『壹』 單片機開關控制LED數碼管的編碼
一,什麼是數碼管
數碼管,其實就是由多個led組合在一起的組合顯示塊;有共陰極的,也有共陽極的。使用的數碼管不同,裡麵包含的led個數也會有相關的差異。我們通常使用的數碼管,裡面有8個led燈,大家可以參照生活中的數碼管器件就一目瞭然了,你會發現,數碼管顯示的每一個數字或字母,都是一段一段組合拼接起來的,並不是像寫的那樣圓滑。其中,組合的每一個段,就是一個led燈。
二,點亮一個數碼管
2.1.在點亮數碼管之前,你還必須弄清楚,改數碼管的接是共陰極還是共陽極的接法;其次,還得弄清楚是那幾個(或一個) IO口是IO口 的斷選位(也就是控制顯示哪一個數碼管,通常由IO口控制一個解碼器來實現,因為這樣更節約IO口資源)。
2.2.弄清楚斷選位之後,還得知道,是哪些IO口控制我們的數碼管上的led;
比如:
P0.0 控制數碼管上的led.0;(注意:數碼管上對應的led位,可以參照原理圖上的或查閱相關資料獲得,這里僅僅舉列)
P0.1-->led.1 P0.2-->led2 ......
2.3.想要點亮數碼管很容易,只要開啟對應的數碼管斷選位,再設置數碼管上led的值為點亮(有的數碼管是共陰極接法,有的是共陽極接法,根據具體的設計,給出相關的高或低電平即可)就OK了。但是,我們要在數碼管上顯示我們想要的數字增么辦呢?這個時候,就是考研創造力的時候了,有的數碼管的資料會直接給出它的真值表,但有的卻不一定找得到。在這個時候,我們就得根據我們想要顯示的數字,點亮並熄滅對應數碼管上的led來實現。(推薦:你可以自己先實驗,找出0-9,或其他想要顯示的字元所對應的IO口的值,來保存起來,這樣你就可以重復利用啦!)
三,點亮多個數碼管
3.1 我們想要點亮多個數碼管,首先可以根據2.1,弄清楚你的數碼管的斷選位,然後周期性的改變斷選位的值,以此動態逐個顯示你的數碼管。
3.2 在顯示多個數碼管時,建議周期大於100hz,這樣人眼難以識別起關和開的瞬間,我們看起來就像時很多個數碼管同時點亮了一樣。
四,動態顯示數碼管
4.1 ,在動態顯示數碼管的值時,建議先根據2.2和2.3,把對應的數碼管顯示參數照準,並保存下來,這樣你用起來也方便。
4.2, 動態顯示數碼管,我們可以在規定的時間周期,改變數碼管對應led的開關個數來實現,比如說:
0 在數碼管中顯示的值為0xc0 1是0xf9
那麼我們就可以在規定的時間里,切換該值,從而達到動態效果。
4.3 我們應該注意的時,掃描數碼管(即顯示多個數碼管)應該與設置數碼管的值(數碼管中led的狀態更新)區分開,掃描周期我們可以放短一點,而改變它的值的周期我們可以一秒或者是2秒改變一次。
4.4 消除余暉,大家實驗後,可能會發現,你顯示的值有的時候並不是想要的,它會跳動或者是亮滅不清晰,這個我們就叫做余暉效應。
產生余暉效應的原因是因為你在選則下一個數碼管的時候,還保留了上一個數碼管的顯示值,所以我們消除余暉,只需要在改變數碼管顯示值的時候,先關閉所有數碼管的顯示,在值跟新完成後我們再打開顯示。這里你不用擔心關閉和開啟會有閃爍,更新值的時間會很短,肉眼時幾乎察覺不到滴。
5,示列代碼
/*
晶元:stc89c52
器件:38解碼器等
編譯環境:UV4,C語言
*/
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {undefined
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};//數碼管顯示值真值表緩存數組
unsigned char LedBuff[6] = {undefined
0xff,0xff,0xff,0xff,0xff,0xff
};//數碼管顯示值緩存數組
void main()
{undefined
unsigned char i =0;
unsigned int cnt = 0;
unsigned long sec = 0;
ENLED = 0;
ADDR3 = 1;
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x67;
TR0 = 1;
while(1)
{undefined
if(TF0==1)
{undefined
TF0 = 0;
TH0 = 0xfc;
TL0 = 0x67;
cnt++;
if(cnt>=1000)
{undefined
cnt = 0;
sec++;
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
switch(i)
{undefined
case 0:ENLED = 1;ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];ENLED = 0;break;
case 1:ENLED = 1;ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];ENLED = 0;break;
case 2:ENLED = 1;ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=LedBuff[2];ENLED = 0;break;
case 3:ENLED = 1;ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];ENLED = 0;break;
case 4:ENLED = 1;ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];ENLED = 0;break;
case 5:ENLED = 1;ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=LedBuff[5];ENLED = 0;break;
default:break;
}
}
}
}
以上代碼,僅供參考,您需要根據自己原理圖的設計來實現。
『貳』 單片機數碼管顯示
以四個數碼管為例,每個數碼管都有一個公共端,共陰或共陽,這個公共端就類似於開關了,四個數碼管還共用8跟數據線,應該共12根線……開始後,讓第一個開關打開,8位數據線輸入第一個數碼管要顯示的數字的編碼,保持幾十毫秒的延時後,把開關關閉(這步挺重要的),然後打開第二個開關,輸入第個數碼管要顯示的數字編碼……一直到第四個,再到第一個,不停的循環……由於兩個數碼管點亮的時間間隔太小,人眼是分辯不出來的,叫人眼的視覺暫留現象。這種數碼管顯示方法叫動態掃描顯示,可以節省數據借口,但耗費CPU……
這樣理解,四個喝醉的人,站在一起,都不穩,你看到一個要倒了,趕快去扶一下,然後扶下一個,來回的扶四個人,你扶的夠快的話,四個人是可以站在那兒的……
『叄』 C語言單片機代碼 數碼管動態顯示
這里的16個元素代表的是從十六進制數0~9、A、B、C、D、E、F的段碼,根據什麼來填這些數組元素?那就要看你設計程序時定義數組的作用才能確定.table[1]對應的元素為0x06,是十六進制數,轉換成二進制數是00000110B,分別對應於數碼管的Dp、g、f、e、d、c、b、a 腳,所以在共陰數碼管上點亮b、c兩段,顯示的是數字1,其它同理。
『肆』 單片機數碼管顯示的數值編碼
8位數據匯流排,16位地址匯流排的CPU;具有布爾處理能力和位處理能力;採用哈佛結構,程序存儲器與數據存儲器地址空間各自獨立,便於程序設計;相同地址的64KB程序存儲器和64KB數據存儲器;
0-8KB片內程序存儲器(8031無,8051有4KB,8052有8KB,89C55有20KB);128位元組片內數據存儲器(8051有256位元組);
32根雙向並可以按位定址的I/O線;兩個16位定時/計數器(8052有3個);一個全雙工的串列I/O介面;多個中斷源的中斷結構,具有兩個中斷優先順序;片內時鍾振盪器。
(4)單片機數碼管顯示數據編碼擴展閱讀:
單片機工作的三個條件分別是電源、時鍾晶振、復位。當單片機不能正常工作時,我們首先就要檢查這三個條件,用電壓表或者萬用表檢測他的電源和接地腳,檢測兩個引腳之間的電壓是不是5V左右;對於時鍾晶體振盪有沒有正常工作。
最好用示波器進行檢測,看能否檢測到相應頻率的正弦波脈沖;復位檢測比較簡單,單片機的復位電平一般是高電平復位,單片機在接通電源的時候一般復位引腳上會出現5V左右的高電平,另外在按下復位按鍵時,復位引腳上也會出現高電平,用一般的電壓表或者萬用表都可以進行檢測。
『伍』 單片機數碼管顯示程序中code是什麼意思
俺來幫你解答:
程序中uchar
code
table[]
是定義一個數組table[]
用來存放顯示編碼的數據。
為了不丟失
把該數組中的數據定義在程序存儲器里。
code
是指數據存儲的空間指定為程序存儲器。
滿意的話
請選擇:滿意回答
呵呵
『陸』 單片機數碼管編碼問題
該程序為時間顯示,各個位逐位掃描顯示
void display(void)
{
if(P1_3==1)
{
P2=0xfe; ;秒 個位 片選
P0=dispcode[miao%10]; ;秒 個位 輸出
delay(1); ;延時
P2=0xfd; ;秒 十位 片選
P0=dispcode[miao/10]; ;秒 十位 輸出
delay(1); ;延時
P2=0xff; ;片選全部無效,及所有數碼管熄滅
P0=dispcode[10];
delay(1); ;延時
P2=0xf7; ;分鍾 個位 片選
P0=dispcode[fen%10]; ;分鍾 個位 輸出
delay(1); ;延時
P2=0xef; ;分鍾 十位 片選
P0=dispcode[fen/10]; ;分鍾 十位 輸出
delay(1); ;延時
P2=0xff; ;片選全部無效,及所有數碼管熄滅
P0=dispcode[10];
delay(1); ;延時
P2=0xbf; ;小時 個位 片選
P0=dispcode[shi%10]; ;小時 個位 輸出
delay(1); ;延時
P2=0x7f; ;小時 十位 片選
P0=dispcode[shi/10]; ;小時 十位 輸出
delay(1); ;延時
}
}
『柒』 51單片機的共陰數碼管怎麼顯示數字(c語言)
要讓51單片機共陰數碼管顯示數字,只需要將單片機的P2埠輸出數字對應的段碼即可。
以顯示數字「0」為例,c語言程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//數碼管的段碼編碼
Uchar table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(){//主函數
P0 = table[0];//顯示0,大家可以修改裡面的數據。
while(1);//程序不再執行其他步驟;
}
(7)單片機數碼管顯示數據編碼擴展閱讀:
數字0-9的對應段碼:
數字0 0x3f
數字1 0x06
數字2 0x5b
數字3 0x4f
數字4 0x66
數字5 0x6d
數字6 0x7d
數字7 0x07
數字8 0x7f
數字9 0x6f
『捌』 51單片機控制數碼管顯示不正常問題,為什麼後面4位數碼管1234和5678都是顯示亂碼呢該怎麼改
授人以魚不如授之以漁。先建立程序的一般結構,然後定義一個code數組,里邊存放數碼管顯示0~9的數據,之後定義一個display顯示函數,傳遞參數但不返回參數,然後將傳遞的參數(1234或5678)分解成4哥單個數,然後依次選擇要顯示的數碼管和數據,緊接消影和簡單暫時,這樣一個數碼管顯示就完成了,之後三個跟這個一樣。最後在主函數里調用這個顯示函數並傳遞參數。
希望我的回答能幫助到你。
『玖』 如何利用單片機讓4位數碼管顯示
程序如下(用的是STC89C52晶元):
#include<reg52.h>//52系列單片機頭文件
#defineucharunsignedchar
#defineuintunsignedint
uintx,y;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共陰極數碼管編碼
voiddisplay(uchar,uchar,uchar,uchar);//聲明子函數
voiddelay(int);//聲明子函數
voidmain()
{
while(1)
{
display(1,2,3,4);//主程序始終調用數碼管顯示子程序
}
}
voiddisplay(uchara,ucharb,ucharc,uchard)
{
P2=0xef;
P0=table[a];//給第一個數碼管送"a"
delay(1);//延時1ms
P2=0xdf;
P0=table[b];//給第二個數碼管送"b"
delay(1);//延時1ms
P2=0xbf;
P0=table[c];//給第三個數碼管送"c"
delay(1);//延時1ms
P2=0x7f;
P0=table[d];//給第三個數碼管送"d"
delay(1);//延時1ms
}
voiddelay(uintz)//延時子函數
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(9)單片機數碼管顯示數據編碼擴展閱讀
led數碼管是由多個發光二極體封裝在一起組成「8」字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。led數碼管常用段數一般為7段有的另加一個小數點,還有一種是類似於3位「+1」型。
位數有半位,1,2,3,4,5,6,8,10位等等,led數碼管根據LED的接法不同分為共陰和共陽兩類,了解LED的這些特性,對編程是很重要的,因為不同類型的數碼管,除了它們的硬體電路有差異外,編程方法也是不同的。
『拾』 單片機數碼管如何顯示數字
從電路圖來看,是需要數碼管共陽極的,哪一位的三極體導通,則該位的數碼管就有被點亮的機會。
那麼七段碼數據,低電平的位對應該筆畫的LED亮。
大致代碼:
P2=0xff;
P0=s_code[1]; //0xF9
P2=0xfe;// P2.0=0
delay_ms();
P2=0xff;
P0=s_code[2]; //0xA4
P2=0xfd;// P2.1=0
delay_ms();
P2=0xff;
P0=s_code[3]; //0xB0
P2=0xfb;// P2.2=0
delay_ms();
P2=0xff;
P0=s_code[4]; //0x99
P2=0xf7;// P2.3=0
delay_ms();