ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:32.62KB ,
资源ID:11915008      下载积分:2 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-11915008.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于单片机的电子闹钟设计.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

基于单片机的电子闹钟设计.docx

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 ,

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

3、知识,以AT89C51单片机为核心,利用七段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所示。图2.1 系统原理图3 硬件设计硬件电路分四个模块:晶振电路、键盘电路、数码管显示电路、蜂鸣器驱动电路。晶振电路使用12MHz晶

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

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

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

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

9、文龙.单片机原理及应用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,0x0

10、ff; / 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, cnt, cnt1, alm1, alm2, alm3;/ 1秒 等时 位闪

11、次数 校时 闹1 闹2 闹3uint 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

12、; if(cnt!=10|wss=0) 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=

13、7;i+) /从秒到时的扫描 P3=j; /选通点亮八个数码管 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

14、; else table23=table24=11; 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); /

15、循环右移 /*显示子函数,用于显示定时2时间*void 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; e

16、lse table36=table37=11; else 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=m

17、iao3%10; /分离秒的个位与十位 table41=miao3/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; table4

18、2= table45=10; j=0x7f; for(i=0;i=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

19、+; /分加1 if(fen59) /判断分是否到1min 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();

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

21、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=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()

22、; if(cnt=0|cnt=10|cnt=11|cnt=12|cnt=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子函

23、数*void jia() if(cnt=1) /判断key1按下的次数是否为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

24、(miao259) /判断秒是否大于60,是,则秒清零 miao2=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 if(fen359) /判断分是否大于60 fen3=0; /是,则分清零 if(cnt=9) /判断key1按下的次数是否为9 shi3+; /是,则时加1 if(shi323) /判断时是否大于23 shi3=0; /是,则时清零 if(cnt=10) /判断key1按下的次数是否为10

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

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