电子时钟设计实验报告

上传人:qd****88 文档编号:72040540 上传时间:2022-04-07 格式:DOC 页数:26 大小:70.50KB
收藏 版权申诉 举报 下载
电子时钟设计实验报告_第1页
第1页 / 共26页
电子时钟设计实验报告_第2页
第2页 / 共26页
电子时钟设计实验报告_第3页
第3页 / 共26页
资源描述:

《电子时钟设计实验报告》由会员分享,可在线阅读,更多相关《电子时钟设计实验报告(26页珍藏版)》请在装配图网上搜索。

1、.单片机电子时钟设计报告一、 设计任务本次课程设计的电子时钟电路,是基于单片机STC89C52、时钟芯片和液晶显示,运用C语言编程实现。电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。二、 系统硬件设备及芯片简介数字电子钟系统设计已经成熟,但是目前系统设计时基本 都是采用 LED 作为显示电路,造成硬件电路复杂、功耗高、产 品体积庞大等特点;液晶显示模块由于具有低功耗、寿命长、 体积小、显示内容丰富、价格低、接口控制方便等优点,因此 在各类电子产品中被极广泛地推广和应用。字符型液晶显示模 块是一类专门用于显示字母、数字、符号等点阵式液晶显示模 块。本系统设计采用字符型液品显示

2、模块 LCD1602 作为显示器 件,这样不仅简化了系统的硬件设计,而且极大地提高了系统 的可靠性。1LCD1602简介字符型液晶显示模块 LCD1602已经是单片机应用设计中 最常用的信息显示器件。LCD1602可以显示两行,每行16个 字符,采用5V电源供电,外围电路配置简单,价格便宜,具 有很高的性价比。2LCD1602功能介绍2.1 引脚功能LCD1602采用标准14脚(无背光)或16脚(带背光)接口,各引脚功能见表1。表 1 引脚功能编号符号引脚说明编号符号引脚说明1VSS电源地9D2Data I/O2VDD电源正极10D3Data I/O3VL液晶显示偏压信号11D4Data I/

3、O4RS数据/命令选择端12D5Data I/O5R/W读/写选择端13D6Data I/O6E使能信号14D7Data I/O7D0Data I/O15BLA背光源正极8D1Data I/O16BLK背光源负极2.2 LCD1602读写指令LCD1602读写指令较多且较复杂,具体使用可以查相关资料,下面仅列出最常用的的一些命令:写指令 38H:显示模式设置;写指令 08H:显示关闭;写指令 01H:显示清屏;写指令 06H:显示光标移动设置;写指令 0CH:显示开及光标设置。2.3 LCD1602 读写操作时序LCD1602 读写操作时序总体上来说是比较简单的,掌握其有两种方法:一种是只看时

4、序图,另外一种方法是直接记忆和总结读写时电平高低和变化。很显然第二种更简单和直接,下面就列出典型读写的时序要求,以方便编写程序。(1) 读状态:输入:RSL,RWH,EH。 输出:D0D7状态字。(2) 写指令:输入:RSL,RWL,D0D7指令码,E上升沿。输出:无。(3)读数据:输入:RSH,RWH,EH。输出:D0D7数据。(4)写 数 据:输入:RSH,RWL,D0D7数据,E上升沿。输出:无。2.4 LCD1602显示方法液晶显示模块是慢速显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平(即不忙),否则该指令失效。显示字符时,要先输入显示字符地址,即告诉模块在哪里显示字

5、符。因为写入显示地址时要求最高位D7 恒定为高电平,所以实际写入的数据应该是要显示地址值加上80H,即将最高位D7置为1。在使用此显示模块时一般要对其进行初始化,设置所需要的显示参数。液晶模块在显示字符时光标是自动右移的,无需人工干预。每次输入指令前,都要判断液晶模块是否处于忙状态。3数字电子钟硬件电路设计硬件电路系统设计主要由单片机最小系统、输入电路、输 出电路等组成。单片机最小系统同所有单片机系统,在此不作 讨论。输入电路主要时间调节电路,为简化系统我们使两个外 部中断来调节“时”和“分”数值,即将INT0、INT1分别接 两个按钮。LCD显示器和单片机接口电路可以采用总线方式或 者是模拟

6、口线方式,本设计采用第二种方式,即以单片机 I/O 模拟控制信号。具体电路见图 1,P0口作为数据,并接上拉电 阻提升电压,P2.0接LCD的RS端、P2.1 接LCD的R/W端、 P2.2接LCD的E端,“分”调节按钮接INT0,“时”调节按钮 接INT1,图1 省略了电源和单片机最小系统电路。图 1 数字电子钟硬件电路 三、 设计电路图及程序1. 电路图如下原理图如下:2. 程序共有四段程序,用Keil仿真是程序列表如图Regx52.h程序为:*ifndef _AT89X52_H_*define _AT89X52_H_sfr P0 = 0x80;sfr SP = 0x81;sfr DPL

7、= 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr P1 = 0x90;sfr SCON = 0x98;sfr SBUF = 0x99;sfr P2 = 0xA0;sfr IE = 0xA8;sfr P3 = 0xB0;sfr IP = 0xB8;sfr T2CON = 0xC8;sfr T2MOD = 0xC9;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xC

8、B;sfr TL2 = 0xCC;sfr TH2 = 0xCD;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;/*-P0 Bit Registers-*/sbit P0_0 = 0x80;sbit P0_1 = 0x81;sbit P0_2 = 0x82;sbit P0_3 = 0x83;sbit P0_4 = 0x84;sbit P0_5 = 0x85;sbit P0_6 = 0x86;sbit P0_7 = 0x87;/*-PCON Bit Values-*/*define IDL_ 0x01*define STOP_ 0x02*define PD_

9、 0x02 /* Alternate definition */*define GF0_ 0x04*define GF1_ 0x08*define SMOD_ 0x80/*-TCON Bit Registers-*/sbit IT0 = 0x88;sbit IE0 = 0x89;sbit IT1 = 0x8A;sbit IE1 = 0x8B;sbit TR0 = 0x8C;sbit TF0 = 0x8D;sbit TR1 = 0x8E;sbit TF1 = 0x8F;/*-TMOD Bit Values-*/*define T0_M0_ 0x01*define T0_M1_ 0x02*defi

10、ne T0_CT_ 0x04*define T0_GATE_ 0x08*define T1_M0_ 0x10*define T1_M1_ 0x20*define T1_CT_ 0x40*define T1_GATE_ 0x80*define T1_MASK_ 0xF0*define T0_MASK_ 0x0F/*-P1 Bit Registers-*/sbit P1_0 = 0x90;sbit P1_1 = 0x91;sbit P1_2 = 0x92;sbit P1_3 = 0x93;sbit P1_4 = 0x94;sbit P1_5 = 0x95;sbit P1_6 = 0x96;sbit

11、 P1_7 = 0x97;sbit T2 = 0x90; /* External input to Timer/Counter 2, clock out */sbit T2EX = 0x91; /* Timer/Counter 2 capture/reload trigger & dir ctl */*-SCON Bit Registers-*/sbit RI = 0x98;sbit TI = 0x99;sbit RB8 = 0x9A;sbit TB8 = 0x9B;sbit REN = 0x9C;sbit SM2 = 0x9D;sbit SM1 = 0x9E;sbit SM0 = 0x9F;

12、/*-P2 Bit Registers-*/sbit P2_0 = 0xA0;sbit P2_1 = 0xA1;sbit P2_2 = 0xA2;sbit P2_3 = 0xA3;sbit P2_4 = 0xA4;sbit P2_5 = 0xA5;sbit P2_6 = 0xA6;sbit P2_7 = 0xA7;/*-IE Bit Registers-*/sbit EX0 = 0xA8; /* 1=Enable External interrupt 0 */sbit ET0 = 0xA9; /* 1=Enable Timer 0 interrupt */sbit EX1 = 0xAA; /*

13、 1=Enable External interrupt 1 */sbit ET1 = 0xAB; /* 1=Enable Timer 1 interrupt */sbit ES = 0xAC; /* 1=Enable Serial port interrupt */sbit ET2 = 0xAD; /* 1=Enable Timer 2 interrupt */sbit EA = 0xAF; /* 0=Disable all interrupts */*-P3 Bit Registers (Mnemonics & Ports)-*/sbit P3_0 = 0xB0;sbit P3_1 = 0

14、xB1;sbit P3_2 = 0xB2;sbit P3_3 = 0xB3;sbit P3_4 = 0xB4;sbit P3_5 = 0xB5;sbit P3_6 = 0xB6;sbit P3_7 = 0xB7;sbit RXD = 0xB0; /* Serial data input */sbit TXD = 0xB1; /* Serial data output */sbit INT0 = 0xB2; /* External interrupt 0 */sbit INT1 = 0xB3; /* External interrupt 1 */sbit T0 = 0xB4; /* Timer

15、0 external input */sbit T1 = 0xB5; /* Timer 1 external input */sbit WR = 0xB6; /* External data memory write strobe */sbit RD = 0xB7; /* External data memory read strobe */*-IP Bit Registers-*/sbit PX0 = 0xB8;sbit PT0 = 0xB9;sbit PX1 = 0xBA;sbit PT1 = 0xBB;sbit PS = 0xBC;sbit PT2 = 0xBD;/*-T2CON Bit

16、 Registers-*/sbit CP_RL2= 0xC8; /* 0=Reload, 1=Capture select */sbit C_T2 = 0xC9; /* 0=Timer, 1=Counter */sbit TR2 = 0xCA; /* 0=Stop timer, 1=Start timer */sbit EXEN2= 0xCB; /* Timer 2 external enable */sbit TCLK = 0xCC; /* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */sbit RCLK = 0xCD; /* 0=Ser

17、ial clock uses Timer 1 overflow, 1=Timer 2 */sbit EXF2 = 0xCE; /* Timer 2 external flag */sbit TF2 = 0xCF; /* Timer 2 overflow flag */*-T2MOD Bit Values-*/*define DCEN_ 0x01 /* 1=Timer 2 can be configured as up/down counter */*define T2OE_ 0x02 /* Timer 2 output enable */*-PSW Bit Registers-*/sbit P

18、 = 0xD0;sbit FL = 0xD1;sbit OV = 0xD2;sbit RS0 = 0xD3;sbit RS1 = 0xD4;sbit F0 = 0xD5;sbit AC = 0xD6;sbit CY = 0xD7;/*-Interrupt Vectors:Interrupt Address = (Number * 8) + 3-*/*define IE0_VECTOR0 /* 0x03 External Interrupt 0 */*define TF0_VECTOR1 /* 0x0B Timer 0 */*define IE1_VECTOR2 /* 0x13 External

19、 Interrupt 1 */*define TF1_VECTOR3 /* 0x1B Timer 1 */*define SIO_VECTOR4 /* 0x23 Serial port */*define TF2_VECTOR5 /* 0x2B Timer 2 */*define EX2_VECTOR5 /* 0x2B External Interrupt 2 */*endifLCD1602驱动程序为:*ifndef LCD_CHAR_1602_2005_4_9*define LCD_CHAR_1602_2005_4_9*include /Port Definitions*sbit LcdRs

20、= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();/while(DBPort&0x80);/在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环, /可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80=0x80 /实际硬件时打开此语句LcdEn=0;retu

21、rn DBPort;/向LCD写入命令或数据*define LCD_COMMAND0 / Command*define LCD_DATA1 / Data*define LCD_CLEAR_SCREEN0x01 / 清屏*define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();/设置

22、显示模式*define LCD_SHOW0x04 /显示开*define LCD_HIDE0x00 /显示关 *define LCD_CURSOR0x02 /显示光标*define LCD_NO_CURSOR0x00 /无光标 *define LCD_FLASH0x01 /光标闪动*define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/设置输入模式*define LCD_AC_UP0x02*define LCD_A

23、C_DOWN0x00 / default*define LCD_MOVE0x01 / 画面可平移*define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/移动光标或屏幕*/*define LCD_CURSOR0x02 *define LCD_SCREEN0x08*define LCD_LEFT0x00*define LCD_RIGHT0x04void LCD_Move(unsigned char object, unsigne

24、d char direction)if(object=LCD_CURSOR)LCD_Write(LCD_COMMAND,0x10|direction);if(object=LCD_SCREEN)LCD_Write(LCD_COMMAND,0x18|direction);*/初始化LCD*void LCD_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_W

25、rite(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/*void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;/*void LCD_L

26、oadChar(unsigned char user8, unsigned char place)unsigned char i;LCD_Write(LCD_COMMAND,0x40|(place*8);for(i=0; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于

27、汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_R

28、ST = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_SetProtect(bit flag) /是否写

29、保护if(flag)Write1302(0x8E,0x10);elseWrite1302(0x8E,0x00);void DS1302_SetTime(unsigned char Address, unsigned char Value) / 设置时间函数DS1302_SetProtect(0);Write1302(Address, (Value/10)Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10

30、+ (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(D

31、S1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);void DateToStr(SYSTEMTIME *Time)Time-DateString0 = Time-Year/10 + 0;Time-DateString1 = Time-Year%10 + 0;Time-DateString2 = -;Time-DateString3 = Ti

32、me-Month/10 + 0;Time-DateString4 = Time-Month%10 + 0;Time-DateString5 = -;Time-DateString6 = Time-Day/10 + 0;Time-DateString7 = Time-Day%10 + 0;Time-DateString8 = 0;void TimeToStr(SYSTEMTIME *Time)Time-TimeString0 = Time-Hour/10 + 0;Time-TimeString1 = Time-Hour%10 + 0;Time-TimeString2 = :;Time-TimeS

33、tring3 = Time-Minute/10 + 0;Time-TimeString4 = Time-Minute%10 + 0;Time-TimeString5 = :;Time-TimeString6 = Time-Second/10 + 0;Time-TimeString7 = Time-Second%10 + 0;Time-DateString8 = 0;void Initial_DS1302(void)unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) DS1302_SetTime(DS1302_SECOND,0

34、);/*void BurstWrite1302(unsigned char *pWClock)/往DS1302写入时钟数据(多字节方式) unsigned char i; Write1302(0x8e,0x00); / 控制命令,WP=0,写操作 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(0xbe); / 0xbe:时钟多字节写命令 for (i = 8; i0; i-) /8Byte = 7Byte 时钟数据 + 1Byte 控制 DS1302InputByte(*pWClock); / 写1Byte数据

35、pWClock+; DS1302_CLK = 1; DS1302_RST = 0; void BurstRead1302(unsigned char *pRClock)/读取DS1302时钟数据(时钟多字节方式) unsigned char i; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(0xbf); / 0xbf:时钟多字节读命令 for (i=8; i0; i-) *pRClock = DS1302OutputByte(); / 读1Byte数据 pRClock+; DS1302_CLK = 1; DS1

36、302_RST = 0;void DS1302_TimeStop(bit flag) / 是否将时钟停止unsigned char Data;Data=Read1302(DS1302_SECOND);DS1302_SetProtect(0);if(flag)Write1302(DS1302_SECOND, Data|0x80);elseWrite1302(DS1302_SECOND, Data&0x7F);*/*endif-四、 心得体会 这是一次非常难得的理论与实践相结合的机会,通过这次比较完整的数字电子时钟设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我综合运用所学的专业基础知识,解决实际工程的能力。 通过这次对数字时钟的设计与制作,让我了解了设计电路的程序。设计中曾遇到诸多问题,由于线路错综复杂,很容易在连线过程中出现错接、漏接的情况,即时连接正确也不一定会实现最初的目标。还要针对错误现象,排查原因,在连线正确的基础上,可能是元器件的故障,需要逐步更换调整。 正是这一次设计让我积累了很多经验,也必然让我在未来的工作学习中表现出更好的应变能力,更强的沟通和理解能力。. v

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!