欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14629|回復: 12
打印 上一主題 下一主題
收起左側(cè)

電子時鐘_秒表_按鍵計數(shù)的單片機設(shè)計 C語言程序代碼及仿真圖

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:198251 發(fā)表于 2017-5-8 17:41 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
一、 電子時鐘、秒表和計數(shù)器的設(shè)計

1、 實現(xiàn)的功能:
1)有key0,key1兩個功能按鍵,復位后,數(shù)碼管會默認顯示時鐘模式 HH.MM 。
HH表示小時,MM表示分鐘),
key0短按一次就進入到了秒表模式,數(shù)碼管顯示格式S.SS.S,(分別表示百秒,秒,毫秒)
key0再短按一次就進入到了計數(shù)器模式,數(shù)碼管顯示格式CCCC(分別為千位百位十位個位)
key0再短按一次,又進入到了時鐘顯示模式,就這樣由key0控制模式的轉(zhuǎn)換。
       2)有RST復位鍵,本身電路設(shè)計有上電自動復位功能,按下RST后,電路復位。
       3)有ckey0,ckey1 兩個計數(shù)按鍵,按下ckey0,計數(shù)加一,按下ckey1,計數(shù)減一。
4) 電子時鐘和秒表時間計時方法是采用89S52內(nèi)部計時器0的一種工作方式(詳見后面的代碼分析),通過計時器0中斷來控制時間的運行。
    5)計數(shù)器是采用外部中斷0和外部中斷1這兩個外部中斷實現(xiàn)加1和減1的操作。
(1) 電子時鐘模式:(以下“長按”表示按下按鍵的時間大于1,短按”表示按下的時間小于0.7  
1)長按key1一次,會進入到調(diào)整分鐘的模式,短按key1一次,分鐘會加一。
第二次長按key1,會進入到調(diào)整小時的模式,短按key1一次,小時加一。
     第三次長按key1,重新回到時鐘顯示模式,這時再短按key1,時間不會變化
2)長按key0一次,會進入到顯示秒的模式

(2) 秒表模式:
1) key0控制進入秒表模式后,短按key1一次,秒表計時開始,再短按key1一次計時結(jié)束
2) 長按key1一次,秒表清零
(3) 計數(shù)器模式
1) ckey0一下,計數(shù)加一,數(shù)碼管相應的顯示的數(shù)值加一,
  ckey1一下,計數(shù)減一,數(shù)碼管相應的顯示的數(shù)值減一,
由于數(shù)碼管的位數(shù)限制,最大只能顯示到9999,此時按下ckey0無反應;考慮到
實際計數(shù)功能,沒有設(shè)置負數(shù),所以最小顯示0000,這時按下ckey1 ,無反應。
2) 長按key1一次計數(shù)器清零。

2、 電路原理圖


(1) 使用片內(nèi)振蕩器




單片機源程序:
  1. #include <reg51.h>
  2. sbit key0=P1^0;
  3. sbit key1=P1^1;    //定義key0,key1接口
  4. unsigned char flag,con,mcount;  //flag為計數(shù)到一秒時給時鐘發(fā)的信號
  5. unsigned char count = 0;   
  6. unsigned char seccount =0; //作為時鐘的秒的計量單位
  7. unsigned char hour = 0;  //時鐘的時
  8. unsigned char min = 0;  //時鐘的分
  9. unsigned char sec = 0;   //時鐘的秒
  10. unsigned char keypress0,keypress1,mode,ms,s,ss,start;
  11. unsigned char
  12. Displaynum[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05, 0x10,0xd3,0x48,0x41,0x83,0x21,0x20,0x53,0x00,0x01,0xff,0xfb};  
  13. //數(shù)碼管十六進制譯碼表   
  14. unsigned char controlnum[]={0x08,0x04,0x02,0x01}; //控制四個數(shù)碼管顯示        
  15. unsigned char DisplayBuff[]={0x00, 0x00, 0x00, 0x00}; //每個數(shù)碼管的值     
  16. void display_state(); //數(shù)碼管顯示子程序
  17. void keyscan();  //鍵盤掃描子程序
  18. void timer();  //秒表子程序
  19. unsigned char count1,flag1,t_adjust=0,tm_adjust=0;
  20. unsigned char bKey0Pressed = 0, bKey1Pressed = 0;
  21. unsigned char ucStatus = 0;
  22. void main()
  23. {
  24.      TMOD = 0x01; //定時器0工作在模式1,GATE=0,C/t=0,16位模
  25.      TH0= (2^16-5000)/256;//定時器0 預存值,
  26.      TL0= (2^16-5000)%256;
  27.      TR0= 1;  //定時器0 啟動      
  28.      ET0= 1;  //定時器中斷0 允許
  29.      EA= 1;    //開中斷
  30.              IT0=1;   //外部中斷0下降沿觸發(fā)
  31.      IT1=1;   //外部中斷1 下降沿觸發(fā)
  32.      EX0=1;   //外部中斷0允許
  33.      EX1=1;   //外部中斷1允許
  34.      PX1=1;   //外部中斷1 為高優(yōu)先級中斷

  35.   while(1)   //死循環(huán),  
  36.   {
  37.     if(flag == 1)    //時鐘顯示
  38.     {
  39.            flag = 0;
  40.        sec++;
  41.           if(sec ==60)
  42.              {sec = 0;
  43.               min++;
  44.                 if(min ==60)
  45.                   {min = 0;
  46.                     hour ++;
  47.                      if(hour == 24)
  48.                       {
  49.                         hour = 0;
  50.                        }
  51.                   }
  52.               }
  53.       }
  54.         display_state();
  55.     keyscan();
  56.     timer();  

  57.      }
  58. }
  59. //////////////////////////////////ISR中斷服務程序,每5ms產(chǎn)生一個定時器0 中斷
  60. void Display() interrupt 1
  61.    {
  62.        TH0  = (2^16-5000)/256;
  63.        TL0  = (2^16-5000)%256;
  64.       
  65.        seccount ++;
  66.            mcount ++;
  67.            keypress0++;
  68.            keypress1++;

  69.        P2=0x00;  //P2口先清零
  70.             P0 = Displaynum[DisplayBuff[count]]; //P0口輸出
  71.               P2 = controlnum[count];  //P2口輸出

  72.            count++;
  73.            if(count==4)
  74.            count=0;
  75.        if(seccount == 200)  //200*5ms=1s
  76.           { seccount =0;
  77.             flag =1;  //每過1秒給時鐘信號加一秒
  78.           }
  79.       
  80.     }

  81. ///////////////////////////////////////////
  82. void display_state()
  83. {
  84.   if(mode == 0)  //時鐘模式,顯示時間
  85.    {
  86.     DisplayBuff[0] = hour/10;
  87.     DisplayBuff[1] = (hour%10)+10;    //"+10"是為了顯示加點的數(shù)字
  88.     DisplayBuff[2] = min/10;
  89.     DisplayBuff[3] = min%10;
  90.    }
  91.   if(mode == 1)  //秒表模式,顯示秒表
  92.    {
  93.     DisplayBuff[0] = ss +10; //"+10"是為了顯示加點的數(shù)字
  94.     DisplayBuff[1] = s/10;
  95.     DisplayBuff[2] = (s%10)+10;
  96.     DisplayBuff[3] = ms;
  97.     }
  98.    if(mode == 2)  // 計數(shù)器模式,顯示計數(shù)
  99.    {
  100.     DisplayBuff[0] = count1/1000;  //千位
  101.     DisplayBuff[1] = (count1-(count1/1000)*1000)/100; //百位
  102.     DisplayBuff[2] = (count1-(count1/100)*100)/10; //十位
  103.     DisplayBuff[3] = count1%10;  //個位
  104.     }
  105.         if(mode==3)   //顯示時鐘的秒,
  106.         {
  107.     DisplayBuff[0] = 20; //第一位不顯示
  108.     DisplayBuff[1] = 21; //第二位顯示一個點
  109.     DisplayBuff[2] = sec/10;//顯示秒的十位
  110.     DisplayBuff[3] = sec%10;//顯示秒的個位
  111.     }

  112. }  

  113. //**************//  
  114. //鍵盤掃描子程序//
  115. //**************//
  116. void keyscan()
  117. {
  118.     if(!key0 && bKey0Pressed == 0)  //檢測到key0按下
  119.     {
  120.         keypress0 = 0;
  121.              bKey0Pressed = 1;  //防止重入此判斷
  122.         while(!key0);  //如果沒放開,就等下去
  123.     }
  124.     if(key0 && bKey0Pressed == 1) //檢測到key0放開
  125.     {
  126.             bKey0Pressed = 0;  //防止重入此判斷
  127.              if (keypress0<120)        //如果是短按
  128.             {
  129.           if(ucStatus == 0x02)
  130.                          {
  131.                         ucStatus = 0x00;  
  132.                     mode = 0;   //時鐘模式
  133.                             t_adjust=0;
  134.             }
  135.                 else if(ucStatus == 0x00)
  136.                     {
  137.                          ucStatus = 0x01;
  138.                      mode = 1;  //秒表模式
  139.             }
  140.                         else if(ucStatus == 0x01)
  141.                         {
  142.                             ucStatus = 0x02;
  143.                      mode = 2;   //計數(shù)模式
  144.             }
  145.         }
  146.                 else if(keypress0>200)  //如果是長按
  147.                         mode=3;  //顯示時鐘的秒的模式
  148.       }
  149.                  ////////////////////////////////
  150.   if(mode == 0)  //進入時鐘模式后
  151.   {        
  152.     if(!key1 && (bKey1Pressed == 0))
  153.          { keypress1 = 0;
  154.              bKey1Pressed = 1;
  155.         while(!key1);
  156.            }

  157.     if(key1 && (bKey1Pressed == 1))
  158.     {
  159.                bKey1Pressed = 0;
  160.            if(keypress1 >= 200)   //如果是長按
  161.         {
  162.                 t_adjust++;
  163.                         if(t_adjust==3)
  164.                            t_adjust=0;
  165.         }
  166.            else if(keypress1 < 120)  
  167.                    switch (t_adjust)
  168.                          {

  169.                           case 1:{   //調(diào)整分
  170.                                    min++;
  171.                                    sec = 0;
  172.                                            if(min == 60)
  173.                                               min = 0;
  174.                                           }
  175.                                         break;
  176.                            case 2: {   //調(diào)整時
  177.                                     hour ++ ;
  178.                                     sec = 0;
  179.                                             if(hour == 24)
  180.                                               hour = 0;
  181.                                                 }
  182.                                         break;
  183.                      default:break;
  184.                           }
  185.             }
  186.         }
  187.       
  188.         else if(mode == 1)  //進入秒表模式
  189.       {   
  190.           if(!key1 && bKey1Pressed == 0)
  191.           {
  192.              keypress1 = 0;
  193.                    bKey1Pressed = 1;
  194.             while(!key1);
  195.           }        
  196.           if(key1 && bKey1Pressed == 1)
  197.           {
  198.                   bKey1Pressed = 0;
  199.                  if(keypress1 < 120)  //短按
  200.                         {
  201.                             if(flag1==0) { start=2;flag1=1;}  //start=2代表秒表開始計時
  202.                                 else {start=0;flag1=0;} //start=0,秒表停止計時
  203.                          }
  204.                          else if(keypress1>200)  //長按
  205.                                start=1;   //秒表清零

  206.                   }
  207.            }
  208. }


  209. void timer()  //秒表子程序
  210. {
  211.    if(mode==1) //進入秒表模式才執(zhí)行
  212.    {  
  213.      if(start==1) //清零
  214.      {  
  215. ms = 0;
  216.              s = 0;
  217.              ss = 0;           
  218.              mcount=0;
  219.           }
  220.          if(start==2)  //秒表開始計時
  221.          {
  222.        if(mcount==20)   //20*5ms=0.1s
  223.             {
  224.               mcount=0;
  225.                    ms++;
  226.                     if(ms == 10) // 10*0.1s=1s,s++
  227.                            {ms = 0;
  228.                             s ++;
  229.                                  if(s == 100)  //100s
  230.                                     {s = 0;
  231.                                     ss ++;
  232.                                          if(ss == 10)
  233.                                            {ss = 0;
  234.                                            s  = 0;
  235.                                            ms = 0;
  236.                                            }
  237.                                     }
  238.                             }
  239.                 }
  240.         }
  241. if (start==0);//秒表停止
  242.         }

  243. }
  244. //////////////////////
  245. void it0(void) interrupt 0 using 1  //外部中斷0 服務程序
  246. {
  247.     if(mode==2)   //只有在計數(shù)模式才執(zhí)行
  248.         {
  249.       count1++;    //每響應一次,計數(shù)加一
  250.       if(count1==10000)  //超出四位時,不能再加
  251.       count1 =9999;
  252.          }
  253. }
  254. void it2(void) interrupt 2 using 2  //外部中斷0 服務程序
  255. {
  256.     if(mode==2)   //只有在計數(shù)模式才執(zhí)行
  257.         {
  258.       if(count1!=0)


  259. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料打包下載:
miaob.rar (63.09 KB, 下載次數(shù): 269)


評分

參與人數(shù) 1黑幣 +5 收起 理由
swxyzzz + 5

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂3 踩

相關(guān)帖子

回復

使用道具 舉報

沙發(fā)
ID:223127 發(fā)表于 2017-10-30 07:31 | 只看該作者
可以 先先
回復

使用道具 舉報

板凳
ID:299654 發(fā)表于 2018-5-14 09:05 | 只看該作者

不錯的設(shè)計很好啊
回復

使用道具 舉報

地板
ID:354654 發(fā)表于 2018-6-19 20:44 | 只看該作者
guboy 發(fā)表于 2018-5-14 09:05
不錯的設(shè)計很好啊

你能不能發(fā)我一份
回復

使用道具 舉報

5#
ID:353831 發(fā)表于 2018-9-12 13:46 | 只看該作者
樓主,計數(shù)在259就歸0了是怎么回事?
回復

使用道具 舉報

6#
ID:353831 發(fā)表于 2018-9-12 16:22 | 只看該作者
你好,你發(fā)的時鐘和計數(shù)器程序為什么只能計數(shù)到255就歸零了
回復

使用道具 舉報

7#
ID:648392 發(fā)表于 2019-12-5 21:54 | 只看該作者
沒現(xiàn)象啊
回復

使用道具 舉報

8#
ID:659357 發(fā)表于 2019-12-12 09:43 來自觸屏版 | 只看該作者
我也想要
回復

使用道具 舉報

9#
ID:662569 發(fā)表于 2019-12-13 14:57 來自觸屏版 | 只看該作者
很棒的設(shè)計
回復

使用道具 舉報

10#
ID:662221 發(fā)表于 2019-12-13 16:28 | 只看該作者
謝謝!好評!
回復

使用道具 舉報

11#
ID:235131 發(fā)表于 2019-12-13 16:39 | 只看該作者
挺全面的,學習用
回復

使用道具 舉報

12#
ID:940268 發(fā)表于 2022-10-11 12:36 | 只看該作者
資料很全面,現(xiàn)在準備學C,需要一個參考案例
回復

使用道具 舉報

13#
ID:517912 發(fā)表于 2022-10-11 16:30 來自觸屏版 | 只看該作者
看起來感覺不錯哦
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

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