標題: 基于51單片機的升級時鐘程序 [打印本頁]

作者: lv181981    時間: 2018-7-18 09:25
標題: 基于51單片機的升級時鐘程序
基于51單片機的升級時鐘程序

單片機源程序如下:
  1. #include "reg52.h"                                  //單片機頭文件
  2. #define uchar unsigned char           //定義uchar 代替 unsigned char
  3. #define uint unsigned int
  4. sbit duan=P2^6;                                           //位定義
  5. sbit wei=P2^7;
  6. sbit k1=P3^4;
  7. sbit k2=P3^5;
  8. sbit k3=P3^6;
  9. sbit k4=P3^7;
  10. void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5);                  //函數(shù)聲明
  11. void delay(uchar mss);
  12. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};         //共陰數(shù)碼管顯示數(shù)字
  13. uchar ms=0,mg=0,fs=0,fg=0,ss=0,sg=0,m=0,f=0,s=0;                           //定義變量
  14.                                                                                                                            //主函數(shù)
  15. main()
  16. {        P0=0x00;
  17.     duan=1;
  18.         duan=0;
  19.         P0=0xc0;
  20.         wei=1;
  21.         wei=0;
  22.         TH0=(65536-50000)/256;
  23.         TL0=(65536-50000)%256;
  24.         TMOD=0x01;                                                                 //設置定時器工作方式---定時器0在工作模式1下工作,即一個16位的計時器
  25.         TR0=1;                                                                        //開定時器0
  26.         ET0=1;                                                                  //開中斷1即定時器中斷0
  27.         EA=1;                                                                  //開總中斷
  28.         while(1)

  29.         {
  30.            if(k1==0)                                                                //按鍵k1為低電頻
  31.           {         
  32.           delay(40);                                                                //延時去抖
  33.              if(k1==0)                                                                 //判斷k1是否按下
  34.                   {                                                                                  //等待按鍵釋放
  35.                           while(k1!=1);
  36.                    f++;                                                                        //分鐘自加
  37.                    m=0;                                                                        //秒置0
  38.                    if(f==60)                                                         //分鐘為60,自動置0,小時自加1
  39.                    {
  40.                                    f=0;
  41.                                 s++;
  42.                                 if(s==24)
  43.                                 {s=0;}
  44.                    }
  45.                   }
  46.                  
  47.           }
  48.           if(k2==0)
  49.           {
  50.                   delay(40);
  51.          if(k2==0)
  52.                  {
  53.                    while(k2!=1);
  54.                    f--;
  55.                    m=0;
  56.                    if(f==-1)
  57.                    {
  58.                                    f=59;
  59.                                 s--;
  60.                                 if(s==-1)
  61.                                 {s=0;}
  62.                    }
  63.                   }
  64.                  
  65.           }
  66.       if(k3==0)
  67.            {
  68.                    delay(40);
  69.              if(k3==0)
  70.                   {
  71.                     while(k3!=1);
  72.                     s++;
  73.                     m=0;
  74.                 if(s==24)
  75.                    {
  76.                                 {
  77.                                         s=0;
  78.                                 }
  79.                    }
  80.                   }
  81.         }
  82.            if(k4==0)
  83.            {
  84.                    delay(40);
  85.              if(k4==0)
  86.                   {
  87.                           while(k4!=1);
  88.                     s--;
  89.                     m=0;
  90.                    if(s==-1)
  91.                    {
  92.                                 {s=23;}
  93.                    }
  94.                   }
  95.                  
  96.           }
  97. mg=m%10;                                                        //秒個位是秒數(shù)除以10的余數(shù)
  98.           ms=m/10;                                                   //秒十位是秒數(shù)除以十的商
  99.           fg=f%10;
  100.           fs=f/10;
  101.           sg=s%10;
  102.           ss=s/10;
  103.          
  104.           display(mg,ms,fg,fs,sg,ss);                //調用顯示函數(shù),實參為秒的十位個位...
  105.         }
  106.        
  107. }

  108. void timer0() interrupt 1                                           //中斷函數(shù)
  109. {  
  110.     int num;                                                                  //num是個標志
  111.         TH0=(65536-50000)/256;                                         //計時器賦初值
  112.         TL0=(65536-50000)%256;
  113.         num++;                                                                          //當num==20即1s 進入秒自加,num清0
  114.         if(num==20)
  115.         {
  116.                  m++;
  117.                 num=0;
  118.                 if(m==60)                                                                 //秒自加到60自動清0,分自加
  119.                 {
  120.                         m=0;
  121.                 f++;
  122.                         if(f==60)
  123.                         {
  124.                                 f=0;
  125.                                 s++;
  126.                                 if(s==24)
  127.                                 {
  128.                                         s=0;
  129.                                 }
  130.                         }
  131.                 }
  132.         }

  133. }
  134. void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5)                   //顯示函數(shù)
  135. {
  136.        
  137.         P0=tab[a0];                 //P0口賦值tab[a0]即對應實參tab[mg]秒個位顯示
  138.         duan=1;                         //開段選即讀到tab[mg]到數(shù)碼管上
  139.         duan=0;                         //關段選
  140.         P0=0xdf;                 //P0賦0xdf即1101 1111
  141.         wei=1;                        //開位選,即第六個數(shù)碼管被選通
  142.         wei=0;                        //關位選
  143. //        delay(10);
  144.         delay(5);                //延時
  145. P0=tab[a1];
  146.         duan=1;
  147.         duan=0;
  148.     P0=0xef;
  149.         wei=1;
  150.         wei=0;

  151.         delay(5);
  152.         P0=0xf7;
  153.         wei=1;
  154.         wei=0;
  155.         P0=tab[a2];
  156.         duan=1;
  157.         duan=0;
  158. delay(5);
  159.         P0=0xfb;
  160.         wei=1;
  161.         wei=0;
  162.         P0=tab[a3];
  163.         duan=1;
  164.         duan=0;
  165.         delay(15);
  166.         P0=0xfd;
  167.         wei=1;
  168.         wei=0;
  169.         P0=tab[a4];
  170.         duan=1;
  171.         duan=0;
  172.         delay(5);
  173.         P0=0xfe;
  174.         wei=1;
  175.         wei=0;
  176.         P0=tab[a5];
  177.         duan=1;
  178.         duan=0;
  179.         delay(5);
  180.        
  181. }

  182. void delay(uchar mss)                 //延時函數(shù)
  183. {
  184.         int i,j;
  185.         for(i=mss;i>0;i--)
  186.         {
  187.                 for(j=30;j>0;j--);
  188.         }
  189. }
復制代碼

所有資料51hei提供下載:
時鐘.zip (28.81 KB, 下載次數(shù): 20)







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1