標(biāo)題: 單片機(jī)數(shù)字鐘(兩個(gè)定時(shí)器,優(yōu)先級(jí)) [打印本頁(yè)]

作者: 會(huì)飛的魚(yú)1710    時(shí)間: 2018-11-14 16:22
標(biāo)題: 單片機(jī)數(shù)字鐘(兩個(gè)定時(shí)器,優(yōu)先級(jí))
數(shù)字鐘電路原理圖如下:


單片機(jī)源程序如下:
  1. #include"reg51.h"

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit k1 = P0^0;//按鍵調(diào)時(shí)間加一  秒
  5. sbit k2 = P0^1;                                //分
  6. sbit k3 = P0^2;                                //時(shí)
  7. sbit k4 = P0^7;             //暫停


  8. char code smduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,   //共陽(yáng)
  9.                                         0x80,0x90,0xbf};        //0-9和-

  10. uchar ms = 0,sec = 0,min =0,hour = 12;//定義變量
  11. uchar i = 0;
  12. /**************延時(shí)函數(shù),有參******/
  13. void delay(uchar h)//延時(shí)xms
  14. {
  15.         uchar k;
  16.                  for(;h > 0;h--)
  17.                         {
  18.                                  for(k = 110;k > 0;k--);
  19.                         }
  20. }

  21. /********定時(shí)器初始化************/
  22. void csh()
  23. {
  24.         TMOD = 0x11;//T0,T1工作方式1
  25.         TH1 = (65536 - 2500) / 256;           //給初值        T1給2.5ms
  26.         TL1 = (65536 - 2500) % 256;
  27.         TH0 = (65536 - 50000) / 256;                 //T0給50ms
  28.         TL0 = (65536 - 50000) % 256;
  29.         //開(kāi)中斷
  30.         ET1 = 1;
  31.         ET0 = 1;
  32.         EA = 1;
  33.         //二級(jí)中斷嵌套令T0 50ms優(yōu)先
  34.         PT0 = 1;
  35.         //開(kāi)定時(shí)器
  36.         TR0 = 1;
  37.         TR1 = 1;
  38. }

  39. /****************按鍵函數(shù)*******/
  40. void key()
  41. {
  42.          if(k1 == 0) //秒
  43.          {
  44.                  delay(10);//延時(shí)10ms
  45.                 if(k1 == 0)
  46.                 {
  47.                         if(sec > 59) sec = 0;
  48.                         else sec++;                                                     
  49.                 }
  50.          while(k1 == 0);
  51.          }                                                        
  52.          if(k2 == 0)//分
  53.          {
  54.                  delay(10);//延時(shí)10ms,
  55.                 if(k2 == 0)
  56.                 {
  57.                         if(min > 59) min = 0;
  58.                         else min++;
  59.                 }
  60.          while(k2 == 0);
  61.          }
  62.          if(k3 == 0) //時(shí)
  63.          {
  64.                  delay(10);//延時(shí)10ms
  65.                 if(k3 == 0)
  66.                 {
  67.                         if(hour > 23) hour = 0;
  68.                         else hour++;
  69.                 }
  70.             while(k3 == 0);
  71.          }
  72.          if(k4 == 0)
  73.          {
  74.                  delay(10);//延時(shí)10ms
  75.                 if(k4 == 0)
  76.                 {
  77.                          TR0 = 0;
  78.                         TR1 = 0;
  79.                 }
  80.                 while(k4 == 0);
  81.          }
  82.        
  83.                

  84. }




  85. /***********定時(shí)器T0中斷(產(chǎn)生時(shí)間數(shù)據(jù))*********/
  86. void i_time() interrupt 1
  87. {
  88.         TH0 = (65536 - 50000) / 256;                 //初值
  89.         TL0 = (65536 - 50000) % 256;
  90.         if(ms > 19)        //1s時(shí)間到
  91.         {
  92.                 ms = 0;
  93.                 if(sec >59)        //1min時(shí)間到
  94.                         {
  95.                                 sec = 0;
  96.                                         if (min>59)//1h到
  97.                                         {
  98.                                                 min = 0;
  99.                                                 if(hour > 23) hour = 0;
  100.                                                 else hour++;
  101.                                         }
  102.                                         else min++;
  103.                         }
  104.                 else sec++;
  105.         }
  106.         else ms++;//50ms中斷計(jì)數(shù)
  107.        
  108. }
  109. /***********定時(shí)器T1中斷(產(chǎn)生動(dòng)態(tài)掃描)*********/
  110. void t_display() interrupt 3
  111. {
  112.         TH1 = (65536 - 2500) / 256;//給初值        T1給2.5ms
  113.         TL1 = (65536 - 2500) % 256;       
  114.         i++;
  115.         if(i > 7) i =0;
  116.         switch(i)
  117.                 {
  118.                        
  119.                         case 0:P3 = 0x00; P2 = smduan[sec % 10]; P3 = 0x01;  //第0次中斷,顯示秒個(gè)位
  120.                                 break;
  121.                         case 1: P3 = 0x00;P2 = smduan[sec / 10]; P3 = 0x02;  //第1次中斷,顯示秒十位
  122.                                 break;
  123.                         case 2:P3 = 0x00; P2 = smduan[10]; P3 = 0x04;  //第2次中斷,顯示-
  124.                                 break;
  125.                         case 3:P3 = 0x00; P2 = smduan[min % 10]; P3 = 0x08;  //第3次中斷,顯示分個(gè)位
  126.                                 break;
  127.                         case 4: P3 = 0x00;P2 = smduan[min / 10]; P3 = 0x10;  //第4次中斷,顯示分十位
  128.                                 break;
  129.                         case 5: P3 = 0x00;P2 = smduan[10]; P3 = 0x20;  //第5次中斷,顯示-
  130.                                 break;
  131.                         case 6:P3 = 0x00; P2 = smduan[hour % 10]; P3 = 0x40;  //第6次中斷,顯示時(shí)個(gè)位
  132.                                 break;
  133.                         case 7:P3 = 0x00; P2 = smduan[hour / 10]; P3 = 0x80;  //第7次中斷        ,顯示時(shí)十位
  134.                                 break;
  135.                   }                                  
  136. }

  137. /***************主函數(shù)************/
  138. main()
  139. {
  140.         csh();
  141.         while(1)
  142.         {
  143.                 key();
  144.         }                                                       
  145. }
復(fù)制代碼

所有資料51hei提供下載:
KEIL.zip (25.43 KB, 下載次數(shù): 33)







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