当前位置:文档之家› 整点报时数字钟[精选.]

整点报时数字钟[精选.]

数字钟一、设计任务本任务为:数字钟。

设计任务具体内容如下:1.1 基本设计任务依据命题题意,本设计采用89C51进行24小时计时并显示。

要求其显示时间范围是00:00:00~23:59:59,具备有时分秒校准功能。

数字钟上面要带有闹钟,闹钟与时钟之间能随时切换,闹钟具备时分秒设置功能。

1.2 控制设计任务由于本设计采用手动校准时钟与手动设置闹钟方案,所以要求用较少的按键来达到切换闹钟与时钟、时钟时分秒校准、闹钟时分秒设置等功能。

1.3 软件设计任务数字钟的所有计时都要由软件控制实现。

用软件对几个按键所得信号进行相应改变,以控制时钟与闹钟的显示。

通过软件对闹钟与时钟进行比较,当时钟所显示时间与闹钟一样时,要启动报时模块。

三、总体设计经过对各个方案分析比较,最终确定总方案如图3-1所示。

该系统所有模块都由主单片机控制。

其中,设计各个模块,包括单片机、显示模块、电机驱动、光电探测由四节AA电池供电。

电机驱动采用L298驱动芯片控制。

用光电传感器对边线的探测来控制距离。

通过单片机的机器周期计算时间计数周期,以达到计时目的。

图3-1 系统方案图3.1 系统硬件电路设计3.1.1 显示及控制模块图3-4 语音报时模块3.2 系统软件设计3.2.1 软件计时的分析与计算单片机内部定时器有4种工作模式,方式0是13位计数器,由于计时时间过短,中断频率高,所以不选用此模式;方式2是自动重装式计数器,是8位计数器,同样中断频率过高;方式3也是8位计数器;方式1是16位计数器,综合考虑,选用方式1做精确计时。

由于51单片机是12分频,因此机器周期=晶振频率/12。

在该设计中,选用频率为12MHz的晶振,因此机器周期=1μs。

定时1s需要1000000个机器周期,因此通过20次定时器中断完成1s的定时,每次完成50000个周期的定时,因此每次给定时器的初值应该是TH0=B0H,TL0=3CH。

3.2.2 系统软件设计设计两套存储方案,一套存储时钟,一套存储闹钟,两者互不干涉,只有当两者相等时才会调用闹钟播放子程序,而当每次整点时则会调用整点报时子程序。

本设计有调用T0中断,并有以下子程序:void delay(void) //延时子程序void delay2(void) //1420专用延时子程序void play(unsigned char temp) //1420播放子程序void display(void) //显示子程序void rdisplay(void) //闹钟显示子程序void ring(void) //闹钟控制子程序void examring(void) //闹钟播放子程序void zhengdian(void) //整点报时子程序Ⅳ、测试结果及结果分析4.1 测试仪器及工具测试仪器及工具:电源一个。

4.2 测试步骤①、接上电源。

②、设定闹钟为00:01:00,并试听闹钟是否准确。

③、试听每次整点报时是否准确。

④、试验各按键功能是否正常。

4.3 测试结果如下闹钟与整点报时功能均正确无误,各按键功能均正常。

4.4 测试结果分析通过对测试数据的分析,可以看出,数字钟能实现时钟计时,并带有闹钟与整点报时功能,即数字钟已经实现了题目所给出的所有要求。

参考文献:1、胡汉才.单片机原理及其接口技术.北京:清华大学出版社,20052、阎石.数字电子技术基础.北京:高等教育出版社,20013、童诗白华成英.模拟电子技术基础.北京:高等教育出版社,20014、郁有文等.传感器原理及工程应用.西安:西安电子科技大学出版社,2008 附件一:参考程序如下:#include<at89x51.h>unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f};unsigned char code tab[]={0xfd,0xfb,0xf7,0xef,0xdf,0xbf};unsigned char code ts[]={0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40 ,0x48,0x50};unsigned char wei[]={0,1,2,3,4,5};unsigned char sec,min,hou,rsec,rmin,rhou,tcont; unsigned char a0,a1,a2;unsigned char smh;void delay(void) //延时子程序{ unsigned char i,j;for (i=10;i>0;i--)for(j=248;j>0;j--);}void delay2(void) //1420专用延时子程序{ unsigned char i,j,k;for (i=200;i>0;i--)for(j=248;j>0;j--)for(k=20;k>0;k--);}void play(unsigned char temp) //1420播放子程序{ P1=0;P3_0=1;P3_1=1;P1=temp;P3_1=0;delay2();P1=0;P3_1=1;}void display(void) //显示子程序{ for(a2=0;a2<6;a2++){ wei[0]=hou/10;wei[1]=hou%10;wei[2]=min/10;wei[3]=min%10;wei[4]=sec/10;wei[5]=sec%10;P2=tab[a2];P0=table[wei[a2]];delay();}}void rdisplay(void) //闹钟显示子程序{ for(a2=0;a2<6;a2++){ wei[0]=rhou/10;wei[1]=rhou%10;wei[2]=rmin/10;wei[3]=rmin%10;wei[4]=rsec/10;wei[5]=rsec%10;P2=tab[a2];P0=table[wei[a2]];delay();}}void ring(void) //闹钟控制子程序{ while(P3_5==0)rdisplay();smh=0;a0=0;while(a0==0){ rdisplay();if(P3_3==0){ delay();if(P3_3==0){ switch(smh){ case 0:rsec++;break;case 1:rmin++;break;case 2:rhou++;break;}if(rsec==60){ rsec=0;rmin++;}if(rmin==60){ rmin=0;rhou++;}if(rhou==24)rhou=0;}while(P3_3==0)rdisplay();}if(P3_2==0){ delay();if(P3_2==0){ switch(smh){ case 0:rsec--;break;case 1:rmin--;break;case 2:rhou--;break;}if(rsec==-1){ rsec=59;rmin--;}if(rmin==-1){ rmin=59;rhou--;}if(rhou==-1)rhou=23;}while(P3_2==0)rdisplay();}if(P3_4==0){ delay();if(P3_4==0)smh++;if(smh==3)smh=0;while(P3_4==0)rdisplay();}if(P3_5==0){ delay();if(P3_5==0)a0=1;while(P3_5==0)rdisplay();break;}}smh=0;}void examring(void) //闹钟播放子程序{ unsigned char i,j,k;if(sec==rsec){ if(min==rmin){ if(hou==rhou){P1=0;P3_0=1;P3_1=1;P1=0x70;P3_1=0;for (i=150;i>0;i--)display();P1=0;P3_1=1;P1=0;P3_0=1;P3_1=1;P1=0x70;P3_1=0;for (i=150;i>0;i--)display();P1=0;P3_1=1;P1=0;P3_0=1;P3_1=1;P1=0x70;P3_1=0;for (i=150;i>0;i--)display();P1=0;P3_1=1;P1=0;P3_0=1;P3_1=1;P1=0x70;P3_1=0;for (i=150;i>0;i--)display();P1=0;P3_1=1;}}}}void zhengdian(void) //整点报时子程序{ unsigned char dian;if(sec==0){ if(min==0){ dian=hou/10;if(dian==0){play(0x60);play(0x68);dian=hou%10;dian=ts[di an];play(dian);play(0x58);}if(dian==1){dian=hou%10;if(dian==0){play(0x60);play(0x68);play(0x50);pla y(0x58);}if(dian!=0){play(0x60);play(0x68);play(0x50);dia n=hou%10;dian=ts[dian];play(dian);play(0x58);}}if(dian==2){dian=hou%10;if(dian==0){play(0x60);play(0x68);play(0x10);pla y(0x50);play(0x58);}if(dian!=0){play(0x60);play(0x68);play(0x10);pla y(0x50);dian=hou%10;dian=ts[dian];play(dian);play(0 x58);}}}}}void main(void) //主程序{ unsigned char i;TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;tcont=0;sec=0;min=0;hou=0;rsec=0;rmin=0;rhou=0;smh=0;for (i=50;i>0;i--)display();while(1){ display();examring();zhengdian();if(P3_3==0){ delay();if(P3_3==0){ switch(smh){ case 0:sec++;break;case 1:min++;break;case 2:hou++;break;}if(sec==60){ sec=0;min++;}if(min==60){ min=0;hou++;}if(hou==24)hou=0;}while(P3_3==0)display();}if(P3_2==0){ delay();if(P3_2==0){ switch(smh){ case 0:sec--;break;case 1:min--;break;case 2:hou--;break;}if(sec==-1){ sec=59;min--;}if(min==-1){ min=59;hou--;}if(hou==-1)hou=23;}while(P3_2==0)display();}if(P3_4==0){ delay();if(P3_4==0)smh++;if(smh==3)smh=0;while(P3_4==0)display();}if(P3_5==0){ delay();if(P3_5==0)ring();}}}void t0(void) interrupt 1 using 0 //调用中断{ TH0=(65536-10000)/256;TL0=(65536-10000)%256;tcont++;if(tcont==100){ tcont=0;sec++;if(sec==60){ sec=0;min++;if(min==60){ min=0;hou++;if(hou==24)hou=0;}}}}附件二:总原理图如下:附件三:元器件清单元器件清单报表元件名称数量单片机AT89C51 一块语音芯片ISD1420 一块喇叭一个12M 晶振一个单排排针若干电容220 uF 5个47 uF 3 个10 uF 3 个47 nF 5 个33 pF 5 个电阻470K 5 个100K 5 个10K 10 个5.1K 5 个4.7K 10 个1K 5 个470 3 个大板子一块驻基体一个附表一元器件清单最新文件仅供参考已改成word文本。

相关主题