|
我的C代碼和仿真放在RAR中了。請賜教
51hei.png (44.34 KB, 下載次數: 49)
下載附件
2022-12-1 16:46 上傳
單片機源程序如下:
- #include <reg52.h>
- sbit ADDR2 =P1^2;
- sbit ADDR1 =P1^1;
- sbit ADDR0 =P1^0;
- sbit ENLED =P1^4;
- sbit ADDR3 =P1^3;
-
- unsigned char code LedChar[16]= //數碼管狀態值初始化
- {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
-
- void main()
- {
- unsigned int i=0, x;
- unsigned char Second=0;//定義一個一秒之后自增1的變量
- ADDR3=1;//使能三八譯碼器
- ENLED=0;//
-
- while(1)
- {
- for(x=0; x<20627; x++)//軟件調試得出這個循環耗時1秒
- {
- P0=0xFF;//P0端口狀態全部熄滅數碼管里的LED達到刷新作用
- switch(i)
- {
- case 0:
- ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10]; i++; break;
- case 1:
- ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10]; i++; break;
- case 2:
- ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10]; i=0; break;
- }
- }
- Second++;//一秒之后變量自加1
- }
- }
- //===========================================================
- //C語言網
- /*欄目----單片機編程----第四章 數碼管*/
- //同時顯示不同的數字
- /*
- 在上一講的代碼中幾個數碼管只能同時顯示相同的數字和字母,這一講我們實現同時3個數碼管點亮但每個數碼管顯示的數字都不一樣,所以我們做一個用來顯示一個變量一秒后自加1的顯示效果。
- 例如,此時時間過去了162秒
- 數碼管2
- 1.取余
- 先定義一個8位的變量Second,最多能計到255秒,所以我們只用到3個數碼管而已,這3個數碼管的顯示只能顯示0~9。
- 這里我們首先來了解一下取余。
- 162%10=2;
- (162/10)%10=6;
- (162/100)%10=1;
- 大家要知道Second是unsigned char無符號整型變量,比如當Second等于169時,(Second/10)是等于16的,后面的小數直接舍去,就算小數是9也照樣舍去,沒有四舍五入的說法。
- 到這里我們也就不難理解,當Second為162時,分別讓3個數碼管顯示各自的位數,數碼管2顯示百位數1,數碼管1顯示十位數6,數碼管0顯示個位數2。
-
- 2.代碼分析
- 首先要同時點亮3個數碼管就必須讓三八譯碼器的IO0~IO2輪流快速輸出低電平,然后在數碼管0被點亮的瞬間之后P0被賦值為LedChar[Second%10],這樣數碼管0就顯示了這個變量的個位數。
- 然后又到了數碼管1被點亮,馬上P0被賦值為LedChar[(Second/10)%10],數碼管1顯示了這個變量的十位數。
- 接著就是到了數碼管2被點亮,馬上P0被賦值為LedChar[(Second/100)%10],數碼管2顯示了這個變量的百位數。
- 大家要有一個意識,那就是隨著每次IO0, IO1, IO2輸出低電平之后的瞬間,P0都會改變它8個IO端口輸出狀態以顯示不同的數字。
-
- 3.代碼
- #include <reg52.h>
- sbit ADDR2=P1^2;
- sbit ADDR1=P1^1;
- sbit ADDR0=P1^0;
- sbit ENLED=P1^4;
- sbit ADDR3=P1^3;
-
- unsigned char code LedChar[16]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};//數碼管狀態值初始化
-
- void main()
- {
- unsigned int i=0, x;
- unsigned char Second=0;//定義一個一秒之后自增1的變量
- ADDR3=1;//使能三八譯碼器
- ENLED=0;//
-
- while(1)
- {
- for(x=0; x<20627; x++)//軟件調試得出這個循環耗時1秒
- {
- P0=0xFF;//P0端口狀態全部熄滅數碼管里的LED達到刷新作用
- switch(i)
- {
- case 0:
- ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10]; i++;break;
-
- case 1:
- ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10]; i++;break;
-
- case 2:
- ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10]; i=0; break;
- }
- }
- Second++;//一秒之后變量自加1
- }
- }
- 4.代碼實現原理
- 我們知道for循環的持續時間為1秒,我們拆開代碼分析就像這樣
- 第一次for循環執行的內容為
- P0=0xFF;
- ADDR2=0; ADDR1=0; ADDR0=0; P0=LedChar[Second%10];i++;
- 第二次for循環執行的內容為
- P0=0xFF;
- ADDR2=0; ADDR1=0; ADDR0=1; P0=LedChar[(Second/10)%10];i++;
- 第三次for循環執行的內容為
- P0=0xFF;
- ADDR2=0; ADDR1=1; ADDR0=0; P0=LedChar[(Second/100)%10];i=0;
- 一直循環下去,也就達到了三八譯碼器IO0~IO2輪流快速地切換輸出低電平了,也就做到同時點亮的作用,直到for循環持續的時間結束就“Second++;”但這條語句執行地很快于是又重新for循環了,但是Second卻改變了數字,LedChar[Second%10]也就不是之前的狀態值了。
- */
復制代碼 |
-
-
仿真.rar
2022-12-1 16:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
27.92 KB, 下載次數: 6, 下載積分: 黑幣 -5
|