久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1475|回復: 4
打印 上一主題 下一主題
收起左側

交作業:倒計時鐘(STC89C52RC單片機+旋轉編碼器+TM1637)

  [復制鏈接]
跳轉到指定樓層
樓主
跟論壇前輩抄抄改改,累死若干腦細胞,弄了這么個縫合怪,可以放廚房燉排骨計時間了。1、上電復位靜態顯示0000。
2、按旋轉編碼器中鍵第1次顯示00:00,分鐘00按秒閃爍;左右旋轉分鐘減加(00-59)。
3、按旋轉編碼器中鍵第2次顯示00:XX,小時00按秒閃爍;左右旋轉小時減加(00-23),所以最大定時時間23小時59分。
4、按旋轉編碼器中鍵第3次顯示XX:XX,秒點閃爍,開始倒計時走時。七色LED點亮(自閃)表示正在倒計時。倒計時結束顯示00:00并全部秒閃,七彩LED熄滅,有源蜂鳴器按秒叫喚。
5、按旋轉編碼器中鍵第4次單片機復位,顯示0000,蜂鳴器關閉,LED關閉。
不會畫proteus,再說沒幾個元件。TM1637 DIO接P3^4、CLK接P3^5,旋轉編碼器中鍵接P3^6+GND,左右接P3^2、P3^3、GND,蜂鳴器接P0^7(P0是開漏,接其他口準雙向口灌電流太小帶不動),七彩LED接P2^1。精度么,5分鐘差不了1秒,沒耐心再比對更長時間的去微調了

制作出來的實物圖如下:


單片機源程序如下:
  1. #include "STC89C52.h"
  2. #include "TM1637.h"
  3. #include "intrins.h"

  4. sbit KA=P3^2;                //旋轉編碼器A
  5. sbit KB=P3^3;                //旋轉編碼器B
  6. sbit KC=P3^6;                //旋轉編碼器中
  7. bit relay=0;        //時間到標志
  8. sbit com=P0^7;        //蜂鳴器
  9. sbit con=P2^1;  //七彩LED
  10. unsigned char KO=0;  //旋轉編碼器
  11. char Num=0,Nu=0;                //計時變量
  12. unsigned char hour=0,minute=0,second=0,time_count=0;   //時,分,秒,10ms計數器
  13. unsigned char show[6]={0,0,0,0,0,0}; //TM1637四位數碼管顯示數組:小時的十位和個位,分鐘的十位和個位,最后兩個為小時和分鐘。
  14. unsigned int Se=0;   //秒計數
  15. unsigned int Kcase=0;//旋轉編碼器中鍵按鍵次數
  16. bit flag_1s=0;                //秒任務標志位
  17. bit flag_500ms=0;        //半秒標志位
  18. bit stat_100ms=0;        //快閃標志位
  19. bit stat_500ms=0;        //半秒狀態位,控制閃爍

  20. bit flag=0;                //調整標志位

  21. /******************************
  22. 函數說明:延時函數,STC_ISP軟件給出 @6MHz 1T單片機
  23. 入口參數:us=延時微秒數
  24. 出口參數:無
  25. ******************************/
  26. void Delay_US(unsigned int us)
  27. {
  28.    while(us--)
  29.    {
  30.                 _nop_();
  31.                 _nop_();
  32.                 _nop_();
  33.                 _nop_();
  34.                 _nop_();
  35.                 _nop_();
  36.         }
  37. }//us延時函數結束

  38. void djs(void)   ///////////////////////////////倒計時
  39. {                                
  40.                                 if(flag_1s==1)
  41.                                 {flag_1s=0;
  42.                                          if(second>0)
  43.                                                 {second--;
  44.                                                 Se++;
  45.                                                 }
  46.                                         else if(minute>0)
  47.                                                 {minute--;
  48.                                                 second=59;}
  49.                                         else if(hour>0)
  50.                                                 {hour--;
  51.                                                 minute=59;
  52.                                                 second=59;}
  53.                                         else{relay=1;flag=1;}
  54.                                 }
  55.                                 show[4]=hour;        
  56.                                 show[5]=minute;
  57.                             show[0]=show[4]/10%10; //顯示的小時十位數
  58.                                 show[1]=show[4]%10;           //顯示的小時個位數
  59.                                 show[2]=show[5]/10%10; //顯示的分鐘十位數
  60.                                 show[3]=show[5]%10;           //顯示的分鐘個位數
  61.                                                 //以下時間到,閃爍顯示00
  62.                                  if(relay==1)
  63.                                 {               
  64.                                                         con=1;
  65.                                                         if(stat_500ms==0)
  66.                                                         {
  67.                                                          TM1637_display(21,21,21,21,0); //半秒熄滅
  68.                                                                         if(Se==0)
  69.                                                                         {com=1;}
  70.                                                                         else{com=0;}
  71.                                                         }
  72.                                                         else
  73.                                                         {
  74.                                                          TM1637_display(0,0,0,0,1); //半秒顯示00:00
  75.                                                         com=1;
  76.                                                         }
  77.                                 }        
  78.                                                         
  79.                                 else {        com=1;
  80.                                                         con=0;
  81.                                                         if(stat_500ms==0)
  82.                                                         {
  83.                                                          TM1637_display(show[0],show[1],show[2],show[3],stat_500ms); //半秒秒點
  84.                                                         }
  85.                                                         else
  86.                                                         {
  87.                                                          TM1637_display(show[0],show[1],show[2],show[3],stat_500ms); //半秒秒點
  88.                                                         }

  89.                                            }
  90.                         
  91. }

  92. /******************************
  93. 函數說明:定時器0初始化,12T自動重裝模式,定時10毫秒
  94. ******************************/
  95. void Timer0Init(void)        //10毫秒@6.000MHz
  96. {
  97.         AUXR &= 0x7F;                //定時器時鐘12T模式
  98.         TMOD &= 0xF0;                //設置定時器模式
  99.         TL0 = 0x78;                        //設置定時初值
  100.         TH0 = 0xEC;                        //設置定時初值
  101.         TF0 = 0;                        //清除TF0標志
  102.         TR0 = 1;                        //定時器0開始計時
  103.         ET0=1;                                //允許T0中斷
  104.         EA=1;                                //開全局中斷
  105. }//定時器初始化結束

  106. void Zuan()   //旋轉處理
  107. {                                            
  108.       switch(Kcase)
  109.                 {case 1:
  110.                                                   if((KO==KA)||(KA==1))  //不理會A引腳上升沿,低電平每個脈沖只做一次處理
  111.                                          {
  112.                                  KO=KA;
  113.                                                 _nop_();        
  114.                                                 _nop_();
  115.                                 return;
  116.                                          }                                                         
  117.                                       (KB == 0)?Num-- : Num++;   //根據引腳B的值,判斷正反轉
  118.                                        KO=KA;    //存儲引腳A狀態
  119.                                                 _nop_();
  120.                                                 _nop_();
  121.         
  122.                                                 if(Num<0){Num=59;}
  123.                                                  if(Num==60){Num=0;}
  124.                                 show[5]=Num;
  125.                             show[0]=show[4]/10%10; //顯示的小時十位數
  126.                                 show[1]=show[4]%10;           //顯示的小時個位數
  127.                                 show[2]=show[5]/10%10; //顯示的分鐘十位數
  128.                                 show[3]=show[5]%10;           //顯示的分鐘個位數
  129.                                 minute=Num;
  130.                                 break;
  131.                 case 2:
  132.                                                   if((KO==KA)||(KA ==1))  //不理會A引腳上升沿,低電平每個脈沖只做一次處理
  133.                                          {
  134.                                  KO=KA;
  135.                                                 _nop_();
  136.                                                 _nop_();
  137.                                                 _nop_();
  138.                                           return;
  139.                                          }                                                         
  140.                                        (KB == 0)?Nu-- : Nu++;   //根據引腳B的值,判斷正反轉
  141.                                         KO=KA;
  142.                                                  _nop_();
  143.                                                 _nop_();
  144.                                                 _nop_();//存儲引腳A狀態
  145.                                                  if(Nu<0){Nu=23;}
  146.                                                  if(Nu==24){Nu=0;}
  147.                                         show[4]=Nu;
  148.                               show[0]=show[4]/10%10; //顯示的小時十位數
  149.                                         show[1]=show[4]%10;           //顯示的小時個位數
  150.                                         show[2]=show[5]/10%10; //顯示的分鐘十位數
  151.                                         show[3]=show[5]%10;           //顯示的分鐘個位數
  152.                                         hour=Nu;
  153.                                         break;
  154.                
  155.                 case 3:
  156.                                 break;
  157.                 }
  158. }




  159. void main(void)
  160. {
  161.         Se=0;
  162.         relay=0;
  163.         flag=0;
  164.         com=1;
  165.         con=1;
  166.           TM1637_display(0,0,0,0,stat_500ms); //上電后默認顯示00:00
  167.          Timer0Init();           //定時器T0初始化并啟動
  168.         while(1)
  169.         {
  170.         
  171.            
  172.                 if(KC==0)/////////////中鍵檢測
  173.                 {
  174.                   Delay_US(7000);///////////按鍵消抖
  175.                 if(KC==0)////再次確認中鍵
  176.                 {
  177.                 Kcase++;
  178.                 if(Kcase==5)
  179.                         {Kcase=1;
  180.                         com=1;
  181.                         con=1;
  182.                         relay=0;
  183.                         flag=0;
  184.                         Num=0;
  185.                         }
  186.         
  187.                 }
  188.                 }
  189.                 switch(Kcase)///////////////////狀態選擇
  190.                 {  case 1:
  191.                                         if(stat_500ms==1)         //半秒閃爍分鐘
  192.                                         {
  193.                                         TM1637_display(show[0],show[1],21,21,1); //半秒閃爍分鐘
  194.                                         }
  195.                                         else
  196.                                         {
  197.                                          TM1637_display(show[0],show[1],show[2],show[3],1); //半秒閃爍分鐘
  198.                                         }
  199.                                        
  200.                           Zuan();                        
  201.                                         break;
  202.                         case 2:
  203.                                         if(stat_500ms==1)         //半秒閃爍小時
  204.                                         {
  205.                                         TM1637_display(show[0],show[1],show[2],show[3],1); //半秒閃爍小時
  206.                                         }
  207.                                         else
  208.                                         {
  209.                                          TM1637_display(21,21,show[2],show[3],1); //半秒閃爍小時
  210.                                         }
  211.                                         Zuan();        
  212.                                         break;
  213.                    case 3:
  214.                                         djs();
  215.                                         break;
  216.                         case 4:
  217.                                         ISP_CONTR=0x20;        //第4按軟件復位
  218.                                         break;
  219.                   }        ////////switch狀態選擇結束
  220.         }//while(1)結束
  221. }//main函數結束



  222. void time0(void) interrupt 1   //T0中斷服務,每10ms響應一次
  223. {
  224.                 time_count++;                 //計數加1
  225.                 if(time_count==55)
  226.                 {stat_500ms=~stat_500ms;
  227.                 }
  228.                 if(time_count==113)
  229.                 {time_count=0;
  230.                 stat_500ms=~stat_500ms;
  231.                 flag_1s=1;
  232.                 }
  233. }////////////////////////////////T0中斷結束
復制代碼


以下為TM1637顯示
  1. sbit CLK= P3^5;   //定義模擬IIC總線的時鐘線
  2. sbit DIO = P3^4;   //定義模擬IIC總線的數據線
  3. void Delay_US(unsigned int us);
  4.   
  5. unsigned char code tab[] =         
  6. {
  7.         0x3F,/*0*/
  8.         0x06,/*1*/
  9.         0x5B,/*2*/
  10.         0x4F,/*3*/
  11.         0x66,/*4*/
  12.         0x6D,/*5*/
  13.         0x7D,/*6*/
  14.         0x07,/*7*/
  15.         0x7F,/*8*/
  16.         0x6F,/*9*/
  17.         0x77,/*10 A*/
  18.         0x7C,/*11 b*/
  19.         0x58,/*12 c*/
  20.         0x5E,/*13 d*/
  21.         0x79,/*14 E*/
  22.         0x71,/*15 F*/
  23.         0x76,/*16 H*/
  24.         0x38,/*17 L*/
  25.         0x54,/*18 n*/
  26.         0x73,/*19 P*/
  27.         0x3E,/*20 U*/
  28.         0x00,/*21 黑屏*/
  29. };

  30. //IIC開始
  31. void TM1637_start(void)
  32. {
  33.          CLK=1;
  34.          DIO=1;
  35.          Delay_US(2);
  36.          DIO=0;
  37. }


  38. //IIC應答
  39. void TM1637_ack(void)
  40. {
  41.         unsigned char i;
  42.         CLK=0;
  43.         Delay_US(5);
  44.          //DIO=1;   
  45.         while(DIO==1&&(i<250))i++;
  46.         CLK=1;
  47.         Delay_US(2);
  48.         CLK=0;
  49. }

  50. //IIC停止
  51. void TM1637_stop(void)
  52. {
  53.          CLK=0;
  54.          Delay_US(2);
  55.          DIO=0;
  56.          Delay_US(2);
  57.          CLK=1;
  58.          Delay_US(2);
  59.          DIO=1;
  60.          Delay_US(2);
  61. }

  62. //寫數據函數
  63. void TM1637_Write(unsigned char DATA)   
  64. {
  65.         unsigned char i;   
  66.         for(i=0;i<8;i++)        
  67.         {
  68.                 CLK=0;     
  69.                 if(DATA & 0x01)
  70.                         DIO=1;
  71.                 else DIO=0;
  72.                  Delay_US(3);
  73.                 DATA=DATA>>1;      
  74.                 CLK=1;
  75.                  Delay_US(3);
  76.         }  
  77.         //TM1637_ack();
  78. }



  79. //按順序顯示
  80. void TM1637_display(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char h)
  81. {

  82.         TM1637_start();
  83.         TM1637_Write(0x40);//寫數據+自動地址加1+普通模式
  84.         TM1637_ack();
  85.         TM1637_stop();
  86.         TM1637_start();
  87.         TM1637_Write(0xc0);//設置顯示首地址即第一個LED
  88.         TM1637_ack();

  89.         TM1637_Write(tab[a]);
  90.         TM1637_ack();
  91.         TM1637_Write(tab[b]|h<<7);//h為1時顯示時鐘中間的兩點
  92.         TM1637_ack();
  93.         TM1637_Write(tab[c]);
  94.         TM1637_ack();
  95.         TM1637_Write(tab[d]);
  96.         TM1637_ack();

  97.         TM1637_stop();
  98.         TM1637_start();
  99.         TM1637_Write(0x89);//開顯示,2/16亮度
  100.         TM1637_ack();
  101.         TM1637_stop();
  102. }


復制代碼

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:149799 發表于 2024-11-12 19:48 | 只看該作者
謝謝樓主上傳,精辟詳細,對學習有幫助。
回復

使用道具 舉報

板凳
ID:876606 發表于 2024-11-13 19:31 | 只看該作者
沒有找到旋轉開關,用的按鍵,但時間減沒反應!

51hei圖片_20241113192843.png (80.59 KB, 下載次數: 0)

51hei圖片_20241113192843.png

倒計時鐘(STC89C52RC單片機 旋轉編碼器 TM1637.rar

81.86 KB, 下載次數: 0, 下載積分: 黑幣 -5

回復

使用道具 舉報

地板
ID:44347 發表于 2024-12-8 23:02 | 只看該作者
感謝版主的無私分享, 受益匪淺
回復

使用道具 舉報

5#
ID:437129 發表于 2024-12-18 12:53 | 只看該作者
多謝樓主分享,樓主辛苦了!
很好的電路和程序。
按照樓主的做了,買的成品旋轉編碼器,自帶上拉電阻、限流電阻和對地電容的那種。連接好后旋轉編碼器不起作用,直接用不帶電阻電容的旋轉編碼器可行,經研究短接限流電阻后使用正常。應該是我買的旋轉編碼器質量不行。
在這里分享給大家,如果遇到同樣問題的避免走彎路。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青青草免费在线视频 | 91精品国产美女在线观看 | 狠狠亚洲 | 国产精品美女在线观看 | 污污的网站在线观看 | 久久91精品国产 | 精品99在线 | 欧美群妇大交群中文字幕 | 国产亚洲精品精品国产亚洲综合 | 国产精品视频久久久 | av色在线| 8x国产精品视频一区二区 | 中文字幕av网址 | 免费观看一级毛片 | 国产一级影片 | av在线免费不卡 | 日韩手机在线视频 | www.五月天婷婷 | 欧美电影大全 | 久草视频在线播放 | 日韩免费激情视频 | 在线观看国产wwwa级羞羞视频 | 毛片网站在线观看视频 | 波多野结衣一区二区三区在线观看 | .国产精品成人自产拍在线观看6 | 91精品久久久久久久久久入口 | 羞羞视频网站免费观看 | 亚洲国产精品一区二区三区 | 久久综合一区 | 欧美天堂 | 国产免费一区 | a视频在线观看 | 日韩欧美成人一区二区三区 | 98成人网 | 亚洲精品第一国产综合野 | 国产精品综合久久 | 欧美一级www片免费观看 | 久久com| 天堂中文资源在线 | 日本大片在线播放 | 国产激情偷乱视频一区二区三区 |