51單片機(jī)中斷匯編_第1頁
51單片機(jī)中斷匯編_第2頁
51單片機(jī)中斷匯編_第3頁
51單片機(jī)中斷匯編_第4頁
51單片機(jī)中斷匯編_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

§3.1概述7種尋址方式,111條指令字節(jié)數(shù)運(yùn)算速度單字節(jié)指令:49條雙字節(jié)指令:45條三字節(jié)指令:17條單周期指令:64條雙周期指令:45條四周期指令:2條第三章MCS-51指令系統(tǒng)

InstructionSet9/26/20241功能數(shù)據(jù)傳送類:29條算術(shù)運(yùn)算類:24條邏輯運(yùn)算類:24條控制轉(zhuǎn)移類:17條位操作類:17條9/26/20242常用符號Rn:工作寄存器中的寄存器Rn、R1…R7之一,Ri:工作寄存器中的寄存器R0或R1#data:8位立即數(shù)#data16:16位立即數(shù)direct:片內(nèi)RAM或SFR的地址(8位)@間接尋址寄存器Bit:片內(nèi)RAM或SFR的位地址addr11:11位目的地址addr16:16位目的地址9/26/20243rel:補(bǔ)碼形式的8位地址偏移量。偏移范圍為-128~127/:位操作指令中,該位求反后參與操作,不影響該位X:片內(nèi)RAM的直接地址或寄存器(X):相應(yīng)地址單元中的內(nèi)容→:箭頭左邊的內(nèi)容送入箭頭右邊的單元內(nèi)9/26/20244§3.2尋址方式3.2.1立即尋址ImmediateAddressing操作數(shù)就包含在指令代碼中,在操作碼之后,稱為立即數(shù),用“?!北硎尽?/p>

MCS-51如:MOVP1,#80HMOVR7,#0F5HMOVDPTR,#1245H操作數(shù)存在程序存儲器中9/26/202453.2.2直接尋址

DirectAddressing直接使用數(shù)所在單元的地址找到了操作數(shù),所以稱這種方法為直接尋址。操作數(shù)在SFR、內(nèi)部RAM、位地址空間。如:MOVA,00H

MOVC,60H

MOVA,0F0H9/26/202463.2.3寄存器尋址RegisterAddressing對選定的工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR中的數(shù)進(jìn)行操作。

例:MOVA,R0;將R0工作寄存器中的數(shù)據(jù)送到累加器A中去。提一個(gè)問題:我們知道,工作寄存器就是內(nèi)存單元的一部分,如果我們選擇工作寄存器組0,則R0就是RAM的00H單元,那么這樣一來,MOVA,00H和MOVA,R0不就沒什么區(qū)別了嗎?9/26/20247的確,這兩條指令執(zhí)行的結(jié)果是完全相同的,都是將00H單元中的內(nèi)容送到A中去,但是執(zhí)行的過程不同,執(zhí)行第一條指令需要2個(gè)機(jī)器周期,而第二條則只需要1個(gè)機(jī)器周期,第一條指令變成最終的目標(biāo)碼要兩個(gè)字節(jié)(E5H00H),而第二條則只要一個(gè)字節(jié)(E8H)就可以了。9/26/202483.2.4寄存器間接尋址Register

IndirectAddressing把地址放在另外一個(gè)寄存器中,根據(jù)這個(gè)寄存器中的數(shù)值決定該到哪個(gè)單元中取數(shù)據(jù)。R0,R1----8位地址,片內(nèi)低128字節(jié)或片外DPTR----16位,片外64KB

MCS-51如: MOVA,@R0 MOVXA,@R0 MOVXA,@DPTR操作數(shù)在片內(nèi)RAM中操作數(shù)在片外RAM中操作數(shù)在片外RAM中9/26/20249以DPTR或PC為基址寄存器,累加器A為變址寄存器。把兩者內(nèi)容相加,結(jié)果作為操作數(shù)的地址。常用于查表操作。

MCS-51

MOVCA,@A+DPTR

;(A+DPTR)→A

MOVCA,@A+PC

;PC+1→PC,(A+PC)→A3.2.5變址尋址(基址+變址)Base-Register-plus-Index-Register-IndirectAddressing操作數(shù)在程序存儲器中9/26/202410E0A程序存儲區(qū)2040H9320E0H472041H………DPH20DPL00ALU如:MOVCA,@A+DPTR設(shè)DPTR=2000H,A=E0H20E0H47指令代碼9/26/2024113.2.6相對尋址將PC中的當(dāng)前內(nèi)容與指令第二字節(jié)給出的數(shù)相加,結(jié)果作為跳轉(zhuǎn)指令的轉(zhuǎn)移地址(轉(zhuǎn)移目的地址)。PC中的當(dāng)前內(nèi)容稱為基地址(本指令后的字節(jié)地址)指令第二字節(jié)給出的數(shù)據(jù)稱為偏移量,1字節(jié)帶符號數(shù).常用于跳轉(zhuǎn)指令。如:JC23H若C=0,不跳轉(zhuǎn);C=1,跳轉(zhuǎn).RelativeAddressing改變PC9/26/202412程序存儲區(qū)ALU如:JC231025H1000H401025H451001H

23……1024H471002H3023H1002H指令代碼當(dāng)前PC9/26/202413

對片內(nèi)RAM的位尋址區(qū)和某些可位尋址的特殊功能寄存器進(jìn)行位操作時(shí)的尋址方式。如:SETB3DH;將27H.5位置1 CLRC;Cy位清03.2.7位尋址BitAddressing操作數(shù)在片內(nèi)RAM位地址區(qū)或SFR某些位中9/26/202414尋址方式涉及的存儲器空間尋址方式尋址空間(操作數(shù)存放空間)立即尋址程序存儲器直接尋址片內(nèi)RAM低128字節(jié)、SFR寄存器尋址工作寄存器R0~R7,A,B,DPTR寄存器間接尋址片內(nèi)RAM:@R0,@R1,SP片外RAM:@R0,@R1,@DPTR變址尋址程序存儲器:@A+PC,@A+DPTR相對尋址程序存儲器256字節(jié)范圍內(nèi):PC+偏移量位尋址片內(nèi)RAM的位尋址區(qū)(20H~2FH字節(jié)地址)某些可位尋址的SFR9/26/202415§3.3數(shù)據(jù)傳送類指令(29條)

DataTransferInstructionMCS-51助記符:助記符:MOV、MOVX、MOVC

XCH、XCHD、SWAP

PUSH、POP

源操作數(shù)尋址方式(5種):立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址。目的操作數(shù)尋址方式(3種):直接尋址、寄存器尋址、寄存器間接尋址

除了目的操作數(shù)為ACC的指令影響奇偶標(biāo)志P外,一般不影響標(biāo)志位。9/26/2024163.3.1十六位數(shù)的傳遞指令(1條) MOVDPTR,#data168051是一種8位機(jī),這是唯一的一條16位立即數(shù)傳遞指令。功能:將一個(gè)16位的立即數(shù)送入DPTR中去。其中高8位送入DPH,低8位送入DPL。

例:MOVDPTR,#1234H執(zhí)行完了之后DPH中的值為12H,DPL中的值為34H。如果我們分別向DPH,DPL送數(shù),則結(jié)果也一樣。如下面兩條指令:MOVDPH,#35H MOVDPL,#12H。則就相當(dāng)于執(zhí)行了MOVDPTR,#3512H。9/26/2024173.3.2累加器A與片外RAM之間的數(shù)據(jù)傳遞類指令(4條)

MOVX

A,@Ri

MOVX

@Ri,A

MOVX

A,@DPTR

MOVX

@DPTR,A說明:1.在51中,與外部存儲器RAM打交道的只可以是A累加器。所有需要送入外部RAM的數(shù)據(jù)必需要通過A送去,而所有要讀入的外部RAM中的數(shù)據(jù)也必需通過A讀入。在此我們可以看出內(nèi)外部RAM的區(qū)別了,內(nèi)部RAM間可以直接進(jìn)行數(shù)據(jù)的傳遞,而外部則不行。比如,要將外部RAM中某一單元(設(shè)為0100H單元的數(shù)據(jù))送入另一個(gè)單元(設(shè)為0200H單元),也必須先將0100H單元中的內(nèi)容讀入A,然后再送到0200H單元中去。9/26/2024182.要讀或?qū)懲獠康腞AM,當(dāng)然也必須要知道RAM的地址,在后兩條指令中,地址是被直接放在DPTR中的。而前兩條指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口來提供。3.使用時(shí)應(yīng)先將要讀或?qū)懙牡刂匪腿隓PTR或Ri中,然后再用讀寫命令。

例:將外部RAM中100H單元中的內(nèi)容送入外部RAM中200H單元中。 MOVDPTR,#0100H MOVXA,@DPTR MOVDPTR,#0200H MOVX@DPTR,A9/26/2024193.3.3讀程序存儲器指令(2條)MOVCA,@A+DPTRMOVCA,@A+PC本組指令是將ROM中的數(shù)送入A中。本組指令也被稱為查表指令,常用此指令來查一個(gè)已做好在ROM中的表格說明:查找到的結(jié)果被放在A中,因此,本條指令執(zhí)行前后,A中的值不一定相同。例:有一個(gè)數(shù)在R0中,要求用查表的方法確定它的平方值(此數(shù)的取值范圍是0-5) MOVDPTR,#100H MOVA,R0 MOVCA,@A+DPTR .…

ORG0100H DB0,1,4,9,16,25如果R0中的值為2,則最終地址為100H+2為102H,到102H單元中找到的是4。9/26/2024203.3.4堆棧操作(2條)

PUSHdirect;SP

SP+1,(SP)(direct)

POPdirect;(direct)(SP),SP

SP-1第一條為壓入指令,就是將direct中的內(nèi)容送入堆棧中,第二條為彈出指令,就是將堆棧中的內(nèi)容送回到direct中。例: MOVSP,#5FH MOVA,#100 MOVB,#20

PUSHACC PUSHB

則執(zhí)行第一條PUSHACC指令是這樣的:將SP中的值加1,即變?yōu)?0H,然后將A中的值送到60H單元中,因此執(zhí)行完本條指令后,內(nèi)存60H單元的值就是100,同樣,執(zhí)行PUSHB時(shí),是將SP+1,即變?yōu)?1H,然后將B中的值送入到61H單元中,即執(zhí)行完本條指令后,61H單元中的值變?yōu)?0。9/26/2024211.給出每條指令執(zhí)行后的結(jié)果MOV23H,#30HMOV12H,#34HMOVR0,#23HMOVR7,12HMOVR1,#12HMOVA,@R0MOV34H,@R1MOV45H,34HMOVDPTR,#6712HMOV12H,DPHMOVR0,DPLMOVA,@R0;(23H)=30H;(12H)=34H;R0=23HXXXXXXXXXXXXXXXXXXDPHDPL45H34H23H12HR7R1R0XXXXXXXX3034XXXX23XXXXXXXX3034341223671234343034341223671234343067341212;R7=34H;R1=12H;A=30H;(34H)=34H;(45H)=34H;DPTR=6712H;(12H)=67H;R0=12H;A=67H內(nèi)部RAM9/26/202422§3.4算術(shù)運(yùn)算類指令(24條)

ArithmeticOperations

主要對8位無符號數(shù);也可用于帶符號數(shù)運(yùn)算。包括:加、減、乘、除、加1、減1運(yùn)算指令影響PSW有關(guān)位。9/26/2024233.4.1

加法指令

ADDA,#data ;A+data→A

ADDA,direct ;A+(direct)→A

ADDA,Rn ;A+Rn→A

ADDA,@Ri ;A+(Ri)→A用途:將A中的值與源操作數(shù)所指內(nèi)容相加,最終結(jié)果存在A中。1.不帶進(jìn)位位的加法指令(4條)9/26/2024242.帶進(jìn)位位的加法指令(4條)

ADDCA,Rn ;A+Rn+CY→A

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

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

ADDCA,#data ;A+data+CY→A用途:將A中的值和其后面的值以及進(jìn)位位C中的值相加,最終結(jié)果存在A,常用于多字節(jié)數(shù)運(yùn)算中。說明:由于51單片機(jī)是一種8位機(jī),所以只能做8位的數(shù)學(xué)運(yùn)算,但8位運(yùn)算的范圍只有0~255,這在實(shí)際工作中是不夠的,因此就要進(jìn)行擴(kuò)展,一般是將2個(gè)8位(兩字節(jié))的數(shù)學(xué)運(yùn)算合起來,成為一個(gè)16位的運(yùn)算,這樣,可以表達(dá)的數(shù)的范圍就可以達(dá)到0~65535。9/26/202425例:先做67H+A0H=107H,而107H顯然超過了0FFH,因此最終保存在A中的是07H,而1則到了PSW中的CY位了。換言之,CY就相當(dāng)于是100H。然后再做10H+30H+CY,結(jié)果是41H,所以最終的結(jié)果是4107H。1067H+30A0H0001000001100111001100001010000001000001000001111067H30A0H4107H9/26/202426設(shè):1067H存在R1R0中,30A0H存在R3R2中,計(jì)算R1R0+R3R2,結(jié)果存在R5R4中。MOVA,R0ADDA,R2;R0+R2→A和CYMOVR4,AMOVA,R1ADDCA,R3;R1+R3+CY→A和CYMOVR5,A9/26/202427又例:先做67H+20H=87H,沒有超過0FFH,因此最終保存在A中的是87H,而PSW中的CY=0。然后再做10H+30H+CY,結(jié)果是40H,所以最終的結(jié)果是4087H。1067H+3020H0001000001100111001100000010000001000000100001111067H3020H4087H9/26/202428DAA在進(jìn)行BCD碼加法運(yùn)算時(shí),跟在ADD和ADDC指令之后,用于對累加器A中剛進(jìn)行的兩個(gè)BCD碼的加法的結(jié)果進(jìn)行十進(jìn)制調(diào)整。例:A=00010101BCD(代表十進(jìn)制數(shù)15)ADDA,#83.十進(jìn)制調(diào)整指令(1條);A=1DH,按二進(jìn)制規(guī)律加;A=23H,按十進(jìn)制規(guī)律加DAA9/26/202429

調(diào)整要完成的任務(wù)是:(1)當(dāng)累加器A中的低4位數(shù)出現(xiàn)了非BCD碼(1010~1111)或低4位產(chǎn)生進(jìn)位(AC=1),則應(yīng)在低4位加6調(diào)整,以產(chǎn)生低4位正確的BCD結(jié)果。(2)當(dāng)累加器A中的高4位數(shù)出現(xiàn)了非BCD碼(1010~1111)或高4位產(chǎn)生進(jìn)位(CY=1),則應(yīng)在高4位加6調(diào)整,以產(chǎn)生高4位正確的BCD結(jié)果。

十進(jìn)制調(diào)整指令執(zhí)行后,PSW中的CY表示結(jié)果的百位值。9/26/202430例若(A)=01010110B,表示的BCD碼為56,(R3)=01100111B,表示的BCD碼為67,(CY)=0。執(zhí)行以下指令:ADDA,R2DAA由于(A)=00100011B,即,且(CY)=1,即結(jié)果為BCD數(shù)123。應(yīng)該注意,DA指令不能對減法進(jìn)行十進(jìn)制調(diào)整。9/26/2024313.4.2減法指令(8條)SUBBA,Rn ;A-Rn-CY→ASUBBA,direct;A-(direct)-CY→ASUBBA,@Ri ;A-(Ri)-CY→ASUBBA,#data ;A-data-CY→A將A中的值減去源操作數(shù)所指內(nèi)容以及進(jìn)位位C中的值,最終結(jié)果存在A中。如:

SUBBA,R2設(shè):A=C9H,R2=55H,CY=1,執(zhí)行指令之后,A中的值為73H。1.帶借位的減法指令(4條)9/26/202432說明:沒有不帶借位的減法指令,如果需要做不帶位的減法指令(在做第一次相減時(shí)),只要將CY清零即可。對帶符號數(shù),要注意OV標(biāo)志。OV=1,出錯。9/26/202433§3.5邏輯運(yùn)算類指令(24條)主要用于對2個(gè)操作數(shù)按位進(jìn)行邏輯操作,結(jié)果送到A或直接尋址單元。

主要操作與、或、異或、移位、取反、清零等。

對標(biāo)志位的影響除了目的操作數(shù)為ACC的指令影響奇偶標(biāo)志P外,一般不影響標(biāo)志位。LogicOperations9/26/2024343.5.1邏輯或指令(6條)ORLA,Rn ;A∨Rn→AORLA,direct ;A∨(direct)→AORLA,@Ri ;A∨(Ri)→AORLA,#data ;A∨data→AORLdirect,A ;(direct)∨A→(direct)ORLdirect,#data;(direct)∨data→(direct)影響P標(biāo)志例:71H和56H相或:

01110001(71H) ∨)01010110(56H)01110111即77H后兩條指令,若直接地址為I/O端口,則為“讀-改寫”操作。

OR

LogicInstruction9/26/2024353.5.2邏輯與指令(6條)ANLA,Rn ;A∧Rn→AANLA,direct ;A∧(direct)→AANLA,@Ri ;A∧(Ri)→AANLA,#data;A∧data→AANLdirect,A ;(direct)∧A→(direct)ANLdirect,#data;(direct)∧data→(direct)影響P標(biāo)志例:71H和56H相與: 01110001(71H) ∧)01010110(56H)01010000即50H后兩條指令,若直接地址為I/O端口,則為“讀-改寫”操作。

ANdLogicInstruction9/26/202436例:71H和56H相異或: 01110001(71H)

⊕)01010110(56H)

3.5.2邏輯異或指令(6條)XRLA,Rn ;A⊕Rn→AXRLA,direct ;A⊕(direct)→AXRLA,@Ri ;A⊕(Ri)→AXRLA,#data ;A⊕data→AXRLdirect,A ;(direct)⊕A→(direct)XRLdirect,#data;(direct)⊕data→(direct)影響P標(biāo)志00100111即27H后兩條指令,若直接地址為I/O端口,則為“讀-改寫”操作。

eXclusive-oR

LogicInstruction9/26/2024373.5.3清0與取反指令(2條)取反:CPLA;/A→A例:若A=5CH,執(zhí)行CPLA結(jié)果:A=A3H清0:CLRA ;0→AComPlementLogicOperation9/26/2024383.5.4循環(huán)移位指令(4條)RLA

RRARLCARRCAA.7 A.0A.7 A.0A.7 A.0CYCYA.7 A.0后兩條指令,影響P標(biāo)志和CY。

RotateLogicinstruction9/26/202439例:若A=5CH,CY=1,執(zhí)行RLCA后,對RLC、RRC指令,在CY=0時(shí)

RLC相當(dāng)于乘以2 RRC相當(dāng)于除以2結(jié)果:A=B9H,CY=0,P=10101110011011100109/26/202440§3.6

控制轉(zhuǎn)移類指令(17條)

BranchingInstruction共有控制程序轉(zhuǎn)移類指令(不包括位操作類的轉(zhuǎn)移指令)。此類指令一般不影響PSW。包括以下類型:無條件轉(zhuǎn)移和條件轉(zhuǎn)移相對轉(zhuǎn)移和絕對轉(zhuǎn)移長轉(zhuǎn)移和短轉(zhuǎn)移調(diào)用與返回指令9/26/2024413.6.1

無條件轉(zhuǎn)移類指令(4條)短轉(zhuǎn)移類指令:AJMPaddr11

長轉(zhuǎn)移類指令:LJMPaddr16

相對轉(zhuǎn)移指令:SJMPrel

間接轉(zhuǎn)移指令:JMP@A+DPTR(1)上面的前三條指令,統(tǒng)統(tǒng)理解成:PC值改變,即跳轉(zhuǎn)到一個(gè)標(biāo)號處。那么他們的區(qū)別何在呢?9/26/202442跳轉(zhuǎn)的范圍不同。短轉(zhuǎn)移類指令:AJMPaddr11

長轉(zhuǎn)移類指令:LJMPaddr16

相對轉(zhuǎn)移指令:SJMPrel轉(zhuǎn)移范圍:2KB64KB-128~+127指令構(gòu)成不同。

AJMP、LJMP后跟的是絕對地址,而SJMP后跟的是相對地址。

指令長度不同原則上,所有用SJMP或AJMP的地方都可以用

LJMP來替代。9/26/202443間接轉(zhuǎn)移指令:JMP@A+DPTR這條指令的用途也是跳轉(zhuǎn),轉(zhuǎn)到什么地方去呢?這可不能由標(biāo)號簡單地決定了。轉(zhuǎn)移地址由A+DPTR形成,并直接送入PC。指令對A、DPTR和標(biāo)志位均無影響。本指令可代替眾多的判別跳轉(zhuǎn)指令,又稱為散轉(zhuǎn)指令,多用于多分支程序結(jié)構(gòu)中。(2)第四條指令與前三條指令相比有所不同9/26/202444例:MOVDPTR,#TAB;將TAB代表的地址送入DPTRJMP@A+DPTR;跳轉(zhuǎn)TAB:AJMPROUT0;跳轉(zhuǎn)ROUT0開始的程序段TAB+2:AJMPROUT1;跳轉(zhuǎn)ROUT1開始的程序段TAB+4:

AJMPROUT2;跳轉(zhuǎn)ROUT2開始的程序段TAB+6:

AJMPROUT3;跳轉(zhuǎn)ROUT3開始的程序段...ROUT0:...ROUT1:...ROUT2:...ROUT3:執(zhí)行該段程序后,程序?qū)⒏鶕?jù)A中的內(nèi)容轉(zhuǎn)移到不同的程序段去執(zhí)行----散轉(zhuǎn)。A=0,轉(zhuǎn)ROUT0A=2,轉(zhuǎn)ROUT1A=4,轉(zhuǎn)ROUT2A=6,轉(zhuǎn)ROUT39/26/2024453.6.2條件轉(zhuǎn)移指令(8條)條件轉(zhuǎn)移指令是指在滿足一定條件時(shí)進(jìn)行相對轉(zhuǎn)移,否則程序繼續(xù)執(zhí)行本指令的下一條指令。一、判A內(nèi)容是否為0轉(zhuǎn)移指令(2條)

JZrel;如果A=0,則轉(zhuǎn)移,否則順序執(zhí)行。JNZ

rel;如果A≠0,就轉(zhuǎn)移。轉(zhuǎn)移到相對于當(dāng)前PC值的8位移量的地址去。即:

新的PC值=當(dāng)前PC+偏移量rel我們在編寫匯編語言源程序時(shí),可以直接寫成:JZ

標(biāo)號 ;即轉(zhuǎn)移到標(biāo)號處。9/26/202446例:MOVA,R0

JZL1MOVR1,#00HAJMPL2L1:MOVR1,#0FFH

L2:SJMPL2END在執(zhí)行上面這段程序前:如果R0=0,結(jié)果R1=0FFH。而如果R0

0,則結(jié)果是R1=00H。把上面的那個(gè)例子中的JZ改成JNZ,看看程序執(zhí)行的結(jié)果是什么?如果R0=0,結(jié)果R1=00H。如果R0

0,結(jié)果是R1中的值為0FFH。9/26/202447二、比較不等轉(zhuǎn)移指令(4條)CJNEA,#data,rel

CJNEA,direct,relCJNERn,#data,relCJNE@Ri,#data,rel此類指令的功能是將兩個(gè)操作數(shù)比較,如果兩者相等,就順序執(zhí)行,如果不相等,就轉(zhuǎn)移。同樣地,使用時(shí),我們可以將rel理解成標(biāo)號,即: CJNEA,#data,標(biāo)號 CJNEA,direct,標(biāo)號 CJNERn,#data,標(biāo)號 CJNE@Ri,#data,標(biāo)號9/26/202448利用這些指令,可以判斷兩數(shù)是否相等。但有時(shí)還想得知兩數(shù)比較之后哪個(gè)大,哪個(gè)小,本條指令也具有這樣的功能:如果兩數(shù)不相等,則CPU還會用CY(進(jìn)位位)來反映哪個(gè)數(shù)大,哪個(gè)數(shù)小。如果前面的數(shù)大,則CY=0,否則CY=1。因此在程序轉(zhuǎn)移后再次利用CY就可判斷出哪個(gè)數(shù)大,哪個(gè)數(shù)小了。9/26/202449舉例: MOVA,R0CJNEA,#10H,L1MOVR1,#0;如R0=10H,則不轉(zhuǎn)移R1=00H; AJMPL3L1:JCL2 ;如CY=1即R0<10H,則轉(zhuǎn)移 MOVR1,#0AAH;否則CY=0即R0>10H,則轉(zhuǎn)移 AJMPL3L2:MOVR1,#0FFHL3:SJMPL3因此最終結(jié)果是:本程序執(zhí)行前,如果R0=10H,則R1=00H;如果R0>10H,則R1=0AAH;如果R0<10H,則R1=0FFH。9/26/202450三、減1不為0轉(zhuǎn)移指令(2條)DJNZRn,relDJNZdirect,relDJNZ指令的執(zhí)行過程是這樣的:它將第一個(gè)參數(shù)中的值減1,然后看這個(gè)值是否等于0,如果等于0,就往下執(zhí)行,如果不等于0,就轉(zhuǎn)移到第二個(gè)參數(shù)所指定的地方去。例:DJNZ10H,LOOP...LOOP:...9/26/202451例:MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$上述程序段的執(zhí)行過程是:將23H單元中的數(shù)連續(xù)相加,存至A中,每加一次,23H單元中的數(shù)值減1,直至減到0,共加(23H)次。9/26/2024523.6.3調(diào)用與返回指令(4條)一、調(diào)用指令(2條)

LCALLaddr16

;長調(diào)用指令(3字節(jié))

ACALLaddr11

;短調(diào)用指令(2字節(jié))上面兩條指令都是在主程序中調(diào)用子程序,兩者的區(qū)別:對短調(diào)用指令,被調(diào)用子程序入口地址必須與調(diào)用指令的下一條指令的第一字節(jié)在相同的2KB存儲區(qū)之內(nèi)。使用時(shí)可以用:

LCALL

標(biāo)號;標(biāo)號表示子程序首地址ACALL

標(biāo)號

來調(diào)用子程序。9/26/202453指令的執(zhí)行過程是:當(dāng)前PC壓棧,子程序首地址送PC,實(shí)現(xiàn)轉(zhuǎn)移。二、返回指令

(2條)子程序執(zhí)行完后必須回到主程序,如何返回呢?只要執(zhí)行一條返回指令就可以了。RET ;子程序返回指令RETI ;中斷子程序返回指令兩者不能互換使用。9/26/2024543.6.4空操作指令(1條)

NOP空操作,就是什么事也不干,停一個(gè)周期,一般用作短時(shí)間的延時(shí)。RET指令的執(zhí)行過程是:堆棧棧頂內(nèi)容(2字節(jié),調(diào)用時(shí)保存的當(dāng)前PC值)彈出給PC,實(shí)現(xiàn)返回。RETI指令除了具有RET指令的功能實(shí)現(xiàn)程序返回外,還有對中斷優(yōu)先級狀態(tài)觸發(fā)器的清零。9/26/202455§3.7位操作指令(17條)BooleanOperationsMCS-51單片機(jī)的硬件結(jié)構(gòu)中,有一個(gè)位處理器(又稱布爾處理器),它有一套位變量處理的指令集,包括位變量傳送、邏輯運(yùn)算、控制程序轉(zhuǎn)移等。在MCS-51中,有一部份RAM和一部份SFR是具有位尋址功能的。位操作區(qū):內(nèi)部RAM的20H-2FH這16個(gè)字節(jié)單元,即128個(gè)位單元(位地址空間位00~7FH);可以位尋址的特殊功能寄存器:

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論