您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 51单片机数字时钟(带闹钟)
计算机硬件综合课程设计报告课目:学院:班级:姓名:指导教师:目录1设计要求1.1功能需求1.2设计要求2硬件设计及描述2.1总体描述2.2系统总体框图2.3Proteus仿真电路图3软件设计流程及描述3.1程序流程图3.2函数模块及功能4心得体会附:源程序1设计要求1.1功能需求(1)实现数字时钟准确实时的计时与显示功能;(2)实现闹钟功能,即系统时间到达闹钟时间时闹铃响;(3)实现时间和闹钟时间的调时功能;(4)刚启动系统的时候在数码管上滚动显示数字串(学号)。1.2设计要求(1)应用MCS-51单片机设计实现数字时钟电路;(2)使用定时器/计数器中断实现计时;(3)选用8个数码管显示时间;(4)使用3个按钮实现调时间和闹钟时间的功能。按钮1:更换模式(模式0:正常显示时间;模式1:调当前时间的小时;模式2;调当前时间的分钟;模式3:调闹钟时间的小时;模式4:调闹钟时间的分钟);按钮2:在非模式0下给需要调节的时间数加一,但不溢出;按钮3:在非模式0下给需要调节的时间数减一,但不小于零;(5)在非0模式下,给正在调节的时间闪烁提示;(6)使用扬声器实现闹钟功能;(7)采用C语言编写程序并调试。2硬件设计及描述2.1总体描述(1)单片机采用AT89C51型;(2)时间显示电路:采用8个共阴极数码管,P1口驱动显示数字,P2口作为扫描信号;(3)时间设置电路:P3.0、P3.1、P3.2分别连接3个按键,实现调模式,时间加和时间减;(4)闹钟:P3.3口接扬声器。2.2系统总体框图2.3Proteus仿真电路图3软件设计流程及描述3.1程序流程图3.2函数模块及功能(1)voiddisplay_led()学号的滚动显示函数;(2)voiddisplay()显示时间以及显示调节时间和闹钟时间的闪烁;开始声明变量初始化设置中断循环停滞等待按键按下显示时间time1重设定时量1000次second加一大于59minute加一大于59hour加一hou=hour%24滚动显示学号输出数字信号输出扫描信号重新计时(3)voidkey_prc()键盘功能函数,实现3个按键有关的模式转换以及数字加一减一;(4)voidinit()初始化设置中断;(5)voidtime1()interrupt3定时器1中断函数,实现计时功能。4心得体会首先在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做单片机实习,我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:C语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。最后,在设计之前,我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力提高都会受益于我在以后的学习、工作和生活中。附:源程序#includereg51.hunsignedcharled[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//用一维数组定义-9、横杠、全灭unsignedcharnum[10]={2,0,0,8,0,1,1,6,6,8};unsignedchara[8];unsignedcharsecond=0,minute=0,hour=0;unsignedcharminute1=0,hour1=0;unsignedcharb[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//扫描unsignedchark=0;unsignedinttemp;//记录毫秒为秒的变量unsignedcharM,S_flag;//M是模式,更新时间的种模式加上正常模式S_flag闪烁标志sbitK1=P3^0;sbitK2=P3^1;sbitK3=P3^2;sbitBEEP=P3^3;voiddelay(unsignedn)//0.2毫秒{intx,y;for(x=0;xn;x++)for(y=0;y24;y++);}voidinit(){M=0;S_flag=0;//闪烁标志位TMOD=0x10;//定时器以方式定时TH1=0xfc;TL1=0x18;EA=1;//打开总中断ET1=1;//允许定时器中断TR1=1;//开启定时器(开始定时计数)}voiddisplay_led(){intx;charl,a,m;for(a=0;a26;a++){x=a-8;for(l=0;l50;l++){for(m=0;m8;m++){P2=b[m];if(x=0&&x10)P1=led[num[x]];elseP1=led[11];delay(10);x++;}x-=8;}}}voidtime1()interrupt3//定时器中断函数{TH1=0xfc;//定时msTL1=0x18;temp++;if(temp==1000)//配合定时器定时s{temp=0;second++;}if(second==59){second=0;if(minute59)minute++;else{minute=0;hour++;hour%=24;}}if(hour1==hour&&minute1==minute&&second10)//闹钟时间到{BEEP=!BEEP;}if(temp%250==0)//每msS_flag=!S_flag;//闪烁标志位取反if(k==8)k=0;P1=a[k];P2=b[k++];delay(1);P2=0xff;}voiddisplay(){switch(M){case0:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case1:{if(S_flag==1){a[0]=led[hour/10];a[1]=led[hour%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case2:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];if(S_flag==1){a[3]=led[minute/10];a[4]=led[minute%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case3:{if(S_flag==1){a[0]=led[hour1/10];a[1]=led[hour1%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute1/10];a[4]=led[minute1%10];a[5]=led[10];a[6]=led[11];a[7]=led[11];}break;case4:{a[0]=led[hour1/10];a[1]=led[hour1%10];a[2]=led[10];if(S_flag==1){a[3]=led[minute1/10];a[4]=led[minute1%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[11];a[7]=led[11];}}}voidkey_prc(){if(K1==0){delay(10);//延时去抖if(K1==0)//按K1进行模式切换{M++;if(M==5)M=0;}while(!K1);//等待按键释放}if(M!=0){switch(M){case1://模式——调时{if(K2==0){delay(10);//延时去抖if(K2==0)//加键按下{if(hour23)hour++;elsehour=0;}while(!K2);//等待按键释放}if(K3==0){delay(10);if(K3==0){if(hour0)hour--;elsehour=23;}while(!K3);}}break;case2://模式——调分{if(K2==0){delay(10);if(K2==0){if(minute59)minute++;elseminute=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(minute0)minute--;elseminute=59;}while(!K3);}}break;case3://模式——闹钟调时{if(K2==0){delay(10);if(K2==0){if(hour123)hour1++;elsehour1=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(hour10)hour1--;elsehour1=23;}while(!K3);}}break;case4://模式——闹钟调分{if(K2==0){delay(10);if(K2==0){if(minute159)minute1++;elseminute1=0;}while(!K2);}if(K3==0){delay(10);//延时去抖if(K3==0)//减键按下{if(minute10)minute1--;elseminute1=59;}while(!K3);}}break;}}}voidmain(){display_led();init();while(1){key_prc();display();}}欢迎您的光临,Word文档下载后可修改编辑.双击可删除页眉页脚.谢谢!你的意见是我进步的动力,希望您提出您宝贵的意见!让我们共同学习共同进步!学无止境.更上一层楼。
本文标题:51单片机数字时钟(带闹钟)
链接地址:https://www.777doc.com/doc-8546142 .html