基于单片机的电子闹钟设计说明.doc

上传人:时光煮雨 文档编号:14118657 上传时间:2022-02-02 格式:DOC 页数:16 大小:394.54KB
返回 下载 相关 举报
基于单片机的电子闹钟设计说明.doc_第1页
第1页 / 共16页
基于单片机的电子闹钟设计说明.doc_第2页
第2页 / 共16页
基于单片机的电子闹钟设计说明.doc_第3页
第3页 / 共16页
基于单片机的电子闹钟设计说明.doc_第4页
第4页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《基于单片机的电子闹钟设计说明.doc》由会员分享,可在线阅读,更多相关《基于单片机的电子闹钟设计说明.doc(16页珍藏版)》请在三一文库上搜索。

1、 . 基于单片机的电子闹钟设计摘要本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。关键词:单片机;led;闹钟;定时器AbstractThis design, adopting AT89C51 chip as the core part with some necessary peripheral circuits, is a simple electronic clock which uses 5V DC as the power supply.Keywords:single chip machine ,in fixed t

2、ime machine, alarm clock,LED1 引言1.1设计目的此次课程设计是在学习先修课程单片机原理与系统设计之后,为加强对学生系统设计和应用能力的培养而开设的综合设计训练环节。本课程设计应结合单片机原理与系统设计课程的根底理论,重点强调实际应用技能训练,包括单片机系统设计的软件和硬件两局部。其课程设计任务是使学生通过应用单片机系统设计的根本理论,根本知识与根本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进展设备技术改造和产品开发的能力,培养学生的创新意识,提高学生的动手能力和分析问题、解决问题的能力。1.2设计要求结合单片机知识,以AT89C5

3、1单片机为核心,利用七段LED数码管实现计时、校时与闹钟功能。1.3设计方法以AT89C51单片机为核心,外加晶振电路,使用8个七段数码管显示,LED采用动态扫描,用74ls245芯片作为驱动电路。通过四个独立按键对时间进展定时、校时,从而实现闹钟提醒功能。2 设计方案与原理2.1设计方案选AT89C51单片机作为系统核心,辅助外部产生时钟信号的晶振电路,再加上四个独立按键作为输入信号,使用8个七段数码管显示时间,芯片74ls245为数码管段选线的驱动,最后用蜂鸣器实现闹铃功能。使用单片机的定时器T0计时时间为50ms,计时20次作为1s的时间基准。第一局部,12MHz的晶振连接至单片机的时钟

4、信号输入端;第二局部,四个独立按键加上四个上拉电阻连接至单片机的P1口的低四位;第三局部,单片机的P0口通过由芯片74ls245构成的驱动电路连接至数码管的段选线,单片机的P3口连接至数码管的位选线;第四局部,单片机的P2.1通过一个NPN型三极管连接至蜂鸣器。8个七段数码管使用动态扫描显示时间,独立按键用软件编程实现对时间和闹钟时、分、秒的设置,再通过比拟所设置的闹钟与时间是否相等,到达闹铃发出声响的效果。2.2设计原理系统原理图如图2.1所示。AT89C51晶振按键段码驱动位码驱动 蜂鸣器8位数码管图2.1 系统原理图3 硬件设计硬件电路分四个模块:晶振电路、键盘电路、数码管显示电路、蜂鸣

5、器驱动电路。晶振电路使用12MHz晶体振荡器,经分频后供单片机工作。键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定与修改。由于通过数码管公共与的电流较大且防止过多地使用分立元件,采用了一片74ls245来驱动段码,用P3口作位码驱动。发音局部是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出连续嘀声,这样就可以省去硬件振荡电路,降低本钱。系统硬件电路图如图3.1所示。图3.1 系统硬件图4 软件设计源程序清单见附录。主程序流程图如图4.1所示。图4.1 主程序流程图5 系统仿真与调试硬件局部设置了的三个按键K1、K2、K3、K4。当按键K1第一次按下时,停

6、止计时进入闹钟1的秒设置,当按键K1第二、第三次按下时,分别进入闹钟1的分设置和时设置,当按K1第四 、第五、第六次按下时分别进入闹钟2的秒、分、时设置,当按K1第七 、第八、第九次按下时分别进入闹钟3的秒、分、时设置,当按K1第十 、第二一、第十二次按下时分别进入时间的秒、分、时设置,在K1按下的各阶段,可用按键K2、K3进展时间和闹铃时间的时、分、秒进展加减设置;当按键K1第十三次按下时恢复到时间显示功能。当显示的时间和定时设置的时间一致时,蜂鸣器发出等时连续蜂鸣声,闹铃时间设置为60秒。在各个闹钟设置阶段,如果有K4按下,那么相应闹钟功能关闭或开启;如在闹铃时有K4按下那么提前停止闹铃。

7、系统仿真图如图5.1所示。图5.1 系统仿真图6 总结通过两周的努力,完成了电子闹钟的设计目的,实现了时间的显示、校时、设置闹钟、闹铃等功能。这期间,我复习了单片机的相关知识,并结合查阅相关资料,设计了整体电路以与各模块的电路,对照硬件电路编写对应模块的子程序,最后将各个子程序整合到一个主程序中,完成了设计所需功能。在设计中,我发现选择适宜的元器件很重要,比方数码管有共阳极和共阴极两种,不同的选择会导致程序的不同,经过屡次调试最终选择了共阳极数码管。另外,我觉得软件的设计比硬件设计更重要,而且难度更大。比方写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常

8、犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。我在这次设计中收获颇多。我对所学的理论知识在实践中加深了认识,同时更加熟练掌握了Proteus、Keil等软件的使用。做任何事都需要耐心和细心,一点小的疏忽和懈怠可能导致整个设计失败。还有一点,自己的设计思路不可能凭空产生,只有借鉴别人已有的设计并充分消化吸收成为自己的东西,才能做出更好的设计作品。参考文献1 王思明.单片机原理与应用系统设计M.:科学,2012.2 明荧. 89C51单片机课程设计实训教材M.:清华大学,2003.3 瑞新.单片机原理与应用教程M.:机械工业,2005.

9、4 文龙.单片机原理与应用M.:电子科技大学,2002.附录源程序清单:/*头文件*#include #include/*宏定义*#define uchar unsigned char #define uint unsigned int/*位声明*sbit key1=P10; sbit key2=P11;sbit key3=P12;sbit key4=P13;sbit fmq=P21;/*数码管显示的数值*uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,/ 0 1 2 3 4 5 0x82,0xf8,0x80,0x90,0xbf,0x0ff; /

10、6 7 8 9 - 灭void jia(); /定义时间加函数void jian(); /定义时间减函数/*数组定义,数组含有8个数值*uchar table18,table28,table38,table48;/*时间显示初始值*uchar shi=12,fen=0,miao=0; /*定义全局变量*uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;uchar shi4,fen4,miao4;uchar flag, flag1, wss, t, t1, alm1, alm2, alm3;/ 1秒等时位闪次数校时闹1 闹2 闹3uint

11、 flag2;/ 蜂鸣/*延时函数,用于动态扫描数码管*void delay(uchar i) uchar x,y; for(x=i;x0;x-) for(y=120;y0;y-); /*初始化函数*void init() TMOD=0x01; /工作方式1 TH0=0x3c; /定时时间为:50ms(65536-50000)/256 TL0=0x0b0; /(65536-50000)%256 ET0=1; /翻开定时器 EA=1; /开总中断 TR0=1; /启动定时器 /*显示子函数,用于显示时间数值*void display() uchar i,j; if(cnt!=10|wss=0)

12、table10=miao%10; /别离秒的个位与十位 table11=miao/10; else table10=table11=11;if(cnt!=11|wss=0) table13=fen%10; /别离分的个位与十位 table14=fen/10; else table13=table14=11;if(cnt!=12|wss=0) table16=shi%10; /别离时的个位与十位 table17=shi/10; else table16=table17=11; table12=table15=10; j=0x7f; for(i=0;i=7;i+) /从秒到时的扫描 P3=j;/选

13、通点亮八个数码管 P0=tabletable1i; /显示数值 delay(10);/调用延时程序 j=_cror_(j,1); /循环右移 /*显示子函数,用于显示定时1时间*void display1() uchar i,j; if(alm1=0) if(cnt!=1|wss=0) table20=miao1%10; /别离秒的个位与十位 table21=miao1/10; else table20=table21=11; if(cnt!=2|wss=0) table23=fen1%10; /别离分的个位与十位 table24=fen1/10; else table23=table24=1

14、1; if(cnt!=3|wss=0) table26=shi1%10; /别离时的个位与十位 table27=shi1/10; else table26=table27=11; else table20=table21=table23=table24=table26=table27=10; table22= table25=10; j=0x7f; for(i=0;i=7;i+) /从秒到时的扫描 P3=j; /选通点亮八个数码管 P0=tabletable2i;/显示数值delay(10); /调用延时程序 j=_cror_(j,1); /循环右移 /*显示子函数,用于显示定时2时间*voi

15、d display2() uchar i,j; if(alm2=0) if(cnt!=4|wss=0) table30=miao2%10; /别离秒的个位与十位 table31=miao2/10; else table30=table31=11; if(cnt!=5|wss=0) table33=fen2%10; /别离分的个位与十位 table34=fen2/10; else table33=table34=11;if(cnt!=6|wss=0) table36=shi2%10; /别离时的个位与十位 table37=shi2/10; else table36=table37=11; els

16、e table30=table31=table33=table34=table36=table37=10; table32= table35=10; j=0x7f;for(i=0;i=7;i+) /从秒到时的扫描 P3=j; /选通点亮八个数码管 P0=tabletable3i; /显示数值delay(10); /调用延时程序 j=_cror_(j,1); /循环右移 /*显示子函数,用于显示定时3时间数值*/void display3() uchar i,j; if(alm3=0) if(cnt!=7|wss=0) table40=miao3%10; /别离秒的个位与十位 table41=m

17、iao3/10; else table40=table41=11;if(cnt!=8|wss=0) table43=fen3%10; /别离分的个位与十位 table44=fen3/10;else table43=table44=11;if(cnt!=9|wss=0) table46=shi3%10; /别离时的个位与十位 table47=shi3/10;else table46=table47=11; else table40=table41=table43=table44=table46=table47=10; table42= table45=10; j=0x7f; for(i=0;i=

18、20) /判断是否到一秒 wss=wss; flag=0; /到了,那么标志位清零 if(cnt1!=0) miao4+; /秒加1 if( miao459) /判断秒是否到60s miao4=0; /到了,那么清零 fen4+; /分加1 if(fen459) /判断分是否到1min fen4=0; /到了,那么清零 shi4+; /时加1 if(shi423) /判断时是否到24h shi4=0; /到了,那么清零 else miao+; /秒加1 if( miao59) /判断秒是否到60s miao=0; /到了,那么清零 fen+; /分加1 if(fen59) /判断分是否到1mi

19、n fen=0; / 到了,那么清零 shi+; /时加1 if(shi23) / 判断时是否到24h shi=0; /到了,那么清零 /*键盘扫描子函数*/void key_scan() if(key1=0) while(!key1) /防止掉显 if(cnt=1|cnt=2|cnt=3) display1(); /key1按了1、2、3次,调用闹钟1子程序 if(cnt=4|cnt=5|cnt=6) display2(); / key1按了4、5、6次,调用闹钟2子程序 if(cnt=7|cnt=8|cnt=9) display3(); / key1按了7、8、9次,调用闹钟3子程序 if

20、(cnt=0|cnt=10|cnt=11|cnt=12|cnt=13) display(); / key1按了10、11、12、13次,调用计时子程序 t+; /记下按键key1按下的次数if(cnt=10&cnt1=0) miao4=miao; fen4=fen;shi4=shi;cnt1+;if(cnt=13) t=0; if(cnt1=1) miao=miao4; fen=fen4; shi=shi4; t1=0; if(key2=0) /判断key2是否按下 while(!key2) /防止掉显 if(cnt=1|cnt=2|cnt=3) display1(); if(cnt=4|cn

21、t=5|cnt=6) display2(); if(cnt=7|cnt=8|cnt=9) display3(); if(cnt=0|cnt=10|cnt=11|cnt=12|cnt=13) display(); jia(); /调用加1子函数 if(key3=0) /判断key3是否按下 while(!key3) /防止掉显 if(cnt=1|cnt=2|cnt=3) display1(); if(cnt=4|cnt=5|cnt=6) display2(); if(cnt=7|cnt=8|cnt=9) display3(); if(cnt=0|cnt=10|cnt=11|cnt=12|cnt=

22、13) display(); jian(); /调用减1子函数 if(key4=0) /判断key4是否按下 while(!key4) /防止掉显 if(cnt=1|cnt=2|cnt=3) alm1=alm1; display1(); if(cnt=4|cnt=5|cnt=6) alm2=alm2; display2(); if(cnt=7|cnt=8|cnt=9) alm3=alm3; display3(); if(cnt=0|cnt=10|cnt=11|cnt=12|cnt=13) display(); /*加1子函数*void jia() if(cnt=1) /判断key1按下的次数是

23、否为1 miao1+; /是,那么秒加1 if(miao159) /判断秒是否大于60,是,那么秒清零 miao1=0; if(cnt=2) /判断key1按下的次数是否为2 fen1+;/是,那么分加1 if(fen159) /判断分是否大于60 fen1=0; /是,那么分清零 if(cnt=3) /判断key1按下的次数是否为3 shi1+; /是,那么时加1 if(shi123) /判断时是否大于23 shi1=0; /是,那么时清零 if(cnt=4) /判断key1按下的次数是否为4 miao2+; /是,那么秒加1 if(miao259) /判断秒是否大于60,是,那么秒清零 m

24、iao2=0; if(cnt=5) /判断key1按下的次数是否为5 fen2+; /是,那么分加1 if(fen259) /判断分是否大于60 fen2=0; /是,那么分清零 if(cnt=6) /判断key1按下的次数是否为6 shi2+; /是,那么时加1 if(shi223) /判断时是否大于23 shi2=0; /是,那么时清零 if(cnt=7) /判断key1按下的次数是否为7 miao3+; /是,那么秒加1 if(miao359) /判断秒是否大于60,是,那么秒清零 miao3=0; if(cnt=8) /判断key1按下的次数是否为8 fen3+; /是,那么分加1 i

25、f(fen359) /判断分是否大于60 fen3=0; /是,那么分清零 if(cnt=9) /判断key1按下的次数是否为9 shi3+; /是,那么时加1 if(shi323) /判断时是否大于23 shi3=0; /是,那么时清零 if(cnt=10) /判断key1按下的次数是否为10 miao+; /是,那么秒加1 if(miao59) /判断秒是否大于60,是,那么秒清零 miao=0;cnt1+; if(cnt=11) /判断key1按下的次数是否为11 fen+; /是,那么分加1if(fen59) /判断分是否大于60 fen=0; /是,那么分清零cnt1+; if(cn

26、t=12) /判断key1按下的次数是否为12 shi+; /是,那么时加1 if(shi23) /判断时是否大于23 shi=0; /是,那么时清零cnt1+; /*减1子函数*/void jian() if(cnt=1)/判断key1按下的次数是否为1,是那么秒减1 miao1-; if(miao1=255)/判断秒是否减到255,是,那么秒置59 miao1=59; if(cnt=2)/判断key1按下的次数是否为2,是那么分减1 fen1-; if(fen1=255) /判断分是否减到255,是,那么分置59 fen1=59; if(cnt=3) /判断key1按下的次数是否为3,是那

27、么时减1 shi1-; if(shi1=255) /判断时是否减到255,是,那么时置23 shi1=23; if(cnt=4) /判断key1按下的次数是否为4,是那么秒减1 miao2-; if(miao2=255) /判断秒是否减到255,是,那么秒置59 miao2=59; if(cnt=5) /判断key1按下的次数是否为5,是那么分减1 fen2-; if(fen2=255) /判断分是否减到255,是,那么分置59 fen2=59; if(cnt=6) /判断key1按下的次数是否为6,是那么时减1 shi2-; if(shi2=255) /判断时是否减到255,是,那么时置23

28、 shi2=23; if(cnt=7) /判断key1按下的次数是否为7,是那么秒减1 miao3-; if(miao3=255) /判断秒是否减到255,是,那么秒置59 miao3=59; if(cnt=8) /判断key1按下的次数是否为8,是那么分减1 fen3-; if(fen3=255) /判断分是否减到255,是,那么分置59 fen3=59; if(cnt=9) /判断key1按下的次数是否为9,是那么时减1 shi3-; if(shi3=255) /判断时是否减到255,是,那么时置23 shi3=23; if(cnt=10) /判断key1按下的次数是否为10,是那么秒减1 miao-; if(miao=255) /判断秒是否减到255,是,那么秒置59 miao=59;t1+; if(cnt=11) /判断key1按下的次数是否为11,是那么分减1 fen-; if(fen=255) /判断分是否减到255,是,那么分置59 fen=59;t1+; if(cnt=12) /判断key1按下的次数是否为12,是那么时减1 shi-; if(shi=255) /判断时是否减到255,是,那么时置23 shi=23;t1+; /*闹铃子函数*/void clock() /判断秒的数值是否相等 if(miao=miao1&alm1=0|miao=m

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1