电子时钟设计实验报告.docx

上传人:b****0 文档编号:9801025 上传时间:2023-05-21 格式:DOCX 页数:26 大小:572.58KB
下载 相关 举报
电子时钟设计实验报告.docx_第1页
第1页 / 共26页
电子时钟设计实验报告.docx_第2页
第2页 / 共26页
电子时钟设计实验报告.docx_第3页
第3页 / 共26页
电子时钟设计实验报告.docx_第4页
第4页 / 共26页
电子时钟设计实验报告.docx_第5页
第5页 / 共26页
电子时钟设计实验报告.docx_第6页
第6页 / 共26页
电子时钟设计实验报告.docx_第7页
第7页 / 共26页
电子时钟设计实验报告.docx_第8页
第8页 / 共26页
电子时钟设计实验报告.docx_第9页
第9页 / 共26页
电子时钟设计实验报告.docx_第10页
第10页 / 共26页
电子时钟设计实验报告.docx_第11页
第11页 / 共26页
电子时钟设计实验报告.docx_第12页
第12页 / 共26页
电子时钟设计实验报告.docx_第13页
第13页 / 共26页
电子时钟设计实验报告.docx_第14页
第14页 / 共26页
电子时钟设计实验报告.docx_第15页
第15页 / 共26页
电子时钟设计实验报告.docx_第16页
第16页 / 共26页
电子时钟设计实验报告.docx_第17页
第17页 / 共26页
电子时钟设计实验报告.docx_第18页
第18页 / 共26页
电子时钟设计实验报告.docx_第19页
第19页 / 共26页
电子时钟设计实验报告.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

电子时钟设计实验报告.docx

《电子时钟设计实验报告.docx》由会员分享,可在线阅读,更多相关《电子时钟设计实验报告.docx(26页珍藏版)》请在冰点文库上搜索。

电子时钟设计实验报告.docx

电子时钟设计实验报告

单片机电子时钟设计报告

一、设计任务

本次课程设计的电子时钟电路,是基于单片机STC89C52、时钟芯片和液晶显示,运用C语言编程实现。

电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。

二、系统硬件设备及芯片简介

数字电子钟系统设计已经成熟,但是目前系统设计时基本都是采用LED作为显示电路,造成硬件电路复杂、功耗高、产品体积庞大等特点;液晶显示模

块由于具有低功耗、寿命长、体积小、显示内容丰富、价格低、接口控制方便

等优点,因此在各类电子产品中被极广泛地推广和应用。

字符型液晶显示模块是一类专门用于显示字母、数字、符号等点阵式液晶显示模块。

本系统设计采

用字符型液品显示模块LCD1602作为显示器件,这样不仅简化了系统的硬件设计,而且极大地提高了系统的可靠性。

1LCD160前介

字符型液晶显示模块LCD1602已经是单片机应用设计中最常用的信息显示器件。

LCD1602可以显示两行,每行16个字符,采用+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。

2LCD1602功能介绍

2.1引脚功能LCD1602采用标准14脚(无背光)或16脚(带背光)接口,各引脚功能见表1。

表1引脚功能

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

DataI/O

2

VDD

电源正极

10

D3

DataI/O

3

VL

液晶显示偏压信号

11

D4

DataI/O

4

RS

数据/命令选择端

12

D5

DataI/O

5

R/W

读/写选择端

13

D6

DataI/O

6

E

使能信号

14

D7

DataI/O

7

D0

DataI/O

15

BLA

背光源正极

8

D1

DataI/O

16

BLK

背光源负极

2.2LCD1602读写指令

LCD1602读写指令较多且较复杂,具体使用可以查相关资料,下面仅列

出最常用的的一些命令:

①写指令38H:

显示模式设置;②写指令08H:

显示关闭;③写指令01H:

显示清屏;④写指令06H:

显示光标移动设置;⑤写指令0CH:

显示开及光标设置。

2.3LCD1602读写操作时序

LCD1602读写操作时序总体上来说是比较简单的,掌握具有两种方法:

一种是只看时序图,另外一种方法是直接记忆和总结读写时电平高低和变化。

很显然第二种更简单和直接,下面就列出典型读写的时序要求,以方便编写程序。

(1)读状态:

输入:

RS=L,RWH,E=Ho

输出:

D0-口7=状态字。

(2)写指令:

输入:

RS=L,RW=L,D0—D7=指令码,£=上升沿。

输出:

无。

(3)读数据:

输入:

RS=H,RWH,E=H。

输出:

D0-D7=数据。

⑷写数据:

卒队:

RS=H,RWL,D0-D7MO,E=±JW。

输出:

无。

2.4LCD1602显示方法

液晶显示模块是慢速显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平(即不忙),否则该指令失效。

显示字符时,要先输入显示字符地址,即告诉模块在哪里显示字符。

因为写入显示地址时要求最高位D7恒定为高电平,所以实际写入的数据应该是要显示地址值加上80H,即将最高位D7置为1。

在使用此显示模块时一般要对其进行初始化,设置所需要的显示参数。

液晶模块在显示字符时光标是自动右移的,无需人工干预。

每次输入指令前,都要判断液晶模块是否处于忙状态。

3数字电子钟硬件电路设计

硬件电路系统设计主要由单片机最小系统、输入电路、输出电路等组成。

单片机最小系统同所有单片机系统,在此不作讨论。

输入电路主要时间调节电路,为简化系统我们使两个外部中断来调节“时”和“分”数值,即将INTO、INT1分别接两个按钮。

LCD显示器和单片机接口电路可以采用总线方式或者是模拟口线方式,本设计采用第二种方式,即以单片机I/O模拟控制信号。

具体电路见图1,P0口作为数据,并接上拉电阻提升电压,P2.0接LCD的RS端、P2.1接LCD的R/W端、P2.2接LCD的E端,“分”调节按钮接INT0,“时”调节按钮接INT1,图1省略了电源和单片机最小系统电路。

图1数字电子钟硬件电路

三、设计电路图及程序

1.电路图如下

 

■3fi

n

115V

U2

Hi

MS

■22耳

■Z7

■3e

12-01-07

■12'25'05

 

 

原理图如下:

 

KTM1

XTJk

J3T

D口支l;

ALE

心皿PO:

AD1H:

AD:

的」怔的」皿的工如1的EADE的W

KAA!

P工L安P12AJ0P:

2A)1m:

K:

AijPUaHp:

m

P.501XD裆:

芷P52OT0Psj5?

tT

M.+TO丁工

P:

:

 

2.程序

共有四段程序,用Keil仿真是程序列表如图

aaa

&a01aDIff0auor

,[巴^|T»rget1

-!

□Target1

-,丁SourceGroup1

S-g]DS13Q2X

-图regx52.h

|!

!

;]kdl&O2.h

|Jintrins>

国dsl302h

Regx52.h程序为:

#ifndef__AT89X52_H_

#define__AT89X52_H

sfrP0

=0x80;

sfrSP

=0x81;

sfrDPL

=0x82;

sfrDPH

=0x83;

sfrPCON

=0x87;

sfrTCON

=0x88;

sfrTMOD

=0x89;

sfrTL0

=0x8A;

sfrTL1

=0x8B;

sfrTH0

=0x8C;

sfrTH1

=0x8D;

sfrP1

=0x90;

sfrSCON

=0x98;

sfrSBUF

=0x99;

sfrP2

=0xA0;

sfrIE二

=0xA8;

sfrP3

=0xB0;

sfrIP=

=0xB8;

sfrT2CON

=0xC8;

sfrT2MOD

=0xC9;

sfrRCAP2L

=0xCA;

sfrRCAP2H

=0xCB;

sfrTL2=0xCC;

sfrTH2=0xCD;

sfrPSW=0xD0;

sfrACC=0xE0;

sfrB=0xF0;

/*

P0BitRegisters*/sbitP0_0=0x80;

sbitP0_1=0x81;

sbitP0_2=0x82;

sbitP0_3=0x83;

sbitP0_4=0x84;

sbitP0_5=0x85;

sbitP0_6=0x86;

sbitP0_7=0x87;

/*

PCONBitValues*/

#defineIDL0x01

#defineSTOP0x02

#definePD_

0x02/*Alternatedefinition*/

#defineGF0_

#defineGF1_

#defineSMOD

0x04

0x08

0x80

/*

TCONBitRegisters*/sbitIT0=0x88;

sbitIE0=0x89;

sbitIT1=0x8A;

sbitIE1=0x8B;

sbitTR0=0x8C;

sbitTF0=0x8D;

sbitTR1=0x8E;

sbitTF1=0x8F;

/*

TMODBitValues

*/

#defineT0_M0_0x01

#defineT0_M1_0x02

#defineT0_CT_0x04

#defineT0_GATE_0x08

#defineT1_M0_0x10

#defineT1_M1_0x20

#defineT1_CT_0x40

#defineT1_GATE_0x80

#defineT1_MASK_0xF0

#defineT0_MASK_0x0F

/*

P1BitRegisters*/sbitP1_0=0x90;

sbitP1_1=0x91;

sbitP1_2=0x92;

sbitP1_3=0x93;

sbitP1_4=0x94;

sbitP1_5=0x95;

sbitP1_6=0x96;

sbitP1_7=0x97;

sbitT2=0x90;/*ExternalinputtoTimer/Counter2,clockout*/

sbitT2EX=0x91;/*Timer/Counter2capture/reloadtrigger&dirctl*/

/*

SCONBitRegisters*/sbitRI=0x98;

sbitTI=0x99;

sbitRB8=0x9A;

sbitTB8=0x9B;

sbitREN=0x9C;

sbitSM2=0x9D;

sbitSM1=0x9E;sbitSM0=0x9F;

/*

P2BitRegisters*/sbitP2_0=0xA0;

sbitP2_1=0xA1;

sbitP2_2=0xA2;

sbitP2_3=0xA3;

sbitP2_4=0xA4;

sbitP2_5=0xA5;

sbitP2_6=0xA6;

sbitP2_7=0xA7;

/*

IEBitRegisters

*/

sbitEX0

=0xA8;

/*1=EnableExternalinterrupt0*/

sbitET0

=0xA9;

/*1=EnableTimer0interrupt*/

sbitEX1

=0xAA;

/*1=EnableExternalinterrupt1*/

sbitET1

=0xAB;

/*1=EnableTimer1interrupt*/

sbitES

=0xAC;

/*1=EnableSerialportinterrupt*/

sbitET2

=0xAD;

/*1=EnableTimer2interrupt*/

sbitEA

=0xAF;

/*0=Disableallinterrupts*/

/*

P3BitRegisters(Mnemonics&Ports)*/sbitP3_0=0xB0;

sbitP3_1=0xB1;

sbitP3_2=0xB2;

sbitP3_3=0xB3;

sbitP3_4=0xB4;

sbitP3_5=0xB5;

sbitP3_6=0xB6;

sbitRXD=0xB0;

sbitTXD=0xB1;

sbitINT0=0xB2;

sbitINT1=0xB3;

sbitT0=0xB4;

sbitT1=0xB5;

sbitWR=0xB6;

sbitRD=0xB7;

sbitP3_7=0xB7;

/*Serialdatainput*/

/*Serialdataoutput*/

/*Externalinterrupt0*/

/*Externalinterrupt1*/

/*Timer0externalinput*/

/*Timer1externalinput*/

/*Externaldatamemorywritestrobe*/

/*Externaldatamemoryreadstrobe*/

/*

IPBitRegisters*/

sbitPX0=0xB8;sbitPT0=0xB9;sbitPX1=0xBA;sbitPT1=0xBB;sbitPS=0xBC;sbitPT2=0xBD;

/*

T2CONBitRegisters*/

sbitCP_RL2=0xC8;

sbitC_T2=0xC9;

sbitTR2=0xCA;

sbitEXEN2=0xCB;

sbitTCLK=0xCC;

sbitRCLK=0xCD;

sbitEXF2=0xCE;

sbitTF2=0xCF;

/*0=Reload,1=Captureselect*/

/*0=Timer,1=Counter*/

/*0=Stoptimer,1=Starttimer*/

/*Timer2externalenable*/

/*0=SerialclockusesTimer1overflow,1=Timer2*/

/*0=SerialclockusesTimer1overflow,1=Timer2*/

/*Timer2externalflag*/

/*Timer2overflowflag*/

/*

T2MODBitValues*/

#defineDCEN_0x01/*1=Timer2canbeconfiguredasup/downcounter*/

#defineT2OE_0x02/*Timer2outputenable*/

/*

PSWBitRegisters*/sbitP=0xD0;

sbitFL=0xD1;

sbitOV=0xD2;

sbitRS0=0xD3;

sbitRS1=0xD4;

sbitF0=0xD5;

sbitAC=0xD6;

sbitCY=0xD7;

/*

InterruptVectors:

InterruptAddress=(Number*8)+3*/

#defineIE0_VECTOR0/*0x03ExternalInterrupt0*/

#defineTF0_VECTOR1/*0x0BTimer0*/

#defineIE1_VECTOR2/*0x13ExternalInterrupt1*/

#defineTF2_VECTOR

#defineEX2VECTOR

/*0x2BTimer2*/

/*0x2BExternalInterrupt2*/#endif

LCD1602驱动程序为:

#ifndefLCD_CHAR_1602_2005_4_9

#defineLCD_CHAR_1602_2005_4_9

#include//Port

Definitions**********************************************************sbitLcdRssbitLcdRwsbitLcdEnsfrDBPort

//内部等待函数

*********************************************************************

*****

unsignedcharLCD_Wait(void)

{.

LcdRs=0;

LcdRw=1;_nop_();

LcdEn=1;_nop_();

//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用

GotoXY()时,会进入死循环,

//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80

//实际硬件时打开此语句

LcdEn=0;

returnDBPort;

}

//向LCD写入命令或数据

************************************************************

#defineLCD_COMMAND0//Command

#defineLCD_DATA1//Data

#defineLCD_CLEAR_SCREEN0x01//清屏

#defineLCD_HOMING0x02//光标返回原点

voidLCD_Write(bitstyle,unsignedcharinput)

{.

LcdEn=0;

LcdRs=style;

LcdRw=0;_nop_();

DBPort=input;_nop_();〃注意顺序

LcdEn=1;_nop_();//注意顺序

LcdEn=0;_nop_();

LCD_Wait();

}

//设置显示模式

************************************************************voidLCD_SetInput(unsignedcharInputMode)

voidLCD_SetDisplay(unsignedcharDisplayMode)

{.

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

}

{.

LCD_Write(LCD_COMMAND,0x04|InputMode);

}

//移动光标或屏幕

************************************************************

/*

#defineLCD_CURSOR0x02

#defineLCD_SCREEN0x08

#defineLCD_LEFT0x00

#defineLCD_RIGHT0x04

voidLCD_Move(unsignedcharobject,unsignedchardirection){.

if(object==LCD_CURSOR)

LCD_Write(LCD_COMMAND,0x10|direction);

if(object==LCD_SCREEN)

LCD_Write(LCD_COMMAND,0x18|direction);}*///初始化Lcd************************************************************voidLCD_Initial(){LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显

示,5*7点阵LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);〃开启显示,无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动

}//************************************************************************voidGotoXY(unsignedcharx,unsignedchary){if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));}voidPrint(unsignedchar*str){while(*str!

='\0'){LCD_Write(LCD_DATA,*str);str++;

}

/*

voidLCD_LoadChar(unsignedcharuser[8],unsignedcharplace){.

unsignedchari;

LCD_Write(LCD_COMMAND,0x40|(place*8));

for(i=0;i<8;i++)

LCD_Write(LCD_DATA,user[i]);

}

*/

//********************************************************************

****

#endif

Intrins.h程序为:

#ifndef__INTRINS_H_

#define__INTRINS_H

externvoid_nop_(void);

externbit_testbit

externunsignedchar_cror_externunsignedint_iror_externunsignedlong_lror_externunsignedchar_crol_externunsignedint_irol_externunsignedlong_lrol_

(bit);

(unsignedchar,unsignedchar);

(unsignedint,unsignedchar);

(unsignedlong,unsignedchar);

(unsignedchar,unsignedchar);

(unsignedint,unsignedchar);

(unsignedlong,unsignedchar);

externunsignedchar_chkfloat_(float);

externvoid_push_(unsignedchar_sfr);

externvoid_pop_(unsignedchar_sfr);

#endif

DS1302时钟程序为:

#ifndef_REAL_TIMER_DS1302_2003_7_21_

#define_REAL_TIMER_DS1302_2003_7_21_

sbitDS1302_CLK=P1A6;〃实时时钟时钟线引脚

sbitDS1302_IO=PW7;〃实时时钟数据线引脚

sbitDS1302_RST=PW5;〃实时时钟复位线引脚

sbitACC0=ACCA0;

sbitACC7=ACCA7;

typedefstruct__SYSTEMTIME__

unsignedcharSecond;

unsignedcharMinute;

unsignedcharHou

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2