《單片機(jī)原理與應(yīng)用技術(shù)》課件第3章_第1頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第3章_第2頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第3章_第3頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第3章_第4頁
《單片機(jī)原理與應(yīng)用技術(shù)》課件第3章_第5頁
已閱讀5頁,還剩176頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第三章MCS-51單片機(jī)指令系統(tǒng)及程序設(shè)計(jì)3.1單片機(jī)指令基礎(chǔ)

3.2尋址方式

3.3指令系統(tǒng)

3.4匯編語言程序設(shè)計(jì)基礎(chǔ)

3.5程序設(shè)計(jì)

3.6習(xí)題

實(shí)訓(xùn)三單片機(jī)輸入/輸出口的設(shè)計(jì)與使用

3.1單片機(jī)指令基礎(chǔ)

3.1.1指令格式

指令的表示方法稱為指令格式。MCS-51單片機(jī)匯編語言指令的基本格式由以下幾個(gè)部分組成:

[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]

3.1.2指令分類

MCS-51系列單片機(jī)指令系統(tǒng)共有111條指令。指令有功能、時(shí)間、空間三種屬性。

(1)按指令所占用存儲(chǔ)空間的長度分類,指令可分為三類:

①單字節(jié)指令:共49條;

②雙字節(jié)指令:共45條;

③三字節(jié)指令:共17條。

(2)按指令執(zhí)行時(shí)間分類,指令可分為三類:

①單機(jī)器周期指令:共64條;

②雙機(jī)器周期指令:共45條;

③四機(jī)器周期指令:共2條,即乘法和除法指令。

指令執(zhí)行時(shí)間和指令長度是兩個(gè)完全不同的概念,前者表示執(zhí)行一條指令所用的時(shí)間;后者表示存放一條指令在ROM中所占的存儲(chǔ)空間,兩者不能混淆。

(3)按指令功能分類,指令可分為數(shù)據(jù)傳送類、算術(shù)運(yùn)算類、邏輯運(yùn)算類、位操作類和控制轉(zhuǎn)移類指令等五大類。3.1.3指令系統(tǒng)中的符號(hào)約定

指令的一個(gè)重要組成部分是操作數(shù),為了表示指令中各種類型的操作數(shù),MCS-51單片機(jī)指令系統(tǒng)采用了如下符號(hào)約定:

(1)?Rn:n=0~7,表示當(dāng)前工作寄存器區(qū)的8個(gè)工作寄存器R0~R7。

(2)?Ri:i=0,1,表示當(dāng)前工作寄存器區(qū)的兩個(gè)工作寄存器R0和R1,i只能取值0或1。

(3)?direct:表示8位內(nèi)部數(shù)據(jù)存儲(chǔ)單元的地址。當(dāng)取值在00H~7H時(shí),表示內(nèi)部數(shù)據(jù)RAM;當(dāng)取值在80H~0FFH時(shí),表示特殊功能寄存器。

(4)?#:立即數(shù)符號(hào),在指令系統(tǒng)中的數(shù)據(jù)和地址均用十六進(jìn)制數(shù)表示,為便于區(qū)別,用“#”號(hào)表示數(shù)據(jù)(立即數(shù))。“#”號(hào)是立即數(shù)的標(biāo)記,凡數(shù)據(jù)前有“#”,代表該十六制數(shù)為立即數(shù),凡立即數(shù)必須在前面標(biāo)記“#”。

(5)?addr11:11位目的地址,用于ACALL和AJMP指令,可在下條指令地址所在的同一2?KBROM范圍內(nèi)調(diào)用或轉(zhuǎn)移。

(6)?ddr16:16位目的地址,用于ACALL和AJMP指令,能在64?KBROM范圍內(nèi)任意值調(diào)用或轉(zhuǎn)移。

(7)?rel:帶符號(hào)的8位偏移地址,用于SJMP和條件轉(zhuǎn)移指令,其范圍是相對(duì)于下一條指令第1字節(jié)地址的-128~+127個(gè)字節(jié)。Rel≤7FH,屬于0~+127B,程序向下轉(zhuǎn)移;rel≥80H(補(bǔ)碼),屬于-128B~0,則程序向上轉(zhuǎn)移。

(8)?bit:位地址,代表片內(nèi)RAM中的可尋址位00H~7FH及SFR中可尋址位。當(dāng)取值為00H~7FH時(shí),表示內(nèi)部數(shù)據(jù)RAM20H~2FH單元中的每一位地址。

(9)?@:間接尋址符,表示其后的寄存器的值為操作數(shù)的地址。@Ri表示寄存器Ri(i=0或1)中存放的是操作數(shù)的地址。如果該地址是內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)中的地址,其取值范圍為00H~7FH;如果該地址是外部數(shù)據(jù)存儲(chǔ)區(qū)中的地址,其取值范圍為00H~0FFH。當(dāng)Ri的值在00H~7FH之間時(shí),它表示的既可能是內(nèi)部數(shù)據(jù)存儲(chǔ)空間中的地址,也可能是外部數(shù)據(jù)存儲(chǔ)空間中的地址,需要通過指令操作碼來區(qū)分。

@DPTR:表示DPTR中存放的是操作數(shù)的地址,該地址位于外部數(shù)據(jù)存儲(chǔ)空間,其取值范圍為0000H~0FFFFH。

(10)?$:本指令的起始地址。

3.2尋址方式

1.立即尋址

立即尋址是直接給出操作數(shù)本身。操作數(shù)以指令字節(jié)的形式存放于程序存儲(chǔ)器中。操作數(shù)前加立即數(shù)符“#”。如果立即數(shù)的最高位為A~F,字符前加前導(dǎo)“0”,以便區(qū)別于標(biāo)號(hào)。

2.直接尋址

直接尋址是以地址形式給出操作數(shù)的直接地址。直接尋址范圍為內(nèi)RAM128B和特殊功能寄存器。

例如:設(shè)內(nèi)部RAM3AH單元的內(nèi)容是48H。

MOVA,3AH ;將內(nèi)RAM3AH單元中的數(shù)據(jù)傳至A中

執(zhí)行過程如圖3-1所示。圖3-1直接尋址示意圖

3.寄存器尋址

寄存器尋址的操作數(shù)存放在規(guī)定的寄存器中,可直接以寄存器的名字表示操作數(shù)地址,即寄存器中的內(nèi)容為操作數(shù)。尋址可用的寄存器有:工作寄存器R0~R7、累加器A、通用寄存器B、數(shù)據(jù)指針DPTR和位累加器CY。這些被尋址寄存器中的內(nèi)容就是操作數(shù)。

例如:

MOV A,R0 ;將R0中的數(shù)據(jù)傳送到A中

設(shè)R0中的內(nèi)容為50H,執(zhí)行后A中的值為50H,執(zhí)行過程如圖3-2所示。圖3-2寄存器尋址示意圖

4.寄存器間接尋址

間接尋址是指指令中操作數(shù)部分所指定的寄存器中存放的是操作數(shù)的地址,即根據(jù)操作數(shù)地址的地址尋找操作數(shù)。

間接尋址用間址符“@”作為前綴。MCS-51指令系統(tǒng)中,可作為間接尋址的寄存器有R0和R1、數(shù)據(jù)指針DPTR和堆棧指針SP(堆棧操作時(shí),不用間接尋址符“@”)。

例如:

MOVA,@R0 ;將R0中內(nèi)容作為地址的存儲(chǔ)單元中的數(shù)據(jù)傳送至A中

設(shè)R0=50H,內(nèi)部RAM50H中的值8AH,執(zhí)行結(jié)果是累加器A中的值為8AH,該指令的執(zhí)行過程如圖3-3所示。圖3-3寄存器間接尋址示意圖

5.變址尋址

變址尋址是指以程序計(jì)數(shù)器PC或數(shù)據(jù)指針DPTR作為基址寄存器,以累加器A作為變址寄存器,變址存放在累加器中,兩者內(nèi)容相加后形成16位操作數(shù)的地址,即

操作數(shù)地址?=?基址?+?變址

這種方式用于讀ROM中數(shù)據(jù)操作,不能訪問數(shù)據(jù)存儲(chǔ)器。

6.相對(duì)尋址

相對(duì)尋址一般用于相對(duì)轉(zhuǎn)移指令,相對(duì)尋址以程序計(jì)數(shù)器PC的當(dāng)前值為基地址與指令中給定的相對(duì)偏移量rel相加得到程序轉(zhuǎn)移地址,即

程序轉(zhuǎn)移目的地址?=?當(dāng)前PC值?+?相對(duì)偏移量rel

rel是一個(gè)帶符號(hào)的8位二進(jìn)制數(shù),用補(bǔ)碼表示,其范圍為-128B~+127B。

7.位尋址

MCS-51具有位處理功能,可以對(duì)數(shù)據(jù)位進(jìn)行操作。位尋址是對(duì)內(nèi)RAM和特殊功能寄存器中的可尋址位進(jìn)行操作的尋址方式,這種尋址方式屬于直接尋址方式,因此與直接尋址方式執(zhí)行過程基本相同,但參與操作的數(shù)據(jù)是1位而不是8位,使用時(shí)需注意。

綜上所述,MCS-51尋址方式與相應(yīng)的尋址范圍如表3-1所示。表3-1尋址方式與相應(yīng)的存儲(chǔ)器空間 3.3指令系統(tǒng)

3.3.1數(shù)據(jù)傳送類指令

單片機(jī)系統(tǒng)一個(gè)重要的工作是完成各部件間的信息交換,所以數(shù)據(jù)傳送是最基本最重要的操作之一。MCS-51指令系統(tǒng)中,各類數(shù)據(jù)傳送指令共有29條,是指令系統(tǒng)中運(yùn)用最頻繁的一類指令。這類指令一般不影響標(biāo)志位,但當(dāng)執(zhí)行結(jié)果改變累加器A的值時(shí),會(huì)影響奇偶標(biāo)志位P。

數(shù)據(jù)傳送類指令的格式為

MOV[目的字節(jié)],[源字節(jié)]

1.內(nèi)RAM數(shù)據(jù)傳送指令

(1)以累加器A為目的字節(jié)傳送指令(4條),將源操作數(shù)送到累加器A中,其源操作數(shù)尋址方式有立即尋址、直接尋址、寄存器尋址和寄存器間接尋址。

MOV A,Rn ;Rn→A,n=0~7

MOVA,@Ri ;(Ri)→A,i=0,1

MOVA,direct ;(direct)→A

MOV A,#data ;data→A

【例3-1】

若R0=40H,(30H)?=60H,(40H)?=50H,將指令執(zhí)行結(jié)果寫在注釋區(qū)。

解:MOVA,R0 ;A=40H

MOVA,@R0 ;A=50H

MOVA,30H ;A=60H

MOVA,#30H ;A=30H

(2)以工作寄存器Rn為目的字節(jié)的傳送指令(3條)。

MOVRn,A ;A→Rn,n=0~7

MOVRn,direct ;(direct)→Rn,n=0~7

MOVRn,#data ;data→Rn,n=0~7

【例3-2】若A=70H,(30H)=60H,將執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:

MOVR1,A ;R1=70H

MOV R3,30H ;R3=60H

MOV R3,#30H ;R3=30H

工作寄存器之間沒有直接傳送的指令,若要傳送,需要通過一個(gè)中間寄存器作緩沖。

【例3-3】

試將R1中的數(shù)據(jù)傳送到R2。

解:

MOVA,R1 ;R1→A

MOV R2,A ;A→R2

(3)以直接地址為目的字節(jié)的傳送指令(5條)。

MOVdirect,A ;A→(direct)

MOVdirect,Rn ;Rn→(direct),n

=0~7

MOVdirect,@Ri ;(Ri)→(direct),i?=0,1

MOVdirect1, direct2 ;(direct2)→(direct1)

MOVdirect,#data ;data→(direct)

【例3-4】

若A?=?70H,R1?=?30H,(30H)?=?60H,(4EH)?=?7FH,將執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:

MOV4FH,A ;(4FH)=70H

MOV 4FH,R1 ;(4FH)=30H

MOV 4FH,@R1 ;(4FH)=60H

MOV 4FH,4EH ;(4FH)=7FH

MOV 4FH,#4EH ;(4FH)=4EH

(4)以寄存器地址為目的字節(jié)的傳送指令(3條)。

MOV@RiA ;A→(Ri),i=0,1

MOV@Ri,direct ;(direct)→(Ri),i=0,1

MOV@Ri,#data ;data→(Ri),i=0,1

【例3-5】

若A?=?70H,R1?=?30H,(30H)?=60H,(40H)?=50H,將執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:

MOV@R1,A ;(30H)=70H

MOV@R1,40H ;(30H)=50H

MOV @R1,#40H ;(30H)=40H

【例3-6】

設(shè)內(nèi)RAM(30H)=60H,分析以下程序連續(xù)運(yùn)行的結(jié)果。

解:

MOV60H,#30H ;(60H)=30H

MOVR0,#60H ;R0=60H

MOVA,@R0 ;A=(R0)=

(60H)=30H

MOVR1,A ;R1=30H

MOV40H,@R1 ;(40H)=(R1)=(30H)=60H

MOV60H,30H ;(60H)=(30H)?=60H

運(yùn)行結(jié)果是:A=30H,R0=60H,R1=30H,(60H)?=60H,(30H)?=60H。

【例3-7】

設(shè)內(nèi)RAM(30)?=60H,(60H)?=?10H,P1口作為輸入口,其輸入的數(shù)據(jù)為CAH,執(zhí)行下列程序后結(jié)果如何?

解:

MOV R0,#30H ;R0=30H

MOV A,@R0 ;A=(R0)=(30H)=60H

MOV R1,A ;R1=60H

MOVB,@R1 ;B=(R1)=(60H)=10H

MOV @R1,P1 ;(R1)=(60H)=CAH

MOV P2,@R1 ;P2=CAH

執(zhí)行結(jié)果:R0=30H,A=60H,R1=60H,B=10H,(60H)

=CAH,P2=CAH。3.3.2算術(shù)運(yùn)算類指令

1.加法指令

1)不帶進(jìn)位的加法指令(4條)

ADDA,Rn ;A+Rn→A,有進(jìn)位,CY=1;無進(jìn)位;CY=0

ADDA,@Ri ;A+(Ri)→A

ADDA,direct ;A+(direct)→A

ADDA,#data ;A+data→A

ADD指令是8位二進(jìn)制數(shù)加法運(yùn)算,其中一個(gè)加數(shù)總是存在累加器A中,而另一個(gè)加數(shù)可由不同尋址方式得到,相加結(jié)果再送回A中,運(yùn)算結(jié)果將對(duì)PSW相關(guān)位產(chǎn)生影響。

【例3-13】

設(shè)A=82H,R0=40H,(40H)=7DH,(30H)=ABH,CY=1。將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:ADDA,R0 ;A=C2H,無進(jìn)位,CY=0

ADDA,@R0 ;A=FFH,無進(jìn)位,CY=0

ADDA,30H ;A=2DH,有進(jìn)位,CY=1

ADDA,#30H ;A=B2H,無進(jìn)位,CY=0

2)帶進(jìn)位加法指令(4條)

ADDCA,Rn ;A+Rn+CY→A

ADDCA,@Ri ;A+(Ri)+CY→A

ADDCA,direct ;A+(direct)+CY→A

ADDCA,#data ;A+data+CY→A

ADDC指令功能與ADD指令的區(qū)別是相加時(shí)再加上CY,其余功能相同。

【例3-14】

已知A=82H,R0=40H,(40)=7DH,(30H)=ABH,CY=1。將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:ADDCA,R0 ;A=C3H,CY=0

ADDCA,@R0 ;A=00H,CY=1

ADDCA,30H ;A=2EH,CY=1

ADDCA,#30H ;A=B3H,CY=0

2.減法指令(4條)

SUBBA,Rn ;A-Rn-CY→A

SUBBA,@Ri ;A-(Ri)-CY→A

SUBBA,direct ;A-(direct)-CY→A

SUBBA,#data ;A-data-CY?→A

SUBB減法指令的功能是將A中的數(shù)據(jù)減去源操作數(shù)所指示的數(shù)據(jù)及進(jìn)位位CY,不夠減時(shí)向高位借位后再減,差存入A中。運(yùn)算結(jié)果將對(duì)PSW相關(guān)位產(chǎn)生影響。

在MCS-51指令系統(tǒng)中,減法必須帶進(jìn)位位,沒有不帶進(jìn)位的減法。若要進(jìn)行不帶進(jìn)位位的減法,可先將進(jìn)位位清零,再執(zhí)行減法指令。

【例3-15】

設(shè)A=82H,R0=40H,(40H)=81H,(30H)=82H,CY=1。將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:SUBBA,R0 ;A=41H,CY=0

SUBBA,@R0 ;A=00H,CY=0

SUBBA,30H ;A=FFH,CY=1

SUBBA,#30H ;A=51H,CY=0加減運(yùn)算對(duì)PSW中的狀態(tài)標(biāo)志位影響如下:

(1)當(dāng)加法運(yùn)算結(jié)果的最高位有進(jìn)位,或減法運(yùn)算的最高位有借位時(shí),進(jìn)位位CY置位,否則CY清零。

(2)當(dāng)加法算時(shí)低4位向高4位有進(jìn)位,或減法運(yùn)算時(shí)低4位向高4位有借位時(shí),輔助進(jìn)位位AC置位,否則清零。

(3)在加減法運(yùn)算過程中,位6和位7未同時(shí)產(chǎn)生進(jìn)位或借位時(shí),溢出標(biāo)志位OV置位,否則清零。溢出標(biāo)志OV=1,說明運(yùn)算結(jié)果產(chǎn)生溢出(即大于?+127或小于-128)。溢出主要用于帶符號(hào)數(shù)運(yùn)算。

(4)當(dāng)運(yùn)算結(jié)果A中各位“1”的個(gè)數(shù)為奇數(shù)時(shí),奇偶標(biāo)志P位置,否則清零。

【例3-16】

有兩個(gè)2字節(jié)數(shù),分別存在31H30H和33H32H中(高位在前),試編寫其加法程序,運(yùn)算結(jié)果存入32H31H30H單元中。

解:加數(shù)和被加數(shù)是16位二進(jìn)制數(shù),不能用一條指令完成,需按下列步驟完成計(jì)算:首先將兩數(shù)的低8位相加,結(jié)果存入30單元中,若有進(jìn)位,保存在CY中;然后再將兩數(shù)的高8位連同CY相加,結(jié)果存入31H單元中;最后把CY存入32H單元中,問題在于CY是1位存儲(chǔ)單元,32H時(shí)8位存儲(chǔ)單元,不可以直接傳送,必須把CY變?yōu)榈攘康?位數(shù),才能存入8位存儲(chǔ)單元中。

程序如下:

MOV A,30H ;

ADD A,32H ;

MOV 30H,A ;

MOV A,31H ;

ADDC A,33H ;

MOV 31H,A ;

MOV A,#00H ;

ADDC A,#00H ;把CY變?yōu)榈攘康?位數(shù)

MOV 32H,A ;存進(jìn)位

【例3-17】

被減數(shù)存在R3、R2中(高位在前),減數(shù)存在R1、R0中,試編寫其減法程序,差值存入R1、R0中,借位存入R2中。

解:在MCS-51指令系統(tǒng)中,減法必須帶CY。本題在低8位相減時(shí),不需要減CY,可先將CY清0。程序如下:

ADD A,#00H ;CY=0

MOV A,R2 ;

SUBB A,R0 ;低8位減

MOV R0,A ;

MOV A,R3 ;

SUBB A,R1 ;高8位連同CY相減

MOV R1,A ;存差高8位

MOV A,#00H ;

ADDC A,#00H ;把CY變?yōu)榈攘康?位數(shù)

MOV R2,A ;存借位

3.加1減1指令

1)加1指令(5條)

INC A ;A+1→A

INC Rn ;Rn+1→Rn

INC @Ri ;(Ri)+1→(Ri)

INC direct ;(direct)+1→(direct)

INC DPTR ;DPTR+1→DPTR

加1指令的功能是將指定單元的數(shù)據(jù)加1再送回該單元。

【例3-18】設(shè)A=FFH,R0=40H,(40H)=FFH,(30H)=82H,DPTR=FFFFH,CY=0,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:INC A ;A=0,有進(jìn)位,不影響標(biāo)志位,CY=0(不變)

INC R0 ;R0=41H

INC @R0 ;(40H)=00H

INC 30H ;(30H)=83H

INC DPTR ;DPTR=0000H

2)減1指令(4條)

DEC A ;A-1→A

DEC Rn ;Rn-1→Rn

DEC @Ri ;(Ri)-1→(Ri)

DEC direct ;(direct)-1→(direct)

減1指令的功能是將指定單元的數(shù)據(jù)減1再送回該單元。加1減1指令涉及A時(shí),會(huì)影響P,但不影響其他標(biāo)志位。

【例3-19】

設(shè)A=00H,R0=40H,(40H)=00H,(30H)=ABH,CY=1,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:DEC A ;A=FFH,有借位,不影響標(biāo)志位,CY=1(不變)

DEC R0 ;R0=3FH

DEC @R0 ;(40H)=FFH

DEC 30H ;(30H)=AAH

4.BCD碼調(diào)整指令

MCS-51有一條專用于BCD碼加法結(jié)果調(diào)整指令。

DA A

這條指令的功能是對(duì)加法運(yùn)算結(jié)果進(jìn)行BCD碼調(diào)整,主要用于BCD碼加法運(yùn)算。BCD碼按二進(jìn)制數(shù)運(yùn)算法則加減以后,有可能出錯(cuò),需進(jìn)行調(diào)整。進(jìn)行加法運(yùn)算時(shí),兩個(gè)壓縮型BCD碼按二進(jìn)制相加,結(jié)果存入累加器A中后,只需在加法指令后緊跟一條DAA指令,即可實(shí)現(xiàn)BCD碼調(diào)整,但對(duì)BCD碼的減法運(yùn)算不能用此指令來調(diào)整。

【例3-20】

已知兩個(gè)BCD碼分別存放在31H30和33H32H中,試編程求其和并存入R4R3R2。

解:程序如下:

MOV A,30H ;

ADD A,32H ;低位相加

DA A ;低位和BCD調(diào)整

MOV R2,A ;

MOV A,31H ;

ADDC A,33H ;

DA A

MOV R3,A

MOV A,#00H ;

ADDC A,#00H ;把進(jìn)位存入A

MOV R4,A

5.乘除法指令

1)乘法指令(1條)

MUL AB ;A

×

B→BA

這條指令功能是實(shí)現(xiàn)兩個(gè)8位無符號(hào)數(shù)的乘法操作。兩個(gè)無符號(hào)數(shù)分別存放在A和B中,乘積為16位,積的低8位存于A中,積的高8位存于B中。如果積大于255(即積的高8位寄存器B不等于0),則OV置1,否則OV清零,而該指令執(zhí)行后,CY總是清零。奇偶標(biāo)志位P的值依據(jù)累加器A中“1”的個(gè)數(shù)決定。

【例3-21】

已知兩個(gè)乘數(shù)分別存放31H和30H,(30H)=4EH,(31H)=50H,試編程求其積,并存入33H32H。

【例3-23】

編程把20H中的二進(jìn)制數(shù)轉(zhuǎn)換為3位BCD碼,百位數(shù)放在20H,十位、個(gè)位數(shù)放在21H中。

解:先將要轉(zhuǎn)換的二進(jìn)制數(shù)除以100,商數(shù)即為百位數(shù),余數(shù)部分再除以10,商數(shù)和余數(shù)分別為十位數(shù)和個(gè)位數(shù),在通過SWAP、ADD指令組合成一個(gè)壓縮的BCD數(shù),十位數(shù)放在21H中的高4位,個(gè)位數(shù)放在21H中的低4位,百位數(shù)放在20H中的低4位。

編程如下:表3-3MCS-51算術(shù)運(yùn)算類指令3.3.3邏輯運(yùn)算及移位指令

邏輯運(yùn)算類指令共24條,包括與、或、異或、清0、取反及移位等操作指令。這些指令涉及A時(shí),影響奇偶標(biāo)志P,但對(duì)CY(除帶CY移位)、AC、OV無影響。

1.邏輯“與”運(yùn)算指令(6條)

邏輯“與”運(yùn)算指令共6條,前四條的功能是將A中的數(shù)據(jù)與源操作數(shù)所指出的數(shù)據(jù)按位進(jìn)行“與”運(yùn)算,運(yùn)算結(jié)果送入A中,指令執(zhí)行后影響奇偶標(biāo)志位P;后兩條指令是將直接地址單元中的數(shù)據(jù)與源操作數(shù)所指出的數(shù)據(jù)按位進(jìn)行“與”運(yùn)算,運(yùn)算結(jié)果送入直接地址單元中。邏輯“與”運(yùn)算也稱邏輯乘,運(yùn)算規(guī)則是有0出0,全1出1。

【例3-24】

設(shè)A=5BH,R0=46H,(46H)=58H,(32H)=ABH,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:程序如下:

2.邏輯“或”運(yùn)算指令(6條)

邏輯“或”運(yùn)算指令共6條,前四條的功能是將A中的數(shù)據(jù)與源操作數(shù)所指出的數(shù)據(jù)按位進(jìn)行“或”運(yùn)算,運(yùn)算結(jié)果送入A中,指令執(zhí)行后影響奇偶標(biāo)志位P;后兩條指令是將直接地址單元中的數(shù)據(jù)與源操作數(shù)所指出的數(shù)據(jù)按位進(jìn)行“或”運(yùn)算,運(yùn)算結(jié)果送入直接地址單元中。邏輯“或”運(yùn)算也稱邏輯加,運(yùn)算規(guī)則是有1出1,全0出0。

【例3-25】

設(shè)A=1BH,R0=46H,(46H)=58H,(32H)=ABH,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:程序如下:邏輯“或”指令是單字節(jié)二進(jìn)制數(shù)邏輯指令,任意邏輯量(1或0)和1相或結(jié)果為1;和0相或,結(jié)果不變。利用這一特點(diǎn),邏輯或指令常用來使字節(jié)中的某些位置1或保留某些位。若要求對(duì)8位二進(jìn)制數(shù)的某位置1,則用“1”和該位相“或”;若要求保留某位原值,則用“0”和該位相“或”。

若(P1)=E8H=11101000B,要求高5位保留,低3位置1,則執(zhí)行指令:

ORL P1,#07H ;

指令結(jié)果位:(P1)=EFH=11101111B。

【例3-26】

有兩個(gè)1位非壓縮的BCD數(shù),分別存在21H和20H中,試將其合并壓縮到20H單元。

解:程序如下:邏輯“異或”運(yùn)算指令共6條,前四條的功能是將A中的數(shù)據(jù)與源操作數(shù)所指出的數(shù)據(jù)按位進(jìn)行“異或”運(yùn)算,運(yùn)算結(jié)果送入A中,指令執(zhí)行后影響奇偶標(biāo)志位P;后兩條指令是將直接地址單元中的數(shù)據(jù)與源操作數(shù)所指出的數(shù)據(jù)按位進(jìn)行“異或”運(yùn)算,運(yùn)算結(jié)果送入直接地址單元中。邏輯“異或”運(yùn)算規(guī)則是相同出0,不同出1。

任意邏輯量(1或0)和1相異或結(jié)果取反;和0相異或,結(jié)果不變。利用這一特點(diǎn),邏輯異或指令常用來使字節(jié)中的某些位取反而其余位不變。

【例3-27】

設(shè)A=1BH,R0=46H,(46H)=58H,(32H)=ABH,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

4.清零和取反指令

CLR A ;0→A CPL A ;A中各位取反→A第一條指令的功能是將A內(nèi)容清0;后一條指令功能是將A內(nèi)容各位取反后送回A中。

【例3-28】

設(shè)A=10010110B,求分別執(zhí)行下列指令后A中的數(shù)值。

CLR A ;A=0

CPL A ;A=01101001B

5.循環(huán)移位指令(4條)

RL A ;循環(huán)左移

RLC A ;帶CY循環(huán)左移(相當(dāng)于乘以2的操作)

RR A ;循環(huán)右移

RRC A ;帶CY循環(huán)右移(相當(dāng)于除以2的操作)

【例3-29】

設(shè)A=10010110B,CY=1,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

解:RL A ;A=00101101B,CY=1

RLC A ;A=00101101B,CY=1

RR A ;A=01001011B,CY=1(不變)

RRC A ;A=11001011B,CY=0(刷新)

邏輯運(yùn)算類指令匯總見表3-4。圖3-4循環(huán)移位指令表3-4MCS-51邏輯運(yùn)算類指令

【例3-30】某已知數(shù)存在R4中,試將其乘2存入R3中,將其除以2存入R2中。

解:程序如下:

3.3.4位操作類指令

位操作又稱為布爾變量操作。MCS-51中有一個(gè)布爾處理器,它是一個(gè)一位處理器,有自己的累加器(借用進(jìn)位位CY),有自己的存儲(chǔ)器(即位尋址區(qū),20H~2FH單元中位地址位00H~7FH中的各位)。布爾操作指令包括位變量的傳送、修改和邏輯操作等。

1.位傳送指令(2條)

MOV C,bit ;(bit)→CY

MOV bit,C ;CY→(bit)

指令中C即進(jìn)位位CY的助記符,bit為內(nèi)RAM20H~2FH中的128個(gè)可尋址位和特殊功能寄存器中的可尋址位。

【例3-31】

將位存儲(chǔ)單元24H.4中的內(nèi)容傳送到位存儲(chǔ)單元24H.0。

解:MOV C,24H.4 ;(24H.4)→C

MOV 24H.0,C ;C→(24H.0)

或?qū)懗桑?/p>

MOV C,24H ;位地址24H=24H.4

MOV 20H,C ;20H=24H.0表3-5MCS-51位操作類指令3.3.5控制轉(zhuǎn)移類指令

控制轉(zhuǎn)移類指令包括無條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、調(diào)用和返回指令。這類指令通過修改PC的內(nèi)容來控制程序的執(zhí)行過程,可極大提高程序的效率。這類指令(除比較轉(zhuǎn)移指令)一般不影響標(biāo)志位。

1.無條件轉(zhuǎn)移指令

無條件轉(zhuǎn)移指令(共3條)根據(jù)其轉(zhuǎn)移范圍可分為長轉(zhuǎn)移、短轉(zhuǎn)移、相對(duì)轉(zhuǎn)移和間接轉(zhuǎn)移四種指令。

1)長轉(zhuǎn)移指令

LJMP addr16 ;addr16→PC,轉(zhuǎn)移范圍為64?KB

這條指令為三節(jié)字指令,是16地址的無條件轉(zhuǎn)移指令,可以轉(zhuǎn)移到64?KB程序存儲(chǔ)器的任意位置。

2)短轉(zhuǎn)移指令

AJMP addr11 ;PC+2→PC,PC15~11不變

這條指令為雙字節(jié)指令(比LJMP指令的機(jī)器碼少一個(gè)字節(jié)),是11位地址的無條件轉(zhuǎn)移指令。轉(zhuǎn)移范圍為PC?+?2后的同一2?KB區(qū)域(即高5位地址相同)。AJMP指令執(zhí)行的步驟是:產(chǎn)生當(dāng)前PC。PC?+?2→PC,前一個(gè)PC是指令執(zhí)行前的地址,后一個(gè)PC是指令執(zhí)行后的PC(成為當(dāng)前PC),PC+2是因?yàn)樵撝噶顬殡p節(jié)字指令。

形成轉(zhuǎn)移目標(biāo)地址。當(dāng)前PC的高5位和指令中的11位地址構(gòu)成轉(zhuǎn)移目標(biāo)地址,即PC=PC15~11a10~a0。

3)相對(duì)轉(zhuǎn)移指令

SJMP rel ;PC+?2→PC,PC+rel→PC

這條指令是雙字節(jié)指令,轉(zhuǎn)移范圍為當(dāng)前PC+127B~-128B。指令執(zhí)行的步驟是:產(chǎn)生當(dāng)前PC。PC+2→PC,PC+2是因?yàn)樵撝噶钍请p字節(jié)指令。

形成轉(zhuǎn)移目標(biāo)地址。PC+rel→PC,rel稱為相對(duì)偏移量,是一個(gè)帶符號(hào)的8位二進(jìn)制數(shù),用補(bǔ)碼表示,其范圍為-128~+127。

4)間接轉(zhuǎn)移指令

JMP @A+DPTR ;A+DPTR→PC

這條指令為一字節(jié)無條件轉(zhuǎn)移指令,屬變址尋址。轉(zhuǎn)移目標(biāo)地址由累加器A的內(nèi)容和數(shù)據(jù)指針DPTR內(nèi)容之和來決定,兩者都是無符號(hào)數(shù)。一般是以DPTR的內(nèi)容是基址,而由A的值來決定具體的轉(zhuǎn)移地址。這條指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。

2.條件轉(zhuǎn)移指令

條件轉(zhuǎn)移指令(共13條)根據(jù)判斷條件可分為判C轉(zhuǎn)移,判bit轉(zhuǎn)移,判A轉(zhuǎn)移,減1非0轉(zhuǎn)移和比較轉(zhuǎn)移指令。滿足條件,則轉(zhuǎn)移,不滿足條件,則程序順序執(zhí)行。

3.調(diào)用和返回指令

在一個(gè)程序中經(jīng)常會(huì)遇到反復(fù)多次執(zhí)行某程序段的情況,如果重復(fù)書寫這個(gè)程序段,會(huì)使程序變得冗長而雜亂。對(duì)此,可把重復(fù)的程序編寫為一個(gè)子程序,在主程序中調(diào)用子程序。這樣,不僅減少了編程的工作量,而且縮短了程序的總長度。另外,子程序還增加了程序的可移植性,一些常用的運(yùn)算程序?qū)懗勺映绦蛐问?,可以被隨時(shí)引用、參考,為廣大單片機(jī)用戶提供了方便。

調(diào)用子程序的程序稱為主程序,主程序和子程序間的調(diào)用關(guān)系如圖3-5所示。圖3-5子程序及其嵌套

調(diào)用指令根據(jù)其調(diào)用子程序所在范圍可分為長調(diào)用和短調(diào)用兩種,其特點(diǎn)類似于長調(diào)用指令和短調(diào)用指令。

1)長調(diào)用指令

LCALL addr16 ;長調(diào)用

LCALL指令執(zhí)行步驟:

(1)生成當(dāng)前PC:PC+3→PC,LCALL是3字節(jié)指令。

(2)斷口地址保存到堆棧中,先壓低字節(jié)入棧。

(3)形成轉(zhuǎn)移目標(biāo)地址:addr16→PC。

2)短調(diào)用指令

ACALL addr11 ;短調(diào)用

ACALL指令執(zhí)行步驟:

(1)生成當(dāng)前PC:PC+2→PC,LCALL是2字節(jié)指令。

(2)斷口地址保存到堆棧中,先壓低字節(jié)入棧。

(3)形成轉(zhuǎn)移目標(biāo)地址:addr11→PC(更新低11位,高5位不變)。

【例3-36】

設(shè)(SP)=6FH,子程序標(biāo)號(hào)為SUB2,首地址為7B16H,LCALL指令首地址為10FAH,求執(zhí)行下列指令后相關(guān)的單元地址。

解:

23DFH:LCALL SUB2 ;

23E2H:… ;

結(jié)果為(SP)=71H,(70H)=E2H,(71H)=23H,(PC)=7B16H。表3-6MCS-51控制轉(zhuǎn)移類指令

4.空操作指令

NOP ;

NOP指令的功能僅使PC加1,然后繼續(xù)執(zhí)行下條指令,無任何其他操作。NOP為單周期指令,占用一個(gè)機(jī)器周期,常用于延時(shí)或等待。

3.4匯編語言程序設(shè)計(jì)基礎(chǔ)

3.4.1匯編語言及其語句結(jié)構(gòu)

計(jì)算機(jī)能識(shí)別的是用二進(jìn)制(0和1)表示的指令,稱為機(jī)器語言(機(jī)器碼),如匯編語言指令:MOV A,#200 ;其機(jī)器代碼為74C8H。

機(jī)器代碼雖然能被計(jì)算機(jī)直接識(shí)別,但在書寫、記憶上都很困難,用它來編寫程序很不方便。為了解決這一問題,人們用一些規(guī)定的英文字符(即助記符)來代替機(jī)器碼,以使程序易讀易懂。用助記符書寫的指令系統(tǒng)就是計(jì)算機(jī)的匯編語言,每一條指令就是匯編語言的一條命令語句。

一條匯編語言的語句最多包括四部分:標(biāo)號(hào)、操作碼、操作數(shù)和注釋,其結(jié)構(gòu)為

標(biāo)號(hào):操作碼[目的操作數(shù)],[源操作數(shù)] ;注釋3.4.2偽指令

1.起始偽指令ORG

格式:ORG 16位地址

功能:規(guī)定ORG下面的目標(biāo)程序的起始地址。

2.結(jié)束偽指令?END

格式:END

功能:匯編語言源程序的結(jié)束標(biāo)志。在END以后所寫的指令,匯編程序不再處理。一個(gè)源程序只能有一個(gè)END指令,且只能放在所有指令的最后。

3.等值偽指令EQU

格式:字符名稱 EQU 數(shù)據(jù)或匯編符號(hào)

功能:將一個(gè)數(shù)據(jù)或特定的匯編符號(hào)賦予規(guī)定的字符名稱。

4.?dāng)?shù)據(jù)地址賦值偽指令DATA

格式:字符名稱 DATA 表達(dá)式

功能:將數(shù)據(jù)地址或代碼地址賦予規(guī)定的字符名稱。

DATA與RQU的功能有些相似,區(qū)別為EQU定義的符號(hào)必須先定義后使用,而DATA可以先使用后定義。

5.定義字節(jié)偽指令DB

格式:DB 8位二進(jìn)制數(shù)表

功能:從指定的地址單元開始,定義若干個(gè)8位內(nèi)存單元的數(shù)據(jù),數(shù)據(jù)與數(shù)據(jù)之間用“,”分割。

6.定義字偽指令DW

格式:DW16位二進(jìn)制數(shù)表

功能:從指定的地址單元開始,定義若干個(gè)16位數(shù)據(jù)。因?yàn)?6位數(shù)須占用兩個(gè)字節(jié),所以高8位先存入,低8位后存入。不足16位者,用0填充。

7.定義位地址指令BIT

格式:字符名稱BIT位地址

功能:將位地址賦予所規(guī)定的字符名稱。3.4.3匯編

匯編又可分為手工匯編和計(jì)算機(jī)匯編兩種。

1.手工匯編

手工匯編是由匯編者對(duì)照指令表,分別查出源程序每條指令的機(jī)器代碼,然后用這些指令代碼以字節(jié)為單位從源程序的起始地址依次排列,形成目標(biāo)程序。

在匯編過程中,若碰到與后面程序有關(guān)的地址標(biāo)號(hào)或變量,則暫時(shí)將這些單元空出,繼續(xù)往后匯編,最后再根據(jù)后面的匯編結(jié)果,將這些空出的單元填好。

【例3-37】用手工對(duì)下段程序進(jìn)行匯編。3.4.4程序設(shè)計(jì)的基本方法

1.分析問題確定算法或解決思路

首先,要對(duì)需要解決的問題進(jìn)行分析,明確題目的任務(wù),弄清現(xiàn)有條件和目標(biāo)要求,然后確定設(shè)計(jì)方法。對(duì)于同一個(gè)問題,一般有多種不同的解決方案,應(yīng)通過認(rèn)真比較,從中挑選最佳方案。這是程序設(shè)計(jì)的基礎(chǔ)。

2.畫流程圖

流程圖又稱為程序框圖,它是用各種圖形、符號(hào)、指向線等來說明程序的執(zhí)行過程。它能充分表達(dá)程序的設(shè)計(jì)思路,可幫助設(shè)計(jì)程序、閱讀程序和查找程序中的錯(cuò)誤。美國國家標(biāo)準(zhǔn)化協(xié)會(huì)ANSI規(guī)定定了一些常用的流程圖符號(hào),已為世界各國程序工作者普遍使用,具體見表3-7。表3-7流程圖符號(hào)表

3.編寫源程序

根據(jù)流程圖中各個(gè)部分的功能,設(shè)計(jì)出一條一條的指令來實(shí)現(xiàn)其功能,也就寫出了具體的程序。所編寫的源程序應(yīng)簡單明了,層次分明。

4.匯編和調(diào)試

對(duì)已編好的程序,先進(jìn)行匯編。在匯編過程中,還可能會(huì)出現(xiàn)一些錯(cuò)誤,計(jì)算機(jī)會(huì)提示,匯編需要對(duì)源程序中的錯(cuò)誤進(jìn)行修改,直到?jīng)]有錯(cuò)誤為止,最終生成機(jī)器碼程序。匯編工作完成后,就可以上機(jī)調(diào)試運(yùn)行。一般先輸入給定的數(shù)據(jù),運(yùn)行程序,檢查運(yùn)行結(jié)果是否正確,若發(fā)現(xiàn)錯(cuò)誤,則通過分析對(duì)源程序進(jìn)行修改,再匯編、調(diào)試,直到獲得正確的調(diào)試結(jié)果為止。 3.5程序設(shè)計(jì)

3.5.1順序程序設(shè)計(jì)

順序程序是指按指令的排列順序依次執(zhí)行的程序,也稱為簡單程序或直線程序。

順序結(jié)構(gòu)是程序結(jié)構(gòu)中較簡單的一種,其特點(diǎn)是按指令的排列順序一條一條地執(zhí)行,直到全部指令執(zhí)行完畢為止。順序程序是構(gòu)成復(fù)雜程序的基礎(chǔ)。

【例3-38】

拆分程序,將R7中的壓縮BCD碼(即一個(gè)字節(jié)中存放兩個(gè)BCD碼)拆分為分離的BCD碼(即一個(gè)字節(jié)中存放1個(gè)BCD碼,在低半個(gè)字節(jié)),并分別存放于R4、R3中。

解:源程序如下:

【例3-39】求補(bǔ)碼:已知一個(gè)16位的二進(jìn)制負(fù)數(shù)存放在R1、R0中,求其補(bǔ)碼,并將結(jié)果存在R3、R2中。

解:最高位是符號(hào)位,負(fù)數(shù)最高位是1,二進(jìn)制負(fù)數(shù)的求補(bǔ)的方法是“按位取反,末位加1”,符號(hào)位不變。利用CPL指令實(shí)現(xiàn)求反;加1時(shí),則應(yīng)從低8位先加1,高8位再加上低位的進(jìn)位。注意,這里不能用INC指令,因?yàn)镮NC指令不影響標(biāo)志位。

程序如下:3.5.2分支程序設(shè)計(jì)

1.單分支選擇結(jié)構(gòu)程序設(shè)計(jì)

通常用條件轉(zhuǎn)移指令形成單分支結(jié)構(gòu)。一般根據(jù)運(yùn)算結(jié)果的狀態(tài)標(biāo)志,用條件判斷跳轉(zhuǎn)指令來選擇并轉(zhuǎn)移,即二選一。

【例3-40】

將ASCII碼轉(zhuǎn)換為十六進(jìn)制數(shù)。設(shè)ASCII碼存放在累加器A中,轉(zhuǎn)換結(jié)果存放在B中。

解:由ASCII碼表可知,30H~39H為0~9的ASCII碼,41H~46H為A~F的ASCII碼。將ASCII碼減30H(0~9)或37H(A~F)就可獲得對(duì)應(yīng)的十六進(jìn)制數(shù)。程序如下:

2.多分支選擇結(jié)構(gòu)程序設(shè)計(jì)

當(dāng)程序的判斷部分有兩個(gè)以上出口流向時(shí),為多分支選擇結(jié)構(gòu)程序。

【例3-41】

兩個(gè)無符號(hào)數(shù)比較(兩分支)。內(nèi)部RAM的30H單元和40H單元各存放一個(gè)8位無符號(hào)數(shù),請(qǐng)比較這兩個(gè)數(shù)的大小,將大的數(shù)存入50H中。

分析:本題是典型的兩分支程序,根據(jù)兩個(gè)無符號(hào)數(shù)的比較結(jié)果(判斷條件),程序可以選擇兩個(gè)流向中的某一個(gè)。比較兩個(gè)無符號(hào)數(shù)常用的方法是將兩個(gè)數(shù)相減X?-?Y,然后判斷借位位的狀態(tài),若CY=0,無借位,X≥Y;若CY=1,有借位,X<Y。大數(shù)存入Z(50H)中。

解:編程如下:

【例3-42】

使用紅外線溫度測量系統(tǒng)測量人體的體溫,當(dāng)有發(fā)熱現(xiàn)象時(shí),給出報(bào)警。把這個(gè)實(shí)際應(yīng)用問題以數(shù)學(xué)方法描述,即以分段函數(shù)來實(shí)現(xiàn):

【例3-44】

兩個(gè)帶符號(hào)數(shù)X、Y分別存于NN1和NN2單元,試比較它們的大小,較大者存入MAX單元;若兩數(shù)相等,則任意存入一個(gè)。

解:兩個(gè)帶符號(hào)數(shù)的比較可先進(jìn)行兩數(shù)相減,然后利用相減結(jié)果的正負(fù)和溢出標(biāo)志結(jié)合起來判斷:

X–Y>?0,若OV=0,則X?>?Y;若OV=1,則X?<?Y。

X–Y<?0,若OV=0,則X?<?Y;若OV=1,則X?>?Y。

編程如下:3.5.3循環(huán)程序設(shè)計(jì)

在許多實(shí)際應(yīng)用中,往往需要多次反復(fù)執(zhí)行某一部分相同的操作,只是參與操作的操作數(shù)不相同,這時(shí)可以采用循環(huán)程序結(jié)構(gòu)。循環(huán)結(jié)構(gòu)常用于求和、統(tǒng)計(jì)、尋找、排序、延時(shí)、求平均值等程序。循環(huán)結(jié)構(gòu)可以縮短程序,減少程序占用的內(nèi)存空間。循環(huán)結(jié)構(gòu)一般包括以下幾個(gè)部分:

(1)循環(huán)初值。

(2)循環(huán)體。

(3)循環(huán)修改。

(4)循環(huán)控制。

上四部分可以用兩種組織形式,可以先處理數(shù)據(jù)后判斷,也可以先判斷后處理數(shù)據(jù)。復(fù)雜問題還需要多重循環(huán)結(jié)構(gòu)。

【例3-45】

四字節(jié)無符號(hào)數(shù)加法程序設(shè)計(jì)。設(shè)兩個(gè)四字節(jié)無符號(hào)數(shù)分別存放在以D1和D2為首地址的內(nèi)RAM連續(xù)單元中,低字節(jié)在前。設(shè)計(jì)程序求兩數(shù)的和,和放在被加數(shù)(D1為首地址)的單元中。

解:編程如下:

【例3-47】

設(shè)在內(nèi)RAM40H開始的存儲(chǔ)區(qū)有若干個(gè)字符和數(shù)字,已知最后一個(gè)字符為“$”(并且只有惟一一個(gè)“$”)。編程統(tǒng)計(jì)這些字符和數(shù)字的個(gè)數(shù),將統(tǒng)計(jì)結(jié)果存入30H單元。

解:程序如下:3.5.4子程序設(shè)計(jì)

在實(shí)際的程序設(shè)計(jì)中,常常將那些需多次應(yīng)用的、完成相同操作的程序段從整個(gè)程序中獨(dú)立出來,單獨(dú)編寫一個(gè)程序段,需要時(shí)通過指令進(jìn)行調(diào)用,這個(gè)程序段稱為子程序。

采用子程序能使整個(gè)程序結(jié)構(gòu)簡單,縮短程序的長度,減少占用的程序存儲(chǔ)空間,調(diào)用程序稱為主程序或調(diào)用程序。

子程序設(shè)計(jì)原則和方法:子程序是一種能完成某一特定任務(wù)的程序段,其資源要為所有調(diào)用程序所共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨(dú)立性和通用性。

編寫子程序時(shí)應(yīng)注意:

(1)子程序的第一條指令的地址稱為子程序的入口地址,該指令必須有標(biāo)號(hào)。

(2)主程序調(diào)用子程序,是通過主程序或調(diào)用程序中的調(diào)用指令來實(shí)現(xiàn)的。一般用長調(diào)用指令LCALLaddr16和CALLaddr11來完成。

(3)子程序中用到堆棧,堆棧通常用來保護(hù)斷點(diǎn)和現(xiàn)場。

(4)子程序的最后一條指令必須是RET返回指令,功能是將堆棧中斷點(diǎn)地址彈出送入PC指針中,實(shí)現(xiàn)返回主程序。

(5)參數(shù)傳遞可以通過累加器、寄存器和堆棧進(jìn)行。

【例3-50】編寫一個(gè)通用子程序,實(shí)現(xiàn)N個(gè)單字節(jié)無符號(hào)數(shù)加法。N小于100H調(diào)用該子程序完成將內(nèi)部RAM30H~5FH中存放的單字節(jié)無符號(hào)數(shù)求和,結(jié)果存入60H61H(高位在前)。

解:本題中需要傳遞的參數(shù)有三種:參與運(yùn)算的字節(jié)無符號(hào)數(shù)個(gè)數(shù)N,用R2傳遞;參與運(yùn)算的數(shù)據(jù),在內(nèi)部RAM單元中,以R0為指針寄存器,間接尋址傳遞;運(yùn)算結(jié)果,共兩個(gè),用R1間接尋址傳遞。

子程序如下:3.5.5查表程序設(shè)計(jì)

MCS-51單片機(jī)系統(tǒng)中,查表程序是一種常用的程序,利用它能避免進(jìn)行復(fù)雜的運(yùn)算或轉(zhuǎn)換過程,它可以完成數(shù)據(jù)計(jì)算、轉(zhuǎn)換、補(bǔ)償?shù)雀鞣N功能,具有程序簡單、執(zhí)行速度快等優(yōu)點(diǎn)。在MCS-51系統(tǒng)中,數(shù)據(jù)表格是存放在程序存儲(chǔ)器ROM中,而不是存放在RAM中,編程時(shí),可以通過DB偽指令將表格的內(nèi)容存入ROM中。用于查表的指令有兩條:

MOVC A,@A+DPTR

MOVC A,@A+PC當(dāng)用DPTR作基址寄存器時(shí),查表的步驟分三步:

(1)基址值(表格首地址)→DPTR;

(2)變址值(表中要查的項(xiàng)與首地址之間所間隔字節(jié)數(shù))→A;

(3)執(zhí)行MOVCA,@A+DPTR。

當(dāng)用PC作基址寄存器時(shí),由于PC本身是一個(gè)程序計(jì)數(shù)器,與指令的存放地址有關(guān),所以查表時(shí)其操作有所不同。也可分為三步:

(1)變址值(表中要查的項(xiàng)與首地址之間所間隔字節(jié)數(shù))→A;

(2)偏移量(查表指令下一條指令首地址到表格首地址之間所間隔字節(jié)數(shù))+A→A;

(3)執(zhí)行MOVCA,@A+PC。

【例3-51】

在MCS-51應(yīng)用系統(tǒng)中,常用LED數(shù)碼顯示數(shù)碼,但顯示數(shù)與顯示數(shù)編碼并不相同,需要將顯示數(shù)轉(zhuǎn)換為顯示字段碼,通常是用查表的方法?,F(xiàn)要求將30H中的顯示數(shù)字(≤9)轉(zhuǎn)換為顯示字段碼并存入30H中,已知共陰極字段碼表的首地址為TABD。

解:編程如下:

【例3-52】

將1位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼。設(shè)1位十六進(jìn)制數(shù)存放在50H的低4位,轉(zhuǎn)換后的ASCII碼仍然送回到50H中。

解:以前的例題中已經(jīng)介紹了將ASCII碼轉(zhuǎn)換為十六進(jìn)制數(shù)的程序。本例是其逆轉(zhuǎn)換,采用的是查表的方法來實(shí)現(xiàn)十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼。程序如下:另外,十六進(jìn)制轉(zhuǎn)換為ASCII碼還可以根據(jù)十六進(jìn)制數(shù)與ASCII碼間的關(guān)系,用計(jì)算的方法進(jìn)行求解。

【例3-53】

用查表程序求0~40之間整數(shù)的立方。已知該整數(shù)存放在內(nèi)部RAM30H中,查得的立方數(shù)存內(nèi)部RAM30H(高8位)31H中。

解:編程如下:3.5.6散轉(zhuǎn)程序設(shè)計(jì)

【例3-54】單片機(jī)四則運(yùn)算系統(tǒng)。在單片機(jī)系統(tǒng)中設(shè)置+、-、×、÷四個(gè)運(yùn)算命令鍵,它們的鍵號(hào)分別是0、1、2、3。當(dāng)其中一個(gè)鍵按下去時(shí),進(jìn)行相應(yīng)的運(yùn)算。操作數(shù)由P1口和P3口輸入,運(yùn)算結(jié)果仍由P1口和P3口輸出。具體如下:P1口輸入被加數(shù)、被減數(shù)、被乘數(shù)和被除數(shù),輸出運(yùn)算結(jié)果的低8位或商;P3口輸入加數(shù)、減數(shù)、乘數(shù)和除數(shù),輸出進(jìn)位(借位)位、運(yùn)算結(jié)果的高8位或余數(shù)。鍵盤號(hào)已存放在30H中。

解:程序如下:3.5.7數(shù)據(jù)查找程序設(shè)計(jì)

1.關(guān)鍵字查找程序

關(guān)鍵字查找也稱為數(shù)據(jù)檢索。如果要查找的表是無序的,查找只能從第一項(xiàng)開始逐項(xiàng)順序查找,判斷所取得數(shù)據(jù)是否與關(guān)鍵字相同。

【例3-55】從100個(gè)無序數(shù)據(jù)表中查找關(guān)鍵字55H。

解:由于表的數(shù)據(jù)是沒有規(guī)律的,是無序數(shù)據(jù),所以只能從表頭開始順序查找,直到找到與關(guān)鍵字相同的數(shù)據(jù)后結(jié)束查找。參考程序如下:

2.?dāng)?shù)據(jù)極值查找程序

數(shù)據(jù)極值查找就是在數(shù)據(jù)區(qū)中查找出最大或最小值。極值查找操作的主要工作是比較大小,從這些數(shù)據(jù)中找出最大或最小值,并存于某一單元中。

【例3-56】

在內(nèi)部RAM中存放20個(gè)數(shù)據(jù),找出最大值并存放于首地址中,設(shè)R1中存放首地址,R3中存放字節(jié)數(shù)。

解:要從一批數(shù)據(jù)中查找最大值,就是要將一批數(shù)據(jù)做大小比較,假設(shè)首地址中的數(shù)據(jù)就是最大值,然后與取出其后的數(shù)據(jù)逐一比較,比首地址中的數(shù)據(jù)大則替換首地址中的內(nèi)容,否則保持其內(nèi)容不變,參考程序如下: 3.6習(xí)題

1.填空題

(1)對(duì)程序存儲(chǔ)器ROM的讀操作,只能使用()指令。

(2)?MOVPSW,#10H是將工作寄存器設(shè)置為第()組。

(3)?ORLA,#0F0H是將A的高4位置(),而低4位()。

(4)在寄存器間接尋址中,寄存器中的內(nèi)容是()。

2.簡述MCS-51指令系統(tǒng)按指令長度、指令執(zhí)行時(shí)間、指令功能分類概況。說明Rn與Ri有什么區(qū)別,n與i值的范圍各是多少,@Ri表示什么,30H與#30H有什么區(qū)別。

3.什么是尋址方式?MCS-51指令系統(tǒng)有幾種尋址方式?訪問內(nèi)部RAM時(shí)可采用哪些尋址方式?試述各種尋址方式所能訪問的存儲(chǔ)空間。

4.指出下列指令中源操作數(shù)的尋址方式。

(1)?MOV R0,#30H;

(2)?MOVA,30H;

(3)?MOV A,@R0;

(4)?MOV @R0,A;

(5)?MOVCA,@A+DPTR;

(6)?CJNE A,#00H,30H;

(7)?MOV C,30H;

(8)?MULAB;

(9)?MOVDPTR,#1234H;

(10)?POPAcc。

5.設(shè)R0=11H,(11H)=22H,(33H)=44H,B=55H,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

(1)?MOVA,R0;

(2)?MOV A,@R0;

(3)?MOV A,33H;

(4)?MOVA,#33H;

(5)?MOV R3,B;

(6)?MOV 40H,33H。

6.設(shè)A=11H,R0=33H,B=44H,(11H)=22H,(22H)=66H,(33H)=44H,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

(1)?MOVA,R0;

(2)?MOVB,#55H;

(3)?MOV40H,@R0;

(4)?MOV11H,22H;

(5)?MOVR3,11H;

(6)?MOV@R0,22H。

7.按下列要求傳送數(shù)據(jù):

(1)將R0中的數(shù)據(jù)傳送到30H中。

(2)將R0中的數(shù)據(jù)傳送到R7中。

(3)將40H中的數(shù)據(jù)傳送到R2中。

(4)將立即數(shù)40H傳送到R5中。

(5)將立即數(shù)40H傳送到以R1中內(nèi)容為地址的存儲(chǔ)單元中。

(6)將40H中的數(shù)據(jù)傳送到以R1中內(nèi)容為地址的存儲(chǔ)單元中。

(7)將R6中的數(shù)據(jù)傳送到以R1中內(nèi)容為地址的存儲(chǔ)單元中。

(8)將R6中的數(shù)據(jù)傳送到以R2中內(nèi)容為地址的存儲(chǔ)單元中。

8.已知(30H)=11H,(11H)=22H,(40H)=33H,求下列程序依次連續(xù)運(yùn)行后A、R0、30H、40H、50H、60H單元中的內(nèi)容。

(1)?MOV50H,30H;

(2)?MOVR0,#40H;

(3)?MOVA,11H;

(4)?MOV60H,@R0;

(5)?MOV@R0,A;

(6)?MOV30H,R0。

9.設(shè)A=11H,(44H)=22H,R0=33H,求下列程序依次執(zhí)行后有關(guān)單元中的內(nèi)容。

(1)?MOVA,R0;

(2)?MOVR0,#44H;

(3)?MOV33H,@R0;

(4)?MOV@R0,A;

(5)?MOVA,R0;

(6)?MOVX @R0,A。

10.按要求傳送數(shù)據(jù)。

(1)內(nèi)RAM50H單元數(shù)據(jù)送外RAM50H單元;設(shè)內(nèi)RAM(50H)=11H。

(2)外RAM50H單元中數(shù)據(jù)送R0;設(shè)外RAM(50H)=22H。

(3)外RAM2000H單元中數(shù)據(jù)送內(nèi)RAM50H單元;設(shè)外RAM(2000H)=33H。

(4)外RAM2000H單元中數(shù)據(jù)送外RAM3000H單元;設(shè)外RAM(2000H)=33H。

(5)?ROM4000H單元中數(shù)據(jù)送P1口;設(shè)ROM(4000H)=44H。

11.試將30H、R7、B、A、PSW、DPTR中的數(shù)據(jù)依次壓入堆棧。并指出每次堆棧操作后,SP=?(SP)=?設(shè)原SP=60H,當(dāng)前工作寄存器區(qū)為0區(qū),(30H)=11H,R7=22H,B=33H,A=44H,PSW=55H,DPTR=6677H。

12.已知條件同上題堆棧操作的結(jié)果,試將堆棧中數(shù)據(jù)依次彈出存入DPH、DPL、A、B、PSW、30H、R7,求DPTR、A、B、PSW、30H、R7中的內(nèi)容和當(dāng)前工作寄存器區(qū)編號(hào)。

13.說明下列指令的功能,指出執(zhí)行后R0的結(jié)果。

(1)?MOV R0,#72H;

(2)?XCH A,R0 ;

(3)?SWAPA ;

(4)?XCH A,R0。

14.設(shè)A=96H,R0=47H,(47H)=CBH,(69H)=34H,(95H)=96H,CY=1,求分別執(zhí)行下列指令后A和CY中的數(shù)據(jù)。

(1)?ADD A,R0;

(2)?ADD A,@R0;

(3)?ADDC A,69H;

(4)?ADDC A,#69H;

(5)?SUBB A,R0;

(6)?SUBB A,@R0;

(7)?SUBB A,95H;

(8)?SUBB A,#95H。

15.有兩個(gè)2字節(jié)數(shù),分別存在R7R6和R5R4中(高位在前),編寫加法程序,運(yùn)算結(jié)果存入R7R6R5中。

16.被減數(shù)存在31H30H中(高位在前),減數(shù)存在33H32H中,編寫減法程序,差值存入31H30H單元,借位存入32H單元。

17.已知兩乘數(shù)分別存在R1和R0中,編程求其積,并存入R3、R2中。

18.已知被除數(shù)和除數(shù)分別存在31H和30H中,編程求其商,商存入33H,余數(shù)存入32H中。

19.設(shè)A=B7H,R0=5EH,(5EH)=D9H,(23H)=C1H,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

(1)?ANL A,R0;

(2)?ANL A,@R0;

(3)?ANL A,#D6H;

(4)?ORL A,23H;

(5)?ORL 23H,A;

(6)?ORL 23H,#23H。

20.設(shè)A=FFH,R0=00H,(00H)=FFH,DPTR=FFFFH,CY=0,位地址(00H)=1,將分別執(zhí)行下列指令后的結(jié)果寫在注釋區(qū)。

(1)?DEC A;

(2)?DEC R0;

(3)?INC @R0;

(4)?INC DPTR;

(5)?CPL 00H;

(6)?SETB00H;

(7)?ANL C,/00H;

(8)?ORL C,00H。

21.已知一壓縮BCD碼存在30H中,試將其拆分為兩個(gè)字節(jié),分別存在31H32H中(高位在前)。

22.設(shè)A=5AH,R1=30H,(30H)=E0H,CY=1。寫出下列指令執(zhí)行后A中的內(nèi)容以及對(duì)CY、P的影響(每條指令都以題中給定的原始數(shù)據(jù)來參加操作)。

(1)?XCHA,R1;

(2)?XCHDA,@R1;

(3)?SWAPA;

(4)?ADDA,#30H;

(5)?ADDCA,30H;

(6)?SUBBA,30H;

(7)?RLA;

(8)?CPL A;

(9)?ANLA,30H;

(10)?ORL A,@R1。

29.試編程將外RAM1000H~1050H單元內(nèi)容清0。

30.試編寫程序,將外部RAM2000H~20FFH數(shù)據(jù)塊傳送到3000H~30FFH區(qū)域中去。

31.設(shè)在內(nèi)部數(shù)據(jù)存儲(chǔ)器中存放有20個(gè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論