標題: 單片機按鍵實現(xiàn)0-9999計數(shù)器程序+仿真 4位一體數(shù)碼管顯示 [打印本頁]

作者: 陳潤源home    時間: 2019-4-6 21:54
標題: 單片機按鍵實現(xiàn)0-9999計數(shù)器程序+仿真 4位一體數(shù)碼管顯示
*********************************************************************************************                                                                               本文已鎖,請進來解鎖*********************************************************************************************
  恭喜您解開本貼,既然來了就請認真看完再走吧
  名稱:按鍵調(diào)節(jié)數(shù)碼管顯示

  功能:通過按鍵加減數(shù)碼管所顯示的數(shù)字
            按下k1加1,最大加到9999
            按下k2減1,最小減到0
            按下k3清零復(fù)位   
   用了最簡單的思路,各路大神不喜勿噴.

   小弟就不和各位爺繞彎子了,直接上圖

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. //----------------------------------------------------------------------
  2. //名稱:按鍵調(diào)節(jié)數(shù)碼管顯示
  3. //----------------------------------------------------------------------
  4. //功能:通過按鍵加減數(shù)碼管所顯示的數(shù)字
  5. //     按下k1加1,最大加到9999
  6. //     按下k2減1,最小減到0
  7. //     按下k3清零復(fù)位   
  8. //----------------------------------------------------------------------
  9. #include <reg51.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int

  12. sbit k1 = P1^0;                   //加
  13. sbit k2 = P1^1;                   //減
  14. sbit k3 = P1^2;                   //復(fù)位
  15. void key(void);
  16. void display(void);

  17. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
  18.                     0x92,0x82,0xf8,0x80,0x90};           //數(shù)組
  19.                        
  20. char m=99,n=98;                                //顯示初值,m,n的值決定開機顯示數(shù)值
  21. //****************************************
  22. //延時程序
  23. //****************************************
  24. void delayms(uint xms)
  25. {
  26.    uint i,j;
  27.    for(i=xms;i>0;i--)
  28.    for(j=110;j>0;j--);
  29. }
  30. //***********************************************
  31. //顯示程序
  32. //***********************************************
  33. void display(void)
  34. {
  35.         P2=0X08;
  36.                 P0=table[m%10];   //顯示個位
  37.                 delayms(5);  
  38.                 P2=0X04;
  39.             P0=table[m/10];          //顯示十位
  40.                 delayms(5);                                                              
  41.             P2=0X02;
  42.                 P0=table[n%10];          //顯示百位
  43.                 delayms(5);
  44.                 P2=0X01;
  45.                 P0=table[n/10];          //顯示千位
  46.                 delayms(5);
  47. }

  48. //***************************************************
  49. //按鍵處理
  50. //***************************************************
  51. void key()
  52. {
  53.   if(k1==0)                                         //檢測按鍵是否被按下
  54.    {                                                 //延時消抖
  55.            delayms(10);                         
  56.         if(k1==0)                                 //再次檢測是否真正按下按鍵
  57.         {
  58.           m++;                                         //m自加一
  59.           if(m>=100)                         //如果m加到100則n加一 (限制m的取值范圍) 個位、十位最大顯示99
  60.           {
  61.                   n++;                                 //n自加一
  62.                 m=0;                                 //使m又從0開始計數(shù)
  63.                 if(n>=100)                         //如果n加到100則m=n=99 (限制n的取值范圍) 百位、千位最大顯示99
  64.                 {
  65.                   m=99;                                 //最大顯示9999
  66.                   n=99;
  67.                 }
  68.           }
  69.         }
  70.         while(!k1);                                 //按鍵松開
  71.    }

  72.   if(k2==0)                                         //檢測按鍵是否被按下
  73.    {                                                 //延時消抖
  74.            delayms(10);                         //再次檢測是否真正按下按鍵
  75.         if(k2==0)
  76.         {                                                 //m自減一
  77.           m--;
  78.           if(m<=0)                                 //如果m減到0則n減一 (限制n的取值范圍) 個位、十位最小顯示00
  79.           {                                                 
  80.             m=99;                                 //重新給m裝初值
  81.                   n--;                                 //n自減一
  82.                 if(n==-1)                         //如果n減到-1,則m=n=0 (限制n的取值范圍) 百位、千位最小顯示00
  83.                 {
  84.                  n=0;                                 //最小顯示0000
  85.                  m=0;
  86.                 }
  87.           }
  88.         }
  89.         while(!k2);                                 //按鍵松開
  90.    }

  91. if(k3==0)                                         //檢測按鍵是否被按下
  92. {
  93.    delayms(10);                                 //延時消抖
  94.    if(k3==0)                                 //再次檢測是否真正按下按鍵
  95.    {
  96.             m=0;                                         //復(fù)位,顯示0000
  97.          n=0;
  98.    }
  99.    while(!k3);                                 //按鍵松開
  100. }
  101. }

  102. void main()
  103. {
  104.   while(1)
  105.   {                                                         //調(diào)用按鍵檢測
  106.    key();                                         //數(shù)碼管顯示

  107. ……………………

  108. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載:
0~9999計數(shù)器.zip (53.03 KB, 下載次數(shù): 226)



作者: kevintang    時間: 2020-3-21 12:23
謝謝分享。
作者: 123321151155    時間: 2020-4-29 15:41
多謝大佬分享
作者: 木頭人51hei    時間: 2020-7-10 23:20
你好  可預(yù)置計數(shù)值 的多步語言能寫一個嗎  賦予輸出口  1000hz以內(nèi)的
作者: zwtaitc    時間: 2020-11-23 14:42
這個跟中斷方式有關(guān)系嗎

作者: zhangleixbyl    時間: 2021-2-20 16:36
用stc89c52怎么改程序啊
作者: bxyyhan    時間: 2021-2-22 10:03
zhangleixbyl 發(fā)表于 2021-2-20 16:36
用stc89c52怎么改程序啊

不用改,直接用,實在手癢愿意改把頭文件改成REG52。
作者: zhangleixbyl    時間: 2021-2-23 05:41
89c52顯示器全亮沒倒計時顯示,沒按按鍵顯示都是零,按了按鍵顯示都是888是什么問題?不兼容嗎
作者: bxyyhan    時間: 2021-2-26 20:08
zhangleixbyl 發(fā)表于 2021-2-23 05:41
89c52顯示器全亮沒倒計時顯示,沒按按鍵顯示都是零,按了按鍵顯示都是888是什么問題?不兼容嗎

檢查你的數(shù)碼管驅(qū)動電路,他是直接驅(qū)動共陽數(shù)碼管,用89C52可能亮度不夠,用12或15單片機,用推挽模式驅(qū)動就好了。
作者: zhangleixbyl    時間: 2021-2-26 23:36
bxyyhan 發(fā)表于 2021-2-26 20:08
檢查你的數(shù)碼管驅(qū)動電路,他是直接驅(qū)動共陽數(shù)碼管,用89C52可能亮度不夠,用12或15單片機,用推挽模式驅(qū) ...

小白初學者不會改啊,謝謝大神指點。
作者: bxyyhan    時間: 2021-2-27 20:20
zhangleixbyl 發(fā)表于 2021-2-26 23:36
小白初學者不會改啊,謝謝大神指點。

看代碼的19-20行,{0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; 這是共陽數(shù)碼管的段碼,分別對應(yīng)數(shù)字0-9,既然是共陽數(shù)碼管,在顯示的時候就要在每位數(shù)碼管的陽極接通高電平才能點亮。

再看37-48行,

這里表明顯示的時候分別往數(shù)碼管陽極輸出高電平,如果能的電路用了三極管擴流驅(qū)動數(shù)碼管,那么就需要輸出低電平,也就是“取反“,不然就是你那種現(xiàn)象,該亮的不亮,不該亮的全亮。如果你使用的是12或15單片機,可以在函數(shù)后加上
P0M1 = 0x00; P0M0 = 0xFF; //P0(00000000B,11111111B)
P2M1 = 0x00; P2M0 = 0x0F; //P2(00000000B,00001111B)
使用單片機推挽模式直接驅(qū)動數(shù)碼管。

作者: zhangleixbyl    時間: 2021-3-10 13:10
bxyyhan 發(fā)表于 2021-2-27 20:20
看代碼的19-20行,{0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; 這是共陽數(shù)碼管 ...

謝謝,指點




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