您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > AT8951单片机带闹钟数字时钟 C语言编程
计算机硬件综合课程设计报告课目:学院:班级:姓名:指导教师:目录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程序流程图开始声明变量初始化设置中断循环停滞等待按键按下显示时间time1重设定时量1000次second加一大于59minute加一大于59hour加一hou=hour%24滚动显示学号3.2函数模块及功能(1)voiddisplay_led()学号的滚动显示函数;(2)voiddisplay()输出数字信号输出扫描信号重新计时显示时间以及显示调节时间和闹钟时间的闪烁;(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();}}
本文标题:AT8951单片机带闹钟数字时钟 C语言编程
链接地址:https://www.777doc.com/doc-4547432 .html