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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1556|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

交作業(yè):倒計(jì)時(shí)鐘(STC89C52RC單片機(jī)+旋轉(zhuǎn)編碼器+TM1637)

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

制作出來的實(shí)物圖如下:


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

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

  20. bit flag=0;                //調(diào)整標(biāo)志位

  21. /******************************
  22. 函數(shù)說明:延時(shí)函數(shù),STC_ISP軟件給出 @6MHz 1T單片機(jī)
  23. 入口參數(shù):us=延時(shí)微秒數(shù)
  24. 出口參數(shù):無
  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延時(shí)函數(shù)結(jié)束

  38. void djs(void)   ///////////////////////////////倒計(jì)時(shí)
  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; //顯示的小時(shí)十位數(shù)
  58.                                 show[1]=show[4]%10;           //顯示的小時(shí)個(gè)位數(shù)
  59.                                 show[2]=show[5]/10%10; //顯示的分鐘十位數(shù)
  60.                                 show[3]=show[5]%10;           //顯示的分鐘個(gè)位數(shù)
  61.                                                 //以下時(shí)間到,閃爍顯示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); //半秒秒點(diǎn)
  84.                                                         }
  85.                                                         else
  86.                                                         {
  87.                                                          TM1637_display(show[0],show[1],show[2],show[3],stat_500ms); //半秒秒點(diǎn)
  88.                                                         }

  89.                                            }
  90.                         
  91. }

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

  106. void Zuan()   //旋轉(zhuǎn)處理
  107. {                                            
  108.       switch(Kcase)
  109.                 {case 1:
  110.                                                   if((KO==KA)||(KA==1))  //不理會(huì)A引腳上升沿,低電平每個(gè)脈沖只做一次處理
  111.                                          {
  112.                                  KO=KA;
  113.                                                 _nop_();        
  114.                                                 _nop_();
  115.                                 return;
  116.                                          }                                                         
  117.                                       (KB == 0)?Num-- : Num++;   //根據(jù)引腳B的值,判斷正反轉(zhuǎn)
  118.                                        KO=KA;    //存儲(chǔ)引腳A狀態(tài)
  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; //顯示的小時(shí)十位數(shù)
  126.                                 show[1]=show[4]%10;           //顯示的小時(shí)個(gè)位數(shù)
  127.                                 show[2]=show[5]/10%10; //顯示的分鐘十位數(shù)
  128.                                 show[3]=show[5]%10;           //顯示的分鐘個(gè)位數(shù)
  129.                                 minute=Num;
  130.                                 break;
  131.                 case 2:
  132.                                                   if((KO==KA)||(KA ==1))  //不理會(huì)A引腳上升沿,低電平每個(gè)脈沖只做一次處理
  133.                                          {
  134.                                  KO=KA;
  135.                                                 _nop_();
  136.                                                 _nop_();
  137.                                                 _nop_();
  138.                                           return;
  139.                                          }                                                         
  140.                                        (KB == 0)?Nu-- : Nu++;   //根據(jù)引腳B的值,判斷正反轉(zhuǎn)
  141.                                         KO=KA;
  142.                                                  _nop_();
  143.                                                 _nop_();
  144.                                                 _nop_();//存儲(chǔ)引腳A狀態(tài)
  145.                                                  if(Nu<0){Nu=23;}
  146.                                                  if(Nu==24){Nu=0;}
  147.                                         show[4]=Nu;
  148.                               show[0]=show[4]/10%10; //顯示的小時(shí)十位數(shù)
  149.                                         show[1]=show[4]%10;           //顯示的小時(shí)個(gè)位數(shù)
  150.                                         show[2]=show[5]/10%10; //顯示的分鐘十位數(shù)
  151.                                         show[3]=show[5]%10;           //顯示的分鐘個(gè)位數(shù)
  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); //上電后默認(rèn)顯示00:00
  167.          Timer0Init();           //定時(shí)器T0初始化并啟動(dòng)
  168.         while(1)
  169.         {
  170.         
  171.            
  172.                 if(KC==0)/////////////中鍵檢測
  173.                 {
  174.                   Delay_US(7000);///////////按鍵消抖
  175.                 if(KC==0)////再次確認(rèn)中鍵
  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)///////////////////狀態(tài)選擇
  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)         //半秒閃爍小時(shí)
  204.                                         {
  205.                                         TM1637_display(show[0],show[1],show[2],show[3],1); //半秒閃爍小時(shí)
  206.                                         }
  207.                                         else
  208.                                         {
  209.                                          TM1637_display(21,21,show[2],show[3],1); //半秒閃爍小時(shí)
  210.                                         }
  211.                                         Zuan();        
  212.                                         break;
  213.                    case 3:
  214.                                         djs();
  215.                                         break;
  216.                         case 4:
  217.                                         ISP_CONTR=0x20;        //第4按軟件復(fù)位
  218.                                         break;
  219.                   }        ////////switch狀態(tài)選擇結(jié)束
  220.         }//while(1)結(jié)束
  221. }//main函數(shù)結(jié)束



  222. void time0(void) interrupt 1   //T0中斷服務(wù),每10ms響應(yīng)一次
  223. {
  224.                 time_count++;                 //計(jì)數(shù)加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中斷結(jié)束
復(fù)制代碼


以下為TM1637顯示
  1. sbit CLK= P3^5;   //定義模擬IIC總線的時(shí)鐘線
  2. sbit DIO = P3^4;   //定義模擬IIC總線的數(shù)據(jù)線
  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應(yīng)答
  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. //寫數(shù)據(jù)函數(shù)
  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);//寫數(shù)據(jù)+自動(dòng)地址加1+普通模式
  84.         TM1637_ack();
  85.         TM1637_stop();
  86.         TM1637_start();
  87.         TM1637_Write(0xc0);//設(shè)置顯示首地址即第一個(gè)LED
  88.         TM1637_ack();

  89.         TM1637_Write(tab[a]);
  90.         TM1637_ack();
  91.         TM1637_Write(tab[b]|h<<7);//h為1時(shí)顯示時(shí)鐘中間的兩點(diǎn)
  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. }


復(fù)制代碼

評分

參與人數(shù) 1黑幣 +70 收起 理由
admin + 70 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:149799 發(fā)表于 2024-11-12 19:48 | 只看該作者
謝謝樓主上傳,精辟詳細(xì),對學(xué)習(xí)有幫助。
回復(fù)

使用道具 舉報(bào)

板凳
ID:876606 發(fā)表于 2024-11-13 19:31 | 只看該作者
沒有找到旋轉(zhuǎn)開關(guān),用的按鍵,但時(shí)間減沒反應(yīng)!

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

51hei圖片_20241113192843.png

倒計(jì)時(shí)鐘(STC89C52RC單片機(jī) 旋轉(zhuǎn)編碼器 TM1637.rar

81.86 KB, 下載次數(shù): 0, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区| 成人二区三区 | 精品在线一区 | 涩涩视频在线观看 | 男人电影天堂 | 久久国产视频网 | 欧美日韩亚洲国产综合 | 天天看天天摸天天操 | 成人在线视频免费观看 | 97视频在线观看免费 | 国产精品1区2区 | 中文字幕免费中文 | 国产精品久久久久久中文字 | 亚洲精品一区二区三区四区高清 | 国内自拍偷拍视频 | 国产日韩欧美二区 | 91pron在线| 精品国产乱码久久久 | 影音先锋中文字幕在线观看 | 欧美一区永久视频免费观看 | 91久久久精品国产一区二区蜜臀 | 在线观看www视频 | 国产成人免费视频 | 三区在线 | av在线一区二区三区 | 亚洲网在线 | 久久久www| 99精品免费 | 国产一区二区在线免费观看 | 国产小视频自拍 | 精品福利一区二区三区 | 日韩一区二区三区在线观看 | 国精产品一区一区三区免费完 | 一区二区日韩 | 国产99久久精品一区二区永久免费 | 色频 | 日韩一级免费看 | 久久国产成人 | 国产高清精品一区二区三区 | 国产精品自拍av | 青久草视频 |