導航:首頁 > 操作系統 > c51單片機數碼管

c51單片機數碼管

發布時間:2023-03-22 17:56:35

單片機c51輸出數碼管顯示為什麼共陽極0是0xc0,共陰極是0x7e

這是根據數碼管的特性決定的(因為一個段位的數碼管是由8個二極體組成的),因為共陽極的數碼管,公共腳接的是電源VCC,所以,想要把那一個二極體點亮就必需將這個點接地,它就會發亮了,例如:要顯示數字「0」,就要把「a、b、c、d、e、f」這幾個發光二極體接地,其它二極體接VCC,它就會顯示成一個「0」了,把它轉換成二進制碼:1100 0000,所以它的十六進制為:0xc0,而共陰極的段位數碼管正確的二進制碼應該是:0011 1111,十六進制為:0x3f.

Ⅱ C51單片機的數碼管顯示問題

#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,t,num,xms;
sbit wela=P2^7;
sbit la=P2^6;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar xms)//這里最好把uchar改為uint,當然不改應該也沒問題,你下面的i跟xms類型不一樣,在這里應該是沒問題,最好還是統一一下
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)
{
shi=num/10;
ge=num%10;

la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);

wela=1;
P0=0xfd;
wela=0;
//delay(5);
la=1;
P0=table[ge];
la=0;
delay(5);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;

while(1)
{

if(key1==0)
{
delay(10);//這里消抖也是,也就是說,用按鍵的話,數碼管就是會閃
因為時間有點長對吧,數碼管來不及立刻顯示,此時用肉眼就能看到閃,所以應該避免不了吧,除非你消抖時間也改短一點,你試試看。看看效果
if(key1==0)
num++;
if(num==60)
num=0;
while(!key1);
delay(10); //按一下十位閃一下就是這里延時太長了,可以不用延時,
數碼管動態顯示要求掃描很快,你上面就是延時了5ms,如果時間再長一點,那你就能看到數碼管不停的閃。所以這里10ms太長了,可以不用。
但為什麼個位沒閃,應該是在display時,先是現實十位,然後把十位滅掉,再顯示個位,一直等到在顯示十位時,個位才滅,就是說在這支前,個位是亮的,由於你這延時了10ms,導致此時十位沒有很快的顯示出來,所以等過了10ms之後,十位才由暗變亮,你就可以看到十位閃了一下。
當你按住key1時,key1一直是0,那麼!key1=1;所以程序一直執行while(!key1);這句語句,那麼結合上面所說十位就亮不了了,只有個位亮。
你可以試著改改delay函數中的值大小,自己觀察一下,display中的delay值可以更小的,3ms,2ms,自己試試吧
}
if(key2==0)
{
delay(10);
if(key2==0)
num--;
if(num==-1)
num=59;
while(!key2);
delay(10);
}

if(key3==0)
{
delay(10);
if(key3==0)
num=0;
while(!key1);
delay(10);
}
if(key4==0)
{
if(key4==0)
{
TR0=~TR0;
}
while(!key4);
}
display(shi,ge);
}
}

void time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
num++;
if(num==60)
num=0;}}

Ⅲ 51單片機數碼管如何依次點亮

51單片機數碼管依次點亮:選擇數碼管操作稱為位選,根據自己的開發板原理圖找到位選對應的管腳,以共陰極為例。要在編程時執行選中操作,只要給對應管腳低電平即可。段選同樣。如果每個單獨連接佔用管腳太多,很浪費硬體資源,所以採用多位串聯控制。

數碼管通常有兩種不同的接法,共陰極和共陽極,共陰極顧名思義就是講八個二極體的陰極連接在一起,這樣根據二極體導通原理,通過控制不同二極體陽極電平就可以控制數碼管顯示不同的數字。單個數碼管是由八個發光二極體連接而成,通過控制不同led點亮,可以使之顯示不同的數字。

注意區分兩個概念即段選和位選;位選指數碼管對應的位,例如圖共有八個數碼管,位選就是選中哪一個數碼管操作,段選則是控制數碼管顯示什麼數字。靜態顯示為了縮短代碼長度,一般都是採用匯流排式編程,顯示數字共陰共陽互為反。

Ⅳ C51單片機數碼管動態顯示工作原理是什麼

數碼管要正常顯示,就要用驅動電路來驅動數碼管的各個段碼,從而顯示出我們要的數字,因此根據數碼管的驅動方式的不同,可以分為靜態式和動態式兩類。
��① 靜態顯示驅動:靜態驅動也稱直流驅動。靜態驅動是指每個數碼管的每一個段碼都由一個單片機的I/O埠進行驅動,或者使用如BCD碼二-十進制解碼器解碼進行驅動。靜態驅動的優點是編程簡單,顯示亮度高,缺點是佔用I/O埠多,如驅動5個數碼管靜態顯示則需要5×8=40根I/O埠來驅動,要知道一個89S51單片盯脊機罩稿可用的I/O埠才32個呢:),實際應用時必須增加解碼驅動器進行驅動,增加了硬體電路的復雜性。
��② 動態顯示驅動:數碼管動態顯示介面是單片機中應用最為廣泛的一種顯示方式之一,動態驅動是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是那個數碼管會顯示出字形,取決於單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會凱悶滲亮。通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位數碼管的點亮時間為1~2ms,由於人的視覺暫留現象及發光二極體的余輝效應,盡管實際上各位數碼管並非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O埠,而且功耗更低。

Ⅳ C51單片機如何讓四位數碼管分別顯示四位不同的數字

每一次只能讓一個數碼管位選,其他的關閉,給數碼管賦值。重復4次就可以了。
假設要顯示「1234」:

#include<reg52.h>
sbit k1 = P1^1;
sbit k2 = P1^2;
sbit k3 = P1^3;
sbit k4 = P1^4;//k1-k4 4個位選開關,我假設你的電路是低電平有效

uchar code table[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8;
0x80,0x98};//共陽極1-9
void delay( char t )//延時函數
{
char x,y;

for( x = t;x > 0;x-- )

{
for( y = 100;y > 0;y-- );

}
}

void main()//主函數
{
int i = 1234;

int temp;

while(1)
{
temp = i;//temp = 1234;
//顯示第4位
k1 = k2 = k3 = k4 = 1;//關閉所有未選
k4 = 0;//打開第4位位選
P2 = table( temp%10 );//假設P2口控制數碼管
temp = temp / 10;//temp = 123

delay( 5 );

//顯示第3位
k1 = k2 = k3 = k4 = 1;//關閉所有未選
k3 = 0;//打開第3位位選
P2 = table( temp%10 );//,假設P2口控制數碼管
temp = temp / 10;//temp = 12
delay( 5 );

//顯示第2位
k1 = k2 = k3 = k4 = 1;//關閉所有未選
k4 = 0;//打開第4位位選
P2 = table( temp%10 );//,假設P2口控制數碼管
temp = temp / 10;//temp = 1;
delay( 5 );
//顯示第1位
k1 = k2 = k3 = k4 = 1;//關閉所有未選
k4 = 0;//打開第1位位選
P2 = table( temp%10 );//假設P2口控制數碼管
delay( 5 );

}

}

Ⅵ c51單片機按鍵每按一次同時數碼管顯示數字加一是什麼

-x0dx0a建立孝鎮一個數組,用於存放 0-9的段碼。x0dx0aint Shuzu[]={---------};x0dx0a如果會用指針x0dx0aint *P;x0dx0aP=Shuzu; //指針指向數組!x0dx0a用外部中斷,x0dx0a每中斷一次,中斷服務程序將數組元素加一P0=Shuzu[ax++](或指針加一:P0=*P++)x0dx0a以上假設P0口驅動數碼管!x0dx0a至於數碼管使用的是共陽還是共陰,就把相對的數值存在數組中!x0dx0a-x0dx0a外部中斷0的中斷程序入口x0dx0avoid TI_0() interrupt 0x0dx0a{x0dx0a --------x0dx0a}x0dx0a都提示到這里了,下面自己該會吧?x0dx0a如果是新手的新手---想要我幫你寫全部程序--x0dx0a那至少你得把你單片機晶元型號說給我巧虧粗才能幫你!x0dx0a還有數碼管是用單片機哪個IO口!x0dx0a數碼管是怎麼空含連接的?(串/並)

Ⅶ C51單片機,控制數碼管每隔3秒,循環數字1234,5678,9876,1368

用四位一體的共陰數碼管,用定時器T0定時,實現3秒切換顯示四組數字。模擬實現,模擬圖如下

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰段碼

uchar code disb[]={0xfe,0xfd,0xfb,0xf7};//位碼

uchar buf[]={1,2,3,4,5,6,7,8,9,8,7,6,1,3,6,8};//顯示四組數字

uchar t0n;//T0定時器中斷計數

void delay()//延時子程序

{

uint y;

for(y=400;y>0;y--);

}

void display(uchar x)//顯示子程序,x為顯示起始位

{

uchar j;

for(j=0;j<4;j++)

{

P2=disb[j];//輸出位碼

P0=tab[buf[j+x]];//輸出段碼

delay();

}

}

void main()//主程序

{

uchar x;

TMOD=0x01;//T0方式1

TH0=0x3C;//晶振12MHz,定是50ms,時間常數,X=3CB0H

TL0=0xB0;

IE=0x82;

TR0 =1;

while(1)

{

display(x);

if(t0n>=60)

{

t0n=0;

x+=4;

if(x>12)x=0;

}

}

}

//定時器T0中斷程序

void T0_ISR() interrupt 1

{

TH0=0x3C;

TL0=0xB0;

t0n++;

}

Ⅷ c51單片機 怎樣實現靜態數碼管動態顯示的數字等於點亮LED燈的個數

c51單片機,靜態數碼管顯示數字等於點亮LED燈的個數,這個很容易實野檔鄭現的。在P3口接8個LED燈,且負極接P3口,亮1個燈時,蠢滲P3=0xFE,再依次向左移位一次,從低位向左增加一個0,則亮燈數加一,同時,用一個變數計頌頌數,並送數碼管顯示就行了,一位共陽數碼管接在P0口。模擬圖如下。

閱讀全文

與c51單片機數碼管相關的資料

熱點內容
cocos2dluapdf 瀏覽:491
假的加密鎖靠譜嗎 瀏覽:176
經營聖手伺服器怎麼調 瀏覽:749
arduino手機編程 瀏覽:481
西醫pdf下載 瀏覽:29
後浪電影學院pdf 瀏覽:813
程序員怎麼做到不被人嫉妒 瀏覽:669
cmd新建文件夾md命令 瀏覽:570
php數組中的數值排序 瀏覽:832
安卓手機怎麼避免小孩內購 瀏覽:171
聯想伺服器出現黃色嘆號怎麼辦 瀏覽:991
約翰編譯器製作教程 瀏覽:130
大地pdf 瀏覽:109
pdfplus 瀏覽:577
匯編O命令 瀏覽:970
plt轉pdf 瀏覽:365
魔獸60宏命令大全 瀏覽:479
php志願者網站源碼 瀏覽:875
貿易pdf 瀏覽:497
dbug命令 瀏覽:352