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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數碼管顯示數字程序 請賜教

[復制鏈接]
跳轉到指定樓層
樓主
我的C代碼和仿真放在RAR中了。請賜教


單片機源程序如下:
  1. #include <reg52.h>
  2. sbit ADDR2 =P1^2;
  3. sbit ADDR1 =P1^1;
  4. sbit ADDR0 =P1^0;
  5. sbit ENLED =P1^4;
  6. sbit ADDR3 =P1^3;

  7. unsigned char code LedChar[16]=        //數碼管狀態值初始化
  8. {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  9. 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

  10. void main()
  11. {  
  12.     unsigned int i=0, x;
  13.     unsigned char Second=0;//定義一個一秒之后自增1的變量
  14.     ADDR3=1;//使能三八譯碼器
  15.     ENLED=0;//
  16.    
  17.     while(1)
  18.     {   
  19.         for(x=0; x<20627; x++)//軟件調試得出這個循環耗時1秒
  20.         {
  21.             P0=0xFF;//P0端口狀態全部熄滅數碼管里的LED達到刷新作用
  22.             switch(i)
  23.             {
  24.                 case 0:
  25.                 ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10];       i++; break;
  26.                 case 1:
  27.                 ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10];  i++; break;     
  28.                 case 2:
  29.                 ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10]; i=0; break;  
  30.             }  
  31.         }
  32.         Second++;//一秒之后變量自加1
  33.     }
  34. }
  35. //===========================================================
  36. //C語言網

  37. /*欄目----單片機編程----第四章 數碼管*/
  38. //同時顯示不同的數字


  39. /*
  40. 在上一講的代碼中幾個數碼管只能同時顯示相同的數字和字母,這一講我們實現同時3個數碼管點亮但每個數碼管顯示的數字都不一樣,所以我們做一個用來顯示一個變量一秒后自加1的顯示效果。

  41. 例如,此時時間過去了162秒

  42. 數碼管2



  43. 1.取余
  44. 先定義一個8位的變量Second,最多能計到255秒,所以我們只用到3個數碼管而已,這3個數碼管的顯示只能顯示0~9。

  45. 這里我們首先來了解一下取余。

  46. 162%10=2;

  47. (162/10)%10=6;

  48. (162/100)%10=1;

  49. 大家要知道Second是unsigned char無符號整型變量,比如當Second等于169時,(Second/10)是等于16的,后面的小數直接舍去,就算小數是9也照樣舍去,沒有四舍五入的說法。

  50. 到這里我們也就不難理解,當Second為162時,分別讓3個數碼管顯示各自的位數,數碼管2顯示百位數1,數碼管1顯示十位數6,數碼管0顯示個位數2。



  51. 2.代碼分析
  52. 首先要同時點亮3個數碼管就必須讓三八譯碼器的IO0~IO2輪流快速輸出低電平,然后在數碼管0被點亮的瞬間之后P0被賦值為LedChar[Second%10],這樣數碼管0就顯示了這個變量的個位數。

  53. 然后又到了數碼管1被點亮,馬上P0被賦值為LedChar[(Second/10)%10],數碼管1顯示了這個變量的十位數。

  54. 接著就是到了數碼管2被點亮,馬上P0被賦值為LedChar[(Second/100)%10],數碼管2顯示了這個變量的百位數。

  55. 大家要有一個意識,那就是隨著每次IO0, IO1, IO2輸出低電平之后的瞬間,P0都會改變它8個IO端口輸出狀態以顯示不同的數字。



  56. 3.代碼
  57. #include <reg52.h>
  58. sbit ADDR2=P1^2;
  59. sbit ADDR1=P1^1;
  60. sbit ADDR0=P1^0;
  61. sbit ENLED=P1^4;
  62. sbit ADDR3=P1^3;

  63. unsigned char code LedChar[16]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};//數碼管狀態值初始化

  64. void main()
  65. {  
  66.     unsigned int i=0, x;
  67.     unsigned char Second=0;//定義一個一秒之后自增1的變量
  68.     ADDR3=1;//使能三八譯碼器
  69.     ENLED=0;//
  70.    
  71.     while(1)
  72.     {   
  73.         for(x=0; x<20627; x++)//軟件調試得出這個循環耗時1秒
  74.         {
  75.             P0=0xFF;//P0端口狀態全部熄滅數碼管里的LED達到刷新作用
  76.             switch(i)
  77.             {
  78.                 case 0:
  79.                 ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10];       i++;break;
  80.       
  81.                 case 1:
  82.                 ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10];  i++;break;     
  83.       
  84.                 case 2:
  85.                 ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10]; i=0; break;  
  86.             }  
  87.         }
  88.         Second++;//一秒之后變量自加1
  89.     }
  90. }


  91. 4.代碼實現原理
  92. 我們知道for循環的持續時間為1秒,我們拆開代碼分析就像這樣

  93. 第一次for循環執行的內容為

  94. P0=0xFF;
  95. ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10];i++;
  96. 第二次for循環執行的內容為

  97. P0=0xFF;
  98. ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10];i++;
  99. 第三次for循環執行的內容為

  100. P0=0xFF;
  101. ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10];i=0;
  102. 一直循環下去,也就達到了三八譯碼器IO0~IO2輪流快速地切換輸出低電平了,也就做到同時點亮的作用,直到for循環持續的時間結束就“Second++;”但這條語句執行地很快于是又重新for循環了,但是Second卻改變了數字,LedChar[Second%10]也就不是之前的狀態值了。
  103. */
復制代碼

仿真.rar

27.92 KB, 下載次數: 6, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發
ID:262 發表于 2022-12-1 16:56 | 只看該作者
程序的注釋很詳細 感謝您的賜教
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色片免费在线观看 | 欧美一级三级在线观看 | 亚洲精品久久久久久首妖 | 国产午夜三级一区二区三 | 91免费视频观看 | 亚洲一区二区三区视频 | 91精品国产综合久久婷婷香蕉 | 国产精品美女久久久久aⅴ国产馆 | 欧美一级在线观看 | 久久亚洲综合 | 一区二区中文 | 精品国产一区二区国模嫣然 | 日本在线一区二区三区 | 一起操网站 | 日韩精品在线一区二区 | 国产精品久久一区 | 国产一区二区三区日韩 | 一区二区三区电影在线观看 | 欧美精品二区 | 青青草网站在线观看 | 久草免费电影 | 国产精品99久久免费观看 | 大象视频一区二区 | 欧美a在线看 | 欧美福利在线 | 99精品一区二区 | 欧美一级一区 | 一区二区免费在线观看 | 精品九九九 | 精品国产一区二区三区久久久蜜月 | 久久久久国产一区二区三区 | 精品欧美| 久久精品亚洲欧美日韩精品中文字幕 | 国产精品久久久久久久7电影 | 亚洲福利在线观看 | 91在线综合 | 中日字幕大片在线播放 | 欧美一级片在线 | 香蕉91| 精品91av | 中文字幕免费观看 |