找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 9671|回復: 6
收起左側

單片機倒計時牌Proteus仿真圖+代碼 可倒計時24小時

  [復制鏈接]
ID:487926 發(fā)表于 2019-3-10 15:42 | 顯示全部樓層 |閱讀模式
“彼岸之光”倒計時牌設計書

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

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. void timer0_init();               //定時器0初始化
  4. void delay(int);                  //延時程序
  5. void trans_led(int,int,int,int);  //數碼管顯示傳送函數
  6. sbit P10=0x90;                    //管腳定義
  7. sbit P30=0xB0;
  8. sbit P20=0xA0;
  9. int day=0,hour=0,min=0,sec=0;     //定義時間變量
  10. unsigned int state=0;             //運行狀態(tài)標志
  11. unsigned int asec=0;              //記錄定時器0中斷次數,當asec=20時計時為1s
  12. unsigned int check_b=0,check_s=0,check_g=0;    //記錄set鍵的按下次數
  13. char table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};  //定義表格
  14. main(){
  15.   timer0_init();
  16.   EX0=1;
  17.   EX1=1;
  18.   IT0=1;
  19.   IT1=1;
  20.   EA=1;
  21.   TR0=1;
  22.   while(1){
  23.    switch(state){
  24.      case(1):trans_led(100,5,10,10); //"天"的百位閃爍
  25.              break;
  26.      case(2):trans_led(10,100,5,10); //"天"的十位閃爍
  27.              break;
  28.      case(3):trans_led(10,10,100,5); //"天"的個位閃爍
  29.              break;
  30.      default:trans_led(0,20,20,20);  //正常運行
  31.              break;

  32.    }
  33.   }
  34. }
  35. void timer0_init(){
  36.   TMOD=0x21;
  37.   TH0=0x3C;
  38.   TL0=0xB0;
  39.   ET0=1;
  40.   TF0=0;
  41. }
  42. void Timer0_overflow() interrupt 1 using 0{
  43.   TH0=0x3C;
  44.   TL0=0xB0;
  45.   asec++;
  46.   if(asec==20){             //定時一秒           
  47.     asec=0;
  48.     if(sec==0){
  49.       sec+=60;
  50.       min--;
  51.     }
  52.     if(min<0){
  53.       min+=60;
  54.       hour--;
  55.     }
  56.     if(hour<0){
  57.       hour+=24;
  58.       day--;
  59.     }
  60.     if(day>=0){              //計時時間未完,秒減一
  61.       sec--;
  62.     }
  63.     else{
  64.       day=hour=min=sec=0;    //計時結束
  65.       TR0=0;
  66.     }
  67.   }
  68. }
  69. void Int0() interrupt 0 using 0{  //set鍵
  70.   if(state>4)
  71.     state=1;
  72.   else
  73.     state++;
  74.   if(state==4){
  75.     state=0;
  76.     TR0=1;
  77.   }
  78. }
  79. void Int1() interrupt 2 using 0{ //select/start鍵

  80. if(state>=1&&state<=3){
  81.   TR0=0;
  82.   hour=min=sec=0;
  83.   timer0_init();
  84.   }
  85.     switch(state){
  86.        case(1):day+=100;
  87.                check_b++;
  88.                break;
  89.        case(2):day+=10;
  90.                check_s++;
  91.                break;
  92.        case(3):day++;
  93.                check_g++;
  94.                break;
  95.        default:break;      
  96.      }

  97.   if(check_b>9)               //計時范圍限制
  98.     day-=1000;
  99.   if(check_s>9){      
  100.     day-=100;
  101.   }
  102.   if(check_g>9){
  103.     day-=10;
  104.   }

  105. }
  106. void delay(int time){
  107.   int i,j;
  108.   for(i=0;i<=time;i++){
  109.     for(j=0;j<=10;j++);
  110.   }
  111. }
  112. void trans_led(int a,int b,int c,int d){
  113.                            //顯示秒
  114.   P2=0xFE;
  115.   P1=table[sec%10];
  116.   delay(20);
  117.   P2=0xFF;

  118.   P2=0xFD;              
  119.   P1=table[sec/10];
  120.   delay(20);
  121.   P2=0xFF;

  122.                           //顯示分
  123.   P2=0xFB;
  124.   P1=table[min%10];
  125.   delay(20);
  126.   P2=0xFF;

  127.   P2=0xF7;              
  128.   P1=table[min/10];
  129.   delay(20);
  130.   P2=0xFF;


  131.                          //顯示時
  132.   P2=0xEF;
  133.   P1=table[hour%10];
  134.   delay(20);
  135.   P2=0xFF;

  136.   P2=0xDF;              
  137.   P1=table[hour/10];
  138.   delay(20);



  139.                         //顯示天
  140.   delay(a);         
  141.   P2=0xFF;            
  142.   P30=0;
  143.   check_b=day/100;         
  144.   P1=table[check_b];
  145.   delay(b);
  146.   P2=0xFF;


  147.   P30=1;
  148.   P2=0x7F;
  149.   check_s=(day/10)%10;
  150.   P1=table[check_s];
  151.   delay(c);
  152.   P2=0xFF;

  153.   P2=0xBF;
  154.   check_g=day%10;
  155.   P1=table[check_g];
  156.   delay(d);
  157.   P2=0xFF;



  158. }
復制代碼
全部資料51hei下載地址:

倒計時牌.zip (540.18 KB, 下載次數: 137)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:97678 發(fā)表于 2020-4-26 21:12 | 顯示全部樓層
值得學習的好東西!��!
回復

使用道具 舉報

ID:772518 發(fā)表于 2020-6-8 10:16 | 顯示全部樓層
膜拜大神
回復

使用道具 舉報

ID:243874 發(fā)表于 2020-10-19 11:33 | 顯示全部樓層
大神,我只要時分秒的倒計時,怎么改
回復

使用道具 舉報

ID:196383 發(fā)表于 2023-9-1 14:47 | 顯示全部樓層
值得學習的好東西!��!
回復

使用道具 舉報

ID:1119063 發(fā)表于 2024-5-21 11:11 | 顯示全部樓層
值得學習的好東西!
回復

使用道具 舉報

ID:1134199 發(fā)表于 2024-10-21 08:33 | 顯示全部樓層
值得學習的好東西
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表