單片機第三章教材_第1頁
單片機第三章教材_第2頁
單片機第三章教材_第3頁
單片機第三章教材_第4頁
單片機第三章教材_第5頁
已閱讀5頁,還剩109頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章MCS-51單片機指令系統(tǒng)及程序設(shè)計3.1MCS-51單片機指令系統(tǒng)簡介3.2MCS-51單片機指令系統(tǒng)3.3匯編語言及其語句3.4MCS-51匯編語言程序設(shè)計3.5MCS-51匯編語言實用程序設(shè)計舉例3.1MCS-51單片機指令系統(tǒng)簡介指令是指示計算機執(zhí)行某種操作的命令,指令是以一組二進制碼表示的,稱為機器指令。計算機只能識別和執(zhí)行機器指令。在計算機中,指令是依次地存儲于存儲器中的,這部分存儲器常稱為程序存儲器。指令格式:指令的編碼規(guī)則,一條指令的二進制碼位數(shù)稱為指令的長度,不同類型的計算機,指令的長度和格式是不一樣的,所能執(zhí)行的指令類型和數(shù)目也不同。指令系統(tǒng):一臺計算機所能執(zhí)行的全部指令的集合。3.1.1MCS-51單片機指令系統(tǒng)的分類按照指令的功能,大致上可以分成以下幾種類型:(1)數(shù)據(jù)傳送指令:其功能是在計算機的各個部件之間傳送數(shù)據(jù),把一處的數(shù)據(jù)復(fù)制到另一處,如存儲器和寄存器之間、寄存器和寄存器之間的數(shù)據(jù)傳送。(2)算術(shù)指令:其功能是進行算術(shù)運算,如加、減、乘、除等。(3)邏輯指令:其功能是進行邏輯運算,如邏輯與、邏輯或、移位等。(4)程序控制指令:其功能是改變和控制程序中指令執(zhí)行的順序。(5)輸入/輸出指令:其功能是完成CPU、存儲器和外部設(shè)備之間的數(shù)據(jù)傳輸。(6)其他指令:這是控制機器運行狀態(tài)的指令,如停機指令、等待和空操作指令等。3.1.2指令格式 指令的具體格式依賴于計算機的結(jié)構(gòu)特征,但指令的組成是一樣的,都包含操作碼和操作數(shù)兩部分。一個完整的MCS-51匯編語言指令的一般格式為:

[標(biāo)號:]<操作碼>[操作數(shù)1][,操作數(shù)2][,操作數(shù)3][;注釋]

其中“標(biāo)號”實際上是符號地址,表示這條指令在程序存儲器中存放的首地址,以字母開始,后可跟1~8個字母或數(shù)字,標(biāo)號不能用操作碼或?qū)S梅?;“操作碼”即指令的助記符,它規(guī)定了指令的具體操作,是指令中唯一不能缺少的部分;“操作數(shù)”為指令的具體操作對象,有些指令中有1~3個操作數(shù),還有些無操作數(shù),僅有操作碼;“注釋”用作解釋和備忘。 例如:MOVA,#00H;00H→A產(chǎn)生操作數(shù)地址的方式稱為尋址方式,一般有7種:立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、位尋址、變址尋址、相對尋址。(1)立即尋址:操作數(shù)字段的內(nèi)容就是參加操作的數(shù)據(jù)。(若指令的操作數(shù)字段內(nèi)容就是一個參加操作的數(shù)據(jù),這種操作數(shù)稱為立即數(shù)。)(2)直接尋址:操作數(shù)本身就是一個有效地址,即操作數(shù)字段的內(nèi)容就是參加操作的數(shù)據(jù)所在的存儲器單元地址。(3)間接尋址:操作數(shù)字段的內(nèi)容給出某個單元的地址,該地址的內(nèi)容才是操作數(shù)的地址。(4)變址尋址:操作數(shù)給出一個位移量D和一個變址器號X,將變址器的內(nèi)容和位移量相加,即(X)+D作為有效地址。(5)相對尋址:操作數(shù)給出一個相對數(shù)X,把它和一個基地址或現(xiàn)行指令地址相加,得到的和作為有效地址。3.1.3指令中的常用符號在描述MCS-51指令系統(tǒng)的功能時,我們經(jīng)常使用下面的縮寫符號,其意義如下:A 累加器ACCAB 累加器ACC和寄存器B組成的寄存器對direct 直接地址,取值為0~0FFH#data 立即數(shù),表示一個常數(shù),取值為0~0FFH@ 間接尋址+、- 、*、/加、減、乘、除∧ 與∨ 或⊕ 異或,也稱半加= 等于< 小于

>大于<> 不等于→ 傳送X 寄存器名(X) X寄存器內(nèi)容((X)) 由X寄存器尋址的存儲器單元內(nèi)容() X寄存器的內(nèi)容取反rrr

指令編碼中rrr三位值由工作寄存器Rn確定,R0~R7對應(yīng)的rrr為000~111Ri

可用作間接尋址的工作寄存器,只能是R0、R1$ 指本條指令起始地址rel

相對偏移量,其值為-128~+127MCS-51指令操作數(shù)的尋址主要有五種方式:寄存器尋址、直接尋址、寄存器間接尋址、立即尋址和基寄存器加變址寄存器間接尋址。尋址方式尋址范圍寄存器尋址R0~R7A、B、C(CY)、AB(雙字節(jié))、DPTR(雙字節(jié))直接尋址內(nèi)部RAM低128字節(jié)(0~7FH)特殊功能寄存器(80H~0FFH)內(nèi)部RAM位尋址區(qū)的128個位(0~7FH)特殊功能寄存器中可尋址的位(80H~0FFH)寄存器間接尋址內(nèi)部數(shù)據(jù)存儲器RAM[@R0,@R1,@SP(僅PUSH,POP)]內(nèi)部數(shù)據(jù)存儲器單元的低4位(@R0,@R1)外部RAM或I/O口(@R0,@R1,@DPTR)立即尋址程序存儲器(常數(shù))基寄存器加變址寄存器間接尋址程序存儲器(@A+PC,@A+DPTR)1.寄存器尋址 由指令指出某一個寄存器的內(nèi)容作為操作數(shù),這種尋址方式稱為寄存器尋址。寄存器尋址對所選的工作寄存器區(qū)中R0~R7進行操作,指令操作碼字節(jié)的低3位指明所用的寄存器。累加器ACC、B、DPTR和進位C(布爾處理機的累加器C)也可用寄存器尋址方式訪問,只是對它們尋址時具體寄存器名隱含在操作碼中。如指令:

MOVA,R0;將工作寄存器R0的內(nèi)容送入累加器A中

;其中的操作數(shù)A、R0都是寄存器尋址其執(zhí)行過程如圖(3-1)所示圖3-1寄存器尋址執(zhí)行過程2.直接尋址在指令中含有操作數(shù)的直接地址,該地址指出了參與運算或傳送的數(shù)據(jù)所在的字節(jié)單元或位的地址。直接尋址方式訪問以下三種存儲空間:特殊功能寄存器(特殊功能寄存器只能用直接尋址方式訪問);內(nèi)部數(shù)據(jù)存儲器的低128字節(jié)(對于8032/8052等單片機,其內(nèi)部高128字節(jié)RAM(80H~0FFH)不能用直接尋址方式訪問);位地址空間。例如:指令

MOVA,30H;內(nèi)部數(shù)據(jù)存儲器30H單元中的內(nèi)容傳送到累加器A中其中30H就是要操作的數(shù)據(jù)所在的單元地址,如果內(nèi)部RAM(30H)=34H,執(zhí)行指令后(A)=34H。該指令執(zhí)行過程如圖(3-2)所示圖3-2直接尋址執(zhí)行過程

3.寄存器間接尋址由指令指出某一個寄存器的內(nèi)容作為操作數(shù)的地址,這種尋址方式稱為寄存器間接尋址(特別應(yīng)注意寄存器的內(nèi)容不是操作數(shù),而是操作數(shù)所在的存儲器地址)。寄存器間接尋址使用所選定的寄存器區(qū)中R0或R1作地址指針(對堆棧操作指令用棧指針SP)來尋址內(nèi)部RAM(00~0FFH)。寄存器間接尋址也適用于訪問外部擴展的數(shù)據(jù)存儲器,用R0、R1或DPTR作為地址指針。寄存器間接尋址用符號@表示。例如:MOV40H,#30H MOVR1,#40H MOV A,@R1

其功能為將當(dāng)前工作區(qū)內(nèi)以R1中的內(nèi)容作為地址的存儲單元中的數(shù)據(jù)送到累加器A中,其源操作數(shù)采用寄存器間接尋址方式,以R1作為地址指針。執(zhí)行后累加器A內(nèi)容為30H。該指令執(zhí)行過程如圖(3-3)所示。圖3-3寄存器間接尋址執(zhí)行過程

4.立即尋址立即尋址方式中操作數(shù)包含在指令字節(jié)中,即操作數(shù)以指令字節(jié)的形式存放于程序存儲器中。例如:指令MOV A,#30H;把常數(shù)30H傳送到累加器A,操作數(shù)2采用立即尋址指令執(zhí)行過程如圖(3-4)所示。圖3-4立即尋址執(zhí)行過程5.基寄存器加變址寄存器間接尋址這種尋址方式以16位的程序計數(shù)器PC或數(shù)據(jù)指針DPTR作為基寄存器,以8位的累加器A作為變址寄存器?;拇嫫骱妥冎芳拇嫫鞯膬?nèi)容相加形成16位的地址,該地址即為操作數(shù)的地址。例如:指令MOVCA,@A+PC ;((A)+(PC))→AMOVCA,@A+DPTR;((A)+(DPTR))→A這兩條指令中操作數(shù)2采用了基寄存器加變址寄存器的間接尋址方式。圖3-5基寄存器加變址寄存器間接尋址執(zhí)行過程6、相對尋址以PC的內(nèi)容作為基地址,加上指令中給定的偏移量所得結(jié)果作為轉(zhuǎn)移地址。應(yīng)注意偏移量是有符號數(shù),在-128~+127之間。轉(zhuǎn)移地址的目的地址=轉(zhuǎn)移指令所在的地址+轉(zhuǎn)移指令的字節(jié)數(shù)+(偏移量)rel例如:指令JC 70H若這條雙字節(jié)的轉(zhuǎn)移指令存放在2000H,取出操作碼后PC指向2001H;取出偏移量后PC指向2002H,故在計算偏移量相加時,PC已為2002H單元,即指向該條指令的下條指令。其示意圖如圖(3-6)所示。例1:設(shè)內(nèi)部RAM(30H)=40H,(40H)=50H,(50H)=10H,試分析下列指令,指出指令中各源操作數(shù)的尋址方式,及各條指令執(zhí)行的結(jié)果。

MOVR0,#30H MOVA,@R0 MOVR1,A MOVP1,@R1

MOVP2,P1 MOV50H,#00H;源30H,立即數(shù)尋址,(R0)=30H;源@R0,寄存器間接尋址,(A)=(30H)=40H;源A,寄存器尋址,(R1)=(A)=40H;源@R1,寄存器間接尋址,(P1)=((R1))=(40H)=50H;源P1,直接尋址,(P2)=50H;源00H,立即數(shù)尋址,(50H)=00HMCS-51具有五個存儲器空間,且多數(shù)從零地址開始編址: 程序存儲器空間 0000~0FFFFH

內(nèi)部RAM空間 00~0FFH

特殊功能寄存器空間 80H~0FFH

位地址空間 00~0FFH

外部RAM/IO空間 0000~0FFFFH

指令對哪一個存儲器空間進行操作是由指令的操作碼和尋址方式確定的。對程序存儲器只能采用立即尋址和基寄存器加變址寄存器間接尋址方式,特殊功能寄存器只能采用直接尋址方式,不能采用寄存器間接尋址,8052/8032等單片機內(nèi)部RAM的高128字節(jié)(80H~0FFH)只能采用寄存器間接尋址,不能使用直接尋址方式,位操作指令只能對位尋址區(qū)操作。外部擴展的數(shù)據(jù)存儲器只能用MOVX指令訪問,而內(nèi)部RAM的低128字節(jié)(00~7FH)既能用直接尋址,也能用寄存器間接尋址。3.2MCS-51單片機指令系統(tǒng)

MCS-51單片機的匯編語言有42種操作碼來描述各種操作,操作碼助記符與尋址方式結(jié)合可得到111條指令。

1、按存放指令占用存儲器字節(jié)數(shù)來分類,有49條單字節(jié)指令,45條雙字節(jié)指令和17條3字節(jié)指令。

2、按執(zhí)行指令所需時間分類,有64條單周期指令,45條雙周期指令,2條(乘、除)4周期指令。

3、按照功能劃分,可分為以下五類: 數(shù)據(jù)傳送類指令、算術(shù)運算類指令、邏輯運算類指令、控制轉(zhuǎn)移類指令、布爾處理類指令。

3.2.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令是應(yīng)用最多的一類指令,其功能是進行數(shù)據(jù)的傳送。1.內(nèi)部8位數(shù)據(jù)傳送指令內(nèi)部8位數(shù)據(jù)傳送指令共有15條,用于單片機內(nèi)部的數(shù)據(jù)存儲器與寄存器之間的數(shù)據(jù)傳送。允許的數(shù)據(jù)傳送形式如圖(3-7)所示。15種合法的指令形式:

MOV A,Rn

;(Rn)→AMOV A,direct

;(direct)→AMOV A,@Ri

;((Ri))→AMOV A,#data

;data→AMOV Rn,A ;A→RnMOV Rn,direct ;(direct)→RnMOV direct,#data

;data→directMOV @Ri,direct

;(direct)→@Ri … …注意:(1)直接地址direct的范圍是00H~0FFH,對于8051系列單片機,其中的00H~7FH為片內(nèi)RAM,80H~FFH為SFR,SFR只能直接尋址,指令中SFR可寫成直接地址也可寫成寄存器名;對于8052系列單片機,80H~FFH區(qū)域為片內(nèi)RAM和SFR地址重疊的區(qū)域,訪問SFR時要使用直接尋址方式,訪問80H~FFH區(qū)域的片內(nèi)RAM時,要使用間接尋址方式;(2)指令MOVdirect1,direct2可實現(xiàn)直接地址direct的自傳送,將源操作數(shù)direct2的內(nèi)容送到目的操作數(shù)direct1中;(3)立即數(shù)#data不能作為目的操作數(shù);(4)@Ri與Rn都不能自傳送;(5)@Ri與Rn之間也不能相互傳送。2.16位數(shù)據(jù)傳送指令

MCS-51單片機系統(tǒng)中16位數(shù)據(jù)傳送指令只有1條,其形式為:

MOV DPTR,#data16

該指令的功能為將16位立即數(shù)送入地址寄存器DPTR中。其中,16位立即數(shù)的高8位送入DPH中,低8位送入DPL中。3.外部數(shù)據(jù)傳送指令 外部數(shù)據(jù)傳送指令的功能是實現(xiàn)CPU與外部數(shù)據(jù)存儲器之間的數(shù)據(jù)傳送。這類指令共4條,指令形式及所實現(xiàn)的功能如下:

MOVXA,@Ri

;((Ri))→A MOVXA,@DPTR ;((DPTR))→A MOVX@Ri,A ;(A)→(Ri)

MOVX@DPTR,A ;(A)→(DPTR) 這4條指令都要使用累加器A。訪問外部數(shù)據(jù)存儲器只能采用間接尋址方式。如果使用R0、R1作為間接尋址寄存器,尋址范圍為256個字節(jié);如果使用DPTR作為間接尋址寄存器,尋址范圍為64KB地址空間。讀外部數(shù)據(jù)存儲器指令寫外部數(shù)據(jù)存儲器指令例2:要求把外部RAM40H單元中的數(shù)據(jù)傳送到內(nèi)部RAM55H中,試編程。解法一:

MOVDPTR,#0040H MOVXA,@DPTR MOV55H,A解法二:

MOVR0,#40H MOVXA,@R0 MOV55H,A4.查表指令

MCS-51單片機的程序存儲器中可以存放一些常數(shù)或表格,MCS-51單片機提供了訪問程序存儲器的指令,又稱查表指令。這類指令共2條,指令形式及實現(xiàn)的功能如下:

MOVC A,@A+DPTR ;((A)+(DPTR))→A MOVC A,@A+PC ;(PC)+1→PC

;((A)+(PC))→A

查表指令的源操作數(shù)都采用基址寄存器加變址寄存器間接尋址方式。如果使用DPTR作為基址寄存器,其查表范圍為整個程序存儲器的64K空間;如果使用PC作為基址寄存器,其查表范圍為查表指令后256字節(jié)的地址空間。這兩條指令執(zhí)行后,DPTR和PC的內(nèi)容都不會改變。

5.交換指令MCS-51單片機指令系統(tǒng)中,實現(xiàn)數(shù)據(jù)交換的指令有以下三種:(1)累加器半字節(jié)交換的指令,用于實現(xiàn)累加器的高4位與低4位互換。(2)字節(jié)交換指令,用于實現(xiàn)兩操作數(shù)內(nèi)容的互換。(3)半字節(jié)交換指令,用于實現(xiàn)兩操作數(shù)低4位內(nèi)容的互換,高4位不變。交換類指令共有5條,其使用情況如圖(3-8)所示。SWAP A ;將累加器A的高4位與低4位互換。XCH A,Rn ;源操作數(shù)與累加器A的內(nèi)容互換。XCH A,directXCH A,@RiXCHD A,@Ri;累加器A的低4位與源操作數(shù)的低4位互換。注意:(1)指令均以累加器A為目的操作數(shù);(2)XCH指令在很多場合用于BCD碼的數(shù)據(jù)處理例3:已知(A)=12H,(R1)=30H,內(nèi)部RAM(30H)=34H,分析指令執(zhí)行結(jié)果。XCHA,30HXCHA,@R1XCHDA,@R1SWAPA;(A)=34H,(30H)=12H;(A)=12H,(30H)=34H;(A)=14H,(30H)=32H;(A)=41H6.堆棧操作指令

MCS-51單片機指令系統(tǒng)中,堆棧操作指令有以下兩種: (1)入棧指令。指令形式及所實現(xiàn)的功能如下:

PUSHdirect

;(SP)+1→SP

;(direct)→(SP) 該指令的功能是將指定直接尋址單元的內(nèi)容壓入堆棧。具體執(zhí)行時,首先將堆棧指針SP的內(nèi)容加1,然后將指定直接尋址單元的內(nèi)容傳送到堆棧指針SP所指向的單元中。 (2)出棧指令。指令形式及所實現(xiàn)的功能如下:

POP direct

;((SP))→(direct);(SP)-1→SP

該指令的功能是將當(dāng)前堆棧指針SP所指向的單元的內(nèi)容傳送到指定直接尋址單元中,然后將SP的內(nèi)容減1。例4:試分析以下程序段的執(zhí)行結(jié)果。MOVSP,#50HMOVA,#12HMOVB,#34HPUSHACCPUSHBPOP BPOP ACC;(SP)=50H;(A)=12H;(B)=34H;(SP)=51H,(51H)=12H;(SP)=52H,(52H)=34H;(B)=34H,(SP)=51H;(A)=12H,(SP)=50H注意:(1)堆棧操作壓棧與出棧相反,壓棧時先進行指針操作,后進行數(shù)據(jù)操作,出棧時先進行數(shù)據(jù)操作,后進行指針操作;(2)上電復(fù)位后SP=07H,由于入棧操作是先指針上移,后壓入數(shù)據(jù),所以堆??臻g并未占用0區(qū)的R7寄存器;(3)一般來說,如果應(yīng)用系統(tǒng)要使用1~3區(qū),在主程序開始執(zhí)行初期,應(yīng)將SP移至內(nèi)部數(shù)據(jù)存儲器的高端;(4)一般情況下,除上電初始化外,不易輕易修改SP。方法一,使用交換指令實現(xiàn):例5:編程實現(xiàn)將內(nèi)部數(shù)據(jù)存儲器中地址為30H和31H兩單元的內(nèi)容互換。XCH A,31H ;累加器A與31H單元內(nèi)容互換XCH A,30H ;累加器A與30H單元內(nèi)容互換XCH A,31H ;累加器A與31H單元內(nèi)容互換方法二,使用堆棧指令實現(xiàn):PUSH 30H ;30H單元內(nèi)容入棧PUSH 31H ;31H單元內(nèi)容入棧POP 30H ;從堆棧中取數(shù)據(jù)送入30H單元POP 31H ;從堆棧中取數(shù)據(jù)送入31H單元3.2.2算術(shù)運算類指令

MCS-51單片機指令系統(tǒng)中實現(xiàn)算術(shù)運算的指令共24條,這類指令大多會影響標(biāo)志位。算術(shù)運算指令包括加法(ADD)、帶進位加法(ADDC)、帶借位減法(SUBB)、乘法(MUL)、除法(DIV)、加1(INC)、減1(DEC)和十進制調(diào)整(DA)等幾種操作,其允許的指令形式如圖(3-9)所示。1、加法ADD與帶進位加法ADDC:ADD A,Rn

;(A)+(Rn)→AADD A,direct

;(A)+(direct)→AADDC A,@Ri

;(A)+((Ri))+(C)→AADDC A,#data

;(A)+data+(C)→A(1)加法(ADD)與帶進位加法(ADDC)差別在于:帶進位加法(ADDC)是將源操作數(shù)的內(nèi)容與累加器A的內(nèi)容相加后,還要再加上進位標(biāo)志位C的內(nèi)容,而加法指令(ADD)不進行加進位標(biāo)志位C的操作。(2)被加數(shù)總是累加器A,并且結(jié)果也放在A中。加法操作影響PSW中的Cy、AC、OV和P。例6:分析下面程序段功能 MOVA,#85H ADDA,#97H MOVR3,A執(zhí)行后(R3)=1CH MOVA,#85H ADDCA,#97H執(zhí)行后(A)=1DH,Cy=1,AC=0,OV=1,P=0例7:已知當(dāng)前Cy=1,分析下面指令執(zhí)行后,A與PSW相關(guān)標(biāo)志位的結(jié)果如何?進行加法運算中參加運算的都是8位二進制數(shù),這些數(shù)可以是無符號數(shù)(0~255),也可以是有符號數(shù),即補碼(-128~127)。例如上例中97H,若當(dāng)做無符號數(shù)是十進制151,當(dāng)做有符號數(shù)是-105,但計算機在作加法運算時,總按以下規(guī)則進行:(1)在求和時,總是把操作數(shù)直接相加,而不需變換。(2)在確定相加后進位Cy的值時,總是把兩個操作數(shù)作為無符號數(shù)直接相加而得出進位Cy值。但若是兩個帶符號的數(shù)相加,相加后的進位值應(yīng)該丟棄,PSW中的Cy位仍為1。(3)在確定相加后溢出標(biāo)志OV的值時,計算機總是把操作數(shù)當(dāng)成有符號數(shù)看待。在作加法運算時,一個整數(shù)和一個負數(shù)相加,是不可能產(chǎn)生溢出的,只有兩個同符號數(shù)相加時,才可能溢出,并按以下方法判斷是否溢出:兩個正數(shù)相加(符號位都為0),若和為負數(shù)(符號位都為1),則一定溢出;兩個負數(shù)相加(符號位都為1),若和為正數(shù)(符號位都為0),則一定溢出。產(chǎn)生溢出OV=1,否則OV=0.上例中兩個負數(shù)相加后,和為正數(shù),有溢出。2、十進制加法調(diào)整指令 十進制加法調(diào)整指令的形式為:

DAA

該指令的功能是對累加器中由兩個壓縮BCD數(shù)的相加所獲得的8位結(jié)果進行調(diào)整,使其調(diào)整為2位壓縮BCD數(shù)。調(diào)整規(guī)則:若累加器A低4位大于9或輔助進位標(biāo)志AC=1,則低4位加6;若累加器A高4位大于9或Cy=1,則高4位加6;若累加器A高4位等于9且低4位大于9,則高4位加6;若累加器A的最高位因調(diào)整而產(chǎn)生進位時,將Cy置1,若不產(chǎn)生進位,保留Cy在調(diào)整前的狀態(tài)而并不清0。DA指令只影響進位標(biāo)志位Cy。3、加1(INC)和減1(DEC):INC A ;(A)+1→AINC DPTR ;(DPTR)+1→DPTRDEC Rn

;(Rn)-1→Rn

加1(INC)和減1(DEC)指令都是單操作數(shù)指令,其功能為將指令中指定操作數(shù)的內(nèi)容加(減)1,并把結(jié)果存回原來的操作數(shù)中,這類指令不影響標(biāo)志位。4、減法指令:(1)減法指令中只有帶借位減法(SUBB)。

SUBB A,direct

;(A)-(direct)-(C)→A(2)對于加減法運算指令來說,當(dāng)加法運算結(jié)果的最高位有進位,或減法運算的最低位有借位時,進位標(biāo)志位C置1,否則進位標(biāo)志位C清0;當(dāng)加法運算低4位向高4位有進位時,或減法運算低4位向高4位有借位時,輔助進位標(biāo)志位AC置1,否則AC清0;第6位和第7位產(chǎn)生且不同時產(chǎn)生進位或借位時,溢出標(biāo)志位OV置1,否則OV清0。5、乘法指令 乘法指令的形式為:

MUL AB

該指令的功能是把累加器A和寄存器B中的8位無符號數(shù)相乘,積為16位,其低8位存放在累加器A中,高8位存放在寄存器B中。如果結(jié)果大于255,即B中內(nèi)容不為0,則溢出標(biāo)志位OV置1,否則OV清0。即如果OV=0,只需從累加器A置取積;如果OV=1,需要從B、A寄存器對中取積。進位標(biāo)志位C始終為0。6、除法指令 除法指令的形式為:

DIV AB

該指令的功能是把累加器A中的8位無符號數(shù)除以寄存器B中的8位無符號數(shù),結(jié)果分為兩部分,其商的整數(shù)部分存放在累加器A中,余數(shù)部分存放在寄存器B中。如果指令執(zhí)行前B中內(nèi)容(除數(shù))為0時,結(jié)果中累加器A中內(nèi)容為0FFH,B中內(nèi)容為被除數(shù),溢出標(biāo)志位OV將被置1,進位標(biāo)志位C始終為0。3.2.3邏輯運算類指令MCS-51單片機指令系統(tǒng)中實現(xiàn)邏輯運算的指令包括與(ANL)、或(ORL)、異或(XRL)的邏輯操作,累加器A自身內(nèi)容的清零(CLR)、取反(CPL)、右移(RR)、帶進位右移(RRC)、左移(RL)、帶進位左移(RLC)等指令。這類指令共24條,并且都不會影響標(biāo)志位。其指令形式如圖(3-10)所示。1、與(ANL)、或(ORL)、異或(XRL):ANL A,Rn

;(A)∧(Rn)→AANL direct,#data ;(direct)∧data→directORL A,#data ;(A)∨data→AORL direct,A

;(direct)∨(A)→directXRL A,direct

;(A)⊕(direct)→AXRL direct,#data ;(direct)⊕data→direct與(ANL)、或(ORL)、異或(XRL)都是雙操作數(shù)指令,不影響標(biāo)志位。2、移位指令RLA;循環(huán)左移(An)→(An+1),(A7)→(A0)RRA;循環(huán)右移(An+1)→(An),(A0)→(A7)RLCA;帶進位循環(huán)左移(An)→(An+1),(A7)→Cy;Cy→(A0)RRCA;帶進位循環(huán)右移(An+1)→(An),Cy→(A7);(A0)→Cy3、清零指令CLR、取反指令CPL

CLR A;0→A CPLA

清零指令CLRA的功能是將累加器A的內(nèi)容清0,與指令MOVA,#0的功能相同,但指令CLRA的執(zhí)行速度更快,占用資源更少。取反指令 CPL 的功能是將累加器A的內(nèi)容按位取反,即原來是1的位變?yōu)?,原來是0的位變?yōu)?。 與算術(shù)運算類指令不同,邏輯運算類指令中,直接地址direct也可以在某些指令中作為目的操作數(shù)。例如:使用邏輯運算指令實現(xiàn)將累加器A的高4位清0,低4位置1。 從邏輯運算的性質(zhì)可知:與0相與可以使原數(shù)清0,與1相或可以使原數(shù)置1,與0相或和與1相與可以使原數(shù)保持不變。因此程序清單如下:

ANL A,#00001111B ;高4位置0,低4位不變

ORL A,#00001111B ;高4位不變,低4位置1

從上面的指令可見:使用ANL指令,可用于屏蔽某些位(清零);使用ORL指令,可用于在不改變其他位的前提下,將某些位置1;使用XRL指令,可用于將某些位求反。3.2.4控制轉(zhuǎn)移類指令1.無條件轉(zhuǎn)移指令

MCS-51單片機指令系統(tǒng)提供了無條件轉(zhuǎn)移指令。執(zhí)行到這類指令時,不需要對條件進行判斷,直接轉(zhuǎn)移到指令中標(biāo)號所指的語句去執(zhí)行。無條件轉(zhuǎn)移指令有以下4種: (1)短跳轉(zhuǎn)指令(絕對跳轉(zhuǎn)指令),指令形式如下:

AJMP 標(biāo)號 絕對跳轉(zhuǎn)指令是一條雙字節(jié)雙機器周期指令,該指令中提供了11位地址,轉(zhuǎn)移范圍是該指令的下一條指令所在的2KB范圍內(nèi),其機器碼為:a10a9800001a7a6a5a4a3a2a1。這條指令的功能是先將PC的內(nèi)容加2,使PC指向下一條指令的起始地址(也稱當(dāng)前PC值),然后將標(biāo)號送入PC的低11位,PC的高5位保持不變,形成新的PC值,實現(xiàn)程序的轉(zhuǎn)移。

例8:KWR:AJMPaddrll如果addrll=00100000000B(0100H),(1)當(dāng)標(biāo)號KWR地址為1030H,程序轉(zhuǎn)移地址??(2)當(dāng)標(biāo)號KWR為3030H時,程序轉(zhuǎn)移地址??分析:(1)在指令執(zhí)行前(PC)=1030H,取出該指令后(PC)+2形成PC當(dāng)前值為1032H,指令執(zhí)行的過程是將指令中的11位地址00100000000B送入PC低11位,即新的PC值為0001000100000000=1100H,所以指令執(zhí)行的結(jié)果就是轉(zhuǎn)移到1100H處執(zhí)行程序。當(dāng)KWR為3030H時,分析?(2)相對轉(zhuǎn)移指令,指令形式如下:

SJMP rel;(PC)+2+rel→PC

相對轉(zhuǎn)移指令是一條雙字節(jié)雙周期指令,rel是相對轉(zhuǎn)移的偏移量。由于該指令中rel是一個以補碼形式表示的8位二進制有符號數(shù),因此轉(zhuǎn)移的地址有可能在PC當(dāng)前值的前面也可能在后面,轉(zhuǎn)移的范圍是指令的下一條指令地址所在的-128~127的256B范圍內(nèi)。例如:在1354H處存放著一條相對轉(zhuǎn)移指令SJMPE7H,即rel=E7H。由于E7H是-18H的補碼,經(jīng)計算可知,其轉(zhuǎn)移的目的地址為(1354H)+2+(-18H)=133EH處。(3)長跳轉(zhuǎn)指令,指令形式如下:

LJMP 標(biāo)號 該指令在執(zhí)行時,轉(zhuǎn)移的目標(biāo)地址可以在64KB程序存儲器的任何地方。例:對于8051單片機系統(tǒng),用戶自己編寫的程序存放在程序存儲器1000H開始的一段空間中,試編寫程序使之在開機后能自動轉(zhuǎn)到1000H處執(zhí)行程序。解:開機后PC被復(fù)位為0000H,因此要使單片機在開機后能自動執(zhí)行用戶的程序,應(yīng)該在程序存儲空間的0000H處存放一條無條件轉(zhuǎn)移指令,即:

0000H:LJMP1000H …… 1000H:……(4)基址寄存器加變址寄存器間接轉(zhuǎn)移指令,指令形式如下:

JMP @A+DPTR

該指令在執(zhí)行時,把累加器A中的8位無符號數(shù)與數(shù)據(jù)指針DPTR中的16位無符號數(shù)相加,其結(jié)果作為下一條指令的地址送入PC,不改變累加器A和數(shù)據(jù)指針DPTR的內(nèi)容。利用這條指令能實現(xiàn)程序的散轉(zhuǎn),因此,這條指令又稱為散轉(zhuǎn)指令。例9:設(shè)最小系統(tǒng)的4個按鍵(鍵值設(shè)為0~3)鍵處理分別放在KPRG1、KPRG12、KPRG13、KPRG14處,試編寫程序使系統(tǒng)能夠自動識別按鍵,并執(zhí)行相應(yīng)的鍵處理程序。解:MOVA,P1 KEY:LJMPKPRG1 ANLA,#0F0H LJMPKPRG2 SWAPA LJMPKPRG3 MOVB,#03H LJMPKPRG4 MULAB KPRG1:…… MOVDPTR,#KEY KPRG2:…… JMP@A+DPTR KPRG3:…… KPRG4:……2.條件轉(zhuǎn)移指令

MCS-51單片機指令系統(tǒng)提供了條件轉(zhuǎn)移指令。執(zhí)行這類指令時,首先對某種條件進行判斷,條件滿足則轉(zhuǎn)移,否則順序執(zhí)行下面的指令。轉(zhuǎn)移的目的地址在以下一條指令的起始地址為中心的-128~127個字節(jié)范圍內(nèi)。當(dāng)條件滿足時,程序轉(zhuǎn)向標(biāo)號所指的語句處執(zhí)行。 條件轉(zhuǎn)移指令有以下7種。(1)

JZrel;(A)=0,(PC)+2+rel→PC

;(A)≠0,(PC)+2→PC

累加器A的內(nèi)容為0,則轉(zhuǎn)移至標(biāo)號處,否則順序執(zhí)行。(2)JNZrel;(A)≠0,(PC)+2+rel→PC

;(A)=0,(PC)+2→PC

累加器A的內(nèi)容不為0,則執(zhí)行轉(zhuǎn)移至標(biāo)號處,否則順序執(zhí)行。(3)JC 標(biāo)號進位標(biāo)志位C的內(nèi)容為1,則執(zhí)行轉(zhuǎn)移至標(biāo)號處,否則順序執(zhí)行。(4)JNC 標(biāo)號進位標(biāo)志位C的內(nèi)容為0,則執(zhí)行轉(zhuǎn)移至標(biāo)號處,否則順序執(zhí)行。例10:編寫程序?qū)?nèi)部RAM以40H為起始地址的數(shù)據(jù)傳送到BUF為起始地址的RAM區(qū)域,遇0終止。解: MOVR0,#40H MOVR1,#BUF LOOP: MOVA,@R0 JZLOOP1 MOV@R1,A INCR0 INCR1 SJMPLOOP LOOP1: SJMP$(5)JBbit,標(biāo)號直接尋址位bit的內(nèi)容為1,則執(zhí)行轉(zhuǎn)移至標(biāo)號處,否則順序執(zhí)行。(6)JNBbit,標(biāo)號直接尋址位bit的內(nèi)容為0,則執(zhí)行轉(zhuǎn)移至標(biāo)號處,否則順序執(zhí)行。(7)JBCbit,標(biāo)號直接尋址位bit的內(nèi)容為1,則執(zhí)行轉(zhuǎn)移至標(biāo)號處,且將直接尋址位bit的內(nèi)容清0,否則順序執(zhí)行。注意: 由于條件轉(zhuǎn)移指令只能轉(zhuǎn)移到以下一條指令的起始地址為中心的-128~127個字節(jié)范圍內(nèi),如果標(biāo)號與上述起始地址的偏移量超過該范圍,則可以采用條件轉(zhuǎn)移指令后增加LJMP指令的方法實現(xiàn)轉(zhuǎn)移。3.比較不相等轉(zhuǎn)移指令

MCS-51單片機指令系統(tǒng)只提供比較不相等轉(zhuǎn)移指令,而未提供其他形式的比較轉(zhuǎn)移指令。比較不相等轉(zhuǎn)移指令有以下4種形式:

CJNE A,direct, rel CJNE A,#data, rel CJNE Rn,#data, rel CJNE @Ri,#data, rel

這組指令的功能是比較操作數(shù)1與操作數(shù)2的大?。▋刹僮鲾?shù)均為無符號數(shù)),如果它們的值不相等則轉(zhuǎn)移,相等則順序執(zhí)行。另外,此類指令還可以影響PSW中的Cy等標(biāo)志。以上指令都執(zhí)行以下操作: 若目的操作數(shù)=源操作數(shù),則Cy=0,(PC)+3→PC;

若目的操作數(shù)>源操作數(shù),則Cy=0,(PC)+3+rel→PC;

若目的操作數(shù)<源操作數(shù),則Cy=1,(PC)+3+rel→PC;4.循環(huán)轉(zhuǎn)移指令MCS-51單片機指令系統(tǒng)提供的循環(huán)轉(zhuǎn)移指令有以下2種形式:

DJNZRn,rel;(Rn)-1→Rn ;若(Rn)=0,則(PC)+2→PC ;若(Rn)≠0,則(PC)+2+rel→PC DJNZdirect,rel;(direct)-1→direct ;若(direct)=0,則(PC)+2→PC ;若(direct)≠0,則(PC)+2+rel→PC這組指令把減1與條件轉(zhuǎn)移兩種功能結(jié)合在一起的指令。指令的操作是先將操作數(shù)減1,并保存結(jié)果,若減1以后操作數(shù)不為0,則轉(zhuǎn)移到指定的地址單元;若減1后操作數(shù)為0,則程序順序執(zhí)行,常用于計數(shù)型循環(huán)結(jié)構(gòu)。例11:把外部RAM以1000H為起始地址的10個單元的數(shù)傳送到內(nèi)部RAM以DATA為起始的區(qū)域中,編程如下。解: MOVDPTR,#1000H MOVR0,#DATA MOVR7,#10 LOOP: MOVXA,@DPTR MOV@R0,A INCR0 INCDPTR DJNZR7,LOOP SJMP$5.調(diào)用與返回指令MCS-51單片機指令系統(tǒng)提供了調(diào)用與返回指令,這類指令用于子程序的調(diào)用與返回,有以下5種:(1)短調(diào)用指令,指令形式如下:ACALL 子程序名該指令執(zhí)行時,先把PC加2以獲得下條指令的地址,把這16位地址壓入堆棧,堆棧指針SP加2。然后將子程序的起始地址送入PC,從而轉(zhuǎn)向執(zhí)行子程序。這條指令不影響標(biāo)志位。(2)長調(diào)用指令,指令形式如下:LCALL 子程序名該指令執(zhí)行時,先把PC加3以獲得下條指令的地址,把這16位地址壓入堆棧,堆棧指針SP加2。然后將子程序的起始地址送入PC,從而轉(zhuǎn)向執(zhí)行子程序。這條指令不影響標(biāo)志位。注意:指令A(yù)CALL與LCALL的區(qū)別在于:ACALL只能調(diào)用程序存儲器中2KB范圍內(nèi)的子程序;LCALL可以調(diào)用程序存儲器中64KB范圍內(nèi)的子程序。(3)子程序返回指令,指令形式如下:RET該指令的功能是從堆棧中取出2B的內(nèi)容送入PC,把堆棧指針SP減2,并從產(chǎn)生的PC值開始執(zhí)行程序,從而實現(xiàn)子程序的返回。這條指令不影響標(biāo)志位。(4)中斷返回指令,指令形式如下:

RETI

該指令的操作與RET指令相似,不同的是通常RETI指令只能用于中斷服務(wù)子程序的末尾。此指令的功能包括兩部分: 恢復(fù)中斷時保存入棧的PC值,使被打斷的程序可從斷點處恢復(fù)執(zhí)行; 恢復(fù)中斷邏輯,使CPU能夠響應(yīng)與剛處理過的中斷同級別的和更低級別的中斷請求。(5)空操作指令,指令形式如下:

NOP

該指令除了使PC加1外,不進行任何操作,常用于產(chǎn)生一個機器周期的等待延時。3.2.5布爾處理類指令 布爾處理功能是MCS-51系列單片機的一個重要特征,這是出于實際應(yīng)用需要而設(shè)置的。布爾變量也即開關(guān)變量,它是以位(bit)為單位進行操作的。允許進行位操作的位空間是:內(nèi)RAM位尋址區(qū)(20H~2FH)的128位和SFR中可以位操作的11個特殊功能寄存器中的83位。1.位傳送指令(2條) 位傳送指令就是可尋址位與累加位CY之間的傳送,指令有兩條。

MOVC,bit;bit→CY,某位數(shù)據(jù)送CYMOVbit,C;CY→bit,CY數(shù)據(jù)送某位例12:把20H位與21H位的內(nèi)容交換,試編程。解: MOVC,20H MOVF,C MOVC,21H MOV20H,C MOVC,F MOV21H,C2.置位/復(fù)位指令(4條) 這些指令對CY及可尋址位進行置位或復(fù)位操作,共有四條指令。

CLRC;0→CY,清CYCLRbit;0→bit,清某一位

SETBC;1→CY,置位CYSETBbit;1→bit,置位某一位3.位運算指令(6條) 位運算都是邏輯運算,有與、或、非三種指令,共六條。

ANLC,bit;(CY)∧(bit)→CYANLC,;(CY)∧()→CYORLC,bit;(CY)∨(bit)→CYORLC,;(CY)∧()→CYCPLC;()→CYCPLbit;()→bit例13:試編程將位B和D的內(nèi)容相異或,并把結(jié)果送到F中。解:異或

MOVC,B ANLC,/D MOVF,C MOVC,D ANLC,/B ORLC,F MOVF,C4.位控制轉(zhuǎn)移指令(5條) 位控制轉(zhuǎn)移指令是以位的狀態(tài)作為實現(xiàn)程序轉(zhuǎn)移的判斷條件,介紹如下:

JC rel

;(CY)=1轉(zhuǎn)移,(PC)+2+rel→PC,否則程序往下執(zhí)行,(PC)+2→PC。

JNCrel

;(CY)=0轉(zhuǎn)移,(PC)+2+rel→PC,否則程序往下執(zhí)行,(PC)+2→PC。

JB bit,rel

;位狀態(tài)為1轉(zhuǎn)移。

JNBbit,rel

;位狀態(tài)為0轉(zhuǎn)移。

JBCbit,rel

;位狀態(tài)為1轉(zhuǎn)移,并使該位清“0”。 后三條指令都是三字節(jié)指令,如果條件滿足,(PC)+3+rel→PC,否則程序往下執(zhí)行,(PC)+3→PC。例14:從P1口輸入一個數(shù),若為正數(shù)則存入內(nèi)RAM40H中,若為負數(shù)則將其取反后存入40H中,試編程。解:

MOVA,P1;取數(shù)送到累加器A JNBACC.7,LOOP;判斷正、負數(shù)

CPLA;為負數(shù),則取反

LOOP: MOV40H,A;存入內(nèi)存

SJMP$ ;結(jié)束3.3匯編語言及其語句格式3.3.1匯編語言的語句格式MCS-51匯編指令由操作碼助記符字段和操作數(shù)字段所組成。指令格式如下:

操作碼 [操作數(shù)1],[操作數(shù)2],[操作數(shù)3]第一部分為指令操作碼助記符,它由2~5個英文字母所組成,如JB、MOV、CJNE、LCALL等。第二部分為操作數(shù),它以一個或幾個空格和操作碼隔開,根據(jù)指令功能的不同,操作數(shù)可以有1、2、3個或者沒有(如空操作指令)。操作數(shù)之間以逗號“,”隔開。3.3.2偽指令 標(biāo)準(zhǔn)的MCS-51匯編程序(如Intel公司的ASM51)還定義許多偽指令供用戶使用,偽指令也稱為匯編命令,大多數(shù)偽指令匯編時不產(chǎn)生機器語言指令,僅提供匯編控制信息。最常用的偽指令有以下幾條。1.定位偽指令

ORG m m為十進制或十六進制數(shù)。m指出在該偽指令后的指令的匯編地址,即生成的機器指令起始存儲器地址。在一個匯編語言源程序中允許使用多條定位偽指令,但其值應(yīng)和前面生成的機器指令存放地址不重疊。2.字節(jié)定義偽指令

DB X1,X2,…,XnXi為單字節(jié)數(shù)據(jù),它為十進制或十六進制數(shù),也可以為一個表達式。Xi也可以為由兩個單引號‘’所括起來的一個字符串,這時Xi定義的字節(jié)長度等于字符串的長度,每一個字符為一個ASCII碼。該偽指令把X1,X2,…,Xn存入目標(biāo)程序存儲器,經(jīng)常用于定義一個常數(shù)表。3.字定義偽指令

DW Y1,Y2,…,YnYi為雙字節(jié)數(shù)據(jù),它可以為十進制或十六進制的數(shù),也可以為一個表達式。該偽指令把Y1,Y2,…,Yn存入目標(biāo)程序存儲器,經(jīng)常用于定義一個地址表。例:

ORG1000HTAB:DB30H,31H,32H,33H,34H;從1000H單元開始存放數(shù)

DB35H,36H,37H,38H,39H;換行,仍要先寫DB ORG0100HTAB1:DW1234H,31H,20;從0100H單元開始存放數(shù)偽指令DB定義0100H~0105H單元的內(nèi)容一次為12H、34H、00H、31H、00H、20H4.字或字節(jié)賦值偽指令

標(biāo)號EQUm

該偽指令把值m賦給前面的標(biāo)號,在程序中標(biāo)號和m是等價的。例如

DBUF EQU 30H,則符號DBUF等價于30H。5.位賦值偽指令

標(biāo)號bitn

該偽指令把值n賦給前面的標(biāo)號,n一般指位地址,在程序中標(biāo)號和n是等價的。 例如:HIGHbit20H,則HIGH等價于位地址20H((22H).0),1→HIGH等價于1→20H等價于1→(22H).0。6.匯編結(jié)束偽指令

END該偽指令指出結(jié)束匯編,即使后面還有指令,匯編程序也不作處理。7.標(biāo)號和注釋 匯編程序允許用戶在源程序中使用標(biāo)號和注釋。標(biāo)號加在指令之前,標(biāo)號必須以字母開始,后跟1~8個字母或數(shù)字,并以冒號“:”結(jié)尾,用戶定義的標(biāo)號不能和匯編保留符號(包括指令操作碼助記符以及寄存器名等)重復(fù)。標(biāo)號的值是它后面的指令存儲地址。注釋是用戶對某一條指令或某一段程序的功能說明,它必須以分號“;”開始。如果一行寫不下,可以另起一行,但都必須以分號“;”開始。下面為含有標(biāo)號和注釋的程序行:

標(biāo)號:操作碼︺[操作數(shù)1],[操作數(shù)2],[操作數(shù)3];注釋3.4MCS-51匯編語言程序設(shè)計3.4.1匯編語言程序設(shè)計特點 一方面,匯編語言指令是用一些具有相應(yīng)含義的助憶符來表達的,所以,它要比機器語言容易掌握和運用,但另一方面,它要直接使用CPU的資源,相對高級程序設(shè)計語言來說,它又顯得難掌握。 匯編語言程序歸納起來大概有以下幾個主要特點:與機器相關(guān)性 匯編語言程序的通用性和可移植性要比高級語言程序低。2.執(zhí)行的高效率 程序的執(zhí)行代碼短,執(zhí)行速度快。用匯編語言編寫程序幾乎是程序員直接在寫執(zhí)行代碼,程序員可以在程序的每個具體細節(jié)上進行優(yōu)化,這也是匯編語言程序執(zhí)行高效率的原因之一。

3.編寫程序的復(fù)雜性 匯編語言是一種面向機器的語言,其匯編指令與機器指令基本上一一對應(yīng),所以,匯編指令也同機器指令一樣具有功能單一、具體的特點。由于匯編語言程序要安排運算的每一個細節(jié),這就使得編寫匯編語言程序比較繁瑣、復(fù)雜。一個簡單的計算公式或計算方法,也要用一系列匯編指令一步一步來實現(xiàn)。4.調(diào)試的復(fù)雜性 在通常情況下,調(diào)試匯編語言程序要比調(diào)試高級語言程序困難。3.4.2匯編語言程序設(shè)計過程程序設(shè)計:使用程序設(shè)計語言編寫程序的過程。 在 程序設(shè)計過程中,應(yīng)在完成規(guī)定功能的前提下,使程序占用空間小,執(zhí)行時間短。同時,在程序設(shè)計時要按照規(guī)定的步驟進行。(1)分析問題,確定算法和解題思路。(2)根據(jù)算法和解題思路畫出程序流程圖。(3)根據(jù)流程圖編寫程序。(4)程序調(diào)試,找出錯誤并更正,再調(diào)試,直至通過。(5)編寫相關(guān)說明。3.4.3匯編語言程序設(shè)計方法 程序設(shè)計就是用計算機所能接受的語言把解決問題的步驟描述出來,也就是編制程序。常用的MCS-51程序設(shè)計語言有MCS-51匯編語言(指令系統(tǒng)中的指令)和MBASIC51、C51、PLM51等高級語言。 單片機應(yīng)用系統(tǒng)的軟件一般由主程序和若干個中斷程序組成。從程序結(jié)構(gòu)上大致可以分為順序結(jié)構(gòu)、分支結(jié)構(gòu)程序。任何復(fù)雜的程序都可以用上述三種結(jié)構(gòu)來表示。三種基本結(jié)構(gòu)的流程圖如圖3-12所示。圖3-12三種基本的程序結(jié)構(gòu)1、順序程序設(shè)計 順序結(jié)構(gòu)的程序多用來處理比較簡單的問題,如簡單的算術(shù)運算類問題。

其特點是:程序中的語句由前向后順序執(zhí)行,最后一條指令執(zhí)行完畢,整個程序也隨之結(jié)束。例3-4-1將30H中存放的壓縮BCD數(shù)轉(zhuǎn)換成二進制數(shù)存放在累加器A中。流程圖如圖(3-13)所示,程序清單如下:轉(zhuǎn)換方法為BCD數(shù)的高4位乘以10再加上低4位。START: MOV A,30H ;取數(shù)(30H)→A ANL A,#0F0H;屏蔽低4位

SWAP A ;高、低4位互換

MOV B,#10 ;10→B MUL AB ;BCD數(shù)的高4位乘以10 MOV B,A ;結(jié)果暫存BMOV A,30H ;取數(shù)

ANL A,#0FH ;屏蔽高4位

ADD A,B ;得到結(jié)果

END例3-4-2已知片內(nèi)RAM的M1、M2、M3單元中分別存放著3個8位無符號數(shù),試編寫程序求和,并把和存入30H、31H中(低位在前,高位在后。)流程圖如圖所示,程序清單如下:START: MOV A,M1 ;取數(shù)(M1)→A ADD A,M2 ;(M1)+(M2)→A MOVR2,A ;暫存放于R2 MOV A,#00H ;A清零

ADDC A,#00H ;進位位處理

MOV R3,A ;進位位暫存R3 MOV A,R2 ;取數(shù)

ADD A,M3 ;實現(xiàn)(M1)+(M2)+(M3)→A MOV 30H,A ;低位放在30H中

MOVA,#00H ADDCA,R3;處理第二次進位位,并與前面的加

MOV31H,A;將和高8位放于31HM1與M2之和送R2開始進位位暫存R3R2+M3的和送30HCy與R3之和送31H結(jié)束二、分支程序設(shè)計在解決很多問題的過程中,需要根據(jù)不同的條件轉(zhuǎn)向不同的處理程序,這種程序結(jié)構(gòu)叫做分支結(jié)構(gòu)。MCS-51單片機指令系統(tǒng)中的控制轉(zhuǎn)移類指令可以實現(xiàn)程序的分支。 (1)兩路分支結(jié)構(gòu)例3-4-3編程實現(xiàn):如果累加器A中數(shù)據(jù)為負數(shù),則將34H單元的數(shù)據(jù)存入寄存器B;否則,將35H單元的數(shù)據(jù)存入寄存器B。流程圖如圖(3-14)所示,程序清單如下:方法一,兩路分支程序。當(dāng)累加器A的最高位為1時,此數(shù)據(jù)為負數(shù),否則,此數(shù)據(jù)為正數(shù)或零。START:JBACC.7,L1;如果負數(shù),轉(zhuǎn)L1 MOVB,35H;將35H單元的數(shù)據(jù)

;存入寄存器B AJMP L2;轉(zhuǎn)L2L1:MOVB,34H;將34H單元的數(shù)據(jù)

;存入寄存器BL2:END程序清單如下:方法二,采用預(yù)測法。首先假設(shè)累加器A中數(shù)據(jù)為負,然后進行判斷。START:MOV B,34H ;假設(shè)累加器A中數(shù)據(jù)為負

JBACC.7,NEXT ;假設(shè)成立,繼續(xù)

MOV B,35H ;假設(shè)不成立,進行修改

NEXT:END采用這種預(yù)測法可以減少程序的復(fù)雜性,避免出錯。但并不是所有的兩路分支程序都可以這樣處理。(2)三路分支結(jié)構(gòu)例3-4-3假設(shè)累加器A中存放一有符號數(shù)X,求解函數(shù):

1當(dāng)X>0 Y=0當(dāng)X=0結(jié)果存入寄存器R0中。

-1當(dāng)X<0

START:CJNEA,#00H,NEERO;累加器A中內(nèi)容與0比較

MOVR0,#00H ;(A)=0,則0→R0 LJMP EXITNEERO:JBACC.7,LEERO MOVR0,#01H ;(A)>0,則1→R0 LJMPEXITLEERO:MOVR0,#0FFH ;(A)<0,則-1→R0EXIT:END3.多路分支結(jié)構(gòu)利用基址寄存器加變址寄存器間接轉(zhuǎn)移指令JMP@A+DPTR,可以根據(jù)累加器A的內(nèi)容實現(xiàn)多路分支。這類程序又稱為散轉(zhuǎn)程序。圖3-16例3-4-4流程圖

程序流程圖如圖(3-16)所示。程序清單如下:START:MOV R1,A RL A ADDA,R1 ;(A)×3→A MOV DPTR,#TABLE ;轉(zhuǎn)移表首地址→DPTR JMP @A+DPTR ;散轉(zhuǎn)TABLE:LJMP PP0 ;轉(zhuǎn)向編號0的處理入口

LJMP PP1 ;轉(zhuǎn)向編號1的處理入口

LJMP PP2 ;轉(zhuǎn)向編號2的處理入口

LJMP PP3 ;轉(zhuǎn)向編號3的處理入口

LJMP PP4 ;轉(zhuǎn)向編號4的處理入口

LJMP PP5 ;轉(zhuǎn)向編號5的處理入口

LJMP PP6 ;轉(zhuǎn)向編號6的處理入口

LJMP PP7 ;轉(zhuǎn)向編號7的處理入口注意: 由于每條長跳轉(zhuǎn)指令LJMP占用3個程序存儲器單元,所以在此程序中,首先將累加器A中的內(nèi)容置為原來的3倍,然后通過JMP @A+DPTR指令實現(xiàn)散轉(zhuǎn),程序中的PP0~PP7為與0~7對應(yīng)的各處理程序的入口地址。使用散轉(zhuǎn)指令,根據(jù)X的內(nèi)容(X=0,1,…)進行程序散轉(zhuǎn)的地址表達式為:地址=表首地址+表中每元素字節(jié)數(shù)×X。三、循環(huán)程序設(shè)計通常情況下,循環(huán)程序包括以下四部分:(1)循環(huán)準(zhǔn)備部分,即循環(huán)初始化,這部分的功能是為循環(huán)做好必要的準(zhǔn)備工作。這部分只執(zhí)行一次,但對于程序的組織十分重要,是完成循環(huán)的第一步。(2)循環(huán)體部分,這部分是循環(huán)操作的實質(zhì)部分,是需要多次執(zhí)行的程序的主體。(3)循環(huán)控制與修改部分,這部分的功能有兩個:一是通過修改某些內(nèi)容,為下一輪工作做好必要的準(zhǔn)備;二是通過判斷、控制循環(huán)的繼續(xù)或終止。(4)循環(huán)的結(jié)果處理部分,結(jié)束循環(huán)后,對所得的結(jié)果進行處理。根據(jù)循環(huán)層次的不同可以把循環(huán)程序分為單重循環(huán)程序和多重循環(huán)程序。1、單重循環(huán)程序例3-4-5內(nèi)部數(shù)據(jù)寄存器從40H開始連續(xù)存放有20個單字節(jié)數(shù),編程求它們的和(雙字節(jié)),并存入R4R3中。用R2作為計數(shù)器,用R0作為數(shù)據(jù)指針,采用寄存器間接尋址方式讀取各數(shù)。流程圖如圖(3-17)所示,程序清單如下:START:MOV R3,#0 ;設(shè)置初值

MOV R4,#0 MOV R2,#20 ;計數(shù)初值

MOV R0,40H ;初始地址

LOOP:MOV A,R3 ;計算和

ADD A,@R0 MOV R3,A CLR A ;處理進位

ADDC A,R4 MOV R4,A

INC R0

;修改控制變量

DJNZ R2,LOOP ;將R2-1再判斷程序是否結(jié)束

END例3-4-6內(nèi)部數(shù)據(jù)寄存器中存放有一個字符串,此字符串以30H為起始地址,以字符內(nèi)容為0結(jié)尾,編程將此字符串傳送到外部數(shù)據(jù)存儲器以1000H開始的連續(xù)單元中。 由于字符串的長度不確定,所以,不能用計數(shù)器來控制循環(huán)的結(jié)束,應(yīng)該以內(nèi)部數(shù)據(jù)存儲器中內(nèi)容是否為0來判斷循環(huán)是否結(jié)束。考慮到程序的容錯性,對于51子系列單片機,內(nèi)部RAM只有128B,地址從00H~7FH。如果從30H單元到7FH單元一直沒有數(shù)據(jù)0,再繼續(xù)傳送將沒有意義。所以,在循環(huán)的結(jié)束部分需要判斷數(shù)據(jù)指針是否越界。程序流程圖如圖(3-18)所示。程序清單如下:START:MOVR0,#30H ;源存儲單元首地址

MOVDPTR,#1000H;目的存儲單元首地址LOOP:MOV A,@R0 ;取數(shù)據(jù)

JZ LL ;為0,傳送結(jié)束

MOVX @DPTR,A;傳送數(shù)據(jù)

INC R0 ;指向下一個數(shù)據(jù)

INC DPTR

CJNE R0,#80H,LOOP ;判斷R0與#80H是否相等,

;不相等則循環(huán)傳送,否則退出LL: END2、多重循環(huán)程序 如果一個循環(huán)中包含了其他的循環(huán)程序,則稱該循環(huán)程序清單為多重循環(huán)程序。 例3-4-7編程實現(xiàn)100ms的延時程序。 編制延時程序時,需要了解MCS-51指令的執(zhí)行時間。在使用12MHz晶振時,一個機器周期為1μs,執(zhí)行一條DJNZ指令時間為2μs。要求時間不長的延時子程序可以使用雙重循環(huán)結(jié)構(gòu)。通用的延時子程序清單如下: ;子程序指令機器周期指令執(zhí)行次數(shù)

DEL: MOV R7,#X ;1 1 DEL1:MOV R6,#Y ;1 X DJNZ R6,$ ;2 X×Y DJNZ R7,DEL1 ;2 X RET ;1 1全部指令執(zhí)行時間為:1+X+2×X×Y+X+2×X+1=2+3×X+2×X×Y個機器周期。對于延時時間為100ms的延時程序,可以選擇X=200,Y=250。這樣,這個子程序的全部執(zhí)行時間為(2+3×200+2×200×250)=100.602ms。如果需要獲取更長的延時時間,可采用更多重的循環(huán),例如要實現(xiàn)秒延時,可以使用三重循環(huán)。四、子程序設(shè)計 子程序的引入簡化了主程序的結(jié)構(gòu),增加了程序的可讀性,避免了重復(fù)性工作,縮短了整個程序。另外,子程序還增加了程序的可移植性,一些常用的處理寫成子程序形式,可以被隨時引用,為編程提供了方便。 使用子程序時需注意:

(1)子程序的第一條指令的地址稱為子程序的首地址或入口地址,必須用標(biāo)號表明。 (2)現(xiàn)場保護。一般子程序的第一部分把主程序(或調(diào)用程序)的關(guān)鍵空間、中間結(jié)果保留起來,常用堆棧保護,以免子程序執(zhí)行過程中改變了這些關(guān)鍵值。但是在子程序返回前要將它們恢復(fù),同時注意出?;謴?fù)順序。

(3)子程序的末尾用RET返回,以便能返回到調(diào)用程序繼續(xù)執(zhí)行下去。 (4)參數(shù)傳遞。在調(diào)用子程序之前,主程序應(yīng)先把有關(guān)的參數(shù)(即入口參數(shù))放到某些約定的位置,子程序在運行時可以從約定的位置/單元得到有關(guān)的參數(shù)。同樣,在子程序運行結(jié)束返回前,也應(yīng)把運算結(jié)果(出口參數(shù))送到約定的位置/單元。在返回主程序后,主程序可以很方便從這里得到需要的結(jié)果。 實際編程時,可以采用多種參數(shù)傳遞的方法,可以用累加器A、寄存器或堆棧等進行參數(shù)的傳遞。(一)子程序的調(diào)用與返回

MCS-51單片機指令系統(tǒng)提供了兩條子程序調(diào)用指令:ACALL addr11和LCALLaddr16。指令中的地址為子程序的入口地址,在實際的程序中通常用標(biāo)號來代表。在主程序調(diào)

溫馨提示

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

評論

0/150

提交評論