基于单片机控制的数字钟课程设计任务书1.设计目的与要求设计出一个数字钟。
准确地理解有关要求,独立完成系统设计,要求所设计的电路具有以下功能:(1)显示:可以显示时、分和秒(2)调时功能:时(0-24)、分和秒(0-60)可以连续可调2.设计内容(1)画出电路原理图,正确使用逻辑关系;(2)确定元器件及元件参数;(3)进行电路模拟仿真;(4)SCH文件生成与打印输出;3.编写设计报告写出设计的全过程,附上有关资料和图纸,有心得体会。
基于单片机控制的数字钟摘要:本设计是由89c51单片机和74hc245构成的多功能数字钟,它可以实现小时、分钟、秒的连续可调。
操作特别方便硬件电路简单。
并且采用具有发光亮度很好的七段数码管显示,特别具有可视性。
关键词:数字钟;单片机表;多功能表目录1引言 (1)2总体设计方案 (1)2.1设计思路 (1)2.2总体设计框图 (1)3设计原理分析 (2)3.1时钟电路的硬件设计分析 (2)3.2时钟电路的软件设计分析 (2)4程序设计 (2)4.1主程序 (2)4.2显示子程序 (3)4.3定时器/计数器T0中断服务程序 (3)4.4按键处理子程序 (3)5 结束语. (3)参考文献 (3)附录1 (4)附录2 (5)1 引言在人们的日常生活中,数字钟占有相当大的比重,可以说它是人们日常生活中不可缺少的东西。
它扮演着时间老人的角色,这次设计是基于单片机制作而成的数字钟,以24小时为一周期,显示时、分、秒,而且可以实现连续可调。
在具体处理过程中非常简单,用内部定时器进行定时处理,按键全部采用独立键盘非常方便快捷。
2 总体设计方案2.1 设计思路:利用单片机内部定时器进行时间定时。
刚开始的时候让数码管显示12点,进入调试模式后在主程序中不停的进行显示和按键扫描,当调整键按下时进入按键扫描程序进入后利用调整键按下的次数进行区分时分秒。
当确定按下次数后,递增键和递减键分别对时间进行加或者减的操作,完毕后在对调整键操作就立刻退出调试进行正常显示。
2.2总体设计框图:图1(总体设计框图)3 设计原理分析3.1 时钟电路的硬件设计分析:单片机P0口经过74HC245直接去驱动六个数码管,六个数码管接成并口动态显示。
再利用P2口的P2.0到P2.5进行位选。
三个按键分别接着P1.0到P1.2进行时间设置。
3.2 时钟电路的软件设计分析:在单片机通电后首先给显示赋初值让数码管显示12点,然后进入程序先对定时器0进行初始化,之后进入大循环主函数由显示函数和按键扫描两条语句构成。
显示函数由正常的动态扫描显示部分组成进行位和段的分时显示,当无按键按下时也对按键扫描进行扫描但由于没按键按下会立刻跳出扫描程序。
当有按键按下时进入按键扫描程序,按键扫描程序由两部分组成一部分对调整键次数进行区分看是按下一次还是两次或是三次然后进人递增键和递减键的扫描对时分秒进行操作,最后回到主程序进行扫描当调整键按下四次时跳出按键扫描程序恢复到正常显示。
4程序设计4.1主程序主程序流程如图2所示,主程序先定时器0进行初始化,然后对显示函数和按键扫描函数进行扫描。
在中断中对时分秒进行设置等待显示,当有按键按下时,则转入相应的按键处理程序进行按键扫描。
图2(主流程图)4.2显示子程序这次设计共用了6个数码管,时、分、秒各占两位,显示程序中首先对时、分、秒进行分离然后在对时、分、秒进行为选和段选的分时传送让数码管进行动态扫描显示。
4.3定时器/计数器T0中断服务程序进入中断后现对定时器进行初始化然后在对一秒钟进行累计处理在其中完成对时分秒的累计清零处理。
4.4按键处理子程序当调整键按下时进入按键处理程序,处理过程图3。
图3(按键扫描流程图)5 结束语经过了三周的学习实践,我得到了很大的锻炼让我对单片机有更深的认识。
也使我对我的专业更加热爱,我爱我的专业。
在编程过程中我也得到了我们宿舍和同学的帮助让我和他们的关系更加密切。
在此期间我又学了很多我以前没有学到的知识,我特别的高兴,在以后短短的岁月中我会对我的专业倾注更多爱。
感谢曾经帮助过我的老师、同学、和所有帮助过我的所有人参考文献[1] 李朝青.单片机原理及接口技术[M].北京:北京航空航天大学出版社,2005[2] 谭浩强.c程序设计[M].北京:清华大学出版社,2005[3] 张桂红.单片机原理与应用[M].福建:福建科技技术出版社,2007[4] 张鹏.单片机原理与应用实例教程[J].海军出版社,2007附录1:总体电路图0123456S 5附录2:程序清单#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit key0=P1^0;//调整键sbit key1=P1^1;//时间增加键sbit key2=P1^2;//时间减少键sbit key3=P1^3;uchar code table[]={0x7e,0x48,0x3d,0x6d,0x4b,0x67,0x77,0x4c,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar temp,tt,shi,ge,aa=1,bb=2,cc,dd,temp1,temp2=12,con=0,con1,con2; void delay(uint z);void initt0();void display();void keyscan();void main(){ initt0();while(1){ display();keyscan();}}void timer0() interrupt 1//50ms定时中断{ TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==20)//一秒钟程序{tt=0;temp++;if(temp==60){temp=0;temp1++;if(temp1==60){temp1=0;temp2++;if(temp2==25){temp2=0;}} }}}void display()//显示子程序{ aa=temp2/10;bb=temp2%10;cc=temp1/10;dd=temp1%10;shi=temp/10;ge=temp%10;P2=0xdf;P0=table[aa];delay(1);P2=0xef;P0=table[bb]|0x80;delay(1);P2=0xf7;P0=table[cc];delay(1);P2=0xfb;P0=table[dd]|0x80;delay(1);P2=0xfd;P0=table[shi];delay(1);P2=0xfe;P0=table[ge];delay(1);}void delay(uint z)//延时1ms {uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void initt0()//定时器的初始化{ TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void keyscan()//键盘扫描程序{if(key0==0){ delay(10);while(key0==0);con++;//按键次数TR0=0;if(con>3){con=0;TR0=1;}}if(key1==0){delay(10);if(con==1)temp++;if(con==2)temp1++;if(con==3)temp2++;if(con==3){con1=24;}else{con1=60;}if(temp>=con1)temp=0;if(temp1>=con1)temp1=0;if(temp2>=con1)temp2=0;while(key1==0);}if(key2==0){delay(10);if(con==3){con2=23;}else{con2=59;}if(con==1){temp--;if(temp<=0)temp=con2;}if(con==2){ temp1--;if(temp1<=0) temp1=con2;}if(con==3){temp2--;if(temp2<=0) temp2=con2;}while(key2==0); }}。