




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、杭州职业技术学院 毕业设计(论文)(2014届)题 目 多功能数字时钟系 别 专 业 班 级 姓 名 指导教师 2014年 5 月 30 日目 录第1章 总体设计要求 4 1.1 设计要求 1.2 设计内容 1.3 系统介绍第2章 单片机最小系统介绍 5 2.1 工作电源 2.2 时钟电路 2.3 复位电路第3章 电路设计 7 3.1 DS1302时钟模块电路 3.2 LCD液晶显示模块 3.3 键盘模块 3.4 整体电路第4章 系统软件设计 10 4.1 主程序流程图 4.2 LCD1602显示流程图参考文献 12附录或相关资料致谢 多功能数字时钟的设计 【摘要】本设计采用LCD液晶屏幕显示
2、系统,以STC89C52RC单片机为核心,由键盘、定时闹铃、日期提醒等功能模块组成。基于题目基本要求,本系统对时间显示、闹铃方式进系统行了重点设计。本系统大部分功能由软件来实现,使电路简单明了,系统稳定性大大提高。本系统不仅成功的实现了要求的基本功能,多数发挥部分也得到了实现,而且还具有一定的创新功能。 【关键词】AT89C51单片机、LCD液晶显示、定时闹铃、DS1302第一章 总体设计要求1.1设计要求(1)使用集成数字电路或单片机作为主控制芯片;(2)使用LCD来显示现在的时间,显示格式为: 上行显示:年-月-日; 下行显示:时时:分分:秒秒;(3)使用时钟芯片DS1302实现时钟定时;
3、(4)具有闹铃功能,一旦时间到则发出警报声;(5)具有调整日期与时间的功能。1.2设计内容(1)查阅相关资料,整体构思,(2)进行调研和总体设计,并绘制系统方框图和主程序流程图等;(3)详细设计:1)LCD显示电路的设计及功能实现 2)实时时钟电路的设计及其功能实现3)按键设置电路的设计及其功能实现1.3 系统介绍设计的电路主要由三大模块构成:单片机控制电路,显示电路以及最小系统。当时间及秒计数计满60时就向分进位,分计数器计满60分后向时计数器进位,小时计数器按“24翻1”规律计数。时、分、秒的计数结果经过数据处理可直送显示器显示。如图1所示。图1 单片机控制的电路第2章 :单片机最小系统介
4、绍单片机系统包括硬件与软件系统,光有硬件是不会正常工作的,硬件必须在软件程序的控制下,执行相应的动作。AT89C51硬件最小系统(正常工作需要的最少元件)常为以下4部分,如图2所示。通常以它作为基本部分,配以不同的外围电路,实现不同的电路功能。2.1 工作电源没有单片机电路不需要电源的,其接法如下:第40脚接+5V的VCC,第20脚接地GND。如图2右下所示。2.2时钟电路时钟电路用于产生单片机工作所需要的时钟信号。常见的时钟电路方式如图2,称为内部时钟方式。单片机芯片内部有一个高增益反向放大器,其输入引脚为XTAL1,输出引脚为XTAL2。只要在19、18两脚上连接晶体振荡器CYS,再加上2
5、个30pF左右的电容(C1、C2)即可构成稳定的自激振荡器。图2 单片机最小硬件系统2.3复位电路单片机AT89C51复位的方法其实很简单,只要在RESET引脚(第9脚)上加一个持续时间为两个机器周期的高电平就可以了,如果晶振为12M,则该高电平只要2s即可。复位操作常见有上电自动复位、按键复位2种方式,其电路如下图3所示:图3 复位电路上电自动复位电路主要由C3和R1组成,只要接通电源就自动完成系统的初始化。当电源接通,电源通过R1对电容C3开始充电,由于电容两端的电压不能突变,而慢慢地由0增大,所以RESET端能维持一定时间的高电平。其维持时间由时间常数R1C3决定,其值越大,高电平维持时
6、间就越长。只要R1C3的值合适,则R1和C3的值不一定须象图1-1中的8.2K和10F,比如R1取10K或其它值也行。按键复位电路主要由S2和R3组成,这种电路一般用在需要经常复位的系统中。 第三章:电路设计3.1 DS1302时钟模块电路时钟模块采用DS1302芯片,DS1302是DALLAS公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态RAM。DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW。其接线电路如图4-2. 由单片机控制的万年历以及时间显示,当时间及秒计数计满60时就向分进位,分计数器计满60分后向时计数器进位,小时计数器按“24翻1”规律计数。时、
7、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期显示,所以在单片机通过对数据处理进行同时在液晶上显示。与单片机连接图如图4所示。DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计
8、时脉冲。图4 时钟电路3.3 LCD液晶显示模块LCD液晶显示模块采用LCD1602型号,具有很低的功耗,正常工作时电流仅2.0mA/5.0V。通过编程实现自动关闭屏幕能够更有效的降低功耗。LCD1602分两行显示,每行可显示多达16个字符。LCD1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,通过内部指令可实现对其显示多样的控制,并且还能利用空余的空间自定义字符。LCD1602的第1-3脚为电源接口,第1脚和第3脚接低电平,第2脚接高电平。第4-6脚为信号接口,第4脚:RS为寄存器选择,接P2.0端口;第5脚R/W为读写信号线,接P2.1端口;第6脚:
9、E端为使能端,接P2.2端口。第7-14脚为8位双向数据线,分别接P0.0-P0.7端口。为增强单片机的驱动能力,需要在P0口接上拉电阻。接口电路如图5:图5 LCD显示电路3.4键盘模块它是整个系统中最简单的部分,根据功能要求,本系统共需四个按键:功能移位键、功能加键、功能减键、立刻跳出调整模式键采用独立式按键。3.5整体电路系统整体电路如图6 所示:图6 系统总体电路图 由单片机控制的万年历以及时间显示,当时间及秒计数计满60时就向分进位,分计数器计满60分后向时计数器进位,小时计数器按“24翻1”规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时
10、电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期显示,所以在单片机通过对数据处理进行同时在液晶上显示。第四章:系统软件设计5.1主程序流程程序分析:开始既当日加一天,同时星期也就相应的加1,看星期是否加到7,若加到了7,就返回到1,若没有就返回到时钟状态,当日加到相应的最大数时,月分就相应的加1,看月份是否加到了13, 若没有到13,就一直等待,若到了13就
11、返回1,且年份就加1,当年份到2099时就清到2005年,若没有,就一直等待,直到2099为止。如图7所示。图7 主程序流程图5.2. LCD1602显示程序流程如图8所示: 图8 LCD1602显示程序流程图参考文献1求是科技. 单片机典型模块设计实例导航. 北京:人民邮电出版社. 2005.82徐淑华, 程退安等.单片微型机原理及应用. 哈尔滨:哈尔滨工业大学出版社. 2005.13孙余凯.精选实用电子电路260例. 北京:电子工业出版社. 2007.6致谢在这次的课题设计撰写过程中,我得到了很多人的帮助。首先我要感谢我的老师在课题设计上的给予我的指导,提供给我支持和帮助,这是我能顺利完成
12、这次论文的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做的更加完善。在此期间,我不但学到了很多技术方面的知识,也提升了我对电子产品的兴趣和认知,提高了自己的设计能力。其次,我还要感谢我的同学,和你们一起讨论才是这次课题设计最开心的事了,也一样收获很多。最后再一次感谢在这次课题设计中帮助过我的良师益友和同学们。附录1.根据DS1302的读写时序,编写DS1302.H代码如下:#include#include/*宏定义,定义DS1302内部寄存器*/#define uchar unsigned char#define uint unsigned int#define DS130
13、2_SECOND0x80#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C#define DS1302_RAM(X)(0xC0+(X)*2) /用于计算 DS1302_RAM 地址的宏 /*端口及位定义*/sbit DS1302_CLK = P24; /实时时钟时钟线引脚 sbit DS1302_IO = P25; /实时时钟数据线引脚 sbit DS1302_RS
14、T = P23; /实时时钟复位线引脚sbit ACC0 = ACC0;sbit ACC7 = ACC7;/*向DS1302送一字节数据*/void DS1302InputByte(unsigned char dat) unsigned char i; ACC = dat; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1;_nop_(); DS1302_CLK = 0; ACC = ACC 1; /*读DS1302一个字节*/unsigned char DS1302OutputByte(void) /实时时钟读取一字
15、节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC DS1302_IO=1; /读管脚 ACC7 = DS1302_IO; DS1302_CLK = 1;_nop_(); DS1302_CLK = 0; return(ACC); /*向DS1302某地址写一字节数据*/void Write_1302(unsigned char ucAddr, unsigned char ucDa) DS1302_RST = 0;_nop_(); DS1302_CLK = 0;_nop_(); DS1302_RST = 1; D
16、S1302InputByte(ucAddr); / 地址,写命令 _nop_(); DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1;_nop_(); DS1302_RST = 0; /*读DS1302某地址的数据*/unsigned char Read_1302(unsigned char ucAddr)/读取DS1302 unsigned char ucData; DS1302_RST = 0;_nop_(); DS1302_CLK = 0;_nop_(); DS1302_RST = 1; DS1302InputByte(ucAddr|0x0
17、1); / 地址,读命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1;_nop_(); DS1302_RST = 0; return(ucData);/*是否写保护*/void DS1302_SetProtect(bit flag) if(flag) Write_1302(0x8E,0x00);else Write_1302(0x8E,0x80);/0512 改,现改为Write_1302(0x8E,0x80)/*设置时间函数*/void DS1302_SetTime(unsigned char Address, unsigne
18、d char Value) DS1302_SetProtect(0); /写保护寄存器,写操作前WP一定要为0Write_1302(Address, (Value/10)4;return(Decimal=Decimal*10+(bcd&=0x0F);/*日期调整*/uchar DayAdjust(uchar year,month) /计算当月有几天uchar Day_out;Day_out=30;if(month=2)&(year%4) Day_out=28;/闰年二月份调整if(month=2)&(!(year%4) Day_out=29;if(month!=2)/其它月份有没有31日if(
19、month=1)&(month=8)&(month=12)&(!(month%2)Day_out=31;/后5月中偶数月 return(Day_out);/*DS1302初始化*/void Initial_DS1302(void)unsigned char Second=Read_1302(DS1302_SECOND);if(Second&0x80)DS1302_SetTime(DS1302_SECOND,0);编写主函数main(),代码如下:#include #include #include /*定义变量及显示数组*/char second,hour,minute,day,month,y
20、ear,week,key1n=0;uchar *weekarray=MON,TUE,WED,THU,FRI,SAT,SUN;uchar code tab1=20 - - ; /初始状态年和星期uchar code tab2=: :;uchar code tab=loading. ;uchar code tab3=please wait;/*校时按键与C51的引脚连接定义*/sbit key1=P15; /设置键sbit key2=P16; /加键sbit key3=P17; /减键/*初始载入程序*/lcd_load(void)lcd_init();lcd_wcmd(FIRSTH+3);/日历
21、显示固定符号从第一行第1个位置之后开始显示display_1602string(tab);lcd_wcmd(SECONDH+0x02);display_1602string(tab3);delayms(400);lcd_wcmd(0x01);/清显示lcd_wcmd(FIRSTH);/日历显示固定符号从第一行第1个位置之后开始显示display_1602string(tab1);lcd_wcmd(SECONDH+6);/时间显示固定符号写入位置,从第2个位置后开始显示display_1602string(tab2);/*时分秒显示函数*/void write_sfm(uchar add,uch
22、ar dat)uchar gw,sw;gw=dat%10;/取得个位数字sw=dat%100/10;/取得十位数字lcd_wcmd(SECONDH+add);/SECONDH是头文件规定的值0x80+0x40lcd_wdat(0x30+sw);/数字+0X30得到该数字的字符lcd_wdat(0x30+gw);/数字+0X30得到该数字的字符/*年月日显示子函数*/void write_nyr(uchar add,uchar dat)uchar gw,sw;gw=dat%10;/取得个位数字sw=dat%100/10;/取得十位数字lcd_wcmd(FIRSTH+add);/设定显示位置为第一
23、个位置+addlcd_wdat(0x30+sw);/数字+30得到该数字的LCD1602显示码lcd_wdat(0x30+gw);/数字+30得到该数字的LCD1602显示码/*星期显示函数*/void write_week(uchar week)/lcd_wcmd(FIRSTH+0x0c);/星期字符的显示位置display_1602string(weekarrayweek-1);/*键盘扫描有关函数*/void keyscan()if(key1=0)/key1为功能键(设置键)delayms(5);/延时,用于消抖动if(key1=0)/延时后再次确认按键按下while(!key1);ke
24、y1n+;/设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环if(key1n=9)key1n=1;/switch(key1n)case 1: TR0=0;/关闭定时器lcd_wcmd(SECONDH+11);/设置按键按动一次,秒位置显示光标 lcd_wcmd(0x0f);/设置光标为闪烁DS1302_SetTime(DS1302_SECOND,second); break;case 2: lcd_wcmd(SECONDH+8);/按2次minute位置显示光标break;case 3: lcd_wcmd(SECONDH+5);/按动3次,hourbreak;case 4:lcd_
25、wcmd(FIRSTH+14);/按动4次,weekbreak;case 5: lcd_wcmd(FIRSTH+9);/按动5次,daybreak;case 6: lcd_wcmd(FIRSTH+6);/按动6次,monthbreak;case 7: lcd_wcmd(FIRSTH+3);/按动7次,yearbreak;case 8:lcd_wcmd(0x0c);/按动到第8次,设置光标不闪烁TR0=1;/打开定时器DS1302_SetTime(DS1302_SECOND,second); break; if(key1n!=0)/当key1按下 ,以下再按以下键才有效(按键次数不等于零)/-加
26、键-if(key2=0) /上调键delayms(5);if(key2=0)while(!key2);switch(key1n)case 1:second+;/设置键按动1次,调秒if(second=60)second=0;/秒超过59,再加1,就归零write_sfm(10,second);/显示加设定好的秒数DS1302_SetTime(DS1302_SECOND,second);lcd_wcmd(SECONDH+11);/break;case 2:minute+;if(minute=60)minute=0;write_sfm(7,minute);/在正确位置显示加设定好的分数据DS130
27、2_SetTime(DS1302_MINUTE,minute);lcd_wcmd(SECONDH+8);/显示位置,第二行第8列break;case 3:hour+;if(hour=24)hour=0;write_sfm(4,hour);/显示加设定好的小时数据DS1302_SetTime(DS1302_HOUR,hour);lcd_wcmd(SECONDH+5);/显示位置,第二行第5列break;case 4:week+;if(week=8)week=1;lcd_wcmd(FIRSTH+0x0C);/显示位置,第一行第12列write_week(week);/指定周数据显示内容DS1302
28、_SetTime(DS1302_WEEK,week);lcd_wcmd(FIRSTH+14);/显示位置,第一行第14列break;case 5:day+;if(day=DayAdjust(year,month)+1)day=1;write_nyr(8,day);/显示加设定好的日期数据DS1302_SetTime(DS1302_DAY,day);lcd_wcmd(FIRSTH+9);/显示位置,第一行第9列break;case 6:month+;if(month=13)month=1;write_nyr(5,month);/DS1302_SetTime(DS1302_MONTH,month)
29、;lcd_wcmd(FIRSTH+6);/break;case 7:year+;if(year=100)year=0;write_nyr(2,year);/显示加设定好的年份数据 DS1302_SetTime(DS1302_YEAR,year);lcd_wcmd(FIRSTH+3);/break;/-减键,各句功能参照加键注释-if(key3=0)delayms(5);if(key3=0)while(!key3);switch(key1n)case 1:second-;if(second=-1)second=59;write_sfm(10,second);/在LCD的正确位置显示改变后新的秒数
30、 DS1302_SetTime(DS1302_SECOND,second);lcd_wcmd(SECONDH+11);/break;case 2:minute-;if(minute=-1)minute=59;write_sfm(7,minute);DS1302_SetTime(DS1302_MINUTE,minute);lcd_wcmd(SECONDH+8);/break;case 3:hour-; if(hour=-1)hour=23;write_sfm(4,hour);DS1302_SetTime(DS1302_HOUR,hour);lcd_wcmd(SECONDH+5);break;ca
31、se 4:week-;if(week=0)week=7;lcd_wcmd(FIRSTH+12);/指定加后的周数据显示位置write_week(week);/指定周数据显示内容DS1302_SetTime(DS1302_WEEK,week);lcd_wcmd(FIRSTH+14);break;case 5:day-;if(day=0)day=DayAdjust(year,month);write_nyr(8,day);DS1302_SetTime(DS1302_DAY,day);lcd_wcmd(FIRSTH+9);break;case 6:month-;if(month=0)month=12
32、;write_nyr(5,month);DS1302_SetTime(DS1302_MONTH,month);lcd_wcmd(FIRSTH+6);break;case 7:year-;if(year=-1)year=99;write_nyr(2,year); DS1302_SetTime(DS1302_YEAR,year);lcd_wcmd(FIRSTH+3);break;/*定时器初始化*/void Timer_Init() /定时器、计数器设置函数TMOD=0x11; /指定定时/计数器的工作方式为3TH0=0; /定时器T0的高四位=0TL0=0; /定时器T0的低四位=0EA=1;
33、/系统允许有开放的中断ET0=1; /允许T0中断TR0=1; /开启中断,启动定时器/*取得并显示日历和时间*/void timer0() interrupt 1 /取得数据(DS1302的读寄存器与写寄存器不一样)second = BCD_Decimal(Read_1302(DS1302_SECOND);minute = BCD_Decimal(Read_1302(DS1302_MINUTE);/hour = BCD_Decimal(Read_1302(DS1302_HOUR);day = BCD_Decimal(Read_1302(DS1302_DAY);month = BCD_Deci
34、mal(Read_1302(DS1302_MONTH);year = BCD_Decimal(Read_1302(DS1302_YEAR);week = BCD_Decimal(Read_1302(DS1302_WEEK); write_sfm(10,second);/秒,从第二行第8个字后开始显示write_sfm(7,minute);/分,从第二行第5个字符后开始显示write_sfm(4,hour);/小时,从第二行第2个字符后开始显示write_nyr(8,day);/日期,从第二行第9个字符后开始显示 write_nyr(5,month);/月份,从第二行第6个字符后开始显示writ
35、e_nyr(2,year);/年,从第二行第3个字符后开始显示write_week(week); /*主函数*/void main()lcd_load();Initial_DS1302(); /调用DS1302的初始化子函数 Timer_Init(); /定时/计数器初始化while(1) keyscan(); /调用键盘扫描子函数 2.程序LCD1602.C代码如下所示:/*包含头文件*/#include #include /因为要用到函数 _nop_();/*端口定义*/sbit RS = P20;sbit RW = P21;sbit E = P22;/*定义液晶显示的位置*/#defin
36、e FIRSTH 0x80 /LCD第一行的初始位置,/因为LCD1602字符地址首位D7恒定为1 #define SECONDH 0xc0 /LCD第二行初始位置 /(因为第二行第一个字符位置地址是0x40/*显示数据表*/unsigned char code DISPLAY1 = YOU ARE WELCOME!;/第一行的显示内容unsigned char code DISPLAY2 = HZVTC CLASS 0811;/第二行的显示内容/*LCD的延时子程序*/void delayms(unsigned char x)unsigned char i;while(x-)for(i=0;i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美容医疗技术题库及答案
- DB43∕T 1326-2017 户外电子显示屏升降系统验收指南
- 2025年基本公共卫生服务项目(慢阻肺健康管理)培训试题及答案
- 汉语课堂考试题目及答案
- 湖南表演考试题目及答案
- 高考编导专业试题及答案
- 2025年起重信号司索工(建筑特殊工种)考试题带答案
- 主管相关专业试题及答案
- 健康教育服务保证承诺书(6篇)
- 环保科普知识普及与教育实践方案设计教案
- 汽车底盘安全培训课件
- 食品添加剂培训课件
- 儿童安全用电防范培训内容课件
- 2025年轮椅转运的题库及答案
- 电商直播干货知识培训内容课件
- 老年脓毒症相关脑病诊疗急诊专家共识解读
- 2025年秋期新教材教科版二年级上册小学科学教学计划+进度表
- 2024年宁波市宁海县国有企业招聘笔试真题
- 2025上半年教师资格证小学《综合素质》笔试真题及答案
- 功率半导体器件基础课件
- 拆零药品培训课件
评论
0/150
提交评论