“彼岸之光”倒計時牌設計書
一.設計構想 ⒈設計一個倒計時牌。 ⒉倒計時牌由九個數碼管分別顯示“天”、“時”、“分”、“秒”,其中“天”為三位,“時”、“分”、“秒”各兩位。 ⒊倒計時牌設置兩個按鍵:select/start鍵和set鍵,用來設置計時時間(只能設置整天)。當按select/start鍵時,“天”的百位、十位、個位依次閃爍,閃爍位表明當前位被選中,此時按set鍵進行調整。三位調整完畢再按下select/start鍵,倒計時開始。 二.實現方法 ⒈定時器0工作在方式1(16位)下定時一秒,每秒觸發(fā)依次,使“秒”變量減一,相當于秒針。 ⒉兩個按鍵:select/start鍵和set鍵分別使用兩個外部中斷INT0和INT1(設置下降沿有效)。當相應的按鍵按下時,觸發(fā)相應的中斷子程序。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

單片機源程序如下:
- #include <reg51.h>
- #include <stdio.h>
- void timer0_init(); //定時器0初始化
- void delay(int); //延時程序
- void trans_led(int,int,int,int); //數碼管顯示傳送函數
- sbit P10=0x90; //管腳定義
- sbit P30=0xB0;
- sbit P20=0xA0;
- int day=0,hour=0,min=0,sec=0; //定義時間變量
- unsigned int state=0; //運行狀態(tài)標志
- unsigned int asec=0; //記錄定時器0中斷次數,當asec=20時計時為1s
- unsigned int check_b=0,check_s=0,check_g=0; //記錄set鍵的按下次數
- char table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定義表格
- main(){
- timer0_init();
- EX0=1;
- EX1=1;
- IT0=1;
- IT1=1;
- EA=1;
- TR0=1;
- while(1){
- switch(state){
- case(1):trans_led(100,5,10,10); //"天"的百位閃爍
- break;
- case(2):trans_led(10,100,5,10); //"天"的十位閃爍
- break;
- case(3):trans_led(10,10,100,5); //"天"的個位閃爍
- break;
- default:trans_led(0,20,20,20); //正常運行
- break;
-
- }
- }
- }
- void timer0_init(){
- TMOD=0x21;
- TH0=0x3C;
- TL0=0xB0;
- ET0=1;
- TF0=0;
- }
- void Timer0_overflow() interrupt 1 using 0{
- TH0=0x3C;
- TL0=0xB0;
- asec++;
- if(asec==20){ //定時一秒
- asec=0;
- if(sec==0){
- sec+=60;
- min--;
- }
- if(min<0){
- min+=60;
- hour--;
- }
- if(hour<0){
- hour+=24;
- day--;
- }
- if(day>=0){ //計時時間未完,秒減一
- sec--;
- }
- else{
- day=hour=min=sec=0; //計時結束
- TR0=0;
- }
- }
- }
- void Int0() interrupt 0 using 0{ //set鍵
- if(state>4)
- state=1;
- else
- state++;
- if(state==4){
- state=0;
- TR0=1;
- }
- }
- void Int1() interrupt 2 using 0{ //select/start鍵
-
- if(state>=1&&state<=3){
- TR0=0;
- hour=min=sec=0;
- timer0_init();
- }
- switch(state){
- case(1):day+=100;
- check_b++;
- break;
- case(2):day+=10;
- check_s++;
- break;
- case(3):day++;
- check_g++;
- break;
- default:break;
- }
-
- if(check_b>9) //計時范圍限制
- day-=1000;
- if(check_s>9){
- day-=100;
- }
- if(check_g>9){
- day-=10;
- }
-
- }
- void delay(int time){
- int i,j;
- for(i=0;i<=time;i++){
- for(j=0;j<=10;j++);
- }
- }
- void trans_led(int a,int b,int c,int d){
- //顯示秒
- P2=0xFE;
- P1=table[sec%10];
- delay(20);
- P2=0xFF;
-
- P2=0xFD;
- P1=table[sec/10];
- delay(20);
- P2=0xFF;
-
- //顯示分
- P2=0xFB;
- P1=table[min%10];
- delay(20);
- P2=0xFF;
-
- P2=0xF7;
- P1=table[min/10];
- delay(20);
- P2=0xFF;
-
-
- //顯示時
- P2=0xEF;
- P1=table[hour%10];
- delay(20);
- P2=0xFF;
-
- P2=0xDF;
- P1=table[hour/10];
- delay(20);
-
-
-
- //顯示天
- delay(a);
- P2=0xFF;
- P30=0;
- check_b=day/100;
- P1=table[check_b];
- delay(b);
- P2=0xFF;
-
-
- P30=1;
- P2=0x7F;
- check_s=(day/10)%10;
- P1=table[check_s];
- delay(c);
- P2=0xFF;
-
- P2=0xBF;
- check_g=day%10;
- P1=table[check_g];
- delay(d);
- P2=0xFF;
-
-
-
- }
復制代碼 全部資料51hei下載地址:
倒計時牌.zip
(540.18 KB, 下載次數: 137)
2019-3-10 15:42 上傳
點擊文件名下載附件
|