久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 10037|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

[分享]給51單片機(jī)初學(xué)者的40個(gè)經(jīng)典實(shí)驗(yàn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:16470 發(fā)表于 2009-8-22 16:47 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
覺得這份資料對(duì)初學(xué)者很有用,希望對(duì)初學(xué)的人有所幫助。 
   

7. I/O并行口直接驅(qū)動(dòng)LED顯示

1. 實(shí)驗(yàn)任務(wù)

如圖13所示,利用AT89S51單片機(jī)的P0端口的P0.0-P0.7連接到一個(gè)共陰數(shù)碼管的a-h(huán)的筆段上,數(shù)碼管的公共端接地。在數(shù)碼管上循環(huán)顯示0-9數(shù)字,時(shí)間間隔0.2秒。

2. 電路原理圖

圖4.7.1

3. 系統(tǒng)板上硬件連線

把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0-P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)數(shù)碼管的a-h(huán)端口上;要求:P0.0/AD0與a相連,P0.1/AD1與b相連,P0.2/AD2與c相連,……,P0.7/AD7與h相連。

4. 程序設(shè)計(jì)內(nèi)容

(1. LED數(shù)碼顯示原理

七段LED顯示器內(nèi)部由七個(gè)條形發(fā)光二極管和一個(gè)小圓點(diǎn)發(fā)光二極管組成,根據(jù)各管的極管的接線形式,可分成共陰極型和共陽極型。

LED數(shù)碼管的g~a七個(gè)發(fā)光二極管因加正電壓而發(fā)亮,因加零電壓而不以發(fā)亮,不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼,下面給出共陰極的字形碼見表2

“0”

3FH

 

“8”

7FH

 

“1”

06H

 

“9”

6FH

 

“2”

5BH

 

“A”

77H

 

“3”

4FH

 

“b”

7CH

 

“4”

66H

 

“C”

39H

 

“5”

6DH

 

“d”

5EH

 

“6”

7DH

 

“E”

79H

 

“7”

07H

 

“F”

71H

 

(2. 由于顯示的數(shù)字0-9的字形碼沒有規(guī)律可循,只能采用查表的方式來完成我們所需的要求了。這樣我們按著數(shù)字0-9的順序,把每個(gè)數(shù)字的筆段代碼按順序排好!建立的表格如下所示:TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

5.程序框圖

 

 

 

 

 

 

 

 

圖4.7.2

6. 匯編源程序
ORG 0
START: MOV R1,#00H
NEXT: MOV A,R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
INC R1
CJNE R1,#10,NEXT
LJMP START
DELAY: MOV R5,#20
D2: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
7. C語言源程序
#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char dispcount;

void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}

void main(void)
{
while(1)
{
for(dispcount=0;dispcount<10;dispcount++)
{
P0=table[dispcount];
delay02s();
}
}
}

8. 按鍵識(shí)別方法之一

1. 實(shí)驗(yàn)任務(wù)

每按下一次開關(guān)SP1,計(jì)數(shù)值加1,通過AT89S51單片機(jī)的P1端口的P1.0到P1.3顯示出其的二進(jìn)制計(jì)數(shù)值。

2. 電路原理圖

圖4.8.1

3. 系統(tǒng)板上硬件連線

(1. 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.7/RD端口連接到“獨(dú)立式鍵盤”區(qū)域中的SP1端口上;

(2. 把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0-P1.4端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1-L8”端口上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。

4. 程序設(shè)計(jì)方法

(1. 其實(shí),作為一個(gè)按鍵從沒有按下到按下以及釋放是一個(gè)完整的過程,也就是說,當(dāng)我們按下一個(gè)按鍵時(shí),總希望某個(gè)命令只執(zhí)行一次,而在按鍵按下的過程中,不要有干擾進(jìn)來,因?yàn)椋诎聪碌倪^程中,一旦有干擾過來,可能造成誤觸發(fā)過程,這并不是我們所想要的。因此在按鍵按下的時(shí)候,



 

 


 

 

圖4.8.2

要把我們手上的干擾信號(hào)以及按鍵的機(jī)械接觸等干擾信號(hào)給濾除掉,一般情況下,我們可以采用電容來濾除掉這些干擾信號(hào),但實(shí)際上,會(huì)增加硬件成本及硬件電路的體積,這是我們不希望,總得有個(gè)辦法解決這個(gè)問題,因此我們可以采用軟件濾波的方法去除這些干擾

信號(hào),一般情況下,一個(gè)按鍵按下的時(shí)候,總是在按下的時(shí)刻存在著一定的干擾信號(hào),按下之后就基本上進(jìn)入了穩(wěn)定的狀態(tài)。具體的一個(gè)按鍵從按下到釋放的全過程的信號(hào)圖如上圖所示:

從圖中可以看出,我們?cè)诔绦蛟O(shè)計(jì)時(shí),從按鍵被識(shí)別按下之后,延時(shí)5ms以上,從而避開了干擾信號(hào)區(qū)域,我們?cè)賮頇z測一次,看按鍵是否真得已經(jīng)按下,若真得已經(jīng)按下,這時(shí)肯定輸出為低電平,若這時(shí)檢測到的是高電平,證明剛才是由于干擾信號(hào)引起的誤觸發(fā),CPU就認(rèn)為是誤觸發(fā)信號(hào)而舍棄這次的按鍵識(shí)別過程。從而提高了系統(tǒng)的可靠性。

由于要求每按下一次,命令被執(zhí)行一次,直到下一次再按下的時(shí)候,再執(zhí)行一次命令,因此從按鍵被識(shí)別出來之后,我們就可以執(zhí)行這次的命令,所以要有一個(gè)等待按鍵釋放的過程,顯然釋放的過程,就是使其恢復(fù)成高電平狀態(tài)。

(1. 對(duì)于按鍵識(shí)別的指令,我們依然選擇如下指令JB BIT,REL指令是用來檢測BIT是否為高電平,若BIT=1,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序。或者是 JNB BIT,REL指令是用來檢測BIT是否為低電平,若BIT=0,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序。

(2. 但對(duì)程序設(shè)計(jì)過程中按鍵識(shí)別過程的框圖如右圖所示:                  圖4.8.3

5. 程序框圖

圖4.8.4

6. 匯編源程序
ORG 0
START: MOV R1,#00H ;初始化R1為0,表示從0開始計(jì)數(shù)
MOV A,R1 ;
CPL A ;取反指令
MOV P1,A ;送出P1端口由發(fā)光二極管顯示
REL: JNB P3.7,REL ;判斷SP1是否按下
LCALL DELAY10MS ;若按下,則延時(shí)10ms左右
JNB P3.7,REL ;再判斷SP1是否真得按下
INC R1 ;若真得按下,則進(jìn)行按鍵處理,使
MOV A,R1 ;計(jì)數(shù)內(nèi)容加1,并送出P1端口由
CPL A ;發(fā)光二極管顯示
MOV P1,A ;
JNB P3.7,$ ;等待SP1釋放
SJMP REL ;繼續(xù)對(duì)K1按鍵掃描
DELAY10MS: MOV R6,#20 ;延時(shí)10ms子程序
L1: MOV R7,#248
DJNZ R7,$
DJNZ R6,L1
RET
END




7. C語言源程序
#include <AT89X51.H>

unsigned char count;

void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}

void main(void)
{
while(1)
{
if(P3_7==0)
{
delay10ms();
if(P3_7==0)
{
count++;
if(count==16)
{
count=0;
}
P1=~count;
while(P3_7==0);
}
}
}
}



9. 一鍵多功能按鍵識(shí)別技術(shù)

1.實(shí)驗(yàn)任務(wù)

如圖4.9.1所示,開關(guān)SP1接在P3.7/RD管腳上,在AT89S51單片機(jī)的P1端口接有四個(gè)發(fā)光二極管,上電的時(shí)候,L1接在P1.0管腳上的發(fā)光二極管在閃爍,當(dāng)每一次按下開關(guān)SP1的時(shí)候,L2接在P1.1管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時(shí)候,L3接在P1.2管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時(shí)候,L4接在P1.3管腳上的發(fā)光二極管在閃爍,再按下開關(guān)SP1的時(shí)候,又輪到L1在閃爍了,如此輪流下去。

2.電路原理圖

圖4.9.1

3.系統(tǒng)板上硬件連線

(1. 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.7/RD端口連接到“獨(dú)立式鍵盤”區(qū)域中的SP1端口上;

(2. 把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0-P1.4端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的“L1-L8”端口上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。

4.程序設(shè)計(jì)方法

(1. 設(shè)計(jì)思想由來

在我們生活中,我們很容易通過這個(gè)叫張三,那個(gè)叫李四,另外一個(gè)是王五;那是因?yàn)槊總(gè)人有不同的名子,我們就很快認(rèn)出,同樣,對(duì)于要通過一個(gè)按鍵來識(shí)別每種不同的功能,我們給每個(gè)不同的功能模塊用不同的ID號(hào)標(biāo)識(shí),這樣,每按下一次按鍵,ID的值是不相同的,所以單片機(jī)就很容易識(shí)別不同功能的身份了。

(2. 設(shè)計(jì)方法

從上面的要求我們可以看出,L1到L4發(fā)光二極管在每個(gè)時(shí)刻的閃爍的時(shí)間是受開關(guān)SP1來控制,我們給L1到L4閃爍的時(shí)段定義出不同的ID號(hào),當(dāng)L1在閃爍時(shí),ID=0;當(dāng)L2在閃爍時(shí),ID=1;當(dāng)L3在閃爍時(shí),ID=2;當(dāng)L4在閃爍時(shí),ID=3;很顯然,只要每次按下開關(guān)K1時(shí),分別給出不同的ID號(hào)我們就能夠完成上面的任務(wù)了。下面給出有關(guān)程序設(shè)計(jì)的框圖。

5.程序框圖

 

 

 

 

 

 

 

 

 

 

 

 


圖4.9.2

6. 匯編源程序
ID EQU 30H
SP1 BIT P3.7
L1 BIT P1.0
L2 BIT P1.1
L3 BIT P1.2
L4 BIT P1.3
ORG 0
MOV ID,#00H
START: JB K1,REL
LCALL DELAY10MS
JB K1,REL
INC ID
MOV A,ID
CJNE A,#04,REL
MOV ID,#00H
REL: JNB K1,$
MOV A,ID
CJNE A,#00H,IS0
CPL L1
LCALL DELAY
SJMP START
IS0: CJNE A,#01H,IS1
CPL L2
LCALL DELAY
SJMP START
IS1: CJNE A,#02H,IS2
CPL L3
LCALL DELAY
SJMP START
IS2: CJNE A,#03H,IS3
CPL L4
LCALL DELAY
SJMP START
IS3: LJMP START
DELAY10MS: MOV R6,#20
LOOP1: MOV R7,#248
DJNZ R7,$
DJNZ R6,LOOP1
RET
DELAY: MOV R5,#20
LOOP2: LCALL DELAY10MS
DJNZ R5,LOOP2
RET
END
7. C語言源程序
#include <AT89X51.H>
unsigned char ID;
void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}

void delay02s(void)
{
unsigned char i;
for(i=20;i>0;i--)
{delay10ms();
}
}

void main(void)
{ while(1)
{ if(P3_7==0)
{delay10ms();
if(P3_7==0)
{
ID++;
if(ID==4)
{
ID=0;
}
while(P3_7==0);
}
}
switch(ID)
{ case 0:
P1_0=~P1_0;
delay02s();
break;
case 1:
P1_1=~P1_1;
delay02s();
break;
case 2:
P1_2=~P1_2;
delay02s();
break;
case 3:
P1_3=~P1_3;
delay02s();
break;
}
}
}

10. 00-99計(jì)數(shù)器

1. 實(shí)驗(yàn)任務(wù)

利用AT89S51單片機(jī)來制作一個(gè)手動(dòng)計(jì)數(shù)器,在AT89S51單片機(jī)的P3.7管腳接一個(gè)輕觸開關(guān),作為手動(dòng)計(jì)數(shù)的按鈕,用單片機(jī)的P2.0-P2.7接一個(gè)共陰數(shù)碼管,作為00-99計(jì)數(shù)的個(gè)位數(shù)顯示,用單片機(jī)的P0.0-P0.7接一個(gè)共陰數(shù)碼管,作為00-99計(jì)數(shù)的十位數(shù)顯示;硬件電路圖如圖19所示。

2. 電路原理圖

圖4.10.1

3. 系統(tǒng)板上硬件連線

(1. 把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0-P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)a-h(huán)端口上;要求:P0.0/AD0對(duì)應(yīng)著a,P0.1/AD1對(duì)應(yīng)著b,……,P0.7/AD7對(duì)應(yīng)著h。

(2. 把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8-P2.7/A15端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)數(shù)碼管的a-h(huán)端口上;

(3. 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.7/RD端口用導(dǎo)線連接到“獨(dú)立式鍵盤”區(qū)域中的SP1端口上;

4. 程序設(shè)計(jì)內(nèi)容

(1. 單片機(jī)對(duì)按鍵的識(shí)別的過程處理

(2. 單片機(jī)對(duì)正確識(shí)別的按鍵進(jìn)行計(jì)數(shù),計(jì)數(shù)滿時(shí),又從零開始計(jì)數(shù);

(3. 單片機(jī)對(duì)計(jì)的數(shù)值要進(jìn)行數(shù)碼顯示,計(jì)得的數(shù)是十進(jìn)數(shù),含有十位和個(gè)位,我們要把十位和個(gè)位拆開分別送出這樣的十位和個(gè)位數(shù)值到對(duì)應(yīng)的數(shù)碼管上顯示。如何拆開十位和個(gè)位我們可以把所計(jì)得的數(shù)值對(duì)10求余,即可得個(gè)位數(shù)字,對(duì)10整除,即可得到十位數(shù)字了。

(4. 通過查表方式,分別顯示出個(gè)位和十位數(shù)字。

5.程序框圖

 

 

 

 

 

 

 

圖4.10.2

6. 匯編源程序
Count EQU 30H
SP1 BIT P3.7
ORG 0
START: MOV Count,#00H
NEXT: MOV A,Count
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
WT: JNB SP1,WT
WAIT: JB SP1,WAIT
LCALL DELY10MS
JB SP1,WAIT
INC Count
MOV A,Count
CJNE A,#100,NEXT
LJMP START
DELY10MS: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
7. C語言源程序
#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char Count;

void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}

void main(void)
{
Count=0;
P0=table[Count/10];
P2=table[Count%10];
while(1)
{
if(P3_7==0)
{
delay10ms();
if(P3_7==0)
{
Count++;
if(Count==100)
{
Count=0;
}
P0=table[Count/10];
P2=table[Count%10];
while(P3_7==0);
}
}
}
}

11. 00-59秒計(jì)時(shí)器(利用軟件延時(shí))

1. 實(shí)驗(yàn)任務(wù)

  如下圖所示,在AT89S51單片機(jī)的P0和P2端口分別接有兩個(gè)共陰數(shù)碼管,P0口驅(qū)動(dòng)顯示秒時(shí)間的十位,而P2口驅(qū)動(dòng)顯示秒時(shí)間的個(gè)位。

2. 電路原理圖

圖4.11.1

3. 系統(tǒng)板上硬件連線

(1. 把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0-P0.7/AD7端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)a-h(huán)端口上;要求:P0.0/AD0對(duì)應(yīng)著a,P0.1/AD1對(duì)應(yīng)著b,……,P0.7/AD7對(duì)應(yīng)著h。

(2. 把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8-P2.7/A15端口用8芯排線連接到“四路靜態(tài)數(shù)碼顯示模塊”區(qū)域中的任一個(gè)a-h(huán)端口上;要求:P2.0/A8對(duì)應(yīng)著a,P2.1/A9對(duì)應(yīng)著b,……,P2.7/A15對(duì)應(yīng)著h。

4. 程序設(shè)計(jì)內(nèi)容

(1. 在設(shè)計(jì)過程中我們用一個(gè)存儲(chǔ)單元作為秒計(jì)數(shù)單元,當(dāng)一秒鐘到來時(shí),就讓秒計(jì)數(shù)單元加1,當(dāng)秒計(jì)數(shù)達(dá)到60時(shí),就自動(dòng)返回到0,重新秒計(jì)數(shù)。

(2. 對(duì)于秒計(jì)數(shù)單元中的數(shù)據(jù)要把它十位數(shù)和個(gè)數(shù)分開,方法仍采用對(duì)10整除和對(duì)10求余。

(3. 在數(shù)碼上顯示,仍通過查表的方式完成。

(4. 一秒時(shí)間的產(chǎn)生在這里我們采用軟件精確延時(shí)的方法來完成,經(jīng)過精確計(jì)算得到1秒時(shí)間為1.002秒。

DELY1S: MOV R5,#100

D2: MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

DJNZ R5,D2

RET

5. 程序框圖

 

 

 

 

 

 

 

 


圖4.11.2

6. 匯編源程序
Second EQU 30H
ORG 0
START: MOV Second,#00H
NEXT: MOV A,Second
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
LCALL DELY1S
INC Second
MOV A,Second
CJNE A,#60,NEXT
LJMP START
DELY1S: MOV R5,#100
D2: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
7. C語言源程序
#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char Second;

void delay1s(void)
{
unsigned char i,j,k;
for(k=100;k>0;k--)
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}


void main(void)
{
Second=0;
P0=table[Second/10];
P2=table[Second%10];
while(1)
{
delay1s();
Second++;
if(Second==60)
{
Second=0;
}
P0=table[Second/10];
P2=table[Second%10];
}
}

12. 可預(yù)置可逆4位計(jì)數(shù)器

1. 實(shí)驗(yàn)任務(wù)

利用AT89S51單片機(jī)的P1.0-P1.3接四個(gè)發(fā)光二極管L1-L4,用來指示當(dāng)前計(jì)數(shù)的數(shù)據(jù);用P1.4-P1.7作為預(yù)置數(shù)據(jù)的輸入端,接四個(gè)撥動(dòng)開關(guān)K1-K4,用P3.6/WR和P3.7/RD端口接兩個(gè)輕觸開關(guān),用來作加計(jì)數(shù)和減計(jì)數(shù)開關(guān)。具體的電路原理圖如下圖所示

2. 電路原理圖

圖4.12.1

3. 系統(tǒng)板上硬件連線

(1. 把“單片機(jī)系統(tǒng)”區(qū)域中的P1.0-P1.3端口用8芯排線連接到“八路發(fā)光二極管指示模塊”區(qū)域中的L1-L4上;要求:P1.0對(duì)應(yīng)著L1,P1.1對(duì)應(yīng)著L2,P1.2對(duì)應(yīng)著L3,P1.3對(duì)應(yīng)著L4;

(2. 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.0/RXD,P3.1/TXD,P3.2/INT0,P3.3/INT1用導(dǎo)線連接到“四路撥動(dòng)開關(guān)”區(qū)域中的K1-K4上;

(3. 把“單片機(jī)系統(tǒng)”區(qū)域中的P3.6/WR,P3.7/RD用導(dǎo)線連接到“獨(dú)立式鍵盤”區(qū)域中的SP1和SP2上;

4. 程序設(shè)計(jì)內(nèi)容

(1. 兩個(gè)獨(dú)立式按鍵識(shí)別的處理過程;

(2. 預(yù)置初值讀取的問題

(3. LED輸出指示

5. 程序框圖

 

 

 

 

 

 

 

 

 

 

 

 

圖4.12.2

6. 匯編源程序
COUNT EQU 30H
ORG 00H
START: MOV A,P3
ANL A,#0FH
MOV COUNT,A
MOV P1,A
SK2: JB P3.6,SK1
LCALL DELY10MS
JB P3.6,SK1
INC COUNT
MOV A,COUNT
CJNE A,#16,NEXT
MOV A,P3
ANL A,#0FH
MOV COUNT,A
NEXT: MOV P1,A
WAIT: JNB P3.6,WAIT
LJMP SK2
SK1: JB P3.7,SK2
LCALL DELY10MS
JB P3.7,SK2
DEC COUNT
MOV A,COUNT
CJNE A,#0FFH,NEX
MOV A,P3
ANL A,#0FH
MOV COUNT,A
NEX: MOV P1,A
WAIT2: JNB P3.7,WAIT2
LJMP SK2
DELY10MS: MOV R6,#20
MOV R7,#248
D1: DJNZ R7,$
DJNZ R6,D1
RET
END
7. C語言源程序
#include <AT89X51.H>

unsigned char curcount;

void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}


void main(void)
{
curcount=P3 & 0x0f;
P1=~curcount;
while(1)
{
if(P3_6==0)
{
delay10ms();
if(P3_6==0)
{
if(curcount>=15)
{
curcount=15;
}
else
{
curcount++;
}
P1=~curcount;
while(P3_6==0);
}
}
if(P3_7==0)
{
delay10ms();
if(P3_7==0)
{
if(curcount<=0)
{
curcount=0;
}
else
{
curcount--;
}
P1=~curcount;
while(P3_7==0);
}
}
}
}

13. 動(dòng)態(tài)數(shù)碼顯示技術(shù)

1. 實(shí)驗(yàn)任務(wù)

如圖4.13.1所示,P0端口接動(dòng)態(tài)數(shù)碼管的字形碼筆段,P2端口接動(dòng)態(tài)數(shù)碼管的數(shù)位選擇端,P1.7接一個(gè)開關(guān),當(dāng)開關(guān)接高電平時(shí),顯示“12345”字樣;當(dāng)開關(guān)接低電平時(shí),顯示“HELLO”字樣。

2. 電路原理圖

圖4.13.1

3. 系統(tǒng)板上硬件連線

(1. 把“單片機(jī)系統(tǒng)”區(qū)域中的P0.0/AD0-P0.7/AD7用8芯排線連接到“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的a-h(huán)端口上;

(2. 把“單片機(jī)系統(tǒng)”區(qū)域中的P2.0/A8-P2.7/A15用8芯排線連接到“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的S1-S8端口上;

(3. 把“單片機(jī)系統(tǒng)”區(qū)域中的P1.7端口用導(dǎo)線連接到“獨(dú)立式鍵盤”區(qū)域中的SP1端口上;

4. 程序設(shè)計(jì)內(nèi)容

(1. 動(dòng)態(tài)掃描方法

動(dòng)態(tài)接口采用各數(shù)碼管循環(huán)輪流顯示的方法,當(dāng)循環(huán)顯示頻率較高時(shí),利用人眼的暫留特性,看不出閃爍顯示現(xiàn)象,這種顯示需要一個(gè)接口完成字形碼的輸出(字形選擇),另一接口完成各數(shù)碼管的輪流點(diǎn)亮(數(shù)位選擇)。

(2. 在進(jìn)行數(shù)碼顯示的時(shí)候,要對(duì)顯示單元開辟8個(gè)顯示緩沖區(qū),每個(gè)顯示緩沖區(qū)裝有顯示的不同數(shù)據(jù)即可。

(3. 對(duì)于顯示的字形碼數(shù)據(jù)我們采用查表方法來完成。

5. 程序框圖

圖4.13.2

6. 匯編源程序
ORG 00H
START: JB P1.7,DIR1
MOV DPTR,#TABLE1
SJMP DIR
DIR1: MOV DPTR,#TABLE2
DIR: MOV R0,#00H
MOV R1,#01H
NEXT: MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R1
MOV P2,A
LCALL DAY
INC R0
RL A
MOV R1,A
CJNE R1,#0DFH,NEXT
SJMP START
DAY: MOV R6,#4
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
TABLE1: DB 06H,5BH,4FH,66H,6DH
TABLE2: DB 78H,79H,38H,38H,3FH
END
7. C語言源程序
#include <AT89X51.H>

unsigned char code table1[]={0x06,0x5b,0x4f,0x66,0x6d};
unsigned char code table2[]={0x78,0x79,0x38,0x38,0x3f};
unsigned char i;
unsigned char a,b;
unsigned char temp;

void main(void)
{
while(1)
{
temp=0xfe;
for(i=0;i<5;i++)
{
if(P1_7==1)
{
P0=table1;
}
else
{
P0=table2;
}
P2=temp;
a=temp<<(i+1);
b=temp>>(7-i);
temp=a|b;
     for(a=4;a>0;a--)
for(b=248;b>0;b--);
}
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:17016 發(fā)表于 2009-9-9 14:12 | 只看該作者
我的腦袋有點(diǎn)暈
回復(fù)

使用道具 舉報(bào)

板凳
ID:17042 發(fā)表于 2009-9-10 00:08 | 只看該作者
好東西。謝了
回復(fù)

使用道具 舉報(bào)

地板
ID:17446 發(fā)表于 2009-9-23 14:49 | 只看該作者
怎么看不見圖啊?
回復(fù)

使用道具 舉報(bào)

5#
ID:26338 發(fā)表于 2010-10-27 21:57 | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

6#
ID:31937 發(fā)表于 2011-10-1 12:40 | 只看該作者
 需要這樣的例子。
回復(fù)

使用道具 舉報(bào)

7#
ID:32474 發(fā)表于 2011-10-17 15:48 | 只看該作者

樓主怎么看不見圖啊

450387581@QQ.COM.我要

回復(fù)

使用道具 舉報(bào)

8#
ID:32486 發(fā)表于 2011-10-17 20:08 | 只看該作者

咋個(gè)看不到圖啊

 

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产免费 | 青青久草| 日韩免费一区二区 | 国产欧美一区二区久久性色99 | 欧美日韩一区二区三区四区 | 久久91精品国产 | 美女国产一区 | 羞羞视频网站免费看 | 新超碰97 | 成人黄色在线 | 521av网站| 成人免费看黄 | 91视频精选| 日本在线视频一区二区 | 一区二区三区久久 | 久久影院一区 | 久操伊人 | 欧美日韩国产在线 | 国产福利二区 | 中文在线视频 | 99久热在线精品视频观看 | 三级av在线 | 色综合激情 | 亚洲xx在线 | 中文字幕精品一区二区三区精品 | 黄色小视频入口 | 亚洲精品二区 | 日韩在线视频播放 | 欧美影院| 久久国产精品免费一区二区三区 | 国产精品亚洲视频 | 国产精品国产自产拍高清 | 神马影院一区二区三区 | 日本高清视频网站 | 精品国产一区二区三区免费 | 日韩一区二区三区在线视频 | 91精品国产91久久综合桃花 | 久久av一区| 国产视频一区在线 | 色久五月 | 国产精品久久久久久久久久三级 |