1、6 位单片机电子钟 1.硬件电路设计:我们此次设计的电子钟采用 2 个 3 位共阳 LED 数码管作为显示器件,以 STC89C52 单片机作为控制器,可以显示时分秒。具体电路设计如下图:二:源程序:#include “at89x52.h“ #define uchar unsigned char #define uint unsigned int uchar code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff; uchar code tab1=0x40,0x79,0x24,0x30,0x19,0x12,0x4
2、2,0x78,0x00,0x10; uchar n; uchar hh,mm,ss; uchar nhh,nmm,nss; uint year; uchar day,mon,week; uchar hhs,hhg,mms,mmg,sss,ssg; uchar days,dayg,mons,mong; uchar nhhs,nhhg,nmms,nmmg,nsss,nssg; uchar set1=1,set2=1; sbit fm=P36; sbit k1=P10; sbit k2=P11; sbit k3=P12; sbit k4=P13; uchar table1=31,31,29,31,3
3、0,31,30,31,31,30,31,30,31; /闰年 uchar table2=31,31,28,31,30,31,30,31,31,30,31,30,31; /非闰年 void jishi(); void baoshi(); void alarm(); void set_time(); void set_alarm(); void set_mdw(); void key_change(); void key_set();void delay(int m) /延时程序,延时 m*0.5ms uint i; uint j; for (i=0;im;i+) for(j=0;j50;j+);
4、 void timer0( ) interrupt 1 TMOD=0x01; TH0=0x3c;TL0=0xb1;n+; jishi(); main() TMOD=0x01; TH0=0x3c;TL0=0xb1;TR0=1; EA=1; ET0=1; hh=23;mm=59;ss=50; nhh=7;nmm=30;nss=0; year=2008;mon=12;day=1;week=1; while(1) hhs=hh/10;/时分秒 hhg=hh%10; mms=mm/10; mmg=mm%10; sss=ss/10; ssg=ss%10; nhhs=nhh/10;/闹钟 nhhg=nhh%
5、10; nmms=nmm/10; nmmg=nmm%10; nsss=nss/10; nssg=nss%10; days=day/10;/月日 dayg=day%10; mons=mon/10; mong=mon%10;key_change(); /k1 按键扫描 key_set(); /k2 按键扫描 set_time(); /设置时间 set_mdw(); /设置月日星期 set_alarm(); /设置闹钟if(set1=1) /正常走时显示 P0=tabhhs;P2_5=0;delay(1);P2_5=1;/时十位 P0=tab1hhg;P2_4=0;delay(1);P2_4=1;/
6、时个位 P0=tabmms;P2_3=0;delay(1);P2_3=1;/分十位 P0=tab1mmg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tabsss;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabssg;P2_0=0;delay(1);P2_0=1;/秒个位 if(set1=2) /设置时间 P0=tabhhs;P2_5=0;delay(1);P2_5=1;/时十位 P0=tab1hhg;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabmms;P2_3=0;delay(1);P2_3=1;/分十位 P0=tab1mmg;
7、P2_2=0;delay(1);P2_2=1;/分个位 P0=tabsss;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabssg;P2_0=0;delay(1);P2_0=1;/秒个位 if(set1=3) /正常显示月日-星期 P0=tabmons;P2_5=0;delay(1);P2_5=1;/时十位 P0=tab1mong;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabdays;P2_3=0;delay(1);P2_3=1;/分十位 P0=tab1dayg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tab11;P2_1=0;
8、delay(1);P2_1=1;/秒十位 P0=tabweek;P2_0=0;delay(1);P2_0=1;/秒个位 if(set1=4) /设置月日-星期 P0=tabmons;P2_5=0;delay(1);P2_5=1;/时十位 P0=tabmong;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabdays;P2_3=0;delay(1);P2_3=1;/分十位 P0=tabdayg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tab11;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabweek;P2_0=0;delay(1);
9、P2_0=1;/秒个位 if(set1=5) /正常显示定时 P0=tabnhhs;P2_5=0;delay(1);P2_5=1;/时十位 P0=tabnhhg;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabnmms;P2_3=0;delay(1);P2_3=1;/分十位 P0=tabnmmg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tabnsss;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabnssg;P2_0=0;delay(1);P2_0=01;/秒个位 if(set1=6) /设置闹钟定时 P0=tabnhhs;P2_5
10、=0;delay(1);P2_5=1;/时十位 P0=tabnhhg;P2_4=0;delay(1);P2_4=1;/时个位 P0=tabnmms;P2_3=0;delay(1);P2_3=1;/分十位 P0=tabnmmg;P2_2=0;delay(1);P2_2=1;/分个位 P0=tabnsss;P2_1=0;delay(1);P2_1=1;/秒十位 P0=tabnssg;P2_0=0;delay(1);P2_0=01;/秒个位 baoshi(); /整点报时 alarm(); /闹钟 void jishi() /计时函数 if(n=20) n=0;ss+; if(ss=60) ss=0
11、;mm+; if(mm=60) mm=0;hh+; if(hh=24) hh=0;day+;week+; if(week=8) week=0; if(year%4=0mon+; if(mon=13) mon=0;year+; else /非闰年 if(day=table2mon+1) day=0;mon+; if(mon=13) mon=0;year+; uchar incone(uchar n) /加 1 函数 if(k3=0) delay(20); if(k3=0) n+; while(!k3); return(n); uchar decone(uchar m) /减 1 函数 if(k4
12、=0) delay(20); if(k4=0) m-; while(!k4); if(m0) m=0; return(m); void key_change() /k1 按键扫描 if(k1=0) delay(20); if(k1=0) set1+; while(!k1); if(set1=7) set1=1; void key_set() /k2 按键扫描 if(k2=0) delay(20); if(k2=0) set2+; while(!k2); if(set2=4) set2=1; void baoshi() /整点报时函数 if(mm=00 if(ss=1) fm=1; void a
13、larm( ) /闹钟函数 uchar x; if(nhh=0) goto end; if(hh=nhhx6;x+) fm=0; delay(30); fm=1; delay(20); fm=0; delay(30); fm=1; delay(20); fm=0; delay(30); fm=1; delay(20); fm=0; delay(30); fm=1; delay(180); end:; void set_time() /设置时间函数 if(set1=2) if(set2=1) hh=incone(hh); if(hh=24) hh=0; if(hh=-1) hh=23; hh=d
14、econe(hh); if(set2=2) mm=incone(mm); if(mm=60) mm=0; if(mm=-1) mm=59; mm=decone(mm); if(set2=3) ss=incone(ss); if(ss=60) ss=0; if(ss=-1) ss=59; ss=decone(ss); void set_mdw() /设置月日星期函数 if(set1=4) if(set2=1) mon=incone(mon); if(mon=13) mon=1; mon=decone(mon); if(mon=0) mon=12; if(set2=2) day=incone(da
15、y); if(day=32) day=1; day=decone(day); if(day=0) day=31; if(set2=3) week=incone(week); if(week=8) week=1; week=decone(week); if(week=0) week=7; void set_alarm() /设置闹钟函数 if(set1=6) if(set2=1) nhh=incone(nhh); if(nhh=24) nhh=0; if(nhh=-1) nhh=23; nhh=decone(nhh); if(set2=2) nmm=incone(nmm); if(nmm=60) nmm=0; nmm=decone(nmm); if(nmm=-1) nmm=59; if(set2=3) nss=incone(nss); if(nss=60) nss=0; nss=decone(nss); if(nss=-1) nss=59; 合作者:吴肖,陈耀,张鹏程,徐煜