![]() |
感謝樓主分享 |
不錯功能比較多 |
顯示函數修改一下,調整時相應的數碼管閃爍 void display(char miao,char fen, char shi) //顯示子程序,分別顯示時,分,秒 { if(slnum==0) { snum=30; fnum=30; mnum=30; } if(slnum==1) { snum=30; fnum=30; mnum++; } if(slnum==2) { snum=30; fnum++; mnum=30; } if(slnum==3) { snum++; fnum=30; mnum=30; } if(mnum>=30) //調整時,秒閃爍 { P0=table[miao%10]; wei7=0; delay(1); wei7=1; P0=0xff; P0=table[miao/10]; wei6=0; delay(1); wei6=1; P0=0xff; if(mnum==60) mnum=0; } P0=table[16]; wei5=0; delay(1); wei5=1; P0=0xff; if(fnum>=30) //調整時,分鐘閃爍 { P0=table[fen%10]; wei4=0; delay(1); wei4=1; P0=0xff; P0=table[fen/10]; wei3=0; delay(1); wei3=1; P0=0xff; if(fnum==60) fnum=0; } P0=table[16]; wei2=0; delay(1); wei2=1; P0=0xff; if(snum>=30) //調整時,小時閃爍 { P0=table[shi%10]; wei1=0; delay(1); wei1=1; P0=0xff; P0=table[shi/10]; wei0=0; delay(1); wei0=1; P0=0xff; if(snum==60) snum=0; } } |
原來的程序,設置調整的時候數碼管不閃爍,我在原來的程序上修改了一下,現在調整的時候對應的數碼管閃爍,這樣比較直觀的知道調整的是時、分、秒。仿真通過 /**************************/ /**************************/ /**** 電子時鐘 ****/ /**************************/ /**************************/ #include<reg52.h> #define uint unsigned int #define uchar unsigned char char miao,fen,shi; bit flag, flag_time; char set_miao=0,set_fen=0;set_shi=12; //鬧鐘初始化 uchar slnum,snum,fnum,mnum; sbit s1=P3^0; //功能鍵 sbit s2=P3^1; //加鍵 sbit s3=P3^2; //減鍵 sbit s4=P3^3; //鬧鐘設置 sbit led1=P1^0; //調整秒鐘的指示燈 sbit led2=P1^1; //調整分鐘的指示燈 sbit led3=P1^2; //調整時鐘的指示燈 sbit led4=P1^3; //鬧鐘設置指示燈 sbit BUZZ =P1^4; //報警 sbit wei0=P2^0; //定義8個數碼管段選 sbit wei1=P2^1; sbit wei2=P2^2; sbit wei3=P2^3; sbit wei4=P2^4; sbit wei5=P2^5; sbit wei6=P2^6; sbit wei7=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; //共陰數碼管編碼 void delay(uint z) //延時函數 { uint x,y; for(x=z;x>0;x--) for(y=125;y>0;y--); } void start() //定時器初始化 { TMOD=0x11; TH0=(65536-50000)/256; //時間累加 TH0=(65536-50000)%256; TH1=(65536-50000)/256; //鬧鐘設置 TH1=(65536-50000)%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=0; //關閉定時器 } void display(char miao,char fen, char shi) //顯示子程序,分別顯示時,分,秒 { if(slnum==0) { snum=30; fnum=30; mnum=30; } if(slnum==1) { snum=30; fnum=30; mnum++; } if(slnum==2) { snum=30; fnum++; mnum=30; } if(slnum==3) { snum++; fnum=30; mnum=30; } if(mnum>=30) //調整時,秒閃爍 { P0=table[miao%10]; wei7=0; delay(1); wei7=1; P0=0xff; P0=table[miao/10]; wei6=0; delay(1); wei6=1; P0=0xff; if(mnum==60) mnum=0; } P0=table[16]; wei5=0; delay(1); wei5=1; P0=0xff; if(fnum>=30) //調整時,分鐘閃爍 { P0=table[fen%10]; wei4=0; delay(1); wei4=1; P0=0xff; P0=table[fen/10]; wei3=0; delay(1); wei3=1; P0=0xff; if(fnum==60) fnum=0; } P0=table[16]; wei2=0; delay(1); wei2=1; P0=0xff; if(snum>=30) //調整時,小時閃爍 { P0=table[shi%10]; wei1=0; delay(1); wei1=1; P0=0xff; P0=table[shi/10]; wei0=0; delay(1); wei0=1; P0=0xff; if(snum==60) snum=0; } } void keyscan() //功能鍵 { if(s1==0) { delay(5); if(s1==0) //確認功能按下 { while(!s1); slnum++; //功能鍵按下次數記錄 if(slnum==1) //功能鍵第一次按下調整“秒鐘” { if(flag) TR0=1; //開定時器 else TR0=0; //關閉定時器 led1=0; } if(slnum==2) { led2=0; led1=1; } if(slnum==3) { led3=0; led2=1; led1=1; } if(slnum==4) { led3=1; led2=1; led1=1; slnum=0; TR0=1; } } } } void time() { if(slnum!=0) { if(s2==0) { delay(5); if(s2==0) { while(!s2); switch(slnum) { case 1: miao++; if(miao==60) miao=0; break; case 2: fen++; if(fen==60) fen=0; break; case 3: shi++; if(shi==24) shi=0; break; } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); switch(slnum) { case 1: miao--; if(miao<0) miao=59; break; case 2: fen--; if(fen<0) fen=59; break; case 3: shi--; if(shi<0) shi=23; break; } } } } } void set_time() { if(slnum==0) { if(s4==0) { delay(5); if(s4==0) { while(!s4); led4=~led4; flag=~flag; } } } if(flag) { if(slnum!=0) { if(s2==0) { delay(5); if(s2==0) { while(!s2); switch(slnum) { case 1: set_miao++; if(set_miao==60) set_miao=0; break; case 2: set_fen++; if(set_fen==60) set_fen=0; break; case 3: set_shi++; if(set_shi==24) set_shi=0; break; } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); switch(slnum) { case 1: set_miao--; if(set_miao<0) set_miao=59; break; case 2: set_fen++; if(set_fen<0) set_fen=59; break; case 3: set_shi--; if(set_shi<0) set_shi=23; break; } } } } } } void main() { start(); while(1) { keyscan(); time(); if(!flag) { display(miao,fen,shi); } else { display(set_miao,set_fen,set_shi); } if(miao==set_miao&&fen==set_fen&&shi==set_shi) { TR1=1; } if(flag_time) { TR1=0; BUZZ=1; flag_time=0; } set_time(); } } void time_0()interrupt 1 { uchar aa; TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; if(aa==20) { aa=0; miao++; if(miao>=60) { miao=0; fen++; if(fen>=60) { fen=0; shi++; if(shi>=24) { shi=0; } } } } } void time_1()interrupt 3 { uchar bz_time; TH1=(65536-50000)/256; TL1=(65536-50000)%256; bz_time++; if(bz_time==200) { bz_time=0; flag_time=1; } BUZZ=~BUZZ; } |
不錯功能比較多 |