51單片機(jī)練習(xí)題集_第1頁(yè)
51單片機(jī)練習(xí)題集_第2頁(yè)
51單片機(jī)練習(xí)題集_第3頁(yè)
51單片機(jī)練習(xí)題集_第4頁(yè)
51單片機(jī)練習(xí)題集_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

...wd......wd......wd...一.閃爍燈1.實(shí)驗(yàn)任務(wù)如圖4.1.1所示:在P1.0端口上接一個(gè)發(fā)光二極管L1,使L1在不停地一亮一滅,一亮一滅的時(shí)間間隔為0.2秒。2.電路原理圖圖4.1.13.系統(tǒng)板上硬件連線把“單片機(jī)系統(tǒng)〞區(qū)域中的P1.0端口用導(dǎo)線連接到“八路發(fā)光二極管指示模塊〞區(qū)域中的L1端口上。4.程序設(shè)計(jì)內(nèi)容〔1〕延時(shí)程序的設(shè)計(jì)方法作為單片機(jī)的指令的執(zhí)行的時(shí)間是很短,數(shù)量大微秒級(jí),因此,我們要求的閃爍時(shí)間間隔為0.2秒,相對(duì)于微秒來(lái)說(shuō),相差太大,所以我們?cè)趫?zhí)行某一指令時(shí),插入延時(shí)程序,來(lái)到達(dá)我們的要求,但這樣的延時(shí)程序是如何設(shè)計(jì)呢下面具體介紹其原理:如圖4.1.1所示的石英晶體為12MHz,因此,1個(gè)機(jī)器周期為1微秒機(jī)器周期微秒MOVR6,#202個(gè)2D1:MOVR7,#2482個(gè)22+2×248=49820×DJNZR7,$2個(gè)2×248(498DJNZR6,D12個(gè)2×20=4010002因此,上面的延時(shí)程序時(shí)間為10.002ms。由以上可知,當(dāng)R6=10、R7=248時(shí),延時(shí)5ms,R6=20、R7=248時(shí),延時(shí)10ms,以此為根本的計(jì)時(shí)單位。如本實(shí)驗(yàn)要求0.2秒=200ms,10ms×R5=200ms,則R5=20,延時(shí)子程序如下:DELAY:MOVR5,#20

D1:MOVR6,#20

D2:MOVR7,#248

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET〔2〕.輸出控制如圖1所示,當(dāng)P1.0端口輸出高電平,即P1.0=1時(shí),根據(jù)發(fā)光二極管的單向?qū)щ娦钥芍?,這時(shí)發(fā)光二極管L1熄滅;當(dāng)P1.0端口輸出低電平,即P1.0=0時(shí),發(fā)光二極管L1亮;我們可以使用SETBP1.0指令使P1.0端口輸出高電平,使用CLRP1.0指令使P1.0端口輸出低電平。5.程序框圖如圖4.1.2所示圖4.1.26.匯編源程序

ORG0

START:CLRP1.0

LCALLDELAY

SETBP1.0

LCALLDELAY

LJMPSTART

DELAY:MOVR5,#20;延時(shí)子程序,延時(shí)0.2秒

D1:MOVR6,#20

D2:MOVR7,#248

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

sbitL1=P1^0;

voiddelay02s(void)//延時(shí)0.2秒子程序

{unsignedchari,j,k;

for(i=20;i>0;i--)

for(j=20;j>0;j--)

for(k=248;k>0;k--);}voidmain(void)

{while(1)

{L1=0;

delay02s();

L1=1;

delay02s();}二.模擬開(kāi)關(guān)燈1.實(shí)驗(yàn)任務(wù)如圖4.2.1所示,監(jiān)視開(kāi)關(guān)K1〔接在P3.0端口上〕,用發(fā)光二極管L1〔接在單片機(jī)P1.0端口上〕顯示開(kāi)關(guān)狀態(tài),如果開(kāi)關(guān)合上,L1亮,開(kāi)關(guān)翻開(kāi),L1熄滅。2.電路原理圖圖4.2.13.系統(tǒng)板上硬件連線〔1〕.把“單片機(jī)系統(tǒng)〞區(qū)域中的P1.0端口用導(dǎo)線連接到“八路發(fā)光二極管指示模塊〞區(qū)域中的L1端口上;〔2〕.把“單片機(jī)系統(tǒng)〞區(qū)域中的P3.0端口用導(dǎo)線連接到“四路撥動(dòng)開(kāi)關(guān)〞區(qū)域中的K1端口上;4.程序設(shè)計(jì)內(nèi)容〔1〕.開(kāi)關(guān)狀態(tài)的檢測(cè)過(guò)程單片機(jī)對(duì)開(kāi)關(guān)狀態(tài)的檢測(cè)相對(duì)于單片機(jī)來(lái)說(shuō),是從單片機(jī)的P3.0端口輸入信號(hào),而輸入的信號(hào)只有高電平和低電平兩種,當(dāng)撥開(kāi)開(kāi)關(guān)K1撥上去,即輸入高電平,相當(dāng)開(kāi)關(guān)斷開(kāi),當(dāng)撥動(dòng)開(kāi)關(guān)K1撥下去,即輸入低電平,相當(dāng)開(kāi)關(guān)閉合。單片機(jī)可以采用JBBIT,REL或者是JNBBIT,REL指令來(lái)完成對(duì)開(kāi)關(guān)狀態(tài)的檢測(cè)即可。〔2〕.輸出控制如圖3所示,當(dāng)P1.0端口輸出高電平,即P1.0=1時(shí),根據(jù)發(fā)光二極管的單向?qū)щ娦钥芍?,這時(shí)發(fā)光二極管L1熄滅;當(dāng)P1.0端口輸出低電平,即P1.0=0時(shí),發(fā)光二極管L1亮;我們可以使用SETBP1.0指令使P1.0端口輸出高電平,使用CLRP1.0指令使P1.0端口輸出低電平。5.程序框圖圖4.2.26.匯編源程序ORG00H

START:JBP3.0,LIG

CLRP1.0

SJMPSTART

LIG:SETBP1.0

SJMPSTART

END7.C語(yǔ)言源程序

#include<AT89X51.H>

sbitK1=P3^0;

sbitL1=P1^0;

voidmain(void)

{while(1)

{

if(K1==0)

{L1=0;//燈亮}

else

{L1=1;//燈滅}三.多路開(kāi)關(guān)狀態(tài)指示1.實(shí)驗(yàn)任務(wù)如圖4.3.1所示,AT89S51單片機(jī)的P1.0-P1.3接四個(gè)發(fā)光二極管L1-L4,P1.4-P1.7接了四個(gè)開(kāi)關(guān)K1-K4,編程將開(kāi)關(guān)的狀態(tài)反映到發(fā)光二極管上?!查_(kāi)關(guān)閉合,對(duì)應(yīng)的燈亮,開(kāi)關(guān)斷開(kāi),對(duì)應(yīng)的燈滅〕。2.電路原理圖圖4.3.13.系統(tǒng)板上硬件連線〔1.把“單片機(jī)系統(tǒng)〞區(qū)域中的P1.0-P1.3用導(dǎo)線連接到“八路發(fā)光二極管指示模塊〞區(qū)域中的L1-L4端口上;〔2.把“單片機(jī)系統(tǒng)〞區(qū)域中的P1.4-P1.7用導(dǎo)線連接到“四路撥動(dòng)開(kāi)關(guān)〞區(qū)域中的K1-K4端口上;4.程序設(shè)計(jì)內(nèi)容〔1.開(kāi)關(guān)狀態(tài)檢測(cè)對(duì)于開(kāi)關(guān)狀態(tài)檢測(cè),相對(duì)單片機(jī)來(lái)說(shuō),是輸入關(guān)系,我們可輪流檢測(cè)每個(gè)開(kāi)關(guān)狀態(tài),根據(jù)每個(gè)開(kāi)關(guān)的狀態(tài)讓相應(yīng)的發(fā)光二極管指示,可以采用JBP1.X,REL或JNBP1.X,REL指令來(lái)完成;也可以一次性檢測(cè)四路開(kāi)關(guān)狀態(tài),然后讓其指示,可以采用MOVA,P1指令一次把P1端口的狀態(tài)全部讀入,然后取高4位的狀態(tài)來(lái)指示?!?.輸出控制根據(jù)開(kāi)關(guān)的狀態(tài),由發(fā)光二極管L1-L4來(lái)指示,我們可以用SETBP1.X和CLRP1.X指令來(lái)完成,也可以采用MOVP1,#1111XXXXB方法一次指示。5.程序框圖讀P1口數(shù)據(jù)到ACC中ACC內(nèi)容右移4次ACC內(nèi)容與F0H相或ACC內(nèi)容送入P1口<![endif]-->圖4.3.26.方法一〔匯編源程序〕

ORG00H

START:MOVA,P1

ANLA,#0F0H

RRA

RRA

RRA

RRA

XORA,#0F0H

MOVP1,A

SJMPSTART

END

7.方法一〔C語(yǔ)言源程序〕

#include<AT89X51.H>

unsignedchartemp;

voidmain(void)

{

while(1)

{

temp=P1>>4;

temp=temp|0xf0;

P1=temp;

}

}

8.方法二〔匯編源程序〕

ORG00H

START:JBP1.4,NEXT1

CLRP1.0

SJMPNEX1

NEXT1:SETBP1.0

NEX1:JBP1.5,NEXT2

CLRP1.1

SJMPNEX2

NEXT2:SETBP1.1

NEX2:JBP1.6,NEXT3

CLRP1.2

SJMPNEX3

NEXT3:SETBP1.2

NEX3:JBP1.7,NEXT4

CLRP1.3

SJMPNEX4

NEXT4:SETBP1.3

NEX4:SJMPSTART

END

9.方法二〔C語(yǔ)言源程序〕

#include<AT89X51.H>

voidmain(void)

{

while(1)

{

if(P1_4==0)

{

P1_0=0;

}

else

{

P1_0=1;

}

if(P1_5==0)

{

P1_1=0;

}

else

{

P1_1=1;

}

if(P1_6==0)

{

P1_2=0;

}

else

{

P1_2=1;

}

if(P1_7==0)

{

P1_3=0;

}

else

{

P1_3=1;

}}}四.廣告燈的左移右移1.實(shí)驗(yàn)任務(wù)做單一燈的左移右移,硬件電路如圖4.4.1所示,八個(gè)發(fā)光二極管L1-L8分別接在單片機(jī)的P1.0-P1.7接口上,輸出“0〞時(shí),發(fā)光二極管亮,開(kāi)場(chǎng)時(shí)P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重復(fù)循環(huán)。2.電路原理圖圖4.4.13.系統(tǒng)板上硬件連線把“單片機(jī)系統(tǒng)〞區(qū)域中的P1.0-P1.7用8芯排線連接到“八路發(fā)光二極管指示模塊〞區(qū)域中的L1-L8端口上,要求:P1.0對(duì)應(yīng)著L1,P1.1對(duì)應(yīng)著L2,……,P1.7對(duì)應(yīng)著L8。4.程序設(shè)計(jì)內(nèi)容我們可以運(yùn)用輸出端口指令MOVP1,A或MOVP1,#DATA,只要給累加器值或常數(shù)值,然后執(zhí)行上述的指令,即可到達(dá)輸出控制的動(dòng)作。每次送出的數(shù)據(jù)是不同,具體的數(shù)據(jù)如下表1所示P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0說(shuō)明L8L7L6L5L4L3L2L111111110L1亮11111101L2亮11111011L3亮11110111L4亮11101111L5亮11011111L6亮10111111L7亮01111111L8亮表15.程序框圖圖4.4.26.匯編源程序

ORG0

START:MOVR2,#8

MOVA,#0FEH

SETBC

LOOP:MOVP1,A

LCALLDELAY

RLCA

DJNZR2,LOOP

MOVR2,#8

LOOP1:MOVP1,A

LCALLDELAY

RRCA

DJNZR2,LOOP1

LJMPSTART

DELAY:MOVR5,#20;

D1:MOVR6,#20

D2:MOVR7,#248

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

unsignedchari;

unsignedchartemp;

unsignedchara,b;

voiddelay(void)

{

unsignedcharm,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--);

}

voidmain(void)

{

while(1)

{

temp=0xfe;

P1=temp;

delay();

for(i=1;i<8;i++)

{

a=temp<<i;

b=temp>>(8-i);

P1=a|b;

delay();

}

for(i=1;i<8;i++)

{

a=temp>>i;

b=temp<<(8-i);

P1=a|b;

delay();

}

}

}五.廣告燈〔利用取表方式〕1.實(shí)驗(yàn)任務(wù)使端口P1做單一燈的變化:左右移2次,閃爍2次〔延時(shí)的時(shí)間0.2秒〕。2.電路原理圖圖4.5.13.系統(tǒng)板上硬件連線把“單片機(jī)系統(tǒng)〞區(qū)域中的P1.0-P1.7用8芯排線連接到“八路發(fā)光二極管指示模塊〞區(qū)域中的L1-L8端口上,要求:P1.0對(duì)應(yīng)著L1,P1.1對(duì)應(yīng)著L2,……,P1.7對(duì)應(yīng)著L8。4.程序設(shè)計(jì)內(nèi)容在用表格進(jìn)展程序設(shè)計(jì)的時(shí)候,要用以下的指令來(lái)完成〔1〕.利用MOVDPTR,#DATA16的指令來(lái)使數(shù)據(jù)指針存放器指到表的開(kāi)頭。〔2〕.利用MOVCA,@A+DPTR的指令,根據(jù)累加器的值再加上DPTR的值,就可以使程序計(jì)數(shù)器PC指到表格內(nèi)所要取出的數(shù)據(jù)。因此,只要把控制碼建成一個(gè)表,而利用MOVC工,@A+DPTR做取碼的操作,就可方便地處理一些復(fù)雜的控制動(dòng)作,取表過(guò)程如以下列圖所示:5.程序框圖圖4.5.26.匯編源程序

ORG0

START:MOVDPTR,#TABLE

LOOP:CLRA

MOVCA,@A+DPTR

CJNEA,#01H,LOOP1

JMPSTART

LOOP1:MOVP1,A

MOVR3,#20

LCALLDELAY

INCDPTR

JMPLOOP

DELAY:MOVR4,#20

D1:MOVR5,#248

DJNZR5,$

DJNZR4,D1

DJNZR3,DELAY

RET

TABLE:DB0FEH,0FDH,0FBH,0F7H

DB0EFH,0DFH,0BFH,07FH

DB0FEH,0FDH,0FBH,0F7H

DB0EFH,0DFH,0BFH,07FH

DB07FH,0BFH,0DFH,0EFH

DB0F7H,0FBH,0FDH,0FEH

DB07FH,0BFH,0DFH,0EFH

DB0F7H,0FBH,0FDH,0FEH

DB00H,0FFH,00H,0FFH

DB01H

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f,

0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f,

0x7f,0xbf,0xdf,0xef,

0xf7,0xfb,0xfd,0xfe,

0x7f,0xbf,0xdf,0xef,

0xf7,0xfb,0xfd,0xfe,

0x00,0xff,0x00,0xff,

0x01};

unsignedchari;

voiddelay(void)

{

unsignedcharm,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--);

}

voidmain(void)

{

while(1)

{

if(table[i]!=0x01)

{

P1=table[i];

i++;

delay();

}

else

{

i=0;

}

}

}六.報(bào)警產(chǎn)生器1.實(shí)驗(yàn)任務(wù)用P1.0輸出1KHz和500Hz的音頻信號(hào)驅(qū)動(dòng)揚(yáng)聲器,作報(bào)警信號(hào),要求1KHz信號(hào)響100ms,500Hz信號(hào)響200ms,交替進(jìn)展,P1.7接一開(kāi)關(guān)進(jìn)展控制,當(dāng)開(kāi)關(guān)合上響報(bào)警信號(hào),當(dāng)開(kāi)關(guān)斷開(kāi)告警信號(hào)停頓,編出程序。2.電路原理圖圖4.6.13.系統(tǒng)板上硬件連線〔1.把“單片機(jī)系統(tǒng)〞區(qū)域中的P1.0端口用導(dǎo)線連接到“音頻放大模塊〞區(qū)域中的SPKIN端口上;〔2.在“音頻放大模塊〞區(qū)域中的SPKOUT端口上接上一個(gè)8歐的或者是16歐的喇叭;〔3.把“單片機(jī)系統(tǒng)〞區(qū)域中的P1.7/RD端口用導(dǎo)線連接到“四路撥動(dòng)開(kāi)關(guān)〞區(qū)域中的K1端口上;4.程序設(shè)計(jì)內(nèi)容〔1.信號(hào)產(chǎn)生的方法500Hz信號(hào)周期為2ms,信號(hào)電平為每1ms變反1次,1KHz的信號(hào)周期為1ms,信號(hào)電平每500us變反1次;5.程序框圖圖4.6.26.匯編源程序

FLAGBIT00H

ORG00H

START:JBP1.7,START

JNBFLAG,NEXT

MOVR2,#200

DV:CPLP1.0

LCALLDELY500

LCALLDELY500

DJNZR2,DV

CPLFLAG

NEXT:MOVR2,#200

DV1:CPLP1.0

LCALLDELY500

DJNZR2,DV1

CPLFLAG

SJMPSTART

DELY500:MOVR7,#250

LOOP:NOP

DJNZR7,LOOP

RET

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

#include<INTRINS.H>

bitflag;

unsignedcharcount;

voiddely500(void)

{unsignedchari;

for(i=250;i>0;i--)

_nop_();}

voidmain(void)

{while(1)

{

if(P1_7==0)

{

for(count=200;count>0;count--)

{P1_0=~P1_0;

dely500();

}

for(count=200;count>0;count--)

{

P1_0=~P1_0;

dely500();

dely500();

}}}}七.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.13.系統(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ù)各管的極管的接線形式,可分成共陰極型和共陽(yáng)極型。LED數(shù)碼管的g~a七個(gè)發(fā)光二極管因加正電壓而發(fā)亮,因加零電壓而不以發(fā)亮,不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼,下面給出共陰極的字形碼見(jiàn)表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的字形碼沒(méi)有規(guī)律可循,只能采用查表的方式來(lái)完成我們所需的要求了。這樣我們按著數(shù)字0-9的順序,把每個(gè)數(shù)字的筆段代碼按順序排好!建設(shè)的表格如下所示:TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH5.程序框圖圖4.7.26.匯編源程序

ORG0

START:MOVR1,#00H

NEXT:MOVA,R1

MOVDPTR,#TABLE

MOVCA,@A+DPTR

MOVP0,A

LCALLDELAY

INCR1

CJNER1,#10,NEXT

LJMPSTART

DELAY:MOVR5,#20

D2:MOVR6,#20

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

DJNZR5,D2

RET

TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f};

unsignedchardispcount;

voiddelay02s(void)

{

unsignedchari,j,k;

for(i=20;i>0;i--)

for(j=20;j>0;j--)

for(k=248;k>0;k--);

}

voidmain(void)

{

while(1)

{

for(dispcount=0;dispcount<10;dispcount++)

{P0=table[dispcount];

delay02s();

}}}八.按鍵識(shí)別方法之一1.實(shí)驗(yàn)任務(wù)每按下一次開(kāi)關(guān)SP1,計(jì)數(shù)值加1,通過(guò)AT89S51單片機(jī)的P1端口的P1.0到P1.3顯示出其的二進(jìn)制計(jì)數(shù)值。2.電路原理圖圖4.8.13.系統(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è)按鍵從沒(méi)有按下到按下以及釋放是一個(gè)完整的過(guò)程,也就是說(shuō),當(dāng)我們按下一個(gè)按鍵時(shí),總希望某個(gè)命令只執(zhí)行一次,而在按鍵按下的過(guò)程中,不要有干擾進(jìn)來(lái),因?yàn)?,在按下的過(guò)程中,一旦有干擾過(guò)來(lái),可能造成誤觸發(fā)過(guò)程,這并不是我們所想要的。因此在按鍵按下的時(shí)候,圖4.8.2要把我們手上的干擾信號(hào)以及按鍵的機(jī)械接觸等干擾信號(hào)給濾除掉,一般情況下,我們可以采用電容來(lái)濾除掉這些干擾信號(hào),但實(shí)際上,會(huì)增加硬件本錢及硬件電路的體積,這是我們不希望,總得有個(gè)方法解決這個(gè)問(wèn)題,因此我們可以采用軟件濾波的方法去除這些干擾信號(hào),一般情況下,一個(gè)按鍵按下的時(shí)候,總是在按下的時(shí)刻存在著一定的干擾信號(hào),按下之后就根本上進(jìn)入了穩(wěn)定的狀態(tài)。具體的一個(gè)按鍵從按下到釋放的全過(guò)程的信號(hào)圖如上圖所示:從圖中可以看出,我們?cè)诔绦蛟O(shè)計(jì)時(shí),從按鍵被識(shí)別按下之后,延時(shí)5ms以上,從而避開(kāi)了干擾信號(hào)區(qū)域,我們?cè)賮?lái)檢測(cè)一次,看按鍵是否真得已經(jīng)按下,假設(shè)真得已經(jīng)按下,這時(shí)肯定輸出為低電平,假設(shè)這時(shí)檢測(cè)到的是高電平,證明剛剛是由于干擾信號(hào)引起的誤觸發(fā),CPU就認(rèn)為是誤觸發(fā)信號(hào)而舍棄這次的按鍵識(shí)別過(guò)程。從而提高了系統(tǒng)的可靠性。由于要求每按下一次,命令被執(zhí)行一次,直到下一次再按下的時(shí)候,再執(zhí)行一次命令,因此從按鍵被識(shí)別出來(lái)之后,我們就可以執(zhí)行這次的命令,所以要有一個(gè)等待按鍵釋放的過(guò)程,顯然釋放的過(guò)程,就是使其恢復(fù)成高電平狀態(tài)?!?.對(duì)于按鍵識(shí)別的指令,我們依然選擇如下指令JBBIT,REL指令是用來(lái)檢測(cè)BIT是否為高電平,假設(shè)BIT=1,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序。或者是JNBBIT,REL指令是用來(lái)檢測(cè)BIT是否為低電平,假設(shè)BIT=0,則程序轉(zhuǎn)向REL處執(zhí)行程序,否則就繼續(xù)向下執(zhí)行程序?!?.但對(duì)程序設(shè)計(jì)過(guò)程中按鍵識(shí)別過(guò)程的框圖如右圖所示:圖4.8.35.程序框圖圖4.8.46.匯編源程序

ORG0

START:MOVR1,#00H;初始化R7為0,表示從0開(kāi)場(chǎng)計(jì)數(shù)

MOVA,R1;

CPLA;取反指令

MOVP1,A;送出P1端口由發(fā)光二極管顯示

REL:JNBP3.7,REL;判斷SP1是否按下

LCALLDELAY10MS;假設(shè)按下,則延時(shí)10ms左右

JNBP3.7,REL;再判斷SP1是否真得按下

INCR7;假設(shè)真得按下,則進(jìn)展按鍵處理,使

MOVA,R7;計(jì)數(shù)內(nèi)容加1,并送出P1端口由

CPLA;發(fā)光二極管顯示

MOVP1,A;

JNBP3.7,$;等待SP1釋放

SJMPREL;繼續(xù)對(duì)K1按鍵掃描

DELAY10MS:MOVR6,#20;延時(shí)10ms子程序

L1:MOVR7,#248

DJNZR7,$

DJNZR6,L1

RET

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

unsignedcharcount;

voiddelay10ms(void)

{

unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

voidmain(void)

{

while(1)

{

if(P3_7==0)

{

delay10ms();

if(P3_7==0)

{

count++;

if(count==16)

{

count=0;

}

P1=~count;

while(P3_7==0);

}

}

}

}九.一鍵多功能按鍵識(shí)別技術(shù)1.實(shí)驗(yàn)任務(wù)如圖4.9.1所示,開(kāi)關(guān)SP1接在P3.7/RD管腳上,在AT89S51單片機(jī)的P1端口接有四個(gè)發(fā)光二極管,上電的時(shí)候,L1接在P1.0管腳上的發(fā)光二極管在閃爍,當(dāng)每一次按下開(kāi)關(guān)SP1的時(shí)候,L2接在P1.1管腳上的發(fā)光二極管在閃爍,再按下開(kāi)關(guān)SP1的時(shí)候,L3接在P1.2管腳上的發(fā)光二極管在閃爍,再按下開(kāi)關(guān)SP1的時(shí)候,L4接在P1.3管腳上的發(fā)光二極管在閃爍,再按下開(kāi)關(guān)SP1的時(shí)候,又輪到L1在閃爍了,如此輪流下去。2.電路原理圖圖4.9.13.系統(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ì)思想由來(lái)在我們生活中,我們很容易通過(guò)這個(gè)叫張三,那個(gè)叫李四,另外一個(gè)是王五;那是因?yàn)槊總€(gè)人有不同的名子,我們就很快認(rèn)出,同樣,對(duì)于要通過(guò)一個(gè)按鍵來(lái)識(shí)別每種不同的功能,我們給每個(gè)不同的功能模塊用不同的ID號(hào)標(biāo)識(shí),這樣,每按下一次按鍵,ID的值是不一樣的,所以單片機(jī)就很容易識(shí)別不同功能的身份了?!?.設(shè)計(jì)方法從上面的要求我們可以看出,L1到L4發(fā)光二極管在每個(gè)時(shí)刻的閃爍的時(shí)間是受開(kāi)關(guān)SP1來(lái)控制,我們給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;很顯然,只要每次按下開(kāi)關(guān)K1時(shí),分別給出不同的ID號(hào)我們就能夠完成上面的任務(wù)了。下面給出有關(guān)程序設(shè)計(jì)的框圖。5.程序框圖圖4.9.26.匯編源程序

IDEQU30H

SP1BITP3.7

L1BITP1.0

L2BITP1.1

L3BITP1.2

L4BITP1.3

ORG0

MOVID,#00H

START:JBK1,REL

LCALLDELAY10MS

JBK1,REL

INCID

MOVA,ID

CJNEA,#04,REL

MOVID,#00H

REL:JNBK1,$

MOVA,ID

CJNEA,#00H,IS0

CPLL1

LCALLDELAY

SJMPSTART

IS0:CJNEA,#01H,IS1

CPLL2

LCALLDELAY

SJMPSTART

IS1:CJNEA,#02H,IS2

CPLL3

LCALLDELAY

SJMPSTART

IS2:CJNEA,#03H,IS3

CPLL4

LCALLDELAY

SJMPSTART

IS3:LJMPSTART

DELAY10MS:MOVR6,#20

LOOP1:MOVR7,#248

DJNZR7,$

DJNZR6,LOOP1

RET

DELAY:MOVR5,#20

LOOP2:LCALLDELAY10MS

DJNZR5,LOOP2

RET

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

unsignedcharID;

voiddelay10ms(void)

{

unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

voiddelay02s(void)

{

unsignedchari;

for(i=20;i>0;i--)

{delay10ms();

}

}

voidmain(void)

{while(1)

{if(P3_7==0)

{delay10ms();

if(P3_7==0)

{

ID++;

if(ID==4)

{

ID=0;

}

while(P3_7==0);

}

}

switch(ID)

{case0:

P1_0=~P1_0;

delay02s();

break;

case1:

P1_1=~P1_1;

delay02s();

break;

case2:

P1_2=~P1_2;

delay02s();

break;

case3:

P1_3=~P1_3;

delay02s();

break;

}}}十.00-99計(jì)數(shù)器1.實(shí)驗(yàn)任務(wù)利用AT89S51單片機(jī)來(lái)制作一個(gè)手動(dòng)計(jì)數(shù)器,在AT89S51單片機(jī)的P3.7管腳接一個(gè)輕觸開(kāi)關(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.13.系統(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?!?.把“單片機(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í)別的過(guò)程處理〔2.單片機(jī)對(duì)正確識(shí)別的按鍵進(jìn)展計(jì)數(shù),計(jì)數(shù)滿時(shí),又從零開(kāi)場(chǎng)計(jì)數(shù);〔3.單片機(jī)對(duì)計(jì)的數(shù)值要進(jìn)展數(shù)碼顯示,計(jì)得的數(shù)是十進(jìn)數(shù),含有十位和個(gè)位,我們要把十位和個(gè)位拆開(kāi)分別送出這樣的十位和個(gè)位數(shù)值到對(duì)應(yīng)的數(shù)碼管上顯示。如何拆開(kāi)十位和個(gè)位我們可以把所計(jì)得的數(shù)值對(duì)10求余,即可個(gè)位數(shù)字,對(duì)10整除,即可得到十位數(shù)字了。〔4.通過(guò)查表方式,分別顯示出個(gè)位和十位數(shù)字。5.程序框圖圖4.10.26.匯編源程序

CountEQU30H

SP1BITP3.7

ORG0

START:MOVCount,#00H

NEXT:MOVA,Count

MOVB,#10

DIVAB

MOVDPTR,#TABLE

MOVCA,@A+DPTR

MOVP0,A

MOVA,B

MOVCA,@A+DPTR

MOVP2,A

WT:JNBSP1,WT

WAIT:JBSP1,WAIT

LCALLDELY10MS

JBSP1,WAIT

INCCount

MOVA,Count

CJNEA,#100,NEXT

LJMPSTART

DELY10MS:MOVR6,#20

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f};

unsignedcharCount;

voiddelay10ms(void)

{

unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

voidmain(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);

}}}}十一.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.13.系統(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ì)過(guò)程中我們用一個(gè)存儲(chǔ)單元作為秒計(jì)數(shù)單元,當(dāng)一秒鐘到來(lái)時(shí),就讓秒計(jì)數(shù)單元加1,當(dāng)秒計(jì)數(shù)到達(dá)60時(shí),就自動(dòng)返回到0,從新秒計(jì)數(shù)?!?.對(duì)于秒計(jì)數(shù)單元中的數(shù)據(jù)要把它十位數(shù)和個(gè)數(shù)分開(kāi),方法仍采用對(duì)10整除和對(duì)10求余。〔3.在數(shù)碼上顯示,仍通過(guò)查表的方式完成?!?.一秒時(shí)間的產(chǎn)生在這里我們采用軟件準(zhǔn)確延時(shí)的方法來(lái)完成,經(jīng)過(guò)準(zhǔn)確計(jì)算得到1秒時(shí)間為1.002秒。DELY1S:MOVR5,#100D2:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RET5.程序框圖圖4.11.26.匯編源程序

SecondEQU30H

ORG0

START:MOVSecond,#00H

NEXT:MOVA,Second

MOVB,#10

DIVAB

MOVDPTR,#TABLE

MOVCA,@A+DPTR

MOVP0,A

MOVA,B

MOVCA,@A+DPTR

MOVP2,A

LCALLDELY1S

INCSecond

MOVA,Second

CJNEA,#60,NEXT

LJMPSTART

DELY1S:MOVR5,#100

D2:MOVR6,#20

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

DJNZR5,D2

RET

TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

7.C語(yǔ)言源程序

#include<AT89X51.H>

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f};

unsignedcharSecond;

voiddelay1s(void)

{

unsignedchari,j,k;

for(k=100;k>0;k--)

for(i

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論