導航:首頁 > 操作系統 > 單片機數碼管靜態顯示

單片機數碼管靜態顯示

發布時間:2022-02-11 07:02:02

❶ 51單片機共陰數碼管利用靜態顯示,讓六個數碼管顯示1~6,程序怎麼寫

代碼如下:

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

#define data P0 //P0口宏定義

/* ***************************************************** */

// 數碼管位選數組定義

/* ***************************************************** */

uchar code leddata[] =

{ 0x3F, //"0"

0x06, //"1"

0x5B, //"2"

0x4F, //"3"

0x66, //"4"

0x6D, //"5"

0x7D, //"6"

0x07, //"7"

0x7F, //"8"

0x6F, //"9"

0x77, //"A"

0x7C, //"B"

0x39, //"C"

0x5E, //"D"

0x79, //"E"

0x71, //"F"

0x76, //"H"

0x38, //"L"

0x37, //"n"

0x3E, //"u"

0x73, //"P"

0x5C, //"o"

0x40, //"-"

0x00, //熄滅

0x00 //自定義};

};

/* ***************************************************** */

// 位定義

/* ***************************************************** */

sbit = P1^7; //段選定義

sbit we = P1^6; //位選定義

/* ***************************************************** */

// 函數名稱:DelayMS()

// 函數功能:毫秒延時

// 入口參數:延時毫秒數(ValMS)

// 出口參數:無

/* ***************************************************** */

void delay(uint z)

{

uint x,y;

for(x = 0; x < z; x++)

for(y = 0; y < 113; y++);

}

/* ***************************************************** */

// 函數名稱:main()

// 函數功能:數碼管靜態顯示

// 入口參數:無

// 出口參數:無

/* ***************************************************** */

void main(void)

{

uchar i;

we = 1; //位選開

data = 0x00; //送入位選數據

we = 0; //位選關

while(1)

{

for(i = 0;i < 16 ; i++)

{

= 1; //段選開

data = leddata[i]; //送入段選數據

= 0; //段選關

delay(500); //延時

}

}

}

(1)單片機數碼管靜態顯示擴展閱讀

對於74HC573,形象一點,我們只需要將其理解為一扇大門,只不過這扇大門是單向的,其中11引腳(LE)控制著門的開、關狀態,高電平為大門打開,低電平為大門關閉。

D0-D7為輸入,Q0-Q7為輸出,在LE = 1,即輸入高電平時,輸入端=輸出端,輸入是什麼,輸出也就原封不動的輸出;在LE = 0 ,即輸入高電平時,大門關閉,實現鎖存,不再輸出。了解之後,我們按照電路圖,來進行編程,代碼實現。

在實現數碼管的靜態顯示中,用到了兩個鎖存器,兩個I/O口,P1.6和P1.7,分別是位選和段選。

首先定義了個數碼管位選數組,也就是十六進制代碼,這便是後來數碼管顯示數字的核心,接著,用 sbit 定義了位選和段選埠,分別是 P1.6 和 P1.7 ,定義了一個延時函數,其實這一串代碼很有意思,開關開關思想,貫穿始終。

首先把位選打開,送入位選數據後,關閉鎖存器,實現鎖存,進入循環,隨之打開段選鎖存器,送入段選數據後,再次關閉段選。

接下來,這個延時操作對於實際看到數碼管的顯示效果特別重要,因為程序在段選後之後,會馬上消隱,顯示的時間之後幾個微秒,這顯然不太合理,需要在關閉段選後加上延時,這樣一來,才會讓每位數碼管亮度保持均勻。

❷ c51單片機數碼管靜態顯示程序

1.先把顯示函數,按照下列,改一改。
void
display(uchar
shi,uchar
ge)
{
shi
=
num
/
10;
ge
=
num
%
10;
la
=
1;
p0
=
table[shi];
la
=
0;
wela
=
1;
p0
=
0xfe;
wela
=
0;
delay(5);
la
=
1;
p0
=
table[ge];
la
=
0;
wela
=
1;
p0
=
0xfd;
wela
=
0;
delay(5);
}
2.用顯示函數代替延時函數。
把你的程序中,凡是:delay(10);,都改成:display(shi,
ge);。
3.把幾處等待按鍵釋放,都加上顯示函數。
如:
while(!key1);
改為:while(!key1)
display(shi,
ge);
試試看吧。

❸ 51單片機數碼管靜態顯示的問題

應該是動態顯示吧!

❹ 單片機匯編程序:LED數碼管靜態顯示問題

顯示8,是因為你程序跑飛了,加上延時,自然是延時後跑飛,所以顯示8。靜態顯示不需特殊的延時。想要一直顯示就寫個死循環就程序停住就可以了,RET是子程序調用的返回,你這里不用加。

❺ 51單片機led數碼管顯示0-99靜態程序

假設P0 P2口接數碼管 程序如下
include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num=0;

//共陰數碼管七段碼
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延時程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void main(void )//主程序
{
while(1)
{
delay_ms(1000);
num++;
if(num==100)num=0;
P0=table[num/10];
P2=table[num%10];

❻ 單片機數碼管靜態顯示學號1830508,用keil 最好有過程,在圖上的過程上修改

// 單片機數碼管動態顯示學號1830508(注多位數碼管用靜態顯示電路會很復雜,所以一般多用動態顯示),方法有多種,下面是一個模擬常式可以參考。

#include<reg51.h>

#define uchar unsigned char

// 此表為 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f

unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

void delay(uchar z)

{

uchar i,j;

for(i=0;i<120;i++)

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

}

void main()

{

while(1)

{

P0=0xff;

P2=LED7Code[0];

P0=0xfe;

delay(5);

P0=0xff;

P2=LED7Code[1];

P0=0xfd;

delay(5);

P0=0xff;

P2=LED7Code[8];

P0=0xfb;

delay(5);

P0=0xff;

P2=LED7Code[3];

P0=0xf7;

delay(5);

P0=0xff;

P2=LED7Code[0];

P0=0xef;

delay(5);

P0=0xff;

P2=LED7Code[5];

P0=0xdf;

delay(5);

P0=0xff;

P2=LED7Code[0];

P0=0xbf;

delay(5);

P0=0xff;

P2=LED7Code[8];

P0=0x7f;

delay(5);

}

}

❼ 51單片機數碼管靜態顯示問題

點亮數碼管是最基本的了。首先要學會看原理圖。通過P22,P23,P24來控制38解碼器先選通一個數碼管,然後把段碼加到P0上,就能顯示了。要想顯示多個數碼管,就是上述方法加上延時。先顯示一個數碼管,再選通另一個數碼管,再送段碼,就能靜態顯示多個數碼管了。

❽ 用51單片機匯編語言,數碼管靜態輪流顯示1~F

編寫相應程序,對應數碼管順序,點亮時間等效果要求,最後執行程序段循環命令即可

❾ 怎麼用單片機匯編語言數碼管靜態顯示1234

數碼管連接電路如圖1所示,p0口輸出碼型,p2口輸出位選。鎖存器74hc573起驅動作用,提供驅動電流供數碼管發光。解碼器74hc138將位選地址轉換成位選信號,例如當前是第5個數碼管顯示,那麼p2口輸出位選地址05h,解碼器輸入cba=110,輸出位選信號y7-y0=11101111,其中y5=0,第5個數碼管選通並顯示,其它數碼管不顯示。實驗時將j6的左邊兩個引腳針(1和2)用跳冒連接,鎖存器11腳接vcc,關閉鎖存功能。
數碼管顯示方式為動態掃描方式,當p0口送第一個數0的碼型到鎖存器時,p2送位選地址01h,即y0=0,只有第一個數碼管亮,顯示0,其他數碼管不顯示。當p0口送第二個數1的碼型到鎖存器時,p2送位選地址02h,即y1=0,只有第二個數碼管亮,顯示1,其他數碼管不顯示。即每次只有一個數碼管點亮,8個數碼管是輪流被點亮的,輪流點亮的間隔時間很短(一般用延時程序延時幾個毫秒),由於視覺的暫留現象,看到的卻好象全都點亮著,這就是動態掃描。
數碼管顯示數字的碼型由數碼管的數據腳a~dp決定,圖2為數碼管的筆段分布圖,由於是共陰極的,所以當a~dp為高電平時相應的筆段會亮,電路中p1.0~p1.7分別接數碼管的a.b.c.d.e.f.g.dp,得到0~9這10個數字的碼型如表1所示。
圖2 數碼管的筆段分布圖
引腳
p0.7
p0.6
p0.5
p0.4
p0.3
p0.2
p0.1p0.0數字 碼型
筆段
dp
g
f
e
d
c
b a
0
0
1
1
1
1
1 1
0 3fh
0
0
0
0
0
1
1 0
1 06h
0
1
0
1
1
0
1 1
2 5bh
0
1
0
0
1
1
1 1
3 4fh
0
1
1
0
0
1
1 0
4 66h
0
1
1
0
1
1
0 1
5 6dh
0
1
1
1
1
1
0 1
6 7dh
0
0
0
0
0
1
1 1
7 07h
0
1
1
1
1
1
1 1
8 7fh
0
1
1
0
1
1
1 1
9 6fh
1
0
0
0
0
0
0 0
小數點80h
只要把上面的相關數,改成學好就可以了。

❿ 單片機上8個數碼管這樣是讓他循環顯示,怎樣讓它靜態顯示呢

/**52單片機,12MHz晶振,8位共陰數碼管,P0口段選,P2口低電平位選,P20最高位,P27最低位**/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define TRUE 1
#define FALSE 0

#define th0 0xfe
#define tl0 0x0c //500us at 12MHz(定時器工作模式1 狀態)
#define DisTimeAt500usCount 5 //單'位'數碼管顯示時間,數碼管刷新頻率f=1/(4t),其中 t 為單'位'數碼管顯示時間,單位 s,頻率f 單位 Hz

#define SEG_Num 8 //數碼管位數
uchar code LoveYouList[SEG_Num]={0x38,0x3f,0x3e,0x79,0x40,0x6e,0x3f,0x3e};//LOVE-YOU
#define SEG_Data P0 //數碼管段驅動介面
#define SEG_En P2 //數碼管位驅動介面
#define SEG_AllOff SEG_En=0xff //關閉所有數碼管(位驅動)

bit DisplayFlag; //顯示標志位

void Timer0() interrupt 1 //定時器0中斷函數
{
static uchar t500us; //定義靜態變數 t500us 定時計數寄存空間
TL0=tl0;
TH0=th0; //重賦 1ms 定時初值
t500us=++t500us%DisTimeAt500usCount; //先計數值加1,後對計數范圍進行限制0~(DisTimeAt500usCount-1)
if(!t500us) DisplayFlag=TRUE; //若定時計數值歸0,則表示計數值曾到達 單'位'顯示時間(DisTimeAt500usCount),顯示標志 置位
}

void SystemInit() //系統初始化函數
{
TMOD=0x01; //關閉定時器1,開啟定時器0,且工作在模式1(16位定時器)
TH0=th0;
TL0=tl0; //裝定時初值(1ms at 12MHz)
TR0=1; //啟動計時
ET0=1; //允許定時器0中斷
EA=1; //開啟系統中斷功能
}

void Display() //顯示函數
{
static dis_loca; //定義靜態變數 顯示位置
dis_loca=++dis_loca%SEG_Num; //先對 顯示位置 加1,後對變數范圍進行限制 0~(SEG_Num-1)
SEG_AllOff; //關閉所有數碼管顯示(位驅動)
SEG_Data=LoveYouList[dis_loca]; //將本次顯示位上的內容轉成代碼,並送到數據埠
SEG_En&=~(1<<dis_loca); //開啟本次需要顯示的位驅動
}

void main() //主函數
{
SystemInit(); //調用 系統初始化函數
while(1) //循環系統
{
if(DisplayFlag) //若顯示標志位為真(單'位'顯示時間結束),則執行以下任務
{
DisplayFlag=FALSE; //清顯示標志位
Display(); //調用 顯示函數
}
}
}
很多設定好的參數可以在 宏定義的時候修改,包括數碼管位數、數碼管刷新率等,如果LZ的晶振不是12MHz,那麼只需要將宏定義中 TH0,TL0的初值修改正常即可,如24MHz,就改成FC18,總體效果我沒實物測試,看LZ造化了。

閱讀全文

與單片機數碼管靜態顯示相關的資料

熱點內容
androidseekbar進度條 瀏覽:356
梯度上升演算法知乎 瀏覽:650
qt項目源碼下載 瀏覽:395
不允許代理伺服器什麼意思 瀏覽:511
盲反卷積演算法 瀏覽:306
峰火戰國什麼時候能開伺服器 瀏覽:452
加密的pdf怎麼提取和修改 瀏覽:488
壓縮空氣氣體流量計 瀏覽:845
高角杯如何編程 瀏覽:1011
哪個app可以下載迷失島 瀏覽:29
100以內程序員鍵盤 瀏覽:914
調試助手源碼是什麼 瀏覽:601
程序員網優 瀏覽:461
有沒有極限壓縮方法 瀏覽:79
岳陽hypermill五軸編程 瀏覽:385
超級舒服的解壓神器 瀏覽:450
超短macd源碼 瀏覽:167
群暉怎麼設置用戶訪問指定文件夾 瀏覽:557
安卓怎麼測觸摸屏 瀏覽:596
javastring原理 瀏覽:318