A. 利用51單片機,用按鍵和數碼管組成一個控制系統,要求四個數碼管顯示四位數字
B. 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);//程序不再執行其他步驟;
}
(2)基於51單片機的數碼管顯示擴展閱讀:
數字0-9的對應段碼:
數字0 0x3f
數字1 0x06
數字2 0x5b
數字3 0x4f
數字4 0x66
數字5 0x6d
數字6 0x7d
數字7 0x07
數字8 0x7f
數字9 0x6f
C. 用51單片機控制數碼管顯示
1. 接電源:VCC(PIN40)、GND(PIN20)。加接退耦電容0.1uF
2. 接晶體:X1(PIN18)、X2(PIN19)。注意標出晶體頻率(選用12MHz),還有輔助電容30pF
3. 接復位:RES(PIN9)。接上電復位電路,以及手動復位電路,分析復位工作原理
4. 接配置:EA(PIN31)。說明原因。
發光二極的控制:單片機I/O輸出
將一發光二極體LED的正極(陽極)接P1.1,LED的負極(陰極)接地GND。只要P1.1輸出高電平VCC,LED就正向導通(導通時LED上的壓降大於1V),有電流流過LED,至發LED發亮。實際上由於P1.1高電平輸出電阻為10K,起到輸出限流的作用,所以流過LED的電流小於(5V-1V)/10K = 0.4mA。只要P1.1輸出低電平GND,實際小於0.3V,LED就不能導通,結果LED不亮。
開關雙鍵的輸入:輸入先輸出高
一個按鍵KEY_ON接在P1.6與GND之間,另一個按鍵KEY_OFF接P1.7與GND之間,按KEY_ON後LED亮,按KEY_OFF後LED滅。同時按下LED半亮,LED保持後松開鍵的狀態,即ON亮OFF滅。
代碼
1. #include <at89x52.h>
2. #define LED P1^1 //用符號LED代替P1_1
3. #define KEY_ON P1^6 //用符號KEY_ON代替P1_6
4. #define KEY_OFF P1^7 //用符號KEY_OFF代替P1_7
5. void main( void ) //單片機復位後的執行入口,void表示空,無輸入參數,無返回值
6. {
7. KEY_ON = 1; //作為輸入,首先輸出高,接下KEY_ON,P1.6則接地為0,否則輸入為1
8. KEY_OFF = 1; //作為輸入,首先輸出高,接下KEY_OFF,P1.7則接地為0,否則輸入為1
9. While( 1 ) //永遠為真,所以永遠循環執行如下括弧內所有語句
10. {
11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1輸出高,LED亮
12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1輸出低,LED滅
13. } //松開鍵後,都不給LED賦值,所以LED保持最後按鍵狀態。
14. //同時按下時,LED不斷亮滅,各佔一半時間,交替頻率很快,由於人眼慣性,看上去為半亮態
15. }
數碼管的接法和驅動原理
一支七段數碼管實際由8個發光二極體構成,其中7個組形構成數字8的七段筆畫,所以稱為七段數碼管,而餘下的1個發光二極體作為小數點。作為習慣,分別給8個發光二極體標上記號:a,b,c,d,e,f,g,h。對應8的頂上一畫,按順時針方向排,中間一畫為g,小數點為h。
我們通常又將各二極與一個位元組的8位對應,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相應8個發光二極體正好與單片機一個埠Pn的8個引腳連接,這樣單片機就可以通過引腳輸出高低電平控制8個發光二極的亮與滅,從而顯示各種數字和符號;對應位元組,引腳接法為:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。
如果將8個發光二極體的負極(陰極)內接在一起,作為數碼管的一個引腳,這種數碼管則被稱為共陰數碼管,共同的引腳則稱為共陰極,8個正極則為段極。否則,如果是將正極(陽極)內接在一起引出的,則稱為共陽數碼管,共同的引腳則稱為共陽極,8個負極則為段極。
以單支共陰數碼管為例,可將段極接到某埠Pn,共陰極接GND,則可編寫出對應十六進制碼的七段碼表位元組數據如右圖:
16鍵碼顯示的程序
我們在P1埠接一支共陰數碼管SLED,在P2、P3埠接16個按鍵,分別編號為KEY_0、KEY_1到KEY_F,操作時只能按一個鍵,按鍵後SLED顯示對應鍵編號。
代碼
1. #include <at89x52.h>
2. #define SLED P1
3. #define KEY_0 P2^0
4. #define KEY_1 P2^1
5. #define KEY_2 P2^2
6. #define KEY_3 P2^3
7. #define KEY_4 P2^4
8. #define KEY_5 P2^5
9. #define KEY_6 P2^6
10. #define KEY_7 P2^7
11. #define KEY_8 P3^0
12. #define KEY_9 P3^1
13. #define KEY_A P3^2
14. #define KEY_B P3^3
15. #define KEY_C P3^4
16. #define KEY_D P3^5
17. #define KEY_E P3^6
18. #define KEY_F P3^7
19. Code unsigned char Seg7Code[16]= //用十六進數作為數組下標,可直接取得對應的七段編碼位元組
20. // 0 1 2 3 4 5 6 7 8 9 A b C d E F
21. {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
22. void main( void )
23. {
24. unsigned char i=0; //作為數組下標
25. P2 = 0xff; //P2作為輸入,初始化輸出高
26. P3 = 0xff; //P3作為輸入,初始化輸出高
27. While( 1 )
28. {
29. if( KEY_0 == 0 ) i=0; if( KEY_1 == 0 ) i=1;
30. if( KEY_2 == 0 ) i=2; if( KEY_3 == 0 ) i=3;
31. if( KEY_4 == 0 ) i=4; if( KEY_5 == 0 ) i=5;
32. if( KEY_6 == 0 ) i=6; if( KEY_7 == 0 ) i=7;
33. if( KEY_8 == 0 ) i=8; if( KEY_9 == 0 ) i=9;
34. if( KEY_A == 0 ) i=0xA; if( KEY_B == 0 ) i=0xB;
35. if( KEY_C == 0 ) i=0xC; if( KEY_D == 0 ) i=0xD;
36. if( KEY_E == 0 ) i=0xE; if( KEY_F == 0 ) i=0xF;
37. SLED = Seg7Code[ i ]; //開始時顯示0,根據i取應七段編碼
38. }
39. }
D. 51單片機怎樣用鍵盤控制數碼管顯示
51單片機怎樣用鍵盤控制數碼管顯示的方法。
如下參考:
1.首先,編寫代碼並點亮數碼管。
E. 51單片機數碼管顯示問題
採用這種方式一般都是所謂的動態掃描顯示,往往不止一個數碼管。一個數碼管8段加一個公共端需要9根口線才能完全顯示任意數字,為了節省IO口線,就利用了人眼視覺駐留的原理(就像電影膠片每秒24幀,連續起來播放你覺得沒有任何間斷),每一位數碼管顯示一會兒,然後關掉它,再去顯示下一個數碼管。只要保證在1秒內每個數碼管能掃上個十幾次二十幾次,視覺上就好像同時點亮了所有數碼管了。
你這段程序就是這種方式:
shuma=a[d1];
//送第d1位數碼管的段碼,d1范圍是0~3共4位
LED_1=0;
//打開d1位數碼管顯示允許,數碼管被點亮
delay_ms(1);
//保持顯示1ms
LED_1=1;
//關閉d1位數碼管顯示,准備顯示下一位
F. 51 單片機 怎麼切換 程序顯示 數碼管
數碼管的顯示一般是每隔一段時間顯示一次。例如要顯示4位,先送顯示第一位,延時幾mS顯示第二位,再延時,接著顯示第三位,然後延時顯示第四位。延時時間很重要,不能太慢,太慢了閃爍,要小於視覺暫留時間。也不能太快,太快了也會閃爍,因為延時短,顯示時間就短,時間都浪費在切換顯示啦。延時可以用軟體延時,簡單。也可用中斷延時。數碼管驅動顯示要估算除顯示以外的程序時間,不能時間太長影響數碼的顯示。成敗與否就在於您對時間的估算上。
祝您成功。
G. 51單片機數碼管顯示
#include<reg52.h>
unsignedcharcodeshu[]={0x08,0x5e,0x82,0x42,0x54,0x41,0x01,0x5a,0x00,0x40};//0-9
unsignedcharcodewei[]={0xfe,0xfd,0xfb,0xf7,0xef};
unsignedintx,y,z;
unsignedcharcon;
unsignedchardis[5];
/**************************************/
voidinit(void)
{
TMOD=0x16;//T1定時器方式1T0計數器自動裝載
TH0=256-1;
TL0=256-1;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;//5mc
TR0=1;
TR1=1;
ET0=1;
ET1=1;
EA=1;
}
/*************************************/
voidtime0()interrupt1
{
x++;
if(x==1)z=x*(60000/y);
x=0;
y=0;
dis[0]=z/10000;
dis[1]=(z%10000)/1000;
dis[2]=(z%1000)/100;
dis[3]=(z%100)/10;
dis[4]=z%10;
}
/************************************/
voidtime1()interrupt3
{
y++;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;//5mc
con++;
P2=wei[con];
P0=shu[con];
}
voidmain(void)
{
x=0;
y=0;
init();
while(1);
}
H. 51單片機學習版數碼管顯示的問題
要顯示6數碼管,明白要樣寫,上面代碼,使用靜態顯示方式,也程序次開了6位選(0xc0),用wela鎖存,再輸出數據'0'6數碼管,用la鎖存,終止程序(死循環),種靜態顯示方式,理論上6數碼管顯示內容樣,能由於靜態輸出電流過大,導致晶元復位...
即使顯示靜態內容,好還用掃描方式顯示,循環,每次開位選,再輸出次數據,加適當延時,只要刷新率夠高,了,雖相對靜態顯示亮度有所下降,功率小.當把顯示6編碼內容存入數組,必要時修改數組,即實現動態顯示了.
I. 51單片機數碼管顯示程序
#include<reg52.h>
//52系列單片機頭文件
#define
uchar
unsigned
char
//宏定義
#define
uint
unsigned
int
sbit
la=P2^6;
//申明u1鎖存器的鎖存端
sbit
wela=P2^7;
//
u2
uchar
num1,num2;
uchar
code
table[]={
//數組定義
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar
code
aable[]={
//位選數組定義
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void
delays(uint);
//子函數申明
void
main()
{
while(1)
{
for(num1=0;num1<48;num1++)
//6個數循環顯示
{
wela=1;
//打開u2鎖存端
P0=aable[num1%6];
//送入位選信號
wela=0;
//關閉u2鎖存端
//
delays(1);
la=1;
//打開u1鎖存端
P0=table[num1%16];
//送入段選信號
la=0;
//關閉u1鎖存端
delays(1);
}
}
}
/*---------主函數-----------------------------------------------*/
void
delays(uint
xs)
{
uint
i,j,k;
for(i=xs;i>0;i--)
for(j=1000;j>0;j--)
for(k=110;k>0;k--);
}
/*----------------延時程序-----------------------------------------------*/
J. 如何用51單片機用一位數碼管顯示對應數字
首先你要把0到9的數字對應的七段碼放在一個數組中,然後用一個變數計按鍵的次數或序號,把該序號的七段碼輸出到對應的埠即可。