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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13657|回復: 11
收起左側

單片機按鍵實現0-9999計數器程序+仿真 4位一體數碼管顯示

  [復制鏈接]
ID:293363 發表于 2019-4-6 21:54 | 顯示全部樓層 |閱讀模式
*********************************************************************************************                                                                               本文已鎖,請進來解鎖*********************************************************************************************
  恭喜您解開本貼,既然來了就請認真看完再走吧
  名稱:按鍵調節數碼管顯示

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

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

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

單片機源程序如下:
  1. //----------------------------------------------------------------------
  2. //名稱:按鍵調節數碼管顯示
  3. //----------------------------------------------------------------------
  4. //功能:通過按鍵加減數碼管所顯示的數字
  5. //     按下k1加1,最大加到9999
  6. //     按下k2減1,最小減到0
  7. //     按下k3清零復位   
  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;                   //復位
  15. void key(void);
  16. void display(void);

  17. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
  18.                     0x92,0x82,0xf8,0x80,0x90};           //數組
  19.                        
  20. char m=99,n=98;                                //顯示初值,m,n的值決定開機顯示數值
  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開始計數
  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;                                         //復位,顯示0000
  97.          n=0;
  98.    }
  99.    while(!k3);                                 //按鍵松開
  100. }
  101. }

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

  107. ……………………

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

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


評分

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

查看全部評分

回復

使用道具 舉報

ID:24486 發表于 2020-3-21 12:23 | 顯示全部樓層
謝謝分享。
回復

使用道具 舉報

ID:740965 發表于 2020-4-29 15:41 | 顯示全部樓層
多謝大佬分享
回復

使用道具 舉報

ID:801315 發表于 2020-7-10 23:20 | 顯示全部樓層
你好  可預置計數值 的多步語言能寫一個嗎  賦予輸出口  1000hz以內的
回復

使用道具 舉報

ID:847810 發表于 2020-11-23 14:42 | 顯示全部樓層
這個跟中斷方式有關系嗎
回復

使用道具 舉報

ID:848824 發表于 2021-2-20 16:36 | 顯示全部樓層
用stc89c52怎么改程序啊
回復

使用道具 舉報

ID:95809 發表于 2021-2-22 10:03 來自觸屏版 | 顯示全部樓層
zhangleixbyl 發表于 2021-2-20 16:36
用stc89c52怎么改程序啊

不用改,直接用,實在手癢愿意改把頭文件改成REG52。
回復

使用道具 舉報

ID:848824 發表于 2021-2-23 05:41 來自觸屏版 | 顯示全部樓層
89c52顯示器全亮沒倒計時顯示,沒按按鍵顯示都是零,按了按鍵顯示都是888是什么問題?不兼容嗎
回復

使用道具 舉報

ID:95809 發表于 2021-2-26 20:08 | 顯示全部樓層
zhangleixbyl 發表于 2021-2-23 05:41
89c52顯示器全亮沒倒計時顯示,沒按按鍵顯示都是零,按了按鍵顯示都是888是什么問題?不兼容嗎

檢查你的數碼管驅動電路,他是直接驅動共陽數碼管,用89C52可能亮度不夠,用12或15單片機,用推挽模式驅動就好了。
回復

使用道具 舉報

ID:848824 發表于 2021-2-26 23:36 | 顯示全部樓層
bxyyhan 發表于 2021-2-26 20:08
檢查你的數碼管驅動電路,他是直接驅動共陽數碼管,用89C52可能亮度不夠,用12或15單片機,用推挽模式驅 ...

小白初學者不會改啊,謝謝大神指點。
回復

使用道具 舉報

ID:95809 發表于 2021-2-27 20:20 | 顯示全部樓層
zhangleixbyl 發表于 2021-2-26 23:36
小白初學者不會改啊,謝謝大神指點。

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

再看37-48行,



  • P2=0X08;
  •                 P0=table[m%10];   //顯示個位
  •                 delayms(5);
  •                 P2=0X04;
  •             P0=table[m/10];          //顯示十位
  •                 delayms(5);
  •             P2=0X02;
  •                 P0=table[n%10];          //顯示百位
  •                 delayms(5);
  •                 P2=0X01;
  •                 P0=table[n/10];          //顯示千位
  •                 delayms(5);
這里表明顯示的時候分別往數碼管陽極輸出高電平,如果能的電路用了三極管擴流驅動數碼管,那么就需要輸出低電平,也就是“取反“,不然就是你那種現象,該亮的不亮,不該亮的全亮。如果你使用的是12或15單片機,可以在函數后加上
P0M1 = 0x00; P0M0 = 0xFF; //P0(00000000B,11111111B)
P2M1 = 0x00; P2M0 = 0x0F; //P2(00000000B,00001111B)
使用單片機推挽模式直接驅動數碼管。
回復

使用道具 舉報

ID:848824 發表于 2021-3-10 13:10 | 顯示全部樓層
bxyyhan 發表于 2021-2-27 20:20
看代碼的19-20行,{0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; 這是共陽數碼管 ...

謝謝,指點
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操天天干天天爽 | 久久不卡| 国产精品欧美一区二区三区不卡 | 欧美精品二区三区 | 成人a视频在线观看 | 天天综合永久 | av大片 | 日韩黄色小视频 | 日批的视频 | 三级视频在线观看 | 男女免费在线观看视频 | 久久成人国产精品 | 亚洲精品成人av | 欧美在线a | 欧一区| 亚洲欧美国产精品久久 | 国产7777 | caoporn视频 | 国产精品亚洲成在人线 | 国产美女精品视频免费观看 | 国产999精品久久久久久绿帽 | 国产成人a亚洲精品 | 久久国产麻豆 | 亚洲欧美日韩精品久久亚洲区 | 亚欧性视频 | 精品国产31久久久久久 | 国产精品久久久久久久久久久久冷 | cao在线 | 亚洲精品视频在线播放 | 国产一区视频在线 | 久久久久无码国产精品一区 | 国产精品a一区二区三区网址 | 色射综合 | 欧美精品网 | 情侣av | 国产精品久久久久999 | 美女一级毛片 | 亚洲天天干 | 欧美黄视频| 美女逼网站 | 成人免费网站www网站高清 |