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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵數碼管的組合使用 附源程序

[復制鏈接]
跳轉到指定樓層
樓主
        這次我們用4個獨立按鍵和8位數碼管來做一個正計數器和倒計時器,到時間后(正計時最大值,倒計時最小值)LED燈閃爍10秒熄滅(大家可以先自己想好步驟,再看一下我下面的思路步驟)我用的單片機是STC89C52

主要的步驟:1、先思考正計數,倒計數需要定時器中斷。還需要按鍵處理函數。另外需要一個數碼管顯示函數。


        2、如何將這三個程序有序的排列組合起來形成一個完整的程序,這時我們可以從正計時器入手(也可以從倒計時入手)(由簡入深,抓住主干)先規定K1代表正計數器的開和關,K2代表秒分時的移位,K3代表自加,K4代表自減。還有就是正計數到達最大值的時候LED燈進行閃爍。


        3、這時就要用標志位來分清關系。
        第一部分按鍵程序,具體操作就是用flag0代表正計數器的開關,knum代表K2按下的時候到底是秒分時哪個 ,K3代表按一下加,K4代表按一下減,這時我們的按鍵程序基本完成;
        第二部分就是我們的定時器中斷函數,因為定時器我選的時16位非自動重裝10ms,所以要累計100次到一秒,大家要注意如果你選的是1ms定時,就需要累計1000次,記著你的數據類型要選int或者unsigned int,這部分容易忽略。還有當K2按下,標志位knum進行改變也就代表著秒分時要開始閃爍。這時要進行計數操作也就是當計數時間到時,flag1進行改變,控制秒分時的閃爍時間間隔。當計數時間到的時候還需要flag2的改變這樣控制LED燈的閃爍頻率以及時間。
        第三部分就是我們的數碼管顯示程序,這個程序要根據knum的值進行改變,當knum=0時它直接進行顯示,當knum!=0也就是K2按下的時候,根據flag1的值來閃爍。
        第四部分就是我們要看到效果,當正計數器到達最大值的時候LED燈開始閃爍。只需在正計數結束的時候控制flag2。
        第五部分當你把前四部分都解決了之后,那么你就可以著手做互鎖關系了,當我們正計數的時候我們不能進行移位操作,也就是說正計數器的開啟與移位操作形成互鎖(我們可以加if語句這樣就實現了)。
        接下來就是K3,4長按和短按操作,短按加減一次,長按連加減。
        我們想要實現的還有倒計時器的設定這時我們可以將K1也設定為長按和短按,長按倒計時器,短按正計數器。同時此時也會出現兩者的相互干擾情況,于是再設定一個互鎖,這樣就就避免了(用if語句來解決,就用我們現成的標志位)。因為我們將K1,K3,K4都用了長按短按,所以就讓K2的長按也有功能,就是全體清零,LED燈閃爍。
        第六部分就是大家發現了嗎?就是在進行長按的時候,由于我們這時候還想要數碼管繼續顯示,所以我在長按的while循環里做了顯示,但這個顯示函數單次顯示只用了1ms,這樣我們顯示了八次,再加上一次延時1ms,我近似認為一次長按循環所需時間為10ms,這一點大家做長按,短按的時候會遇到的,還有就是數碼管顯示函數的延時時間長短,會改變數碼管亮度。大家可以自己寫一下這個程序,寫完就理解我為什么要這樣寫了。
        有錯誤請指出,謝謝。

單片機源程序如下:
  1. #include"digdisplay.h"
  2. sbit k1=P3^1;                        //短按進行計數操作,長按進行倒計時操作
  3. sbit k2=P3^0;                        //短按進行秒分時的移位閃爍,長按進行秒分時歸零,沒有移位閃爍,LED燈閃爍開始
  4. sbit k3=P3^2;                        //短按進行秒分時(看K2讓誰閃爍)的加一操作 ,長按進行連加操作(K2讓誰閃爍)
  5. sbit k4=P3^3;                        //短按進行秒分時(看K2讓誰閃爍)的減一操作 ,長按進行連減操作(K2讓誰閃爍)
  6. sbit led=P2^0;                        //當計數到最大值時LED燈開始閃爍,當倒計時到零時開始閃爍
  7. u8 datenume[6]={0,0,0,0,0,0};         //當做存儲秒分時的值,通過運算轉換為數碼管顯示的值
  8. u8 miao=0,fen=0,shi=0,count,knum=0,flag0=0,time=0,flag1=0,flag2=0,flag3=0,time_count=0;                  //flag0是否進行計數操作,falg1秒分時的閃爍標志位,falg2是定時或計數到時LED燈進行閃爍,flag3是否進行倒計時操作,knum進行移位操作的標志性
  9. u8 a,b,c,d,e;                          //這幾個都代表數值,計算時間用的,你可以在程序中發現它們

  10. void Delay5ms()                //@12.000MHz
  11. {
  12.         unsigned char i, j;

  13.         i = 10;
  14.         j = 183;
  15.         do
  16.         {
  17.                 while (--j);
  18.         } while (--i);
  19. }


  20. void keyprogress()                        //對四個固定按鍵進行操作,具體操作如下
  21. {
  22.            if(!k1)
  23.         {
  24.            Delay5ms();
  25.            if(!k1)
  26.            {
  27.              while(!k1)
  28.                  {
  29.                      digdisplay(0,datenume[0]);
  30.                  digdisplay(1,datenume[1]);
  31.                  digdisplay(2,16);
  32.                  digdisplay(3,datenume[2]);
  33.                  digdisplay(4,datenume[3]);
  34.                  digdisplay(5,16);
  35.                  digdisplay(6,datenume[4]);
  36.                  digdisplay(7,datenume[5]);
  37.                     d++;
  38.                         Delay1ms();
  39.                         if(d==100)
  40.                         {
  41.                           if(knum==0&&flag0==0&&(miao!=0||fen!=0||shi!=0))          //計數器和倒計時形成互鎖當秒分時都為零時不能進行倒計時
  42.                           {
  43.                            flag3=!flag3;  //開啟倒計時和關閉倒計時
  44.                       }
  45.                         }
  46.                  }
  47.                  if(d<100)
  48.                  {
  49.               if(knum==0&&flag3==0)           //當沒進行移位操作時才可以啟動計數器,解決了移位時計數器開啟問題,互鎖
  50.                   {                                                   //計數器和倒計時形成互鎖
  51.                 flag0=!flag0;                   //開啟計數器和關閉計數器
  52.                   }
  53.                  }
  54.                  d=0;
  55.            }
  56.         }
  57.         if(!k2)
  58.         {
  59.            Delay5ms();
  60.            if(!k2)
  61.            {
  62.              while(!k2)
  63.                  {
  64.                      digdisplay(0,datenume[0]);
  65.                  digdisplay(1,datenume[1]);
  66.                  digdisplay(2,16);
  67.                  digdisplay(3,datenume[2]);
  68.                  digdisplay(4,datenume[3]);
  69.                  digdisplay(5,16);
  70.                  digdisplay(6,datenume[4]);
  71.                  digdisplay(7,datenume[5]);
  72.                             e++;
  73.                          Delay1ms();
  74.                          if(e==100)                 //全體歸零LED燈閃爍
  75.                          {
  76.                                    flag0=0;
  77.                                 flag1=0;
  78.                                 flag2=1;
  79.                                 flag3=0;
  80.                                 knum=0;
  81.                                 shi=0;
  82.                                 fen=0;
  83.                                 miao=0;
  84.                          }
  85.                  }
  86.              if(flag0==0&&e<100)                //解決了當移位操作時計數器開啟問題,形成必須要計數器關閉才能開始移位,形成互鎖
  87.                 {
  88.               knum++;
  89.                   if(knum==4)
  90.                   {
  91.                     knum=0;
  92.                   }
  93.                 }
  94.                 e=0;
  95.            }
  96.         }
  97.         if(!k3)                                                        //必須在有移位操作的時候才能加,也算一個鎖定
  98.         {
  99.          Delay5ms();
  100.           if(!k3)
  101.          {
  102.           while(!k3)
  103.           {
  104.           digdisplay(0,datenume[0]);
  105.           digdisplay(1,datenume[1]);
  106.           digdisplay(2,16);
  107.           digdisplay(3,datenume[2]);
  108.           digdisplay(4,datenume[3]);
  109.           digdisplay(5,16);
  110.           digdisplay(6,datenume[4]);
  111.           digdisplay(7,datenume[5]);
  112.             Delay1ms();
  113.                 a++;
  114.                 if(a==100)
  115.                 {
  116.                   a=50;
  117.                    if(knum==1)
  118.                    {
  119.                       miao++;
  120.                           if(miao==60)
  121.                           {
  122.                              miao=0;
  123.                           }
  124.                    }
  125.                    else if(knum==2)
  126.                    {
  127.                       fen++;
  128.                           if(fen==60)
  129.                           {
  130.                               fen=0;
  131.                           }
  132.                    }
  133.                    else if(knum==3)
  134.                    {
  135.                       shi++;
  136.                           if(shi==24)
  137.                           {
  138.                               shi=0;
  139.                           }
  140.                    }
  141.                 }
  142.           }
  143.                 if(knum!=0)
  144.            {
  145.                 if(a<50)
  146.                 {
  147.                    if(knum==1)
  148.                   {
  149.                    miao++;
  150.                    if(miao==60)
  151.                    {
  152.                      miao=0;
  153.                    }
  154.                   }
  155.                   else if(knum==2)
  156.                   {
  157.                     fen++;
  158.                         if(fen==60)
  159.                         {
  160.                           fen=0;
  161.                         }
  162.                   }
  163.                   else if(knum==3)
  164.                   {
  165.                      shi++;
  166.                          if(shi==24)
  167.                          {
  168.                            shi=0;
  169.                          }
  170.                   }
  171.                 }
  172.            }
  173.        a=0;
  174.          }
  175.         }
  176.         if(!k4)                                                          //必須在有移位操作時才可以自減
  177.         {
  178.           Delay5ms();
  179.            if(!k4)
  180.            {
  181.              while(!k4)
  182.                  {
  183.            digdisplay(0,datenume[0]);
  184.                digdisplay(1,datenume[1]);
  185.                digdisplay(2,16);
  186.                digdisplay(3,datenume[2]);
  187.                digdisplay(4,datenume[3]);
  188.                digdisplay(5,16);
  189.                digdisplay(6,datenume[4]);
  190.                digdisplay(7,datenume[5]);
  191.                Delay1ms();
  192.                    a++;
  193.                    if(a==100)
  194.                    {
  195.                      a=50;
  196.                          if(knum==1)
  197.                          {
  198.                            miao--;
  199.                            if(miao==255)
  200.                            {
  201.                              miao=59;
  202.                            }
  203.                          }
  204.                          if(knum==2)
  205.                          {
  206.                             fen--;
  207.                                 if(fen==255)
  208.                                 {
  209.                                    fen=59;
  210.                                 }
  211.                          }
  212.                          if(knum==3)
  213.                          {
  214.                             shi--;
  215.                                 if(shi==255)
  216.                                 {
  217.                                    shi=23;
  218.                                 }
  219.                          }
  220.                    }
  221.                  }
  222.                  if(a<50)
  223.                  {
  224.               if(knum==1)
  225.                   {
  226.                     miao--;
  227.                         if(miao==255)
  228.                         {
  229.                           miao=59;
  230.                         }
  231.                   }
  232.                   else if(knum==2)
  233.                   {
  234.                      fen--;
  235.                          if(fen==255)
  236.                          {
  237.                            fen=59;
  238.                          }
  239.                   }
  240.                  else if(knum==3)
  241.                   {
  242.                      shi--;
  243.                          if(shi==255)
  244.                          {
  245.                                    shi=23;
  246.                          }
  247.                   }
  248.                  }
  249.                  a=0;
  250.            }
  251.         }
  252. }
  253. void shuma()                                //做數碼管顯示函數,當knum=0時普通顯示,當knum!=0時靠標志位flag1決定閃爍
  254. {
  255.     if(knum==0)
  256.         {
  257.           digdisplay(0,datenume[0]);
  258.           digdisplay(1,datenume[1]);
  259.           digdisplay(2,16);
  260.           digdisplay(3,datenume[2]);
  261.           digdisplay(4,datenume[3]);
  262.           digdisplay(5,16);
  263.           digdisplay(6,datenume[4]);
  264.           digdisplay(7,datenume[5]);
  265.         }
  266.   else if(knum==1)
  267.    {
  268.      if(flag1)
  269.          {                                                                                                                                                                                                                                                                                          
  270.       digdisplay(0,datenume[0]);
  271.           digdisplay(1,datenume[1]);
  272.           digdisplay(2,16);
  273.           digdisplay(3,datenume[2]);
  274.           digdisplay(4,datenume[3]);
  275.           digdisplay(5,16);
  276.           digdisplay(6,datenume[4]);
  277.           digdisplay(7,datenume[5]);
  278.          }
  279.          else
  280.          {
  281.           digdisplay(0,17);
  282.           digdisplay(1,17);
  283.           digdisplay(2,16);
  284.           digdisplay(3,datenume[2]);
  285.           digdisplay(4,datenume[3]);
  286.           digdisplay(5,16);
  287.           digdisplay(6,datenume[4]);
  288.           digdisplay(7,datenume[5]);
  289.          }
  290.    }
  291.   else if(knum==2)
  292.    {
  293.      if(flag1)
  294.          {
  295.       digdisplay(0,datenume[0]);
  296.           digdisplay(1,datenume[1]);
  297.           digdisplay(2,16);
  298.           digdisplay(3,datenume[2]);
  299.           digdisplay(4,datenume[3]);
  300.           digdisplay(5,16);
  301.           digdisplay(6,datenume[4]);
  302.           digdisplay(7,datenume[5]);
  303.          }
  304.          else
  305.          {
  306.           digdisplay(0,datenume[0]);
  307.           digdisplay(1,datenume[1]);
  308.           digdisplay(2,16);
  309.           digdisplay(3,17);
  310.           digdisplay(4,17);
  311.           digdisplay(5,16);
  312.           digdisplay(6,datenume[4]);
  313.           digdisplay(7,datenume[5]);
  314.          }
  315.    }
  316.   else  if(knum==3)
  317.    {
  318.      if(flag1)
  319.          {
  320.       digdisplay(0,datenume[0]);
  321.           digdisplay(1,datenume[1]);
  322.           digdisplay(2,16);
  323.           digdisplay(3,datenume[2]);
  324.           digdisplay(4,datenume[3]);
  325.           digdisplay(5,16);
  326.           digdisplay(6,datenume[4]);
  327.           digdisplay(7,datenume[5]);
  328.          }
  329.          else
  330.          {
  331.           digdisplay(0,datenume[0]);
  332.           digdisplay(1,datenume[1]);
  333.           digdisplay(2,16);
  334.           digdisplay(3,datenume[2]);
  335.           digdisplay(4,datenume[3]);
  336.           digdisplay(5,16);
  337.           digdisplay(6,17);
  338.           digdisplay(7,17);
  339.          }
  340.    }
  341. }
  342. void main()
  343. {
  344.    TMOD &= 0xF0;    //設置定時器模式
  345.    TMOD |= 0x01;    //設置定時器模式
  346.    TL0 = 0xF0;                //設置定時初值                10毫秒定時器
  347.    TH0 = 0xD8;                //設置定時初值
  348.    TF0 = 0;                     //清除TF0標志
  349.    TR0=1;                //定時器開啟           定時器在程序運行過程中將一直啟動     
  350.    ET0=1;
  351.    EA=1;
  352.    while(1)
  353.    {
  354.       keyprogress();           //按鍵處理函數分別處理K1,K2,K3,K4的長按和短按程序
  355.           shuma();                           //數碼管管顯示程序,處理K2按鍵按下
  356.    }
  357. }
  358. void int0() interrupt 1                                
  359. {
  360.    TL0 = 0xF0;                //設置定時初值
  361.    TH0 = 0xD8;                //設置定時初值
  362.    datenume[0]=miao%10;                        //對秒分時進行數據處理,用數碼管顯示做鋪墊
  363.    datenume[1]=miao/10;
  364.    datenume[2]=fen%10;
  365.    datenume[3]=fen/10;
  366.    datenume[4]=shi%10;
  367.    datenume[5]=shi/10;
  368.    if(flag0&&knum==0)                //進行正向計數,knum判斷是否進行了移位操作,flag0判斷是否進行了開始操作
  369.   {
  370.    count++;
  371.    if(count==100)
  372.    {
  373.      count=0;
  374.          miao++;
  375.          if(miao==60)
  376.          {
  377.            miao=0;
  378.            fen++;
  379.            if(fen==60)
  380.            {
  381.               fen=0;
  382.                   shi++;
  383.                   if(shi==24)
  384.                   {
  385.                     shi=0;
  386.                         flag2=!flag2;                //開啟LED燈的閃爍
  387.                         flag0=!flag0;                //關閉計數器
  388.                   }
  389.            }
  390.          }
  391.    }
  392.   }

  393.   if(flag3&&knum==0)                  //進行倒計時操作
  394.   {
  395.      time_count++;
  396.          if(time_count==100)
  397.          {
  398. ……………………

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

所有資料51hei提供下載:
數碼管與按鍵的組合使用.rar (39.3 KB, 下載次數: 26)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:673128 發表于 2020-2-12 11:23 | 只看該作者

大哥沒有壞啊
回復

使用道具 舉報

板凳
ID:135835 發表于 2020-2-12 17:02 | 只看該作者
下了,壓縮包沒壞,正常解壓。
回復

使用道具 舉報

地板
ID:328014 發表于 2020-2-15 14:15 | 只看該作者
好東東 很詳細啊,,樓主能附個原理圖嗎?
回復

使用道具 舉報

5#
ID:691807 發表于 2020-2-15 14:42 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

6#
ID:24810 發表于 2020-2-15 17:23 | 只看該作者
下來學習下。
回復

使用道具 舉報

7#
ID:673128 發表于 2020-2-17 08:47 | 只看該作者
51hei團團 發表于 2020-2-15 14:15
好東東 很詳細啊,,樓主能附個原理圖嗎?

那個我這是用單片機一步步實驗出來的,我沒有學用仿真軟件,思路就是開頭的思路。你按照它走一定能做出來的。
回復

使用道具 舉報

8#
ID:684248 發表于 2020-2-24 17:22 | 只看該作者
樓主,digdisplay.c的函數能分享下嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品国产 | 亚洲三区在线观看 | 精品久久久久久久久久久下田 | 狠狠干在线| 麻豆久久久久久久 | 久久久久久亚洲 | 国产丝袜av | 天天欧美 | 日韩一区二区三区在线观看 | 一区在线视频 | 天堂久久av| 超碰国产在线 | 欧美日韩国产一区二区三区 | 精品美女久久久 | 在线亚洲欧美 | 亚洲精品成人 | 久久av一区 | 久久久影院 | 亚洲二区视频 | 一级做a | 久草.com | 精品久久影院 | 久久精品国产一区二区三区不卡 | 日韩一区二区在线免费观看 | 香蕉视频91 | 成人在线国产 | 欧美一区二区视频 | 日本一区二区高清视频 | 午夜精品久久久久久不卡欧美一级 | 国产日韩精品一区二区三区 | 91视频正在播放 | 国产精品二区三区 | 欧美一区二区在线播放 | 久久精品日 | 91国语清晰打电话对白 | 99小视频 | 精品成人在线视频 | 日本精品一区二区 | 91精品国产手机 | 激情影院久久 | 国产精品久久久久久久久免费樱桃 |