单片机电子时钟设计淮安信息职业技术学院电子工程系15077029李典一.题目:单片机电子时钟时钟二.内容:设计一个数字时钟,显示范围为00:00:00~23:59:59。通过几个开关进行控制,其中开关K1用于切换时间设置(调节时钟)和时钟运行(正常运行)状态;开关K2用于切换修改时、分、秒数值;开关K3用于使相应数值加1调节;开关K4用于减1调节;开关K5用于设定闹钟,闹钟同样可以设定初值,并且设定好后到时间通过实验箱音频放出一段乐曲作为闹铃。选做增加项目:还可增加秒表功能(精确到0.01s)或年月日设定功能。三.要求:开关K3进行加1调节时,当加至最大值(时为24,分和秒均为60)时要能正常归零。开关K4进行减1调节时,当减至最小值00时,均能再回到从相应最大值(时为23,分、秒均为59)。闹钟乐曲自定。四.电路及功能说明:电路图如图所示:图A图B图C该数字钟是用一片AT89C51A单片机通过编程去驱动8个数码管实现的。通过6个开关控制,从上到下6个开关KEY1~KEY6的功能分别为:KEY1,切换至秒表;KEY2,调节时间,每调一次时加1;KEY3,调节时间,每调一次分加1;KEY4,从其它状态切换至时钟状态;KEY5,切换至闹钟设置状态,也可以对秒表清零;KEY6,秒表暂停.控制键分别与P1.0~P1.5口连接.其中:A.通过P2口和P3口去控制数码管的显示如图所示P2口接数码管的a——g端,是控制输出编码,P3口接数码管的1——8端,是控制动态扫描输出.B.从P0.0输出一个信号使二极管发光,二极管在设置的闹钟时间到了时候发光,若有乐曲可以去驱动扬声器实现。(图A是时钟运行状态,图B是闹钟运行状态,图C是秒表运行状态)功能说明:1.各个控制键的功能:可对时间进行校准调节(只能加1);按下设置键数字时钟进入闹钟设置状态,设置闹钟的时间;时加1、分加1键是在校准时间时或设置闹钟时间对小时数或分钟数调节而设置的;按下秒切换键就可以进入秒表模式,同时秒表也开始计时,按下秒表暂停、复位键就暂停、归零,如果要重新对秒计时则可以按秒表开始、复位;清零键可以对闹钟清零。2.AT89C51单片机,通过编写程序对数码显示进行控制。3.八个7段数码管显示时钟和秒表信号。五.实验程序流程图:1.主程序流程图:开始定时器及中断寄存器初使化是否设定参数执行显示程序执行时钟,秒表,闹钟设定程序NY2.中断程序流程图恢复初值保护tcount=100?tcount加1秒数值time1.second加1,tcount归零分数值time1.minute加1,time1.second归零,YNtime1.second=60?YNtime1.minute=60?时数值time1.hour加1,time1.minute归零YN时数值time1.hour归零time1.hour23?YN判断时间与闹钟时间是否相同执行闹钟程序P0.0=1闹钟程序是否执行完返回主程序YYNN2.秒表中断程序流程图:恢复初值保护ms100?秒计数器加1,10ms计数器归零,即sec++,ms=0sec60?10ms计数器加1分计数器加1,秒计数器归零,即minit++,sec=0.输出字码,中断结束,返回上级主程序YYNN3.按键程序流程图:第一图为时钟和闹钟的调节.程序初使化判断时加键thour是否按下,P1.2=0?判断标志flag是否为0,flag=0?输出闹钟时个位加1,alarms[6]++,延时Y判断分加键盘tminute是否按下,P1.1=0?输出时钟时个位加1,dat1[6]++,延时.Ydat1[6]9?输出时钟时十位加1,dat1[7]++,延时dat1[7]2?时十位归零,dat1[7]=0NNYYNNalarms[6]9?输出闹钟时十位加1,alarms[7]++,延时alarms[7]2?时十位归零,alarms[7]=0.YYNN判断标志flag是否为0,flag=0?输出时钟分个位加1,dat1[3]++,延时.dat1[3]9?输出时钟分十位加1,dat1[4]++,延时dat1[4]2?分十位归零,dat1[4]=0输出闹钟分个位加1,alarms[3]++,延时alarms[3]9?输出闹钟分十位加1,alarms[4]++,延时alarms[4]2?分十位归零,alarms[4]=0.YYYNYNNYYNN第二图为进入中断和清零判断分加键tminute是否按下,P1.1=0?N判断秒表miaobiao1是否按下,P1.0=0?进入秒表中断,执行秒表中断程序判断清零键miaobiao2是否按下,P1.3=0?清零所有的计数器,各个显示的字码返加上级主程序NYYN六.实验结果分析:此时钟设计是利用protues仿真软件进行仿真。基本上实现了要求的功能,该多功能数字钟实现的时钟显示、闹钟设置和秒表功能,校准时钟时只设计了时加键和分加键以及清零键,没有设置减分减时键。可发通过循环调节得到正确的调节数值。另外,要求有一段乐曲来作为闹钟,可这里只是用了一个二级管的发光来实现这个功能。若用一个扬声器和一个乐曲能够实现。七.程序清单:#includereg51.h#defineucharunsignedchar#defineuintunsignedint#definedelay_time3uchark,dat[]={0,0,0,0,0,0,0,0};uinttcount,t,u;uchardat1[]={0,0,0,0,0,0,0,0};uchardat2[]={0,0,0,0,0,0,0,0};ucharalarms[]={0,0,0,0,0,0,0,0};uchardis_bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};unsignedcharcodeSEG7[11]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0xBF,/*-*/};sbitmiaobiao1=P1^0;sbittminute=P1^1;sbitthour=P1^2;sbitmiaobiao2=P1^3;sbitalarm=P1^4;sbitP0_0=P0^0;sbitP1_5=P1^5;sbitP1_6=P1^6;sbitP1_7=P1^7;ucharms=0;ucharflag=0;ucharsec=0;ucharminit=0;structtime{ucharsecond;ucharminute;ucharhour;}time1;ucharn,i;voiddelay(n){while(n--){for(i=120;i0;i--);}}voidmodify(void){EA=0;if(thour==0){if(flag==0){dat1[6]++;delay(180);if(dat1[6]9){dat1[6]=0;dat1[7]++;if(dat1[7]2){dat1[7]=0;}}}if(flag==1){alarms[6]++;delay(200);if(alarms[6]9){alarms[6]=0;alarms[7]++;if(alarms[7]2){alarms[7]=0;}}dat[6]=alarms[6];dat[7]=alarms[7];}}if(tminute==0){if(flag==0){dat1[3]++;delay(180);if(dat[3]=10){dat1[4]++;dat1[3]=0;if(dat1[4]5){dat1[4]=0;}}}if(flag==1){alarms[3]++;delay(200);if(alarms[3]9){alarms[4]++;alarms[3]=0;if(alarms[4]5){alarms[4]=0;}}dat[3]=alarms[3];dat[4]=alarms[4];}}if(miaobiao1==0){TR0=0;ET0=0;TR1=1;ET1=1;}if(miaobiao2==0){TR0=1;ET0=1;TR1=0;ET1=0;dat2[0]=0;dat2[1]=0;dat2[3]=0;dat2[4]=0;dat2[6]=0;dat2[7]=0;ms=0;sec=0;minit=0;}if(P1_5==0){TR0=0;ET0=0;TR1=0;ET1=0;}if(alarm==0){TR0=0;ET0=0;TR1=0;ET1=0;flag=1;dat[0]=0;dat[1]=0;dat[2]=10;dat[3]=0;dat[4]=0;dat[5]=10;dat[6]=0;dat[7]=0;}EA=1;}voidinit(void){TMOD=0x11;TH0=0xDB;TL0=0xFF;TH1=0xDB;TL1=0xFF;ET0=1;//10msET1=1;//TR1=1;TR0=1;tcount=0;ms=0;sec=0;minit=0;EA=1;}voidtest(void){for(k=0;k8;k++){P3=dis_bit[k];P2=SEG7[dat[k]];delay(1);P3=0X00;}}voidmain(){init();delay(10);while(1){modify();test();}}voiddiplay()interrupt1{ET0=0;TR0=0;TH0=0xDB;TL0=0xff;TR0=1;tcount++;if(tcount==100){time1.second++;tcount=0;dat1[0]=(time1.second)%10;dat1[1]=(time1.second)/10;}if(time1.second==60){time1.second=0;time1.minute++;dat1[3]=(time1.minute)%10;dat1[4]=(time1.minute)/10;}if(time1.minute==60){time1.minute=0;time1.hour++;dat1[6]=time1.hour%10;dat1[7]=time1.hour/10;}if(time1.hour23){time1.hour=0;}dat[5]=10;dat[2]=10;dat[0]=dat1[0];dat[1]=dat1[1];dat[3]=dat1[3];dat[4]=dat1[4];dat[6]=dat1[6];dat[7]=dat1[7];flag=0;P0=0x00;if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alarms[3]==dat1[3])){P0=0x01;}ET0=1;}voidtime_2(void)interrupt3{EA=0;TR0=0;TH1=0xDB;TL1=0xFF;TR1=1;ms++;dat2[0]=ms%10;dat2[1]=ms/10;if(ms=100){ms=0;sec++;dat2[3]=sec%10;dat2[4]=sec/10;if(sec=60){sec=0;minit++;dat2[6]=minit%10;dat2[7]=minit/10;}}dat[5]=10;dat[2]=10;dat[0]=dat2[0];dat[1]=dat2[1];dat[3]=dat2[3];dat[4]=dat2[4];dat[6]=dat2[6];dat[7]=dat2[7];EA=1;