下面這個仿真效果圖,大家可按上面的電路來制作
/** //模仿秒表計時功能,獨立按鍵可控制計時數字的“暫停/走動”。(程序沒有考慮計時精確度控制) /*P2.2~P2.4與138譯碼器輸入口連接 /*P1.0連接獨立按鍵 /*P0口輸出數據 ***/ #include<AT89X51.H> code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共陰數碼管 0-9 '-' '熄滅‘表 unsigned int count,a,b,sec,min,hour; bit c_flag; // 暫停/計時 標志 /*****T1初始化*****/ void timer_1(void) { TH1=0x0ec; TL1=0x078; TR1=1; } /*****數據計數******/ void time_count(viod) { if(hour==60){sec=0,min=0,hour=0;} else if(sec!=59) sec++; else if(min!=59) {sec=0,min++;} else {min=0,hour++;} } /******數字調整*******/ void get_count(unsigned int x) { a=x/10; b=x%10; } /*******按鍵檢測********/ void key_tach(void) { int i,j; j=P1&0x01; if(j==0){ for(i=0;i<=200;i++); j=P1&0x01; if(j==0) {if(c_flag==1) c_flag=0; else c_flag=1;} } } /*******顯示程序********/ void display(viod) { int flag; P0=0x00; flag=count%8; switch(flag){ case 0:P2=flag*4; get_count(hour); P0=tab[a]; break; case 1:P2=flag*4; P0=tab[b]; break; case 2:P2=flag*4; P0=tab[10]; break; case 3:P2=flag*4; get_count(min); P0=tab[a]; break; case 4:P2=flag*4; P0=tab[b]; break; case 5:P2=flag*4; P0=tab[10]; break; case 6:P2=flag*4; get_count(sec); P0=tab[a]; break; case 7:P2=flag*4; P0=tab[b]; break; default:return; } } /*******中斷服務程序********/ void int1() interrupt 3 { key_tach(); if(c_flag==0) { if(count==7) {count=0;time_count();} else count++;} else { if(count==7) {count=0;} else count++;} display(); timer_1(); } /******主程序*****/ void main() { c_flag=0; count=0; sec=0; min=0; hour=0; TMOD=0x10; EA=1; ET1=1; timer_1(); while(1); }