第3章單片機(jī)原理_第1頁
第3章單片機(jī)原理_第2頁
第3章單片機(jī)原理_第3頁
第3章單片機(jī)原理_第4頁
第3章單片機(jī)原理_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

3.1指令系統(tǒng)概述指令是使計(jì)算機(jī)完成基本操作的命令。一種計(jì)算機(jī)能夠執(zhí)行的全部指令的集合,稱為這種計(jì)算機(jī)的指令系統(tǒng)。單片機(jī)的指令系統(tǒng)與微型計(jì)算機(jī)的指令系統(tǒng)不同,MCS-51系列單片機(jī)指令系統(tǒng)共有111條指令,42種指令助記符,其中有49條單字節(jié)指令,45條雙字節(jié)指令和17條三字節(jié)指令;有64條為單機(jī)器周期指令,45條為雙機(jī)器周期指令,只有乘、除法兩條指令為四機(jī)器周期指令。在存儲空間和運(yùn)算速度上,效率都比較高。

MCS-51系列單片機(jī)指令系統(tǒng)功能強(qiáng)、指令短、執(zhí)行快。從功能上可分成五大類:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯操作指令、控制轉(zhuǎn)移指令和位操作指令。3.1.1指令格式[標(biāo)號:]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋](1)操作碼助記符表明指令的功能,不同的指令有不同的指令助記符,它一般用說明其功能的英文單詞的縮寫形式表示。(2)操作數(shù)用于給指令的操作提供數(shù)據(jù)、數(shù)據(jù)的地址或指令的地址,操作數(shù)往往用相應(yīng)的尋址方式指明。MCS-51單片機(jī)指令系統(tǒng)的指令按操作數(shù)的多少可分為無操作數(shù)、單操作數(shù)、雙操作數(shù)和三操作數(shù)四種情況。(3)標(biāo)號是該指令的符號地址,后面須帶冒號。它主要為轉(zhuǎn)移指令提供轉(zhuǎn)移的目的地址。(4)注釋是對該指令的解釋,前面須帶分號。它們是編程者根據(jù)需要加上去的,用于對指令進(jìn)行說明,對于指令本身功能而言是可以不要的。3.1.2指令中用到的標(biāo)識符為便于后面的學(xué)習(xí),在這里先對指令中用到的一些符號的約定意義作以說明:(1)Ri和Rn:表示當(dāng)前工作寄存器區(qū)中的工作寄存器,i取0或1,表示R0或R1。n取0~7,表示R0~R7。(2)#data:表示包含在指令中的8位立即數(shù)。(3)#data16:表示包含在指令中的16位立即數(shù)。(4)rel:以補(bǔ)碼形式表示的8位相對偏移量,范圍為-128~127,主要用在相對尋址的指令中。(5)addr16和addr11:分別表示16位直接地址和11位直接地址。(6)direct:表示直接尋址的地址。(7)bit:表示可位尋址的直接位地址。(8)(X):表示X單元中的內(nèi)容。(9)((X)):表示以X單元的內(nèi)容為地址的存儲器單元內(nèi)容,即(X)作地址,該地址單元的內(nèi)容用((X))表示。(10)/和→符號:“/”表示對該位操作數(shù)取反,但不影響該位的原值。“→”表示操作流程,將箭尾一方的內(nèi)容送入箭頭所指一方的單元中去。3.2MCS-51單片機(jī)尋址方式

MCS-51單片機(jī)的尋址方式按操作數(shù)的類型,可分為數(shù)的尋址和指令尋址,數(shù)的尋址有:常數(shù)尋址(立即尋址)、寄存器數(shù)尋址(寄存器尋址)、存儲器數(shù)尋址(直接尋址方式、寄存器間接尋址方式、變址尋址方式)和位尋址,指令的尋址有絕對尋址和相對尋址,3.2.1常數(shù)尋址(立即尋址)操作數(shù)是常數(shù),使用時(shí)直接出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分。與操作碼一起存放在程序存儲器中,可以立即得到并執(zhí)行,不需要經(jīng)過別的途徑去尋找。常數(shù)又稱為立即數(shù),故又稱為立即尋址。在匯編指令中,立即數(shù)前面以“#”符號作前綴。在程序中通常用于給寄存器或存儲器單元賦初值,例如:MOVA,#20H

其功能是把立即數(shù)20H送給累加器A,其中源操作數(shù)20H就是立即數(shù)。指令執(zhí)行后累加器A中的內(nèi)容為20H。3.2.2寄存器數(shù)尋址(寄存器尋址)操作數(shù)在寄存器中,使用時(shí)在指令中直接提供寄存器的名稱,這種尋址方式稱為寄存器尋址。在MCS-51系統(tǒng)中,這種尋址方式針對的寄存器只能是R0~R78個(gè)通用寄存器和部分特殊功能寄存器(如累加器A、寄存器B、數(shù)據(jù)指針DPTR等)中的數(shù)據(jù),對于其它的特殊功能寄存器中的內(nèi)容的尋址方式不屬于它。在匯編指令中,寄存器尋址在指令中直接提供寄存器的名稱,如R0、R1、A、DPTR等。例如:MOVA,R0其功能是把R0寄存器中的數(shù)送給累加器A,在指令中,源操作數(shù)R0為寄存器尋址,傳送的對象為R0中的數(shù)據(jù)。如指令執(zhí)行前R0中的內(nèi)容為20H,則指令執(zhí)行后累加器A中的內(nèi)容為20H。3.2.3存儲器數(shù)尋址存儲器數(shù)尋址針對的數(shù)據(jù)是存放在存儲器單元中,對于存儲器單元的內(nèi)容通過提供存儲器單元地址使用。根據(jù)存儲器單元地址的提供方式,存儲器數(shù)的尋址方式有:直接尋址、寄存器間接尋址、變址尋址。一.直接尋址直接尋址是指數(shù)據(jù)在存儲器單元中,在指令中直接提供存儲器單元的地址。在MCS-51系統(tǒng)中,這種尋址方式針對的是片內(nèi)數(shù)據(jù)存儲器和特殊功能寄存器。在匯編指令中,指令中直接以地址數(shù)的形式提供存儲器單元的地址。例如:MOVA,20H

其功能是把片內(nèi)數(shù)據(jù)存儲器20H單元的內(nèi)容送給累加器A。如指令執(zhí)行前片內(nèi)數(shù)據(jù)存儲器20H單元的內(nèi)容為30H,則指令執(zhí)行后累加器A的內(nèi)容為30H。指令中20H是地址數(shù),它是片內(nèi)數(shù)據(jù)存儲單元的地址。在MCS-51中,數(shù)據(jù)前面不加“#”是存儲單元地址而不是常數(shù),常數(shù)前面要加符號“#”。對于特殊功能寄存器,在指令中使用時(shí)往往通過特殊功能寄存器的名稱使用,而特殊功能寄存器名稱實(shí)際上是特殊功能寄存器單元的符號地址,因此它們是直接尋址。例如:MOVA,P0

其功能是把P0口的內(nèi)容送給累加器A。P0是特殊功能寄存器P0口的符號地址,該指令在翻譯成機(jī)器碼時(shí),P0就轉(zhuǎn)換成直接地址80H。二.寄存器間接尋址寄存器間接尋址是指數(shù)據(jù)存放在存儲單元中,而存儲單元地址存放在寄存器中,在指令中通過提供存放存儲單元地址的寄存器來使用對應(yīng)的存儲單元。形式為:@寄存器名。例如:MOVA,@R1

該指令的功能是將以工作寄存器R1中的內(nèi)容為地址的片內(nèi)RAM單元的數(shù)據(jù)傳送到累加器A中去。指令的源操作數(shù)是寄存器間接尋址。若R1中的內(nèi)容為80H,片內(nèi)RAM地址為80H的單元中的內(nèi)容為20H,則執(zhí)行該指令后,累加器A的內(nèi)容為20H。寄存器間接尋址示意圖如圖所示。80H20H20HA80HR1在MCS-51單片機(jī)中,寄存器間接尋址用到的寄存器只能是通用寄存器R0、R1和數(shù)據(jù)指針寄存器DPTR,它能訪問的數(shù)據(jù)是片內(nèi)數(shù)據(jù)存儲器和片外數(shù)據(jù)存儲器。其中,片內(nèi)數(shù)據(jù)存儲器只能用R0和R1作指針間接訪問;片外數(shù)據(jù)存儲器,低端的256字節(jié)單元,既可以用兩位十六進(jìn)制地址以R0或R1作指針間接訪問,也可用四位十六進(jìn)制地址以DPTR作指針間接訪問,而高端的字節(jié)單元則只能以DPTR作指針間接訪問。對于片內(nèi)RAM和片外RAM的低端256字節(jié)都可以用R0和R1作指針訪問,它們之間用指令來區(qū)別。片內(nèi)RAM訪問用MOV指令,片外RAM訪問用MOVX指令。三.變址尋址變址尋址是指操作數(shù)的地址由基址寄存器的地址加上變址寄存器的地址得到。在MCS-51系統(tǒng)中,它是以數(shù)據(jù)指針寄存器DPTR或程序計(jì)數(shù)器PC為基址,累加器A為變址,兩者相加得存儲單元的地址,所訪問的存儲器為程序存儲器。例如:MOVCA,@A+DPTR其功能是將數(shù)據(jù)指針寄存器DPTR的內(nèi)容和累加器A中的內(nèi)容相加作為程序存儲器的地址,從對應(yīng)的單元中取出內(nèi)容送累加器A中。指令中,源操作數(shù)的尋址方式為變址尋址,設(shè)指令執(zhí)行前數(shù)據(jù)指針寄存器DPTR的值為2000H,累加器A的值為05H,程序存儲器2005H單元的內(nèi)容為30H,則指令執(zhí)行后,累加器A中的內(nèi)容為30H。示意圖如圖所示。2000H30H30HDPTRA2005H05HA+3.2.4位尋址位尋址是指操作數(shù)是二進(jìn)制位的尋址方式。在MCS-51單片機(jī)中有一個(gè)獨(dú)立的位處理器,有多條位處理指令,能夠進(jìn)行各種位運(yùn)算。在MCS-51系統(tǒng)中,位處理的操作對象是各種可位尋址位。對于它們的訪問是通過提供相應(yīng)的位地址來處理。在MCS-51系統(tǒng)中,位地址的表示可以用以下幾種方式:1.直接位地址(00H~0FFH)。例如:20H2.字節(jié)地址帶位號。例如:20H.3表示20H單元的3位。3.特殊功能寄存器名帶位號。例如:P0.1表示P0口的1位。4.位符號地址。例如:TR0是定時(shí)/計(jì)數(shù)器T0的啟動位。3.2.5指令尋址一.絕對尋址絕對尋址是在指令的操作數(shù)中直接提供目的位置的地址或地址的一部份。在MCS-51系統(tǒng)中,長轉(zhuǎn)移和長調(diào)用提供目的位置的16位地址,絕對轉(zhuǎn)移和絕對調(diào)用提供目的位置的16位地址的低11位,它們都為絕對尋址。二.相對尋址相對尋址是以當(dāng)前程序計(jì)數(shù)器PC值加上指令中給出的偏移量rel得到目的位置的地址。在MCS-51系統(tǒng)中,相對轉(zhuǎn)移指令的操作數(shù)屬于相對尋址。在使用相對尋址時(shí)要注意以下兩點(diǎn):(1)當(dāng)前PC值是指轉(zhuǎn)移指令執(zhí)行時(shí)的PC值,它等于轉(zhuǎn)移指令的地址加上轉(zhuǎn)移指令的字節(jié)數(shù)。實(shí)際上是轉(zhuǎn)移指令的下一條指令的地址。例如:若轉(zhuǎn)移指令的地址為2010H,轉(zhuǎn)移指令的長度為2字節(jié),則轉(zhuǎn)移指令執(zhí)行時(shí)的PC值為2012H。(2)偏移量rel是8位有符號數(shù),以補(bǔ)碼表示,它的取值范圍為-128~+127。當(dāng)為負(fù)值時(shí),向前轉(zhuǎn)移,當(dāng)為正數(shù)時(shí)向后轉(zhuǎn)移。相對尋址的目的地址為:目的地址=當(dāng)前PC+rel=轉(zhuǎn)移指令的地址+轉(zhuǎn)移指令的字節(jié)數(shù)+rel3.3MCS-51單片機(jī)指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令有29條,是指令系統(tǒng)中數(shù)量最多、使用也最頻繁的一類指令。這類指令可分為三組:普通傳送指令、數(shù)據(jù)交換指令、堆棧操作指令。一.普通傳送指令普通傳送指令以助記符MOV為基礎(chǔ)。分成片內(nèi)數(shù)據(jù)存儲器傳送指令、片外數(shù)據(jù)存儲器傳送指令和程序存儲器傳送指令。1.片內(nèi)數(shù)據(jù)存儲器傳送指令MOV指令格式:MOV目的操作數(shù),源操作數(shù)其中:源操作數(shù)可以為A、Rn、@Ri、direct、#data,目的操作數(shù)可以為A、Rn、@Ri、direct,組合起來總共16條,按目的操作數(shù)的尋址方式劃分為五組:(1)以A為目的操作數(shù)

MOVA,Rn

;A←Rn MOVA,direct ;A←(direct)

MOVA,@Ri

;A←(Ri)

MOVA,#data ;A←#data(2)以Rn為目的操作數(shù)

MOVRn,A ;Rn←A MOVRn,direct ;Rn←(direct)

MOVRn,#data ;Rn←#data(3)以直接地址direct為目的操作數(shù)

MOVdirect,A ;(direct)←A MOVdirect,Rn

;(direct)←Rn MOVdirect,direct ;(direct)←(direct)

MOVdirect,@Ri

;(direct)←(Ri)

MOVdirect,#data ;(direct)←#data(4)以間接地址@Ri為目的操作數(shù)

MOV@Ri,A ;(Ri)←A MOV@Ri,direct ;(Ri)←(direct)

MOV@Ri,#data ;(Ri)←#data(5)以DPTR為目的操作數(shù)

MOVDPTR,#data16;DPTR←#data16注意,源操作數(shù)和目的操作數(shù)中的Rn和@Ri不能相互配對。如不允許有“MOVRn,Rn”,“MOV@Ri,Rn”這樣的指令,在MOV指令中,不允許在一條指令中同時(shí)出現(xiàn)工作寄存器,無論它是寄存器尋址還是寄存器間接尋址。2.片外數(shù)據(jù)存儲器傳送指令MOVX

在MCS-51系統(tǒng)中只能通過累加器A與片外數(shù)據(jù)存儲器進(jìn)行數(shù)據(jù)傳送,訪問時(shí),只能通過@Ri和@DPTR以間接尋址方式進(jìn)行。MOVX指令共有四條:

MOVXA,@DPTR ;A←(DPTR)

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

;A←(Ri)

MOVX@Ri,A ;(Ri)←A

其中前兩條指令通過DPTR間接尋址,可以對整個(gè)64K片外數(shù)據(jù)存儲器訪問。后兩條指令通過@Ri間接尋址,只能對片外數(shù)據(jù)存儲器的低端的256字節(jié)訪問,訪問時(shí)將低8位地址放于Ri中。3.程序存儲器傳送指令MOVC

程序存儲器傳送指令只有兩條,一條用DPTR基址變址尋址。一條用PC基址變址尋址。

MOVCA,@A+DPTR ;A←(A+DPTR)

MOVCA,@A+PC ;A←(A+PC)這兩條指令通常用于訪問表格數(shù)據(jù),因此以稱為查表指令。例如:查表指令MOVCA,@A+PC所在的地址為2000H,表格的起始單元地址為2035H,表格的第4個(gè)元素(位移量為03H)的內(nèi)容為45H,則查表指令的處理過程如下:

MOVA,#03H;表格元素相對于表首的位移量送累加器AADDA,34H;當(dāng)前程序計(jì)數(shù)器PC相對于表首的差值加到累加器A中

MOVCA,@A+PC;查表,查得第4個(gè)元素內(nèi)容45H送累加器A

注意:查表指令的長度為1個(gè)字節(jié),當(dāng)前程序計(jì)數(shù)器PC的值應(yīng)為查表指令的地址加1。【例3-1】寫出完成下列功能的程序段。(1)將R0的內(nèi)容送R6中程序?yàn)椋篗OVA,R0 MOVR6,A(2)將片內(nèi)RAM30H單元的內(nèi)容送片外60H單元中程序?yàn)椋篗OVA,30H MOVR0,#60H MOVX@R0,A(3)將片處RAM1000H單元的內(nèi)容送片內(nèi)20H單元中程序?yàn)椋篗OVDPTR,#1000H MOVA,@DPTR MOV20H,A(4)將ROM2000H單元的內(nèi)容送片內(nèi)RAM的30H單元中程序?yàn)椋篗OVA,#0 MOVDPTR,#1000H MOVCA,@A+DPTR MOV30H,A二.?dāng)?shù)據(jù)交換指令普通傳送指令實(shí)現(xiàn)將源操作數(shù)的數(shù)據(jù)傳送到目的操作數(shù),指令執(zhí)行后源操作數(shù)不變,數(shù)據(jù)傳送是單向的。數(shù)據(jù)交換指令數(shù)據(jù)作雙向傳送,傳送后,前一個(gè)操作數(shù)原來的內(nèi)容傳送到后一個(gè)操作數(shù)中,后一個(gè)操作數(shù)原來的內(nèi)容傳送到前一個(gè)操作數(shù)中。數(shù)據(jù)交換指令要求第一個(gè)操作數(shù)須為累加器A,共有5條。

XCHA,Rn

;A<=>Rn XCHA,direct ;A<=>(direct)

XCHA,@Ri

;A<=>(Ri)

XCHDA,@Ri

;A0~3<=>(Ri)0~3 SWAPA ;A0~3<=>A4~7【例3-2】若R0的內(nèi)容為30H,片內(nèi)RAM30H單元的內(nèi)容為23H,累加器A的內(nèi)容為45H,則執(zhí)行XCHA,@R0指令后片內(nèi)RAM30H單元的內(nèi)容為45H,累加器A中的內(nèi)容為23H。若執(zhí)行SWAPA指令,則累加器A的內(nèi)容為54H。三.堆棧操作指令堆棧是在片內(nèi)RAM中按“先進(jìn)后出,后進(jìn)先出”原則設(shè)置的專用存儲區(qū)。數(shù)據(jù)的進(jìn)棧和出棧由指針SP統(tǒng)一管理。在MCS-51系統(tǒng)中,堆棧操作指令有兩條:

PUSHdirect;SP←(SP+1),(SP)←(direct)

POPdirect;(direct)←(SP),(SP)←(SP-1)其中PUSH指令入棧,POP指令出棧。操作時(shí)以字節(jié)為單位。入棧時(shí)SP指針先加1,再入棧。出棧時(shí)內(nèi)容先出棧,SP指針再減1。用堆棧保存數(shù)據(jù)時(shí),先入棧的內(nèi)容后出棧;后入棧的內(nèi)容先出棧。

【例3-3】若入棧保存時(shí)入棧的順序?yàn)椋?/p>

PUSHA PUSHB

則出棧的順序?yàn)椋?/p>

POPB POPA3.3.2算術(shù)運(yùn)算指令一.加法指令1.一般的加法指令A(yù)DDADDA,Rn

;A←A+RnADDA,direct ;A←A+(direct)ADDA,@Ri

;A←A+(Ri)ADDA,#data ;A←A+#data2.帶進(jìn)位加指令A(yù)DDCADDCA,Rn

;A←A+Rn+CADDCA,direct ;A←A+(direct)+CADDCA,@Ri

;A←A+(Ri)+CADDCA,#data ;A←A+#data+C3.加1指令I(lǐng)NCA ;A←A+1INCRn

;Rn←Rn+1INCdirect ;(direct)←(direct)+1INC@Ri

;(Ri)←(Ri)+1INCDPTR ;DPTR←DPTR+1其中,ADD和ADDC指令在執(zhí)行時(shí)要影響CY、AC、OV和P標(biāo)志位。而INC指令除了INCA要影響P標(biāo)志位外,對其它標(biāo)志位都沒有影響。在MCS-51單片機(jī)中,常用ADD和ADDC配合使用實(shí)現(xiàn)多字節(jié)加法運(yùn)算?!纠?-4】試把存放在R1R2和R3R4中的兩個(gè)16位數(shù)相加,結(jié)果存于R5R6中。處理時(shí),R2和R4用一般的加法指令A(yù)DD,結(jié)果放于R6中,R1和R3用帶進(jìn)位的加法指令A(yù)DDC,結(jié)果放于R5中,程序如下:

MOVA,R2 ADDA,R4 MOVR6,A MOVA,R1 ADDCA,R3 MOVR5,A二.減法指令1.帶借位減法指令SUBBSUBBA,Rn

;A←A-Rn-CSUBBA,direct ;A←A-(direct)-CSUBBA,@Ri

;A←A-(Ri)-CSUBBA,#data ;A←A-#data–C2.減1指令DECDECA ;A←A-1DECRn

;Rn←Rn-1DECdirect ;direct←(direct)-1DEC@Ri

;(Ri)←(Ri)-1在MCS-51單片機(jī)中,只提供了一種帶借位的減法指令,沒有提供一般的減法指令,一般的減法操作可以通過先對CY標(biāo)志清零,然后再執(zhí)行帶借位的減法來實(shí)現(xiàn)。其中,SUBB指令在執(zhí)行時(shí)要影響CY、AC、OV和P標(biāo)志位。而DEC指令除了DECA要影響P標(biāo)志位外,對其它標(biāo)志位都沒有影響?!纠?-5】求R3←R2-R1。程序?yàn)椋?/p>

MOVA,R2 CLRC SUBBA,R1 MOVR3,A3.乘法指令MUL

在MCS-51單片機(jī)中,乘法指令只有一條:

MULAB

該指令執(zhí)行時(shí)將對存放于累加器A中的無符號被乘數(shù)和放于B寄存器中的無符號乘數(shù)相乘,積的高字節(jié)存于B寄存器中,低字節(jié)存于累加器A中。指令執(zhí)行后將影響CY和OV標(biāo)志,CY復(fù)位,對于OV:當(dāng)積大于255時(shí)(即B中不為0),OV為1;否則,OV為0。4.除法指令DIV

在MCS-51單片機(jī)中,除法指令也只有一條:

DIVAB

該指令執(zhí)行時(shí)將用存放在累加器A中的無符號被除數(shù)與存放在B寄存器中的無符號除數(shù)相除,除得的結(jié)果,商的存于累加器A中,余數(shù)存于B寄存器中。指令執(zhí)行后將影響CY和OV標(biāo)志,一般情況CY和OV都清0,只有當(dāng)B寄存器中的除數(shù)為0時(shí),CY和OV才被置1。5.十進(jìn)制調(diào)整指令在MCS-51單片機(jī)中,十進(jìn)制調(diào)整指令只有一條:

DAA

它只能用在ADD或ADDC指令后面,用來對兩個(gè)二位的壓縮的BCD碼數(shù)通過用ADD或ADDC指令相加后存于累加器A中的結(jié)果進(jìn)行調(diào)整,使得它得到正確的十進(jìn)制結(jié)果。通過該指令可實(shí)現(xiàn)兩位十進(jìn)制BCD碼數(shù)的加法運(yùn)算。它的調(diào)整過程為:(1)若累加器A的低四位為十六進(jìn)制的A~F或輔助進(jìn)位標(biāo)志AC為1,則累加器A中的內(nèi)容作加06H調(diào)整。(2)若累加器A的高四位為十六進(jìn)制的A~F或進(jìn)位標(biāo)志CY為1,則累加器A中的內(nèi)容作加60H調(diào)整?!纠?-6】在R3中有十進(jìn)制數(shù)67,在R2中有十進(jìn)制數(shù)85,用十進(jìn)制運(yùn)算,運(yùn)算的結(jié)果放于R5中。程序?yàn)椋?/p>

MOVA,R3 ADDA,R2 DAA MOVR5,A

程序中DA指令對ADD指令運(yùn)算出來的放于累加器A中的結(jié)果進(jìn)行調(diào)整,調(diào)整后,累加器A中的內(nèi)容為52H,CY為1,則結(jié)果為152,最后放于R5中的內(nèi)容為52H(十進(jìn)制數(shù)52)。3.3.3邏輯操作指令一.邏輯與指令A(yù)NLANLA,RnA←A

RnANLA,directA←A

(direct)ANLA,@RiA←A

((Ri))ANLA,#dataA←AdataANLdirect,A(direct)←(direct)

AANLdirect,#data(direct)←(direct)

data二.邏輯或指令ORLORLA,RnA←A

RnORLA,directA←A

(direct)ORLA,@RiA←A

((Ri))ORLA,#dataA←AdataORLdirect,A(direct)←(direct)

AORLdirect,#data(direct)←(direct)

data三.邏輯異或指令XRLXRLA,RnA←A

RnXRLA,directA←A

(direct)XRLA,@RiA←A

((Ri))XRLA,#dataA←AdataXRLdirect,A(direct)←(direct)

AXRLdirect,#data(direct)←(direct)

data

在使用中,邏輯與用于實(shí)現(xiàn)對指定位清0,其余位不變;邏輯或用于實(shí)現(xiàn)對指定位置1,其余位不變;邏輯異或用于實(shí)現(xiàn)指定位取反,其余位不變。【例3-7】寫出完成下列功能的指令段。1.對累加器A中的1、3、5位清0,其余位不變

ANLA,#11010101B2.對累加器A中的2、4、6位置1,其余位不變

ORLA,#01010100B3.對累加器A中的0、1位取反,其余位不變

XRLA,#00000011B四.清零和求反指令1.清零指令:CLRAA←02.求反指令:CPLAA←ā

在MCS-51系統(tǒng)中,只能對累加器A中的內(nèi)容進(jìn)行清零和求反,如要對其它的寄存器或存儲單元進(jìn)行清零和求反,則須放在累加器A進(jìn)行,運(yùn)算后再放回原位置?!纠?-8】寫出對R0寄存器內(nèi)容求反的程序段。程序?yàn)椋?/p>

MOVA,R0 CPLA MOVR0,A五.循環(huán)移位指令

MCS-51系統(tǒng)有四條對累加器A的循環(huán)移位指令,前兩條只在累加器A中進(jìn)行循環(huán)移位,后兩條還要帶進(jìn)位標(biāo)志CY進(jìn)行循環(huán)移位。每一次移一位。分別如下:1.累加器A循環(huán)左移

RLA2.累加器A循環(huán)右移

RRA3.帶進(jìn)位的循環(huán)左移

RLCA4.帶進(jìn)位的循環(huán)右移

RRCA【例3-9】若累加器A中的內(nèi)容為10001011B,CY=0,則執(zhí)行RLCA指令后累加器A中的內(nèi)容為00010110,CY=1。3.3.4控制轉(zhuǎn)移指令共有17條,包括無條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、子程序調(diào)用及返回指令。一.無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令是指當(dāng)執(zhí)行該指令后,程序?qū)o條件地轉(zhuǎn)移到指令指定的地方去。無條件轉(zhuǎn)移指令包括長轉(zhuǎn)移指令、絕對轉(zhuǎn)移指令、相對轉(zhuǎn)移指令和間接轉(zhuǎn)移指令。1.長轉(zhuǎn)移指令LJMP

指令格式:LJMPaddr16 ;PC←addr16

指令后面帶目的位置的16位地址,執(zhí)行時(shí)直接將該16位地址送給程序指針PC,程序無條件地轉(zhuǎn)到16位目標(biāo)地址指明的位置去。指令中提供的是16位目標(biāo)地址,所以可以轉(zhuǎn)移到64KB程序存儲器的任意位置,故得名為“長轉(zhuǎn)移”。該指令不影響標(biāo)志位,使用方便。缺點(diǎn)是:執(zhí)行時(shí)間長,字節(jié)數(shù)多。2.絕對轉(zhuǎn)移指令指令格式:AJMPaddr11 ;PC10~0←addr11AJMP指令后帶的是目的位置的低11位直接地址,執(zhí)行時(shí),先將程序指針PC的值加2(該指令長度為2字節(jié)),然后把指令中的11位地址addr11送給程序指針PC的低11位,而程序指針的高5位不變,執(zhí)行后轉(zhuǎn)移到PC指針指向的新位置。由于11位地址addr11的范圍是00000000000~11111111111,即2KB范圍,而目的地址的高5位不變,所以程序轉(zhuǎn)移的位置只能是和當(dāng)前PC位置(AJMP指令地址加2)在同一2KB范圍內(nèi)。轉(zhuǎn)移可以向前也可以向后,指令執(zhí)行后不影響狀態(tài)標(biāo)志位。【例3-10】若AJMP指令地址為3000H。AJMP后面帶的11位地址addr11為123H,則執(zhí)行指令A(yù)JMPaddr11后轉(zhuǎn)移的目的位置是多少?

AJMP指令的PC值加2=3000H+2=3002H=0011000000000010B

指令中的addr11=123H=00100100011B

轉(zhuǎn)移的目的地址為0011000100100101B=3125H3.相對轉(zhuǎn)移指令指令格式:SJMPrel

;PC←PC+2+relSJMP指令后面的操作數(shù)rel是8位帶符號補(bǔ)碼數(shù),執(zhí)行時(shí),先將程序指針PC的值加2(該指令長度為2字節(jié)),然后再將程序指針PC的值與指令中的位移量rel相加得轉(zhuǎn)移的目的地址。即:轉(zhuǎn)移的目的地址=SJMP指令所在地址+2+rel

因?yàn)?位補(bǔ)碼的取值范圍為-128~+127,所以該指令的轉(zhuǎn)移范圍是:相對PC當(dāng)前值向前128字節(jié),向后127字節(jié)?!纠?-11】在2100H單元有SJMP指令,若rel=5AH(正數(shù)),則轉(zhuǎn)移目的地址為215CH(向后轉(zhuǎn));若rel=F0H(負(fù)數(shù)),則轉(zhuǎn)移目的地址為20F2H(向前轉(zhuǎn))。用匯編語言編程時(shí),指令中的相對地址rel往往用目的位置的標(biāo)號(符號地址)表示。機(jī)器匯編時(shí),能自動算出相對地址值;但手工匯編時(shí),需自己計(jì)算相對地址值rel。rel的計(jì)算方法如下:

rel=目的地址-(SJMP指令地址+2)如目的地址等于2013H,SJMP指令的地址為2000H,則相對地址rel為11H。注意:在單片機(jī)程序設(shè)計(jì)中,通常用到一條SJMP指令:

SJMP$

該指令的功能是在自己本身上循環(huán),進(jìn)入等待狀態(tài)。其中符號$表示轉(zhuǎn)移到本身,它的機(jī)器碼為80FEH。在程序設(shè)計(jì)中,程序的最后一條指令通常用它,使程序不再向后執(zhí)行以避免執(zhí)行后面的內(nèi)容而出錯(cuò)。4.間接轉(zhuǎn)移指令指令格式:JMP@A+DPTR ;PC←A+DPTR

它MCS-51系統(tǒng)中唯一一條間接轉(zhuǎn)移指令,轉(zhuǎn)移的目的地址是由數(shù)據(jù)指針DPTR的內(nèi)容與累加器A中的內(nèi)容相加得到,指令執(zhí)行后不會改變DPTR及A中原來的內(nèi)容。數(shù)據(jù)指針DPTR的內(nèi)容一般為基址,累加器A的內(nèi)容為相對偏移量,在64KB范圍內(nèi)無條件轉(zhuǎn)移。該指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。DPTR一般為確定值,根據(jù)累加器A的值來實(shí)現(xiàn)轉(zhuǎn)移到不同的分支。在使用時(shí)往往與一個(gè)轉(zhuǎn)移指令表一起來實(shí)現(xiàn)多分支轉(zhuǎn)移。【例3-12】下面的程序能根據(jù)累加器A的值0、2、4、6轉(zhuǎn)移到相應(yīng)的TAB0~TA6分支去執(zhí)行。

MOVDPTR,#TABLE;表首地址送DPTR JMP@A+DPTR;根據(jù)A值轉(zhuǎn)移

TABLE:AJMPTAB0;當(dāng)(A)=0時(shí)轉(zhuǎn)TAB0執(zhí)行

AJMPTAB2;當(dāng)(A)=2時(shí)轉(zhuǎn)TAB2執(zhí)行

AJMPTAB4;當(dāng)(A)=4時(shí)轉(zhuǎn)TAB4執(zhí)行

AJMPTAB6;當(dāng)(A)=6時(shí)轉(zhuǎn)TAB6執(zhí)行二.條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是指當(dāng)條件滿足時(shí),程序轉(zhuǎn)移到指定位置,條件不滿足時(shí),程序?qū)⒗^續(xù)順次執(zhí)行。在MCS-51系統(tǒng)中,條件轉(zhuǎn)移指令有三種:累加器A判零條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令、減1不為零轉(zhuǎn)移指令。1.累加器A判零條件轉(zhuǎn)移指令判0指令:JZrel

;若A=0,則PC←PC+2+rel,否則,PC←PC+2判非0指令:JNZrel

;若A0,則PC←PC+2+rel,否則,PC←PC+2【例3-13】把片外RAM的30H單元開始的數(shù)據(jù)塊傳送到片內(nèi)RAM的40H開始的位置,直到出現(xiàn)零為止。片內(nèi)、片外數(shù)據(jù)傳送以累加器A過渡。每次傳送一個(gè)字節(jié),通過循環(huán)處理,直到處理到傳送的內(nèi)容為0結(jié)束。程序如下:

MOVR0,#30H MOVR1,#40H LOOP:MOVXA,@R0 MOV@R1,A INCR1 INCR0 JNZLOOP SJMP$2.比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令用于對兩個(gè)數(shù)作比較,并根據(jù)比較情況進(jìn)行轉(zhuǎn)移,比較轉(zhuǎn)移指令有四條:CJNEA,#data,rel

;若A=data,則PC←PC+3,不轉(zhuǎn)移,繼續(xù)執(zhí)行 若A>data,則C=0,PC←PC+3+rel,轉(zhuǎn)移 若A<data,則C=1,PC←PC+3+rel,轉(zhuǎn)移CJNERn,#data,rel

;若(Rn)=data,則PC←PC+3,不轉(zhuǎn)移,繼續(xù)執(zhí)行 若(Rn)>data,則C=0,PC←PC+3+rel,轉(zhuǎn)移 若(Rn)<data,則C=1,PC←PC+3+rel,轉(zhuǎn)移CJNE@Ri,#data,rel

;若((Ri))=data,則PC←PC+3,不轉(zhuǎn)移,繼續(xù)執(zhí)行 若((Ri))>data,則C=0,PC←PC+3+rel,轉(zhuǎn)移 若((Ri))<data,則C=1,PC←PC+3+rel,轉(zhuǎn)移CJNEA,direct,rel

;若A=direct,則PC←PC+3,不轉(zhuǎn)移,繼續(xù)執(zhí)行 若A>direct,則C=0,PC←PC+3+rel,轉(zhuǎn)移 若A<direct,則C=1,PC←PC+3+rel,轉(zhuǎn)移3.減1不為零轉(zhuǎn)移指令這種指令是先減1后判斷,若不為零則轉(zhuǎn)移。指令有兩條:DJNZRn,rel

;先Rn中的內(nèi)容減1,再判斷Rn中的內(nèi)容是否等于零,若不為零,則轉(zhuǎn)移。DJNZdirect,rel

;先(direct)中的內(nèi)容減1,再判斷(direct)中的內(nèi)容是否等于零,若不為零,則轉(zhuǎn)移。在MCS-51系統(tǒng)中,通常用DJNZ指令來構(gòu)造循環(huán)結(jié)構(gòu),實(shí)現(xiàn)重復(fù)處理。【例3-14】統(tǒng)計(jì)片內(nèi)RAM中30H單元開始的20個(gè)數(shù)據(jù)中0個(gè)數(shù),放于R7中。用R2作循環(huán)變量,最開始置初值為20;作R7作計(jì)數(shù)器,最開始置初值為0;用R0作指針訪問片內(nèi)RAM單元,最開始置初值為30H;用DJNZ指令對R2減1轉(zhuǎn)移進(jìn)行循環(huán)控制,在循環(huán)體中用指針R0依次取出片內(nèi)RAM中的數(shù)據(jù),判斷,如為0,則R7中的內(nèi)容加1。程序:

MOVR0,#30H MOVR2,#20 MOVR7,#0LOOP:MOVA,@R0 CJNEA,#0,NEXT INCR7NEXT:INCR0 DJNZR2,LOOP三.子程序調(diào)用及返回指令這類指令有四條。兩條子程序調(diào)用指令,兩條返回指令。1.長調(diào)用指令指令格式:LCALLaddr16執(zhí)行過程:(PC)←(PC)+3

(SP)←(SP)+1

(SP)←(PC)7~0

(SP)←(SP)+1

(SP)←(PC)15~8

(PC)←addr16

該指令執(zhí)行時(shí),先將當(dāng)前的PC(指令的PC加指令的字節(jié)數(shù)3)值壓入堆棧保存,入棧時(shí)先低字節(jié),后高字節(jié)。然后轉(zhuǎn)移到指令中addr16所指定的地方執(zhí)行。由于后面帶16位地址,因而可以轉(zhuǎn)移到程序存儲空間的任一位置。2.絕對調(diào)用指令指令格式:ACALLaddr11執(zhí)行過程:(PC)←(PC)+2

(SP)←(SP)+1

(SP)←(PC)7~0

(SP)←(SP)+1

(SP)←(PC)15~8

(PC)10~0←addr11

該指令執(zhí)行過程與LCALL指令類似,只是該指令與AJMP一樣只能實(shí)現(xiàn)2KB范圍內(nèi)轉(zhuǎn)移,執(zhí)行的最后是將指令中的addr11送給PC指針的低11位。對于LCALL和ACALL兩條子程序調(diào)用指令,在匯編程序中,指令后面通常帶轉(zhuǎn)移位置的標(biāo)號,用LCALL指令調(diào)用,轉(zhuǎn)移位置可以是程序存儲空間的任一位置,用ACALL指令調(diào)用,轉(zhuǎn)移位置與ACALL指令的下一條指令必須在同一個(gè)2KB內(nèi),即它們的高5位地址相同。3.子程序返回指令指令格式:RET執(zhí)行過程:(PC)15~8←((SP)) (SP)←(SP)-1

(PC)7~0←((SP)) (SP)←(SP)-1

執(zhí)行時(shí)將子程序調(diào)用指令壓入堆棧的地址出棧,第一次出棧的內(nèi)容送PC的高8位,第二次出棧的內(nèi)容送PC的低8位。執(zhí)行完后,程序轉(zhuǎn)移到新的PC位置執(zhí)行指令。由于子程序調(diào)用指令執(zhí)行時(shí)壓入的內(nèi)容是調(diào)用指令的下一條指令的地址,因而RET指令執(zhí)行后,程序?qū)⒎祷氐秸{(diào)用指令的下一條指令執(zhí)行。該指令通常放于子程序的最后一條指令位置,用于實(shí)現(xiàn)返回到主程序。另外,在MCS-51程序設(shè)計(jì)中,也常用RET指令來實(shí)現(xiàn)程序轉(zhuǎn)移,處理時(shí)先將轉(zhuǎn)移位置的地址用兩條PUSH指令入棧,低字節(jié)在前,高字節(jié)在后,然后執(zhí)行RET指令,執(zhí)行后程序轉(zhuǎn)移到相應(yīng)的位置去執(zhí)行。4.中斷返回指令指令格式:RETI執(zhí)行過程:(PC)15~8←((SP)) (SP)←(SP)-1

(PC)7~0←((SP)) (SP)←(SP)-1

該指令的執(zhí)行過程與RET基本相同,只是RETI在執(zhí)行后,在轉(zhuǎn)移之前將先清除中斷的優(yōu)先級觸發(fā)器。該指令用于中斷服務(wù)子程序后面,作為中斷服務(wù)子程序的最后一條指令,它的功能是返回主程序中斷的斷點(diǎn)位置,繼續(xù)執(zhí)行斷點(diǎn)位置后面的指令。在MCS-51系統(tǒng)中,中斷都是硬件中斷,沒有軟件中斷調(diào)用指令,硬件中斷時(shí),由一條長轉(zhuǎn)移指令使程序轉(zhuǎn)移到中斷服務(wù)程序的入口位置,在轉(zhuǎn)移之前,由硬件將當(dāng)前的斷點(diǎn)地址壓入堆棧保存,以便于以后通過中斷返回指令返回到斷點(diǎn)位置后繼續(xù)執(zhí)行。3.3.5位操作指令在MCS-51系統(tǒng)中,有17條位處理指令,可以實(shí)現(xiàn)位傳送、位邏輯運(yùn)算、位控制轉(zhuǎn)移等操作。

溫馨提示

  • 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

提交評論