單片機(jī)第三章教材_第1頁(yè)
單片機(jī)第三章教材_第2頁(yè)
單片機(jī)第三章教材_第3頁(yè)
單片機(jī)第三章教材_第4頁(yè)
單片機(jī)第三章教材_第5頁(yè)
已閱讀5頁(yè),還剩109頁(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)介

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

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

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

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

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

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

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

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

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

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

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

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

4.立即尋址立即尋址方式中操作數(shù)包含在指令字節(jié)中,即操作數(shù)以指令字節(jié)的形式存放于程序存儲(chǔ)器中。例如:指令MOV A,#30H;把常數(shù)30H傳送到累加器A,操作數(shù)2采用立即尋址指令執(zhí)行過(guò)程如圖(3-4)所示。圖3-4立即尋址執(zhí)行過(guò)程5.基寄存器加變址寄存器間接尋址這種尋址方式以16位的程序計(jì)數(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í)行過(guò)程6、相對(duì)尋址以PC的內(nèi)容作為基地址,加上指令中給定的偏移量所得結(jié)果作為轉(zhuǎn)移地址。應(yīng)注意偏移量是有符號(hào)數(shù),在-128~+127之間。轉(zhuǎn)移地址的目的地址=轉(zhuǎn)移指令所在的地址+轉(zhuǎn)移指令的字節(jié)數(shù)+(偏移量)rel例如:指令JC 70H若這條雙字節(jié)的轉(zhuǎn)移指令存放在2000H,取出操作碼后PC指向2001H;取出偏移量后PC指向2002H,故在計(jì)算偏移量相加時(shí),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具有五個(gè)存儲(chǔ)器空間,且多數(shù)從零地址開(kāi)始編址: 程序存儲(chǔ)器空間 0000~0FFFFH

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

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

位地址空間 00~0FFH

外部RAM/IO空間 0000~0FFFFH

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

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

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

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

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

3.2.1數(shù)據(jù)傳送類(lèi)指令數(shù)據(jù)傳送指令是應(yīng)用最多的一類(lèi)指令,其功能是進(jìn)行數(shù)據(jù)的傳送。1.內(nèi)部8位數(shù)據(jù)傳送指令內(nèi)部8位數(shù)據(jù)傳送指令共有15條,用于單片機(jī)內(nèi)部的數(shù)據(jù)存儲(chǔ)器與寄存器之間的數(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,對(duì)于8051系列單片機(jī),其中的00H~7FH為片內(nèi)RAM,80H~FFH為SFR,SFR只能直接尋址,指令中SFR可寫(xiě)成直接地址也可寫(xiě)成寄存器名;對(duì)于8052系列單片機(jī),80H~FFH區(qū)域?yàn)槠瑑?nèi)RAM和SFR地址重疊的區(qū)域,訪問(wèn)SFR時(shí)要使用直接尋址方式,訪問(wèn)80H~FFH區(qū)域的片內(nèi)RAM時(shí),要使用間接尋址方式;(2)指令MOVdirect1,direct2可實(shí)現(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單片機(jī)系統(tǒng)中16位數(shù)據(jù)傳送指令只有1條,其形式為:

MOV DPTR,#data16

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

MOVXA,@Ri

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

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

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

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

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

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

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

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

5.交換指令MCS-51單片機(jī)指令系統(tǒng)中,實(shí)現(xiàn)數(shù)據(jù)交換的指令有以下三種:(1)累加器半字節(jié)交換的指令,用于實(shí)現(xiàn)累加器的高4位與低4位互換。(2)字節(jié)交換指令,用于實(shí)現(xiàn)兩操作數(shù)內(nèi)容的互換。(3)半字節(jié)交換指令,用于實(shí)現(xiàn)兩操作數(shù)低4位內(nèi)容的互換,高4位不變。交換類(lèi)指令共有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指令在很多場(chǎng)合用于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單片機(jī)指令系統(tǒng)中,堆棧操作指令有以下兩種: (1)入棧指令。指令形式及所實(shí)現(xiàn)的功能如下:

PUSHdirect

;(SP)+1→SP

;(direct)→(SP) 該指令的功能是將指定直接尋址單元的內(nèi)容壓入堆棧。具體執(zhí)行時(shí),首先將堆棧指針SP的內(nèi)容加1,然后將指定直接尋址單元的內(nèi)容傳送到堆棧指針SP所指向的單元中。 (2)出棧指令。指令形式及所實(shí)現(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ìn)行指針操作,后進(jìn)行數(shù)據(jù)操作,出棧時(shí)先進(jìn)行數(shù)據(jù)操作,后進(jìn)行指針操作;(2)上電復(fù)位后SP=07H,由于入棧操作是先指針上移,后壓入數(shù)據(jù),所以堆??臻g并未占用0區(qū)的R7寄存器;(3)一般來(lái)說(shuō),如果應(yīng)用系統(tǒng)要使用1~3區(qū),在主程序開(kāi)始執(zhí)行初期,應(yīng)將SP移至內(nèi)部數(shù)據(jù)存儲(chǔ)器的高端;(4)一般情況下,除上電初始化外,不易輕易修改SP。方法一,使用交換指令實(shí)現(xiàn):例5:編程實(shí)現(xiàn)將內(nèi)部數(shù)據(jù)存儲(chǔ)器中地址為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)容互換方法二,使用堆棧指令實(shí)現(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ù)運(yùn)算類(lèi)指令

MCS-51單片機(jī)指令系統(tǒng)中實(shí)現(xiàn)算術(shù)運(yùn)算的指令共24條,這類(lèi)指令大多會(huì)影響標(biāo)志位。算術(shù)運(yùn)算指令包括加法(ADD)、帶進(jìn)位加法(ADDC)、帶借位減法(SUBB)、乘法(MUL)、除法(DIV)、加1(INC)、減1(DEC)和十進(jìn)制調(diào)整(DA)等幾種操作,其允許的指令形式如圖(3-9)所示。1、加法ADD與帶進(jìn)位加法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)與帶進(jìn)位加法(ADDC)差別在于:帶進(jìn)位加法(ADDC)是將源操作數(shù)的內(nèi)容與累加器A的內(nèi)容相加后,還要再加上進(jìn)位標(biāo)志位C的內(nèi)容,而加法指令(ADD)不進(jìn)行加進(jìn)位標(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é)果如何?進(jìn)行加法運(yùn)算中參加運(yùn)算的都是8位二進(jìn)制數(shù),這些數(shù)可以是無(wú)符號(hào)數(shù)(0~255),也可以是有符號(hào)數(shù),即補(bǔ)碼(-128~127)。例如上例中97H,若當(dāng)做無(wú)符號(hào)數(shù)是十進(jìn)制151,當(dāng)做有符號(hào)數(shù)是-105,但計(jì)算機(jī)在作加法運(yùn)算時(shí),總按以下規(guī)則進(jìn)行:(1)在求和時(shí),總是把操作數(shù)直接相加,而不需變換。(2)在確定相加后進(jìn)位Cy的值時(shí),總是把兩個(gè)操作數(shù)作為無(wú)符號(hào)數(shù)直接相加而得出進(jìn)位Cy值。但若是兩個(gè)帶符號(hào)的數(shù)相加,相加后的進(jìn)位值應(yīng)該丟棄,PSW中的Cy位仍為1。(3)在確定相加后溢出標(biāo)志OV的值時(shí),計(jì)算機(jī)總是把操作數(shù)當(dāng)成有符號(hào)數(shù)看待。在作加法運(yùn)算時(shí),一個(gè)整數(shù)和一個(gè)負(fù)數(shù)相加,是不可能產(chǎn)生溢出的,只有兩個(gè)同符號(hào)數(shù)相加時(shí),才可能溢出,并按以下方法判斷是否溢出:兩個(gè)正數(shù)相加(符號(hào)位都為0),若和為負(fù)數(shù)(符號(hào)位都為1),則一定溢出;兩個(gè)負(fù)數(shù)相加(符號(hào)位都為1),若和為正數(shù)(符號(hào)位都為0),則一定溢出。產(chǎn)生溢出OV=1,否則OV=0.上例中兩個(gè)負(fù)數(shù)相加后,和為正數(shù),有溢出。2、十進(jìn)制加法調(diào)整指令 十進(jìn)制加法調(diào)整指令的形式為:

DAA

該指令的功能是對(duì)累加器中由兩個(gè)壓縮BCD數(shù)的相加所獲得的8位結(jié)果進(jìn)行調(diào)整,使其調(diào)整為2位壓縮BCD數(shù)。調(diào)整規(guī)則:若累加器A低4位大于9或輔助進(jìn)位標(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)生進(jìn)位時(shí),將Cy置1,若不產(chǎn)生進(jìn)位,保留Cy在調(diào)整前的狀態(tài)而并不清0。DA指令只影響進(jìn)位標(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é)果存回原來(lái)的操作數(shù)中,這類(lèi)指令不影響標(biāo)志位。4、減法指令:(1)減法指令中只有帶借位減法(SUBB)。

SUBB A,direct

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

MUL AB

該指令的功能是把累加器A和寄存器B中的8位無(wú)符號(hào)數(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寄存器對(duì)中取積。進(jìn)位標(biāo)志位C始終為0。6、除法指令 除法指令的形式為:

DIV AB

該指令的功能是把累加器A中的8位無(wú)符號(hào)數(shù)除以寄存器B中的8位無(wú)符號(hào)數(shù),結(jié)果分為兩部分,其商的整數(shù)部分存放在累加器A中,余數(shù)部分存放在寄存器B中。如果指令執(zhí)行前B中內(nèi)容(除數(shù))為0時(shí),結(jié)果中累加器A中內(nèi)容為0FFH,B中內(nèi)容為被除數(shù),溢出標(biāo)志位OV將被置1,進(jìn)位標(biāo)志位C始終為0。3.2.3邏輯運(yùn)算類(lèi)指令MCS-51單片機(jī)指令系統(tǒng)中實(shí)現(xiàn)邏輯運(yùn)算的指令包括與(ANL)、或(ORL)、異或(XRL)的邏輯操作,累加器A自身內(nèi)容的清零(CLR)、取反(CPL)、右移(RR)、帶進(jìn)位右移(RRC)、左移(RL)、帶進(jìn)位左移(RLC)等指令。這類(lèi)指令共24條,并且都不會(huì)影響標(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;帶進(jìn)位循環(huán)左移(An)→(An+1),(A7)→Cy;Cy→(A0)RRCA;帶進(jìn)位循環(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)容按位取反,即原來(lái)是1的位變?yōu)?,原來(lái)是0的位變?yōu)?。 與算術(shù)運(yùn)算類(lèi)指令不同,邏輯運(yùn)算類(lèi)指令中,直接地址direct也可以在某些指令中作為目的操作數(shù)。例如:使用邏輯運(yùn)算指令實(shí)現(xiàn)將累加器A的高4位清0,低4位置1。 從邏輯運(yùn)算的性質(zhì)可知:與0相與可以使原數(shù)清0,與1相或可以使原數(shù)置1,與0相或和與1相與可以使原數(shù)保持不變。因此程序清單如下:

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

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

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

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

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

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

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

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

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

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

JMP @A+DPTR

該指令在執(zhí)行時(shí),把累加器A中的8位無(wú)符號(hào)數(shù)與數(shù)據(jù)指針DPTR中的16位無(wú)符號(hào)數(shù)相加,其結(jié)果作為下一條指令的地址送入PC,不改變累加器A和數(shù)據(jù)指針DPTR的內(nèi)容。利用這條指令能實(shí)現(xiàn)程序的散轉(zhuǎn),因此,這條指令又稱(chēng)為散轉(zhuǎn)指令。例9:設(shè)最小系統(tǒng)的4個(gè)按鍵(鍵值設(shè)為0~3)鍵處理分別放在KPRG1、KPRG12、KPRG13、KPRG14處,試編寫(xiě)程序使系統(tǒng)能夠自動(dòng)識(shí)別按鍵,并執(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單片機(jī)指令系統(tǒng)提供了條件轉(zhuǎn)移指令。執(zhí)行這類(lèi)指令時(shí),首先對(duì)某種條件進(jìn)行判斷,條件滿足則轉(zhuǎn)移,否則順序執(zhí)行下面的指令。轉(zhuǎn)移的目的地址在以下一條指令的起始地址為中心的-128~127個(gè)字節(jié)范圍內(nèi)。當(dāng)條件滿足時(shí),程序轉(zhuǎn)向標(biāo)號(hào)所指的語(yǔ)句處執(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)號(hào)處,否則順序執(zhí)行。(2)JNZrel;(A)≠0,(PC)+2+rel→PC

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

累加器A的內(nèi)容不為0,則執(zhí)行轉(zhuǎn)移至標(biāo)號(hào)處,否則順序執(zhí)行。(3)JC 標(biāo)號(hào)進(jìn)位標(biāo)志位C的內(nèi)容為1,則執(zhí)行轉(zhuǎn)移至標(biāo)號(hào)處,否則順序執(zhí)行。(4)JNC 標(biāo)號(hào)進(jìn)位標(biāo)志位C的內(nèi)容為0,則執(zhí)行轉(zhuǎn)移至標(biāo)號(hào)處,否則順序執(zhí)行。例10:編寫(xiě)程序?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)號(hào)直接尋址位bit的內(nèi)容為1,則執(zhí)行轉(zhuǎn)移至標(biāo)號(hào)處,否則順序執(zhí)行。(6)JNBbit,標(biāo)號(hào)直接尋址位bit的內(nèi)容為0,則執(zhí)行轉(zhuǎn)移至標(biāo)號(hào)處,否則順序執(zhí)行。(7)JBCbit,標(biāo)號(hào)直接尋址位bit的內(nèi)容為1,則執(zhí)行轉(zhuǎn)移至標(biāo)號(hào)處,且將直接尋址位bit的內(nèi)容清0,否則順序執(zhí)行。注意: 由于條件轉(zhuǎn)移指令只能轉(zhuǎn)移到以下一條指令的起始地址為中心的-128~127個(gè)字節(jié)范圍內(nèi),如果標(biāo)號(hào)與上述起始地址的偏移量超過(guò)該范圍,則可以采用條件轉(zhuǎn)移指令后增加LJMP指令的方法實(shí)現(xiàn)轉(zhuǎn)移。3.比較不相等轉(zhuǎn)移指令

MCS-51單片機(jī)指令系統(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ù)均為無(wú)符號(hào)數(shù)),如果它們的值不相等則轉(zhuǎn)移,相等則順序執(zhí)行。另外,此類(lèi)指令還可以影響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單片機(jī)指令系統(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í)行,常用于計(jì)數(shù)型循環(huán)結(jié)構(gòu)。例11:把外部RAM以1000H為起始地址的10個(gè)單元的數(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單片機(jī)指令系統(tǒng)提供了調(diào)用與返回指令,這類(lèi)指令用于子程序的調(diào)用與返回,有以下5種:(1)短調(diào)用指令,指令形式如下:ACALL 子程序名該指令執(zhí)行時(shí),先把PC加2以獲得下條指令的地址,把這16位地址壓入堆棧,堆棧指針SP加2。然后將子程序的起始地址送入PC,從而轉(zhuǎn)向執(zhí)行子程序。這條指令不影響標(biāo)志位。(2)長(zhǎng)調(diào)用指令,指令形式如下:LCALL 子程序名該指令執(zhí)行時(shí),先把PC加3以獲得下條指令的地址,把這16位地址壓入堆棧,堆棧指針SP加2。然后將子程序的起始地址送入PC,從而轉(zhuǎn)向執(zhí)行子程序。這條指令不影響標(biāo)志位。注意:指令A(yù)CALL與LCALL的區(qū)別在于:ACALL只能調(diào)用程序存儲(chǔ)器中2KB范圍內(nèi)的子程序;LCALL可以調(diào)用程序存儲(chǔ)器中64KB范圍內(nèi)的子程序。(3)子程序返回指令,指令形式如下:RET該指令的功能是從堆棧中取出2B的內(nèi)容送入PC,把堆棧指針SP減2,并從產(chǎn)生的PC值開(kāi)始執(zhí)行程序,從而實(shí)現(xiàn)子程序的返回。這條指令不影響標(biāo)志位。(4)中斷返回指令,指令形式如下:

RETI

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

NOP

該指令除了使PC加1外,不進(jìn)行任何操作,常用于產(chǎn)生一個(gè)機(jī)器周期的等待延時(shí)。3.2.5布爾處理類(lèi)指令 布爾處理功能是MCS-51系列單片機(jī)的一個(gè)重要特征,這是出于實(shí)際應(yīng)用需要而設(shè)置的。布爾變量也即開(kāi)關(guān)變量,它是以位(bit)為單位進(jìn)行操作的。允許進(jìn)行位操作的位空間是:內(nèi)RAM位尋址區(qū)(20H~2FH)的128位和SFR中可以位操作的11個(gè)特殊功能寄存器中的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條) 這些指令對(duì)CY及可尋址位進(jìn)行置位或復(fù)位操作,共有四條指令。

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

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

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)作為實(shí)現(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口輸入一個(gè)數(shù),若為正數(shù)則存入內(nèi)RAM40H中,若為負(fù)數(shù)則將其取反后存入40H中,試編程。解:

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

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

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

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

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

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

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

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

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

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

標(biāo)號(hào)EQUm

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

DBUF EQU 30H,則符號(hào)DBUF等價(jià)于30H。5.位賦值偽指令

標(biāo)號(hào)bitn

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

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

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

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

其特點(diǎn)是:程序中的語(yǔ)句由前向后順序執(zhí)行,最后一條指令執(zhí)行完畢,整個(gè)程序也隨之結(jié)束。例3-4-1將30H中存放的壓縮BCD數(shù)轉(zhuǎn)換成二進(jì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個(gè)8位無(wú)符號(hào)數(shù),試編寫(xiě)程序求和,并把和存入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 ;進(jìn)位位處理

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

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

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

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

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

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

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

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

NEXT:END采用這種預(yù)測(cè)法可以減少程序的復(fù)雜性,避免出錯(cuò)。但并不是所有的兩路分支程序都可以這樣處理。(2)三路分支結(jié)構(gòu)例3-4-3假設(shè)累加器A中存放一有符號(hào)數(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)容實(shí)現(xiàn)多路分支。這類(lèi)程序又稱(chēng)為散轉(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)向編號(hào)0的處理入口

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

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

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

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

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

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

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

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

MOV R0,40H ;初始地址

LOOP:MOV A,R3 ;計(jì)算和

ADD A,@R0 MOV R3,A CLR A ;處理進(jìn)位

ADDC A,R4 MOV R4,A

INC R0

;修改控制變量

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

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

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

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

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

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

INC DPTR

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

;不相等則循環(huán)傳送,否則退出LL: END2、多重循環(huán)程序 如果一個(gè)循環(huán)中包含了其他的循環(huán)程序,則稱(chēng)該循環(huán)程序清單為多重循環(huán)程序。 例3-4-7編程實(shí)現(xiàn)100ms的延時(shí)程序。 編制延時(shí)程序時(shí),需要了解MCS-51指令的執(zhí)行時(shí)間。在使用12MHz晶振時(shí),一個(gè)機(jī)器周期為1μs,執(zhí)行一條DJNZ指令時(shí)間為2μs。要求時(shí)間不長(zhǎng)的延時(shí)子程序可以使用雙重循環(huán)結(jié)構(gòu)。通用的延時(shí)子程序清單如下: ;子程序指令機(jī)器周期指令執(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í)行時(shí)間為:1+X+2×X×Y+X+2×X+1=2+3×X+2×X×Y個(gè)機(jī)器周期。對(duì)于延時(shí)時(shí)間為100ms的延時(shí)程序,可以選擇X=200,Y=250。這樣,這個(gè)子程序的全部執(zhí)行時(shí)間為(2+3×200+2×200×250)=100.602ms。如果需要獲取更長(zhǎng)的延時(shí)時(shí)間,可采用更多重的循環(huán),例如要實(shí)現(xiàn)秒延時(shí),可以使用三重循環(huán)。四、子程序設(shè)計(jì) 子程序的引入簡(jiǎn)化了主程序的結(jié)構(gòu),增加了程序的可讀性,避免了重復(fù)性工作,縮短了整個(gè)程序。另外,子程序還增加了程序的可移植性,一些常用的處理寫(xiě)成子程序形式,可以被隨時(shí)引用,為編程提供了方便。 使用子程序時(shí)需注意:

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

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

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

溫馨提示

  • 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)論