资源描述
单片机原理与应用课程设计 【设计题目】 数字钟设计与实现 【指导教师】 【班级】 06电子(1)班 【姓名】 【学号】 【日期】 2010年06月19日 电子信息技术专业单片机综合实践任务书设计题目数字钟的设计与实现导师姓名储忠、胡学友 主要内容及目标通过单片机内定时器控制走时,准确持续走时,调时不影响走时。在八个数码管上显示时、分、秒及两个小数点。含有闹钟功能,可以选择闹钟开关,可以设定闹铃时间。到达闹钟时刻蜂鸣器警报,可以关掉警报。具有的设计条件1 PC机一台;2 AT89S51单片机最小系统版一片;3 Keil C调试环境、Proteus仿真软件。计划设计进程(1)明确课题对程序功能,运算精度等方面的要求及硬件条件(2)把复杂问题分解为若干模块,确定各模块处理方法,画出流程图。(3)编制程序,根据流程图精心选择合适的指令和寻址方式来编制源程序(4)对程序进行汇编,调试和修改,直到程序运行结果正确为止。(5)购买器材,连接、制作硬件;(6)将软件功能在硬件上得到实现,做出数字钟实物。参考文献1张毅刚、彭喜元 单片机原理与应用设计 电子工业出版社2李玉梅 基于MCS51系列单片机原理的应用设计 国防工业出版社3顾栤、赵伟军、王泰 单片机计算机原理开发应用 高等教育出版社4张洪润、蓝清华 单片机应用技术教程 清华大学出版社 目 录摘 要11、设计目的22、设计内容22.1任务及要求22.2系统功能说明22.3软件研制方面32.4硬件研制方面32.5源程序流程图33、仿真实现(电路连接图)43.1引脚连接43.2仿真结果(电路原理图)44、总结55、参考文献6附录6摘 要基于单片机的数字钟的设计与实现,主要讨论了它从软件上实现的过程,流程图的设定,电路图的绘制,重点在单片机特有的定时中断方式,在最后富有采用中断方式实现的数字钟的源程序。 关键字:单片机,数字钟,中断,定时,消抖1、设计目的(1)通过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;(3)提高综合及灵活运用所学知识解决工业控制的能力,培养动手能力和实际应用能力。2、设计内容2.1任务及要求通过单片机内定时器控制走时,准确持续走时,调时不影响走时。在八个数码管上显示时、分、秒及两个小数点。含有闹钟功能,可以选择闹钟开关,可以设定闹铃时间。到达闹钟时刻蜂鸣器警报,可以关掉警报。2.2系统功能说明电子钟的格式为:XX.XX.XX ,由左向右分别为:时、分、秒。完成显示由秒01一直加1至59,再恢复为00;分加1,由00至01,一直加1至59,再恢复00;时加1,时由00加至23之后秒、分、时全部清清零。该钟使用T0作250us的定时中断。走时调整:走时过程中直接调整且不影响走时准确性,按下h键对“时”显示进行调整(每按一次加1);按下m键对“分”显示进行调整(每按一次加1);按下s键“秒”显示进行调整(每按一次加1)。闹时调整:按下BUT键进入闹时调整,但不影响走时准确性,按下h键对“时”显示进行调整(每按一次加1);按下m键对“分”显示进行调整(每按一次加1)。闹铃启/停设定:通过模式设定键cancel选择为闹铃启/停设定,cancel键断开闹时功能启动;按下cancel键闹铃功能关闭,也可在闹铃响起后终止闹铃。2.3软件研制方面1. 采用模块化程序结构设计软件,首先将整个软件分成若干功能模块;2. 根据流程图,编写源程序;3. 上机调试各模块程序;4. 与硬件一起联调,最后完成全部调试工作。 2.4硬件研制方面1. 将整个硬件系统划分为若干功能单元电路,绘出整个系统逻辑电路图,注明各交单元电路间接口信号 ;2. 完成各单元电路设计,包括选择合适的各类元器件和电路板设计(元件布局和走线)。2.5源程序流程图初始化清数码管显示时钟芯片赋初值是定闹钟程序取时钟否送显示BUT键按下3、仿真实现(电路连接图) 3.1引脚连接8位高亮共阴型数码管,单片机P1.0P1.7接数码管adp脚,P3.0P3.7接数码管14脚, P2.0P2.2接s、m、h控制键,P2.3接BUT键,P2.4接蜂鸣器,P2.5接cancel键,RST用单片机自带。3.2仿真结果(电路原理图) (备注:为效果直观,仿真时用LED代替的蜂鸣器。)4、总结通过这次课程设计我们最大的收获是对单片机的定时中断方式有了直观的认识,设计数字钟我们用单片机内部定时计数器,通过设置定时器产生精确的定时中断,达到计时的目的。用定时器可以产生250us的精确定时,然后,4000次中断后就得到了精确的1s的定时。60个1s,即产生了1分钟等等用延时也可以做电子钟,但产生的定时一般是近似值,走得时间久了,定时会产生较大的偏差,而用定时器中断做的电子钟就不会有这个问题,很准确。两星期前,我们对单片机知之甚少,我们首先从任务要求出发,分析如何实现功能,然后将其分为若干模块,将每个模块设计好以后,再进行总体设计,最后是将硬件电路焊好,并进行电路连接。现在我们熟悉了51单片机的指令系统,熟悉了定时器/计数器和中断系统的使用,了解了串行接口的基本使用方法,基本掌握了单片机程序设计的方法。 由于对单片机我们还只是接触了皮毛,所以先做一个功能相对简单电子钟暂且练习对定时器计数器的用法,还有就是系统简单好调试,以保证按时完成设计任务。在以后的学习中,我们打算逐渐增加它的功能,比如说加温度控制,加秒表等功能来完善这个电子钟。在实验中用8个数码管本计划加入日期显示,最终未能实现,待以后用更多时间改正。通过答辩,我们意识到了原来没有注意的地方,比如点阵LED一般采用扫描式显示,实际运用分为三种方式:点扫描;行扫描;列扫描。若使用点扫描,其扫描频率必须大于1664=1024Hz,即周期小于1ms。若使用第二和第三种方式,则频率必须大于168=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路(三极管)提高电流,否则LED亮度会不足,且有时出现数字显示不明显的状况。最后,在这里我们要感谢指导老师,感谢在设计及改正中给予的宝贵指导;另外,还要特别感谢等悉心给予帮助的同学。5、参考文献1张毅刚、彭喜元 单片机原理与应用设计 电子工业出版社2李玉梅 基于MCS51系列单片机原理的应用设计 国防工业出版社3顾栤、赵伟军、王泰 单片机计算机原理开发应用 高等教育出版社4张洪润、蓝清华 单片机应用技术教程 清华大学出版社附录#include Unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80; /数码管段选 unsigned char dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /数码管位选 unsigned char dispbuf8=0,0,16,0,0,16,0,0; /缓存区unsigned char dispbitcnt; /要显示的位置unsigned char second=0;unsigned char minite=0;unsigned char hour=0;unsigned char t_minite=0;unsigned char t_hour=0;unsigned int tcnt; /中断次数unsigned char mstcnt; /扫描时间变量 unsigned int flag; /标志位sbit s=P20;sbit m=P21;sbit h=P22;sbit BUT=P23; /设定闹铃sbit LED=P24; sbit cancel=P25; /闹铃启用禁止void set_time();void adjust_time();void delay();void main(void) TMOD=0x02; /T0工作方式2 TH0=0x06; /每250us中断一次 TL0=0x06; TR0=1; ET0=1; EA=1; BUT=1; cancel=1; while(1) while(BUT=1) adjust_time(); while(BUT=0) set_time(); void set_time() if(m=0) delay(); /消抖 if(m=0) t_minite+; if(t_minite=60) t_minite=0; dispbuf3=t_minite%10; dispbuf4=t_minite/10; while(m=0); else if(h=0) delay(); if(h=0) t_hour+; if(t_hour=24) t_hour=0; dispbuf6=t_hour%10; dispbuf7=t_hour/10; while(h=0); void adjust_time() if(s=0) delay(); if(s=0) second+; if(second=60) second=0; dispbuf0=second%10; dispbuf1=second/10; while(s=0); else if(m=0) delay(); if(m=0) minite+; if(minite=60) minite=0; dispbuf3=minite%10; dispbuf4=minite/10; while(m=0); else if(h=0) delay(); if(h=0) hour+; if(hour=24) hour=0; dispbuf6=hour%10; dispbuf7=hour/10; while(h=0); void delay() unsigned char i,j; for(i=5;i0;i-) for(j=248;j0;j-); void t0(void) interrupt 1 mstcnt+; if(mstcnt=8) /数码管动态刷新时间 mstcnt=0; P3=dispbitcodedispbitcnt; P1=dispcodedispbufdispbitcnt; dispbitcnt+; if(dispbitcnt=8) dispbitcnt=0; tcnt+; /中断产生秒 if(tcnt=4000) tcnt=0; second+; if(second=60) second=0; minite+; if(minite=60) minite=0; hour+; if(hour=24) hour=0; if(BUT=1) dispbuf0=second%10; dispbuf1=second/10; dispbuf3=minite%10; dispbuf4=minite/10; dispbuf6=hour%10; dispbuf7=hour/10; if(t_minite=minite&t_hour=hour&cancel!=0) LED=LED; else LED=0; 11
展开阅读全文