1、8位数码管显示时钟8位数码管显示时钟本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能!本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能!C程序:#include unsigned char led12=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00; /用一维数组定义-9、横杠、全灭unsigned char num12=2,0,0,9,3,5,0,7,0,1,2,0 ;unsigned char a8; unsigned char second=0,minute=0,hour=0,year=
2、0,mon=1,day=1,day1,hsec,sec_m,min_m,N,temp1;unsigned char minute1=0,hour1=0;unsigned char void init1() S_flag=0; /闪烁标志位 TMOD=0x10; /定时器以方式定时 TH1=0xfc; TL1=0x18; EA=1; /打开总中断 ET1=1; /允许定时器中断 TR1=1; /开启定时器(开始定时计数) void init0() TMOD=0x01; /定时器以方式定时 TH0=0xff; TL0=0xff; EA=1; /打开总中断 ET0=1; /允许定时器中断 TR0=0
3、; /关闭定时器(关闭定时计数) void display_led() /流动显示学号 int x; char l,a,m; for(a=0;a21;a+) x=a-8; for(l=0;l6;l+) for(m=0;m=0&x12) P1=lednumx; else P1=led11; delay(10); x+; x-=8; void display() /显示时钟及显示调节位 switch(M) case 0: a0=ledhour/10; a1=ledhour%10; a2=led10; a3=ledminute/10; a4=ledminute%10; a5=led10; a6=le
4、dsecond/10; a7=ledsecond%10; break; case 1: if(S_flag=1) a0=ledhour/10; a1=ledhour%10; else a0=led11; a1=led11; a2=led10; a3=ledminute/10; a4=ledminute%10; a5=led10; a6=ledsecond/10; a7=ledsecond%10; break; case 2: a0=ledhour/10; a1=ledhour%10; a2=led10; if(S_flag=1) a3=ledminute/10; a4=ledminute%10
5、; else a3=led11; a4=led11; a5=led10; a6=ledsecond/10; a7=ledsecond%10; break; case 3: if(S_flag=1) a0=ledyear/10; a1=ledyear%10; else a0=led11; a1=led11; a2=led10; a3=ledmon/10; a4=ledmon%10; a5=led10; a6=ledday/10; a7=ledday%10; break; case 4: a0=ledyear/10; a1=ledyear%10; a2=led10; if(S_flag=1) a3
6、=ledmon/10; a4=ledmon%10; else a3=led11; a4=led11; a5=led10; a6=ledday/10; a7=ledday%10; break; case 5: a0=ledyear/10; a1=ledyear%10; a2=led10; a3=ledmon/10; a4=ledmon%10; a5=led10; if(S_flag=1) a6=ledday/10; a7=ledday%10; else a6=led11; a7=led11; break; case 6: if(S_flag=1) a0=ledhour1/10; a1=ledho
7、ur1%10; else a0=led11; a1=led11; a2=led10; a3=ledminute1/10; a4=ledminute1%10; a5=led10; a6=led11; a7=led11; break; case 7: a0=ledhour1/10; a1=ledhour1%10; a2=led10; if(S_flag=1) a3=ledminute1/10; a4=ledminute1%10; else a3=led11; a4=led11; a5=led10; a6=led11; a7=led11; void key_prc() /时钟和闹钟调节 if(K1=
8、0) delay(10); /延时去抖 if(K1=0) /按K1进行模式切换 M+; if(M=8) M=0; while(!K1);/等待按键释放 if(M!=0) switch(M) case 1: /模式-调时 if(K2=0) delay(10); /延时去抖 if(K2=0) /加键按下 if(hour 0) hour-; else hour=23; while(!K3); break; case 2: /模式-调分 if(K2=0) delay(10); if(K2=0) if(minute0) minute-; else minute=59; while(!K3); break
9、; case 3: /模式-调年 if(K2=0) delay(10); if(K2=0) if(year0) year-; else year=99; while(!K3); break; case 4: /模式-调月 if(K2=0) delay(10); if(K2=0) if(mon1) mon-; else mon=12; while(!K3); if(year%4=0&mon=2)day1=29;/闰年2月为29天 if(year%4!=0&mon=2)day1=28;/非闰年2月为28天 if(mon=4|mon=6|mon=9|mon=11)day1=30; if(mon=1|
10、mon=3|mon=5|mon=7|mon=8|mon=10|mon=12)day1=31; break; case 5: /模式-调日 if(K2=0) delay(10); if(K2=0) if(day1) day-; else day=day1; while(!K3); break; case 6: /模式-闹钟调时 if(K2=0) delay(10); if(K2=0) if(hour10) hour1-; else hour1=23; while(!K3); break; case 7: /模式-闹钟调分 if(K2=0) delay(10); if(K2=0) if(minut
11、e10) minute1-; else minute1=59; while(!K3); break; void display_rq() /年月日显示 if(K2=0) delay(10); if(K2=0) a0=ledyear/10; a1=ledyear%10; a2=led10; a3=ledmon/10; a4=ledmon%10; a5=led10; a6=ledday/10; a7=ledday%10; while(!K2); /等待按键释放 void key_prc2() /秒表模式转换 if(M=0) if(K3=0) delay(10); /延时去抖 if(K3=0) /按
12、K3进行模式切换 N+; if(N=2) N=0; while(!K3);/等待按键释放 void display_sec() /秒表显示 if(N=1) a0=ledmin_m/10; a1=ledmin_m%10; a2=led10; a3=ledsec_m/10; a4=ledsec_m%10; a5=led10; a6=ledhsec/10; a7=ledhsec%10; if(K2=0) delay(10); /延时去抖 if(K2=0) /加键按下 TR0=!TR0; while(!K2); /等待按键释放 void res_sec() /秒表复位 if(K1=0) delay(1
13、0); if(K1=0) min_m=0; sec_m=0; hsec=0; M=0; while(!K1) ; void main() /主程序 display_led(); init0(); init1(); while(1) key_prc(); key_prc2(); if(N=1) display_sec(); res_sec(); else display_rq(); display(); void time1() interrupt 3 /定时器中断函数 if(year%4=0&mon=2)day1=29;/闰年2月为29天 if(year%4!=0&mon=2)day1=28;
14、/非闰年2月为28天 if(mon=4|mon=6|mon=9|mon=11)day1=30; if(mon=1|mon=3|mon=5|mon=7|mon=8|mon=10|mon=12)day1=31; TH1=0xfc; /定时ms TL1=0x18; temp+; if(temp=1000) /配合定时器定时s temp=0; second+; if(second=60) second=0; if(minuteday1) day=1; mon+; if(mon12) mon=1; year+; if(year=99) year=0; if(hour1=hour&minute1=minu
15、te&K0=0) /闹钟时间到 BEEP=!BEEP; if(temp%250=0) /每ms S_flag=!S_flag; /闪烁标志位取反 if(k=8) k=0; P1=ak; P2=bk+; delay(1); P2=0xff; void sec_clo() interrupt 1 /秒表程序中断 TH0=0xff; TL0=0xff; temp1+; if(temp1=150) temp1=0; hsec+; if(hsec=100) hsec=0; sec_m+; if(sec_m=60) sec_m=0; min_m+; if(min_m=100) min_m=0; 仿真电路图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1