❶ 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造化了。