版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机数字闹钟/电子表设计报告一、本设计功能描述1、采用stc89c52单片机作为主控芯片,实现数字钟表主控功能。2、采用液晶屏显示当前年、月、日、时、分、秒,闹铃时间及状态等信息。3、采用六键键盘设定时间初始值,具体方法是按时间设定键依次进入年、月、日、时、分、秒设定状态,然后通过向上、向下键修改设定值。正在设定的变量以闪烁状态突出显示。4、采用六键键盘设定闹铃时间,具体方法是按闹铃设定键依次进入时、分设定状态,然后通过向上、向下键修改设定值。正在设定的变量以闪烁状态突出显示。5、采用ds1302实时时钟芯片完成后台计时功能,要求具有后备电源,即使主电源掉电时间仍然保持运行。6、可设定闹铃使
2、能,具体方法是按闹铃使能键,按一次打开,再按一次关闭。闹铃使能关闭时不报警。7、当闹铃使能打开,且当前时间到达闹铃设置时间,则蜂鸣器和led红灯同时报警,如不按取消键,报警时间为1分钟。报警状态可以通过按取消键退出。8、系统通过usb电源供电,单片机程序也可通过usb线串行下载。二、相关基础介绍1ds1302芯片(1) ds1302的性能特性l 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;ds1302时钟芯片包括实时时钟/日历和31字节的静态ram。它经过一个简单的串行接口与微处理器通信。实时时钟/日历提供秒、分、时、日、周、月和年等信息。对于小于31天的月和月末的日期自动
3、进行调整,还包括闰年校正的功能。时钟的运行可以采用24h或带am(上午)/pm(下午)的12h格式。采用三线接口与cpu 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或ram数据。ds1302有主电源/后备电源双电源引脚:vcc1在单电源与电池供电的系统中提供电源,并提供低功率的电池备份;vcc2在双电源系统中提供主电源,在这种运用方式中vcc1连接到备份电,以便在没有主电源的情况下能保存时间信息以及数据。ds1302由vcc1或vcc2中较大者供电。当vcc2大于vcc10.2v时,vcc2给ds1302供电;当vcc2小于vcc1时,ds1302由vcc1供电。(2) ds13
4、02数据操作原理 ds1302在任何数据传送时必须先初始化,把rst脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在sclk的上升沿被输出。无论是读周期还是写周期,开始8位指定40存器中哪个将被访问到。在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的始终周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字数。 如果在传送过程中置rst脚为低电平,则会中止本次数据传送,并且i/o引脚变为高阻态。上电运行时,在vcc 2.5v之前,rst脚必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。d
5、s1302的引脚及内部结构图如图1所示。 图1 ds1302引脚图及内部结构ds1302的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1;如果它为0。则不能把数据写入到ds1302中。位6如果为0则表示存取日历时钟数据;为1表示存取ram数据。位51(a4a0)指示操作单元的地址。最低有效位(位0)如为0,表示要进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。图2 ds1302的控制字ds1302的读写时序如图3所示。为了提高对32个地址的寻址能力(地址/命令位15 = 逻辑1),可以把时钟/日历或ram寄存器规定为多字节(burst)方式。位6规定时钟或ram
6、,而位0规定读或写。在时钟/日历寄存器中的地址931或ram寄存器中的地址31不能存储数据。在多字节方式中,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写ram时,为了传送数据不必写所有31字节,不管是否写了全部31字节,所写的每一字都将传送至ram。图3 ds1302数据读/写时序ds1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,ds1302停止振荡,进入低功耗的备份方式。通常在对ds1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将
7、开始启动。am-pm/12-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5是am/pm位,此位是高电平时表示pm,低电平表示am。在24小时方式下,位5为第二个10小时位(2023h)。 ds1302的晶振选用32.768khz,电容推荐值为6pf,因为振荡频率较低,也可以不接电容,对记时精度影响不大。2stc89c52单片机(1) stc89c52 单片机概述stc89c52系列单片机是宏晶科技生产的单时钟/机器周期(1t)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12
8、倍,内部集成max810专用复位电路。 (2) stc89c52 单片机管脚及封装stc89c52 单片机有多种封装形式,本设计中选用40dip封装,其管脚定义如图4所示。其最小应用系统如图5所示。图4 stc89c52 管脚图 三、portel硬件开发软件protel是目前国内最流行的通用eda软件,它是将电路原理图设计、pcb板图设计、电路仿真和pld设计等多个实用工具软件组合后构成的eda工作平台,是第一个将eda软件设计成基于windows的普及型产品。2pcb板设计(1) 定元件的封装 (2) 建立pcb板框 (3) 载入网络表 (4) 布局 (5) pcb设计遵循的规则 地线回路规
9、则:图7 地线回路规则 窜扰控制 屏蔽保护图8 屏蔽保护 走线方向控制规则 电源与地线层的完整性规则四、硬件电路设计单片机数字闹钟硬件框图如图9所示。图9 硬件框图其中ds1302完成计时功能,单片机主控芯片读取ds1302的时间数据,在液晶屏上显示出来。用户可以通过按键设定时间初始值、闹铃初始值等。主电源和备份电源给各芯片供电。1 单片机电路 单片机采用stc89c52芯片,电路采用11.0592mhz外部无源晶体,振荡电容采用20pf。复位电路采用10uf(c1)电容和10k(r2)组成的阻容复位电路。单片机管脚连接标号中,p00p07为液晶屏数据线,p25p27为液晶屏控制线。标号rxd
10、和txd是单片机的异步串行通信引脚,用于单片机程序的isp下载。2 ds1302时钟电路ds1302时钟电路如图11所示,其中bt1是后备电池,以保证在主电源掉电时时钟依然运行。y2是时钟晶振,因为频率较低,故可以不加电容。r10r12为上拉电阻。ds1302通过sclk、i/o和rst管脚和单片机相连。图11 ds1302时钟电路3 液晶屏显示电路显示部分采用smc 1602液晶屏进行数据显示与单片机接口电路如图12所示。图12 lcd与单片机接口电路4 按键电路u盘驱动芯片ch375不仅提供了与usb设备的硬件连接,还内置了文件系统底层程序,使得读、写u盘中的文件变得容易。图中ch375使
11、用12mhz外部晶体,振荡电容为20pf。管脚连接标号d0d7是与单片机并口进行数据传输的数据线,ch375int为单片机提供中断信号,ch375cs、ch375a0、ch375wr和ch375rd是控制信号线。ch375通过ru2和ru3两个电阻与u盘的ud+和ud-数据线连接,同时通过lu发光管输出u盘状态。 3键盘驱动电路键盘驱动电路如图14所示。图14 键盘驱动程序电路使用与单片机管脚直接相连的按键实现键盘。当按键按下时管脚为低电平,无按键时为高电平。单片机采用查询方式获取按键信息。4闹铃电路图15 闹铃电路 闹铃电路由单片机管脚驱动蜂鸣器和报警灯实现,当闹铃时间到时,蜂鸣器鸣响,红灯
12、报警。5电源电路本设计采用usb接口供电,电源电压5v。同时,usb接口通过内含pl2303芯片的转换电路对单片机进行程序编写。其电路原理如图所示。图16 供电及程序下载电路五、 软件设计1、软件流程图本设计软件流程如图17所示。 图17 软件流程图 2、时间调整程序设计调整时间用4个调整按纽,1个作为移位、控制用,另外2个作为加个减用,分别定义为时间设置按纽、加按纽、减按纽。在调整时间过程中,要调整的位与别的位应该有区别,所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位。闪烁原理就是,让要调整的一位每隔一定时间熄灭一次,比如说50ms。利用定时器记时,当到达50ms溢出时,就送给该位
13、熄灭符,在下一次溢出时,再送正常显示的值,不断交替,直到调整该位结束。此时送正常显示值给该位,再进入下一位调整闪烁程序。时间调整程序流程图如图18所示。控制键有效,进入月调整程序控制键有效,进入年调整程序等待按键程序等待按键程序减键有效加键有效加键有效减键有效月减1年加1月加1年减1控制键有效,进入星期调整程序控制键有效,进入日调整程序等待按键程序等待按键程序减键有效加键有效加键有效减键有效星期减1日加1星期加1日减1控制键有效,进入分调整程序控制键有效,进入小时调整程序等待按键程序等待按键程序减键有效加键有效加键有效减键有效分减1小时加1分加1小时减1控制键有效,跳出时间调整程序,进入主循环
14、程序图18 时间设定程序流程图 闹铃时间设定方法类似,不再赘述。3、主程序 下面介绍main.c主程序编写,其他程序略。(1) 头文件和一些宏定义#include #include #include 1602.h#include ds1302.h#define amhouraddr 0xc0 /存闹铃时的地址#define amminuteaddr 0xc2 /存闹铃分的地址#define amenaddr 0xc4 /存闹钟使能标志的地址(2) 管脚、常量、变量定义/定义管脚sbit led_alarm=p21;/报警灯sbit beep_alarm=p20; /蜂鸣器sbit key_tm
15、set = p32; /时间设置sbit key_amset = p33;/闹铃设置sbit key_up = p34;/上调sbit key_down = p35;/下调sbit key_amen = p36;/闹铃开关sbit key_review = p37;/查看/定义标识volatile bit flagkeypress = 0; /有键按下标志volatile bit flagshow = 0; /显示标志volatile bit flagtmset = 0; /时间设置状态标志volatile bit flagamset = 0; /闹铃设置状态标志volatile bit fl
16、agamen = 0; /闹铃使能标志,0为闹铃不使能,1为闹铃使能volatile bit flagalarm = 0; /闹铃状态标志/按键响应用变量uchar keyvalue,keytmset,keyamset,keyup,keydown,keyset,keyamen,keyreview;/ds1302时钟用变量systemtime currenttime;uchar year, month, day, hour, minute, second;uchar amhour, amminute,amstart;/报警及存储用变量/char * psave;/字符串显示用变量uchar st
17、r16 = 000000;uchar date9=00-00-00, time9=00:00:00;uchar hide, setnum;uint counter; (3) 函数声明/函数声明void int2str(int x, char* str);void delay1ms(unsigned int count);void data_init();void timer0_init();void timer0_isr () ;void keyprocess(uint num);(4) 各子程序/整型转字符串的函数,转换范围0-65536void int2str(int x, char* s
18、tr) int i=1; int tmp=10; while(x/tmp!=0) i+; tmp*=10; tmp=x; stri=0; while(i1) str-i=0+(tmp%10); tmp/=10; str0=tmp+0; void delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j= 450) flagshow = 1; counter = 0; /设定闪烁标志 if (hide = 1) hide = 0; else hide = 1; void keyprocess(uint num
19、) switch (num) case 1: /tmset键被按下。setnum=0-管设置;1-年;2-月;3-日;4-时;5-分;6-秒,按一下setnum加1。 if (flagamset=1) /从闹铃时间设置进入当前时间设置 flagamset = 0;flagtmset = 1;setnum = 1; else if (flagtmset=0)/从正常状态进入当前时间设置 flagtmset = 1;setnum = 1; else /已经在时间设置状态 setnum +; if (setnum = 7) /已经设定完毕,则存盘退出 setnum = 0;flagtmset = 0
20、; break; case 2: /amset键被按下。setnum=0-关设置;1-时;2-分,按一下setnum加1。 if (flagtmset=1) /从当前时间设置进入闹铃时间设置 flagtmset = 0;flagamset = 1;setnum = 1; /清屏l1602_string(1,1, );l1602_string(2,1, );/读出当前闹铃时间并显示 int2str(amhour,str1); l1602_string(2,1,str1);int2str(amminute,str1); l1602_string(2,4,str1); else if (flagam
21、set=0)/从正常状态进入闹铃时间设置 flagamset = 1;setnum = 1; /清屏l1602_string(1,1, );l1602_string(2,1, );/读出当前闹铃时间并显示 int2str(amhour,str1); l1602_string(2,1,str1);int2str(amminute,str1); l1602_string(2,4,str1); else /已经在闹铃时间设置状态 setnum +; if (setnum = 3) /已经设定完毕,则存盘退出并返回正常显示界面 /存入闹铃时间 write1302(0x8e,0x00); /写入允许 w
22、rite1302(amhouraddr,amhour);delay1ms(500); write1302(amminuteaddr,amminute);delay1ms(500); write1302(0x8e,0x80); /写入禁止amhour=read1302(amhouraddr);amminute=read1302(amminuteaddr); setnum = 0;flagamset = 0; break; case 3: /up键被按下 if (flagtmset = 1) /如果在当前时间设置状态 switch (setnum) case 0: case 1: /年 if (y
23、ear99)year+; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_year,year); write1302(0x8e,0x80); /禁止写入 break; case 2: /月 if (month12) month+; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_month,month); write1302(0x8e,0x80); /禁止写入 break; case 3: /日 if (day31) day+; write1302(0x8e,0x00); /写入允许 ds1
24、302_settime(ds1302_day,day); write1302(0x8e,0x80); /禁止写入 break; case 4: /时 if (hour23) hour+; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_hour,hour); write1302(0x8e,0x80); /禁止写入 break; case 5: /分 if (minute59) minute+; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_minute,minute); write1302
25、(0x8e,0x80); /禁止写入 break; case 6: /秒 if (second59) second+; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_second,second); write1302(0x8e,0x80); /禁止写入 break; if (flagamset=1) /如果在闹铃设置状态 switch (setnum) case 1: /时 if (amhour23) amhour+; break; case 2: /时 if (amminute0)year-; write1302(0x8e,0x00);
26、/写入允许 ds1302_settime(ds1302_year,year); write1302(0x8e,0x80); /禁止写入 break; case 2: /月 if (month0) month-; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_month,month); write1302(0x8e,0x80); /禁止写入 break; case 3: /日 if (day0) day-; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_day,day); write130
27、2(0x8e,0x80); /禁止写入 break; case 4: /时 if (hour0) hour-; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_hour,hour); write1302(0x8e,0x80); /禁止写入 break; case 5: /分 if (minute0) minute-; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_minute,minute); write1302(0x8e,0x80); /禁止写入 break; case 6: /秒 if
28、 (second0) second-; write1302(0x8e,0x00); /写入允许 ds1302_settime(ds1302_second,second); write1302(0x8e,0x80); /禁止写入 break; if (flagamset=1) /如果在闹铃设置状态 switch (setnum) case 1: /时 if (amhour0) amhour-; break; case 2: /时 if (amminute0) amminute-; break; break; break; case 5: /闹铃使能键被按下 if (flagamen = 0) /
29、存入闹铃时间 write1302(0x8e,0x00); /写入允许 write1302(amenaddr,1); delay1ms(500); write1302(0x8e,0x80); /写入禁止 flagamen = 1; l1602_string(2,11,open ); else /存入闹铃时间 write1302(0x8e,0x00); /写入允许 write1302(amenaddr,0); delay1ms(500); write1302(0x8e,0x80); /写入禁止 flagamen = 0; l1602_string(2,11,close); break; case
30、6: /闹铃review键按下,实际功能就是在闹铃响的时候关铃声 led_alarm = 1; beep_alarm = 1; flagalarm = 0; break; /* 名称 : main()* 功能 : 主函数*/void main() uint i, j,temp; ea = 0;timer0_init(); /定时器0初始化 data_init();initial_ds1302();ea = 1;/载入闹钟使能信号 temp = read1302(amenaddr);if (temp = 1) flagamen = 1;else if (temp = 0) flagamen =
31、0;else /存入闹铃时间 write1302(0x8e,0x00); /写入允许 write1302(amenaddr,0); delay1ms(500); write1302(0x8e,0x80); /写入禁止 flagamen = 0;/载入闹铃时间amhour = read1302(amhouraddr);if (amhour23)|(amhour59)|(amminute0) amminute = 0; /存入闹铃时间 write1302(0x8e,0x00); /写入允许 write1302(amminuteaddr,amminute); delay1ms(500); write
32、1302(0x8e,0x80); /写入禁止 amminute=read1302(amminuteaddr); /显示初始化l1602_init();l1602_string(1,1, welcome to my );l1602_string(2,1, digital timer! );/延时for (i=0;i1000;i+) for (j=0;j1000;j+) ; /初始化屏幕l1602_string(1,1, alarm );if (flagamen = 1) l1602_string(2,1, open );else l1602_string(2,1, close ); while(
33、1) if (flagalarm = 1) led_alarm = 0; beep_alarm = 0; else led_alarm = 1; beep_alarm = 1; /时间显示 if (flagshow = 1) /读出日期时间值 ds1302_gettime(¤ttime); year = currenttime.year; month = currenttime.month; day = currenttime.day; hour = currenttime.hour; minute = currenttime.minute; second = currenttim
34、e.second; datetostr(¤ttime); timetostr(¤ttime); /flagalarm=0为闹铃关闭状态,flagalarm=1为闹铃打开状态, if (flagamen = 1)&(hour = amhour)&(minute = amminute)&(amstart = 0) flagalarm = 1; amstart = 1; else if (flagamen != 1)|(hour != amhour)|(minute != amminute) flagalarm = 0; amstart = 0; /如果不在闹铃设置状态则显示
35、当前日期时间 if (flagamset = 0) l1602_string(1,1,currenttime.datestring); l1602_string(2,1,currenttime.timestring); else /如果在闹铃状态则显示闹铃时和分 int2str(amhour,str1); l1602_string(2,1,str1); l1602_string(2,3,:); int2str(amminute,str1); l1602_string(2,4,str1); /产生时间设定时的闪烁效果,只在闪烁标志置位时运行 /setnum=0-未设定;1-年;2-月;3-日;4
36、-时;5-分;6-秒 if (flagtmset=1)&(hide=1) switch (setnum) case 0: break; case 1: /年 l1602_string(1,1, ); break; case 2: /月 l1602_string(1,4, ); break; case 3: /日 l1602_string(1,7, ); break; case 4: /时 l1602_string(2,1, ); break; case 5: /分 l1602_string(2,4, ); break; case 6: /秒 l1602_string(2,7, ); break
37、; default: break; else if (flagamset=1)&(hide=1) switch (setnum) case 0: break;case 1: /时 l1602_string(2,1, ); break; case 2: /分 l1602_string(2,4, ); break;default: break; flagshow = 0; /以下为键盘查询,当有按键从按下到弹起时,该按键被响应。 if (key_tmset)&(keytmset=0) flagkeypress = 1;keyvalue = 1; else if (key_amset)&(keyamset=0) flagkeypress = 1; keyvalue = 2; else if (key_up)&(keyup=0) flagkeypress = 1; keyvalue = 3; else if (key_down)&(keydown=0) flagkeypress = 1; keyvalue = 4; else if (key_amen)&(keyamen=0) flagkeypress = 1; keyvalue = 5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 25831-2024变形高温合金丝材
- 军训夏令营家长寄语
- 国际贸易专业求职信模板集合8篇
- 关于物流专业的实习报告范文8篇
- “沙钢杯”理论题练习试卷附答案(一)
- 2017年四川省绵阳市中考语文试卷(学生版)
- 2023-2024学年上海市青浦一中八年级(上)期中数学试卷(含解析)
- 语文统编版(2024)一年级上册识字2 金木水火土 教案
- 2024高考物理一轮复习第37讲静电力的性质(讲义)(学生版+解析)
- 广东高考语法填空词形变换总结
- 汽车零配件供应链管理模式与优化策略
- 组织行为学课件北京大学MBA美斯蒂芬·P·罗宾斯着第
- 幼儿园公开课:中班语言《彩色牛奶》课件
- 诉讼异地管辖申请书范本 法院
- 小学生诚信教育主题班会 诚信伴我行守护真善美 课件
- 第十五课 播种性格收获希望 课件 2023-2024学年心理健康江苏版七年级(全一册)试用本
- 山东省淄博市实验中学、齐盛高级中学2023-2024学年高二上学期期中考试数学试卷(解析版)
- 高中营养与健康教育教学评价与质量监控方案
- itc多功能厅设计方案
- 测试Bug记录表模板
- 安全生产责任制考核评分表(班组长)
评论
0/150
提交评论