第三章 單片機(jī)匯編程序設(shè)計(jì) 課件_第1頁(yè)
第三章 單片機(jī)匯編程序設(shè)計(jì) 課件_第2頁(yè)
第三章 單片機(jī)匯編程序設(shè)計(jì) 課件_第3頁(yè)
第三章 單片機(jī)匯編程序設(shè)計(jì) 課件_第4頁(yè)
第三章 單片機(jī)匯編程序設(shè)計(jì) 課件_第5頁(yè)
已閱讀5頁(yè),還剩114頁(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)介

12023/1/31單片機(jī)原理與應(yīng)用電子課件第3

章單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)2023/1/312本章主要內(nèi)容:3.151系列單片機(jī)指令系統(tǒng)概述3.251系列單片機(jī)尋址方式3.351系列單片機(jī)指令系統(tǒng)

3.451系列單片機(jī)匯編指令格式及標(biāo)識(shí)3.551系列單片機(jī)匯編程序常用偽指令

3.651系列單片機(jī)匯編程序設(shè)計(jì)2023/1/313§3.151系列單片機(jī)指令系統(tǒng)概述指令:就是計(jì)算機(jī)可以直接識(shí)別和執(zhí)行的某種操作命令。指令系統(tǒng):一臺(tái)計(jì)算機(jī)中所有指令的集合。一條指令的結(jié)構(gòu)用如下形式表示:操作碼字段OP地址碼字段A操作碼字段表征指令的操作特性與功能,而地址碼字段通常指定參與操作的操作數(shù)的地址。

在51單片機(jī)中的指令系統(tǒng)中,有單字節(jié)、雙字節(jié)、三字節(jié)等不同長(zhǎng)度的指令。

單字節(jié)指令只有一個(gè)字節(jié),操作碼和操作數(shù)都在這個(gè)字節(jié)中。51指令系統(tǒng)共有單字節(jié)指令49條。

§3.151系列單片機(jī)指令系統(tǒng)概述

雙字節(jié)指令包括兩個(gè)字節(jié),其中一個(gè)字節(jié)是操作碼,第二個(gè)字節(jié)是操作數(shù)。51指令系統(tǒng)共有雙字節(jié)指令45條。

三字節(jié)指令中,操作碼占一個(gè)字節(jié),操作數(shù)占兩個(gè)字節(jié),其中操作數(shù)既可能是數(shù)據(jù),也可能是地址。51指令系統(tǒng)共有三字節(jié)指令45條。§3.251系列單片機(jī)尋址方式

MCS-51單片機(jī)的尋址方式按操作數(shù)的類型,可分為數(shù)的尋址和指令尋址.數(shù)的尋址有:常數(shù)尋址(立即尋址)、寄存器數(shù)尋址(寄存器尋址)、存儲(chǔ)器數(shù)尋址(直接尋址方式、寄存器間接尋址方式、變址尋址方式)和位尋址.指令的尋址有:絕對(duì)尋址和相對(duì)尋址。操作數(shù)是常數(shù),常數(shù)又稱為立即數(shù),使用時(shí)直接出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分。在匯編指令中,立即數(shù)前面以“#”符號(hào)作前綴。在程序中通常用于給寄存器或存儲(chǔ)器單元賦初值,例如:MOVA,#20H其功能是把立即數(shù)20H送給累加器A,其中源操作數(shù)20H就是立即數(shù)。指令執(zhí)行后累加器A中的內(nèi)容為20H。§3.251系列單片機(jī)尋址方式3.2.1立即尋址2023/1/3173.2.2寄存器尋址操作數(shù)在寄存器中,使用時(shí)在指令中直接提供寄存器的名稱,這種尋址方式稱為寄存器尋址。在匯編指令中,寄存器尋址在指令中直接提供寄存器的名稱,如R0、R1、A、DPTR等。例如:MOVA,R0其功能是把R0寄存器中的數(shù)送給累加器A,在指令中,源操作數(shù)R0為寄存器尋址,傳送的對(duì)象為R0中的數(shù)據(jù)。§3.251系列單片機(jī)尋址方式§3.251系列單片機(jī)尋址方式3.2.3直接尋址

直接尋址是指數(shù)據(jù)在存儲(chǔ)器單元中,在指令中直接提供存儲(chǔ)器單元的地址。

這種尋址方式針對(duì)的是片內(nèi)數(shù)據(jù)存儲(chǔ)器和特殊功能寄存器。在匯編指令中,指令中直接以地址數(shù)的形式提供存儲(chǔ)器單元的地址。例如:

MOVA,20H其功能是把片內(nèi)數(shù)據(jù)存儲(chǔ)器20H單元的內(nèi)容送給累加器A。

直接尋址方式的尋址范圍包括:1.低128單元。在指令中直接以單元地址形式給出。2.專用寄存器。專用寄存器除了以單元地址形式給出外,還可以以寄存器符號(hào)形式給出。直接尋址是訪問(wèn)專用寄存器的唯一方法。例如指令:

MOVA,SBUFSBUF是專用寄存器名?!?.251系列單片機(jī)尋址方式§3.251系列單片機(jī)尋址方式3.2.4寄存器間接尋址

寄存器間接尋址是指數(shù)據(jù)存放在存儲(chǔ)單元中,而存儲(chǔ)單元地址存放在寄存器中,在指令中通過(guò)提供存放存儲(chǔ)單元地址的寄存器來(lái)使用對(duì)應(yīng)的存儲(chǔ)單元。形式為:@寄存器名

例如:MOVA,@R1該指令的功能是將以工作寄存器R1中的內(nèi)容為地址的片內(nèi)RAM單元的數(shù)據(jù)傳送到累加器A中去。80H20H20HA80HR1§3.251系列單片機(jī)尋址方式寄存器間接尋址若R1中的內(nèi)容為80H,片內(nèi)RAM地址為80H的單元中的內(nèi)容為20H,則執(zhí)行該指令MOVA,@R1后,累加器A的內(nèi)容為20H。寄存器間接尋址示意圖如圖所示。

寄存器間接尋址用到的寄存器只能是通用寄存器R0、R1和數(shù)據(jù)指針寄存器DPTR,它能訪問(wèn)的數(shù)據(jù)是片內(nèi)數(shù)據(jù)存儲(chǔ)器和片外數(shù)據(jù)存儲(chǔ)器。其中,片內(nèi)數(shù)據(jù)存儲(chǔ)器只能用R0和R1作指針間接訪問(wèn);片外數(shù)據(jù)存儲(chǔ)器,低端的256字節(jié)單元,既可以用兩位十六進(jìn)制地址以R0或R1作指針間接訪問(wèn),也可用四位十六進(jìn)制地址以DPTR作指針間接訪問(wèn).而高端的字節(jié)單元?jiǎng)t只能以DPTR作指針間接訪問(wèn)?!?.251系列單片機(jī)尋址方式對(duì)于片內(nèi)RAM和片外RAM的低端256字節(jié)都可以用R0和R1作指針訪問(wèn),它們之間用指令來(lái)區(qū)別。片內(nèi)RAM訪問(wèn)用MOV指令,片外RAM訪問(wèn)用MOVX指令。3.2.5相對(duì)尋址

相對(duì)尋址是把指令中給定的地址偏移量與程序計(jì)數(shù)器

PC的當(dāng)前值相加,得到真正的程序轉(zhuǎn)移地址。相對(duì)尋址方式主要是解決程序轉(zhuǎn)移而專門設(shè)置的。

例如:JC80H

若C=0,則PC值不變,若C=1,則以當(dāng)前PC值為基地址,加上偏移量80H得到新的PC值。

這里的偏移量是一個(gè)帶符號(hào)的二進(jìn)制補(bǔ)碼數(shù),所能表示的數(shù)的范圍是-128~+127,因此相對(duì)轉(zhuǎn)移是以轉(zhuǎn)移指令的下條指令為基點(diǎn),向前最大可能轉(zhuǎn)移127個(gè)字節(jié),向后最大可能轉(zhuǎn)移128個(gè)字節(jié)。3.2.6變址尋址

變址尋址是指操作數(shù)的地址由基址寄存器的地址加上變址寄存器的地址得到。它是以數(shù)據(jù)指針寄存器DPTR或程序計(jì)數(shù)器PC為基址,累加器A為變址,兩者相加得存儲(chǔ)單元的地址,所訪問(wèn)的存儲(chǔ)器為程序存儲(chǔ)器。

MOVCA,@A+DPTR

MOVCA,@A+PC

2000H30H30HDPTRA2005H05HA+§3.251系列單片機(jī)尋址方式變址尋址設(shè)指令執(zhí)行前數(shù)據(jù)指針寄存器DPTR的值為2000H,累加器A的值為05H,程序存儲(chǔ)器2005H單元的內(nèi)容為30H,則指令執(zhí)行后,累加器A中的內(nèi)容為30H。示意圖如圖所示。§3.251系列單片機(jī)尋址方式3.2.7位尋址51指令系統(tǒng)有位處理功能,可以對(duì)數(shù)據(jù)位進(jìn)行操作,因此就有相應(yīng)的位尋址方式。位尋址的范圍包括:(1)內(nèi)部RAM中的位尋址區(qū)。單元地址為20H~2FH,共16個(gè)單元128位,位地址是00H~7FH。(2)專用寄存器的可尋址位??梢晕粚ぶ返膶S眉拇嫫鞴灿?1個(gè),實(shí)有尋址位83位。

§3.351系列單片機(jī)指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令屬于復(fù)制,傳送后,源操作數(shù)不變,不影響別的寄存器和標(biāo)志。傳送指令包括“MOV”、“MOVX”、“MOVC”。數(shù)據(jù)傳送指令的約定是從右向左,左邊是目的操作數(shù),右邊是源操作數(shù)。源操作數(shù)可以是:累加寄存器、通用寄存器、直接地址、間接地址和立即數(shù)。目的操作數(shù)除了不能用立即數(shù),其它和源操作數(shù)一樣。3.3.1.1片內(nèi)數(shù)據(jù)存儲(chǔ)器傳送指令MOV指令格式:MOV目的操作數(shù),源操作數(shù)其中:源操作數(shù)可以為A、Rn、@Ri、direct、#data,目的操作數(shù)可以為A、Rn、@Ri、direct,組合起來(lái)總共16條,按目的操作數(shù)的尋址方式劃分為五組:(1)以A為目的操作數(shù)

MOVA,Rn

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

MOVA,@Ri

;A←((Ri))

MOVA,#data ;A←#data§3.351系列單片機(jī)指令系統(tǒng)(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§3.351系列單片機(jī)指令系統(tǒng)(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不能相互配對(duì)。如不允許有“MOVRn,Rn”,“MOV@Ri,Rn”這樣的指令,在MOV指令中,不允許在一條指令中同時(shí)出現(xiàn)工作寄存器,無(wú)論它是寄存器尋址還是寄存器間接尋址?!?.351系列單片機(jī)指令系統(tǒng)3.3.1.2片外數(shù)據(jù)存儲(chǔ)器傳送指令MOVX

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

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

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

;A←((Ri))

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

其中前兩條指令通過(guò)DPTR間接尋址,可以對(duì)整個(gè)64K片外數(shù)據(jù)存儲(chǔ)器訪問(wèn)。后兩條指令通過(guò)@Ri間接尋址,只能對(duì)片外數(shù)據(jù)存儲(chǔ)器的低端的256字節(jié)訪問(wèn),訪問(wèn)時(shí)將低8位地址放于Ri中。§3.351系列單片機(jī)指令系統(tǒng)3.3.1.3程序存儲(chǔ)器數(shù)據(jù)傳送指令MOVC

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

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

MOVCA,@A+PC ;A←(A+PC)這兩條指令通常用于訪問(wèn)表格數(shù)據(jù),因此稱為查表指令?!?.351系列單片機(jī)指令系統(tǒng)

【例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§3.351系列單片機(jī)指令系統(tǒng)(4)將ROM2000H單元的內(nèi)容送片內(nèi)RAM的30H單元中程序?yàn)椋篗OVA,#0 MOVDPTR,#2000H MOVCA,@A+DPTR MOV30H,A§3.351系列單片機(jī)指令系統(tǒng)3.3.1.4數(shù)據(jù)交換指令

普通傳送指令實(shí)現(xiàn)將源操作數(shù)的數(shù)據(jù)傳送到目的操作數(shù),指令執(zhí)行后源操作數(shù)不變,數(shù)據(jù)傳送是單向的。數(shù)據(jù)交換指令數(shù)據(jù)作雙向傳送,傳送后,前一個(gè)操作數(shù)原來(lái)的內(nèi)容傳送到后一個(gè)操作數(shù)中,后一個(gè)操作數(shù)原來(lái)的內(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.351系列單片機(jī)指令系統(tǒng)

【例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?!?.351系列單片機(jī)指令系統(tǒng)3.3.1.5堆棧指令

堆棧是在片內(nèi)RAM中按“先進(jìn)后出,后進(jìn)先出”原則設(shè)置的專用存儲(chǔ)區(qū)。數(shù)據(jù)的進(jìn)棧和出棧由指針SP統(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)容先出棧?!?.351系列單片機(jī)指令系統(tǒng)

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

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

POPB POPA§3.351系列單片機(jī)指令系統(tǒng)3.3.2算術(shù)運(yùn)算指令§3.351系列單片機(jī)指令系統(tǒng)3.3.2.1加法指令1.一般的加法指令A(yù)DDADDA,Rn

;A←(A)+(Rn)ADDA,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)志位外,對(duì)其它標(biāo)志位都沒(méi)有影響。在MCS-51單片機(jī)中,常用ADD和ADDC配合使用實(shí)現(xiàn)多字節(jié)加法運(yùn)算。§3.351系列單片機(jī)指令系統(tǒng)

【例3-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§3.351系列單片機(jī)指令系統(tǒng)【例3-6】見書P453.3.2.2減法指令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§3.351系列單片機(jī)指令系統(tǒng)

在51單片機(jī)中,只提供了一種帶借位的減法指令,沒(méi)有提供一般的減法指令,一般的減法操作可以通過(guò)先對(duì)CY標(biāo)志清零,然后再執(zhí)行帶借位的減法來(lái)實(shí)現(xiàn)。例3-7:設(shè)(45H)=0AAH,(47H)=66H,試編寫45H內(nèi)容減去47H內(nèi)容后,結(jié)果再存入49H單元的程序。MOV45H,#0AAHMOV47H,#66HMOVA,45H;向A設(shè)置被減數(shù)CLRC

;清除進(jìn)位標(biāo)志CY

SUBBA,47H ;A←(A)-(47H)-(C

)MOV 49H,A ;將結(jié)果置于地址為49H的內(nèi)部RAM存儲(chǔ)單元中執(zhí)行以上程序后,(49H)=44H,CY=0,OV=1,AC=0。

§3.351系列單片機(jī)指令系統(tǒng)3.3.2.3乘法指令

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

MULAB該指令執(zhí)行時(shí)將對(duì)存放于累加器A中的無(wú)符號(hào)被乘數(shù)和放于B寄存器中的無(wú)符號(hào)乘數(shù)相乘,積的高字節(jié)存于B寄存器中,低字節(jié)存于累加器A中。指令執(zhí)行后將影響CY和OV標(biāo)志,CY復(fù)位,對(duì)于OV:當(dāng)積大于255時(shí)(即B中不為0),OV為1;否則,OV為0。§3.351系列單片機(jī)指令系統(tǒng)3.3.2.4除法指令

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

DIVAB

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

DAA

它只能用在ADD或ADDC指令后面,用來(lái)對(duì)兩個(gè)二位的壓縮的BCD碼數(shù)通過(guò)用ADD或ADDC指令相加后存于累加器A中的結(jié)果進(jìn)行調(diào)整,使得它得到正確的十進(jìn)制結(jié)果。通過(guò)該指令可實(shí)現(xiàn)兩位十進(jìn)制BCD碼數(shù)的加法運(yùn)算。它的調(diào)整過(guò)程為:(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)整

§3.351系列單片機(jī)指令系統(tǒng)【例3-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指令對(duì)ADD指令運(yùn)算出來(lái)的放于累加器A中的結(jié)果進(jìn)行調(diào)整,調(diào)整后,累加器A中的內(nèi)容為52H,CY為1,則結(jié)果為152,最后放于R5中的內(nèi)容為52H(十進(jìn)制數(shù)52)?!?.351系列單片機(jī)指令系統(tǒng)3.3.3邏輯運(yùn)算指令§3.351系列單片機(jī)指令系統(tǒng)3.3.3.1邏輯與指令A(yù)NLANLA,RnA←(A)(Rn)ANLA,directA←(A)

(direct)ANLA,@RiA←(A)

((Ri))ANLA,#dataA←(A)#dataANLdirect,Adirect←(direct)

(A)ANLdirect,#datadirect←(direct)

#data3.3.3.2邏輯或指令ORLORLA,RnA←(A)(Rn)ORLA,directA←(A)

(direct)ORLA,@RiA←(A)

((Ri))ORLA,#dataA←(A)#dataORLdirect,Adirect←(direct)

(A)ORLdirect,#datadirect←(direct)

#data§3.351系列單片機(jī)指令系統(tǒng)3.3.3.3邏輯異或指令XRLXRLA,RnA←(A)(Rn)XRLA,directA←(A)

(direct)XRLA,@RiA←(A)

((Ri))XRLA,#dataA←(A)#dataXRLdirect,Adirect←(direct)

(A)XRLdirect,#datadirect←direct)

#data§3.351系列單片機(jī)指令系統(tǒng)

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

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

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

XRLA,#00000011B§3.351系列單片機(jī)指令系統(tǒng)3.3.3.4清零和求反指令1.清零指令:CLRAA←02.求反指令:CPLAA←ā

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

MOVA,R0 CPLA MOVR0,A§3.351系列單片機(jī)指令系統(tǒng)3.3.3.5循環(huán)移位指令

MCS-51系統(tǒng)有四條對(duì)累加器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.351系列單片機(jī)指令系統(tǒng)3.3.4控制轉(zhuǎn)移指令§3.351系列單片機(jī)指令系統(tǒng)3.3.4.1無(wú)條件轉(zhuǎn)移指令

無(wú)條件轉(zhuǎn)移指令是指當(dāng)執(zhí)行該指令后,程序?qū)o(wú)條件地轉(zhuǎn)移到指令指定的地方去。無(wú)條件轉(zhuǎn)移指令包括長(zhǎng)轉(zhuǎn)移指令、絕對(duì)轉(zhuǎn)移指令、相對(duì)轉(zhuǎn)移指令和間接轉(zhuǎn)移指令??刂妻D(zhuǎn)移指令分為:無(wú)條件轉(zhuǎn)移指令、有條件轉(zhuǎn)移指令和子程序調(diào)用和返回指令。

1.長(zhǎng)轉(zhuǎn)移指令LJMP

LJMPaddr16 ;PC←addr16

指令后面帶目的位置的16位地址,執(zhí)行時(shí)直接將該16位地址送給程序指針PC,程序無(wú)條件地轉(zhuǎn)到16位目標(biāo)地址指明的位置去。

指令中提供的是16位目標(biāo)地址,所以可以轉(zhuǎn)移到64KB程序存儲(chǔ)器的任意位置,故得名為“長(zhǎng)轉(zhuǎn)移”。長(zhǎng)轉(zhuǎn)移指令需要三個(gè)字節(jié)。§3.351系列單片機(jī)指令系統(tǒng)例3-10ORG0000HLJMPSTARTORG0030HSTART:LJMPLABORG7000HLAB:MOVA,R42.絕對(duì)轉(zhuǎn)移指令A(yù)JMPAJMPaddr11 ;PC10~0←addr11

AJMP指令后帶的是目的位置的低11位直接地址,范圍是00000000000-11111111111,即2KB范圍,而目的地址的高5位不變,所以程序轉(zhuǎn)移的位置只能是和當(dāng)前PC位置(AJMP指令地址加2)在同一2KB范圍內(nèi)。轉(zhuǎn)移可以向前也可以向后,指令執(zhí)行后不影響狀態(tài)標(biāo)志位?!?.351系列單片機(jī)指令系統(tǒng)3.短轉(zhuǎn)移指令SJMPSJMPrel

;PC←(PC)+2+rel

短轉(zhuǎn)移指令又叫相對(duì)轉(zhuǎn)移指令。

SJMP指令后面的操作數(shù)rel是8位帶符號(hào)補(bǔ)碼數(shù),8位補(bǔ)碼的取值范圍為-128~+127,所以該指令的轉(zhuǎn)移范圍是:相對(duì)PC當(dāng)前值向前128字節(jié),向后127字節(jié)。§3.351系列單片機(jī)指令系統(tǒng)注意:在單片機(jī)程序設(shè)計(jì)中,通常用到一條SJMP指令:

SJMP$

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

又叫間接轉(zhuǎn)移指令。是51系統(tǒng)中唯一一條間接轉(zhuǎn)移指令,轉(zhuǎn)移的目的地址是由數(shù)據(jù)指針DPTR的內(nèi)容與累加器A中的內(nèi)容相加得到。

該指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。DPTR一般為確定值,根據(jù)累加器A的值來(lái)實(shí)現(xiàn)轉(zhuǎn)移到不同的分支。在使用時(shí)往往與一個(gè)轉(zhuǎn)移指令表一起來(lái)實(shí)現(xiàn)多分支轉(zhuǎn)移。§3.351系列單片機(jī)指令系統(tǒng)【例3-11】下面的程序能根據(jù)累加器A的值0、2、4、6轉(zhuǎn)移到相應(yīng)的TAB0-TAB6分支去執(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í)行§3.351系列單片機(jī)指令系統(tǒng)§3.351系列單片機(jī)指令系統(tǒng)3.3.4.2有條件轉(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)移指令JZrel

;若A=0,則PC←(PC)+2+rel,否則,PC←(PC)+2

JNZrel

;若A0,則PC←(PC)+2+rel,否則,PC←(PC)+2例3-12比較內(nèi)部RAM單元中地址為60H的數(shù)據(jù)如果不為0,則傳送到P1口,否則不傳送。MOVA,60HJZL1MOVP1,AL1:......

§3.351系列單片機(jī)指令系統(tǒng)【例3-13】把片外RAM的30H單元開始的數(shù)據(jù)塊傳送到片內(nèi)RAM的40H開始的位置,直到出現(xiàn)零為止。片內(nèi)、片外數(shù)據(jù)傳送以累加器A過(guò)渡。每次傳送一個(gè)字節(jié),通過(guò)循環(huán)處理,直到處理到傳送的內(nèi)容為0結(jié)束。程序如下:

MOVR0,#30H MOVR1,#40H LOOP:MOVXA,@R0 MOV@R1,A INCR1 INCR0 JNZLOOP SJMP$§3.351系列單片機(jī)指令系統(tǒng)2.比較不等轉(zhuǎn)移指令比較轉(zhuǎn)移指令用于對(duì)兩個(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)移?!?.351系列單片機(jī)指令系統(tǒng)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)移?!?.351系列單片機(jī)指令系統(tǒng)例3-14內(nèi)部RAM單元中兩個(gè)存儲(chǔ)單元地址為50H和51H,如果它們相等,則將地址為52H的數(shù)據(jù)單元傳送給58H,如果不相等,則將地址為62H的數(shù)據(jù)單元傳送給58H。MOVA,50HCJNEA,51H,L1MOV58H,52HSJMPL2L1:MOV58H,62HL2:3.循環(huán)減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)移。

在51系統(tǒng)中,通常用DJNZ指令來(lái)構(gòu)造循環(huán)結(jié)構(gòu),實(shí)現(xiàn)重復(fù)處理?!?.351系列單片機(jī)指令系統(tǒng)

【例3-15】統(tǒng)計(jì)片內(nèi)RAM中30H單元開始的20個(gè)數(shù)據(jù)中0個(gè)數(shù),放于R7中。

用R2作循環(huán)變量,最開始置初值為20;作R7作計(jì)數(shù)器,最開始置初值為0;用R0作指針訪問(wèn)片內(nèi)RAM單元,最開始置初值為30H;用DJNZ指令對(duì)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§3.351系列單片機(jī)指令系統(tǒng)4.判C轉(zhuǎn)移指令JCrel;若C=1,則轉(zhuǎn)移,PC←(PC)+2+rel;否則程序繼續(xù)執(zhí)行JNCrel;若C=0,則轉(zhuǎn)移,PC←(PC)+2+rel;否則程序繼續(xù)執(zhí)行例3-16比較內(nèi)部RAM單元中兩個(gè)存儲(chǔ)單元的大小。設(shè)A、B、C的地址分別為50H、51H、52H。A和B為無(wú)符號(hào)數(shù),如果A<B,則將-1送入C;如果A=B,則將0送入C;如果A>B,則將1送入C。MOVA,50HCJNEA,51H,L1MOV52H,#0SJMPL3L1:JCL2MOV52H,#1SJMPL3L2:MOV52H,#-1L3: ......§3.351系列單片機(jī)指令系統(tǒng)5.判直接尋址位轉(zhuǎn)移指令JBbit,rel

;若(bit)=1,則轉(zhuǎn)移,PC←(PC)+3+rel;否則程序繼續(xù)執(zhí)行JNBbit,rel

;若(bit)=0,則轉(zhuǎn)移,PC←(PC)+3+rel;否則程序繼續(xù)執(zhí)行JBCbit,rel

;若(bit)=1,則轉(zhuǎn)移,PC←(PC)+3+rel,且(bit)←0;否則程序繼續(xù)執(zhí)行利用位轉(zhuǎn)移指令可進(jìn)行各種測(cè)試。例3-17內(nèi)部RAM單元中存儲(chǔ)單元地址為50H,如果該存儲(chǔ)單元有奇數(shù)個(gè)1,則將R0置1,否則將R0清0。編寫該程序。首先將50H單元送給A,然后判斷P標(biāo)志位,根據(jù)P標(biāo)志位的結(jié)果,給RO置1或清0。MOVA,50HJBP,L1MOVR0,#0SJMPL2L1:MOVR0,#1L2:......§3.351系列單片機(jī)指令系統(tǒng)§3.351系列單片機(jī)指令系統(tǒng)3.3.4.3子程序調(diào)用指令

這類指令有四條。兩條子程序調(diào)用指令,兩條返回指令。1.絕對(duì)調(diào)用指令指令格式:ACALLaddr11執(zhí)行過(guò)程:PC←(PC)+2 SP←(SP)+1

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

(SP)←(PC)15~8 PC10~0←addr112.長(zhǎng)調(diào)用指令指令格式:LCALLaddr16執(zhí)行過(guò)程:PC←(PC)+3 SP←(SP)+1

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

(SP)←(PC)15~8 PC←addr16

§3.351系列單片機(jī)指令系統(tǒng)3.子程序返回指令指令格式:RET執(zhí)行過(guò)程:PC15~8←((SP))

SP←(SP)-1 PC7~0←((SP))

SP←(SP)-1由于子程序調(diào)用指令執(zhí)行時(shí)壓入的內(nèi)容是調(diào)用指令的下一條指令的地址,因而RET指令執(zhí)行后,程序?qū)⒎祷氐秸{(diào)用指令的下一條指令執(zhí)行?!?.351系列單片機(jī)指令系統(tǒng)4.中斷子程序返回指令指令格式:RETI執(zhí)行過(guò)程:PC15~8←((SP))

SP←(SP)-1 PC7~0←((SP))

SP←(SP)-1

該指令用于中斷服務(wù)子程序后面,作為中斷服務(wù)子程序的最后一條指令,它的功能是返回主程序中斷的斷點(diǎn)位置,繼續(xù)執(zhí)行斷點(diǎn)位置后面的指令?!?.351系列單片機(jī)指令系統(tǒng)例3-18編寫一個(gè)子程序,其首地址為L(zhǎng)COUNT,功能是計(jì)算A寄存器中1的個(gè)數(shù),并將這個(gè)計(jì)數(shù)值放入寄存器R0。編一程序段,求出地址為50H的16位內(nèi)存單元的1的個(gè)數(shù),放入寄存器A中子程序如下:LCOUNT:MOVR0,#0;計(jì)數(shù)初值為0MOVR1,#8;R1是循環(huán)變量,初始值為8,因?yàn)锳寄存器有8位LOOP:RLCA;帶進(jìn)位左移1次,將當(dāng)前最高位移到進(jìn)位標(biāo)志CY中MOVR2,A;由于馬上要進(jìn)行加法運(yùn)算,保存A寄存器的內(nèi)容到R2MOVA,R0;將R0送入A中,為下一步加法做準(zhǔn)備ADDCA,#0;將CY加入A中MOVR0,A;將結(jié)果送回R0中MOVA,R2;恢復(fù)A的值DJNZR1,LOOP;一次循環(huán)結(jié)束,將循環(huán)計(jì)數(shù)器減一RET主程序?qū)⑦@16位數(shù)據(jù)分成兩個(gè)字節(jié),分別傳入A寄存器中,然后分別調(diào)用子程序計(jì)算出它們1的個(gè)數(shù),然后再相加到A寄存器。主程序如下:MOVA,50HACALLLCOUNT;調(diào)用子程序MOV60H,R0;將計(jì)算結(jié)果保存在地址為60H的內(nèi)存單元中MOVA,51HACALLLCOUNT;調(diào)用子程序MOVA,R0;將計(jì)算結(jié)果保存在A寄存器中ADDA,60H ;將兩次調(diào)用結(jié)果相加§3.351系列單片機(jī)指令系統(tǒng)3.3.4.4空操作指令NOP;PC←(PC)+1這是一條單字節(jié)指令。執(zhí)行時(shí),不作任何操作(即空操作),僅將程序計(jì)數(shù)器PC的內(nèi)容加1,使CPU指向下一條指令繼續(xù)執(zhí)行程序。它要占用一個(gè)機(jī)器周期,常用來(lái)產(chǎn)生時(shí)間延遲,構(gòu)造延時(shí)程序。3.3.5位操作指令§3.351系列單片機(jī)指令系統(tǒng)3.3.5.1位數(shù)據(jù)傳送指令

位傳送指令有兩條,用于實(shí)現(xiàn)位運(yùn)算器C與一般位之間的相互傳送。

MOVC,bit ;C←(bit)

MOVbit,C ;(bit)←C

指令在使用時(shí)必須有位運(yùn)算器C參與,不能直接實(shí)現(xiàn)兩位之間的傳送。如果進(jìn)行兩位之間的傳送,可以通過(guò)位運(yùn)算器C來(lái)傳送。

【例3-16】把片內(nèi)RAM中位尋址區(qū)的20H位的內(nèi)容傳送到30H位。程序:

MOVC,20H MOV30H,C3.3.5.2位數(shù)據(jù)清零指令

CLRC ;C←0CLRbit ;(bit)←0§3.351系列單片機(jī)指令系統(tǒng)3.3.5.3位數(shù)據(jù)置1指令

SETBC ;C←1SETBbit ;(bit)←13.3.5.4位數(shù)據(jù)取反指令

CPLC ;C←/CCPLbit ;(bit)←(bit)§3.351系列單片機(jī)指令系統(tǒng)3.3.5.5位與指令

ANLC,bit ;C←C∧(bit)ANLC,/bit ;C←C∧(/bit)3.3.5.6位或指令ORLC,bit ;C←C∨(bit)ORLC,/bit ;C←C∨(/bit)§3.351系列單片機(jī)指令系統(tǒng)

【例3-17】利用位邏輯運(yùn)算指令編程實(shí)現(xiàn)下面硬件邏輯電路的功能。與或或與P1.0P1.1P1.2P1.3P1.4P1.5§3.351系列單片機(jī)指令系統(tǒng)程序: MOVC,P1.0 ANLC,P1.1 CPLC ORLC,/P1.2 MOVF0,C MOVC,P1.3 ORLC,P1.4 ANLC,F(xiàn)0 CPLC MOVP1.5,C§3.351系列單片機(jī)指令系統(tǒng)2023/1/3176§3.451系列單片機(jī)匯編指令格式

[標(biāo)號(hào):]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋](1)操作碼助記符表明指令的功能,不同的指令有不同的指令助記符,它一般用說(shuō)明其功能的英文單詞的縮寫形式表示。(2)操作數(shù)用于給指令的操作提供數(shù)據(jù)、數(shù)據(jù)的地址或指令的地址,操作數(shù)往往用相應(yīng)的尋址方式指明。(3)標(biāo)號(hào)是該指令的符號(hào)地址,后面須帶冒號(hào)。(4)注釋是對(duì)該指令的解釋,前面須帶分號(hào)。§3.551系列單片機(jī)匯編程序常用偽指令

有一些指令,如指定目標(biāo)程序或數(shù)據(jù)存放的地址、給一些指定的標(biāo)號(hào)賦值、表示源程序結(jié)束等指令,并不產(chǎn)生目標(biāo)程序(機(jī)器碼),也不影響程序的執(zhí)行,僅僅產(chǎn)生供匯編用的某些命令,用來(lái)對(duì)匯編過(guò)程進(jìn)行某種控制或操作,這類指令稱為偽指令。如果是手工編譯,這些偽指令將失去意義。3.5.1定義起始地址偽指令格式:ORG地址(十六進(jìn)制表示)這條偽指令放于一段源程序或數(shù)據(jù)的前面,匯編時(shí)用于指明程序或數(shù)據(jù)從程序存儲(chǔ)空間什么位置開始存放。ORG偽指令后的地址是程序或數(shù)據(jù)的起始地址?!纠?-19】ORG1000HSTART:MOVA,#7FH指明后面的程序從程序存儲(chǔ)器的1000H單元開始存放。3.5.2定義匯編結(jié)束偽指令格式:END該指令放于程序最后位置,用于指明匯編語(yǔ)言源程序的結(jié)束位置,當(dāng)匯編程序匯編到END偽指令時(shí),匯編結(jié)束。END后面的指令,匯編程序都不予處理。一個(gè)源程序只能有一個(gè)END命令,否則就有一部分指令不能被匯編?!?.551系列單片機(jī)匯編程序常用偽指令3.5.3標(biāo)號(hào)賦值偽指令格式:符號(hào)EQU項(xiàng)該偽指令的功能是將指令中的項(xiàng)的值賦予EQU前面的符號(hào)。項(xiàng)可以是常數(shù)、地址標(biāo)號(hào)或表達(dá)式。以后可以通過(guò)使用該符號(hào)使用相應(yīng)的項(xiàng)?!纠?-19】 TAB1EQU1000H TAB2EQU2000H匯編后TAB1、TAB2分別等于1000H、2000H。程序后面使用1000H、2000H的地方就可以用符號(hào)TAB1、TAB2替換。用EQU偽指令對(duì)某標(biāo)號(hào)賦值后,該符號(hào)的值在整個(gè)程序中不能再改變?!?.551系列單片機(jī)匯編程序常用偽指令3.5.4字節(jié)定義偽指令格式:[標(biāo)號(hào):]DB項(xiàng)或項(xiàng)表DB偽指令用于定義字節(jié)數(shù)據(jù),可以定義一個(gè)字節(jié),也可定義多個(gè)字節(jié),定義多個(gè)字節(jié)時(shí),兩兩之間用逗號(hào)間隔,定義的多個(gè)字節(jié)在存儲(chǔ)器中是連續(xù)存放的。定義的字節(jié)可以是一般常數(shù),也可以為字符,還可以是字符串,字符和字符串以引號(hào)括起來(lái),字符數(shù)據(jù)在存儲(chǔ)器中以ASCII碼形式存放。在定義時(shí)前面可以帶標(biāo)號(hào),定義的標(biāo)號(hào)在程序中是起始單元的地址?!?.551系列單片機(jī)匯編程序常用偽指令12H34H35H41H61H62H63H3000H3001H3002H3003H3004H3005H3006H§3.551系列單片機(jī)匯編程序常用偽指令【例3-20】 ORG3000H TAB1:DB12H,34H DB'5','A','abc'匯編后,各個(gè)數(shù)據(jù)在存儲(chǔ)單元中的存放情況如下:3.5.5字定義偽指令格式:[標(biāo)號(hào):]DW項(xiàng)或項(xiàng)表這條指令與DB相似,但用于定義字?jǐn)?shù)據(jù)。項(xiàng)或項(xiàng)表指所定義的一個(gè)字在存儲(chǔ)器中占兩個(gè)字節(jié)。匯編時(shí),機(jī)器自動(dòng)按高字節(jié)在前低字節(jié)在后存放?!纠?-21】 ORG3000H TAB2:DW1234H,5678H匯編后,各個(gè)數(shù)據(jù)在存儲(chǔ)單元中的存放情況如左圖:12H34H56H78H3000H3001H3002H3003H§3.551系列單片機(jī)匯編程序常用偽指令3.5.6存儲(chǔ)區(qū)定義偽指令格式:[標(biāo)號(hào):]DS數(shù)值表達(dá)式該偽指令用在存儲(chǔ)器中保留一定數(shù)量的字節(jié)單元。保留存貯空間主要為以后存放數(shù)據(jù)。保留的字節(jié)單元數(shù)由表達(dá)式的值決定?!纠?-22】 ORG2000H TAB1:DB12H,34H DS4H DB'5'匯編后,存儲(chǔ)單元中的分配情況如左圖:12H34H----35H3000H3001H3002H3003H3004H3005H3006H§3.551系列單片機(jī)匯編程序常用偽指令3.5.7位定義偽指令格式:符號(hào)bit位地址bit該偽指令用于給位地址賦予符號(hào),經(jīng)賦值后可用該符號(hào)代替bit后面的位地址?!纠?-23】 PLGbitF0 AIbit P1.0定義后,在程序中位地址F0、P1.0就可以通過(guò)FLG和AI來(lái)使用。§3.551系列單片機(jī)匯編程序常用偽指令3.5.8內(nèi)部RAM地址賦值偽指令格式:符號(hào)DATA直接字節(jié)地址該偽指令用于給片內(nèi)RAM字節(jié)單元地址賦予DATA前面的符號(hào),賦值后可用該符號(hào)代替DATA后面的片內(nèi)RAM字節(jié)單元地址?!纠?-24】 RESULTDATA60H

MOVRESULT,A匯編后,RESULT就表示片內(nèi)RAM的60H單元,程序后面用片內(nèi)RAM的60H單元的地方就可以用RESULT?!?.551系列單片機(jī)匯編程序常用偽指令3.5.9外部RAM地址賦值偽指令格式:符號(hào)XDATA直接字節(jié)地址該偽指令與DATA偽指令基本相同,只是它針對(duì)的是片外RAM字節(jié)單元?!纠?-25】 PORT1XDATA2000HMOVDPTR,PORT1 MOVX@DPTR匯編后,符號(hào)PORT1就表示片外RAM的2000H單元地址,程序后面可通過(guò)符號(hào)PORT1表示片外RAM的2000H單元地址?!?.551系列單片機(jī)匯編程序常用偽指令§3.651系列單片機(jī)匯編程序設(shè)計(jì)和大家熟悉的高級(jí)語(yǔ)言設(shè)計(jì)一樣,匯編程序的設(shè)計(jì)也常采用以下幾種基本結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),再加上廣泛使用的子程序和中斷服務(wù)子程序。任何復(fù)雜的程序都是由這幾種基本結(jié)構(gòu)復(fù)合而成的。3.6.1順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)是最簡(jiǎn)單的一種基本結(jié)構(gòu),是指完全按順序逐條執(zhí)行的指令序列。解:由于X>Y,所以X-Y>0,不需要借位;(X-Y)*Z的結(jié)果最多占用兩個(gè)字節(jié)。首先將X-Y結(jié)果放入A寄存器中,將Z的內(nèi)容放入B寄存器中,然后將A和B相乘,其結(jié)果的高低字節(jié)分別置于B和A寄存器中,然后將它們分別放入34H和35H存儲(chǔ)單元中。

§3.651系列單片機(jī)匯編程序設(shè)計(jì)例3-26:已知X、Y、Z分別為片內(nèi)RAM30H、31H、32H單元的內(nèi)容,設(shè)X>Y,試編程完成下式的算術(shù)運(yùn)算:S=(X-Y)*Z,并將計(jì)算結(jié)果S存入片內(nèi)RAM34H(高字節(jié))、35H(低字節(jié))單元中。

程序如下: ORG 0030HSTART:MOV A,30H ;A←X CLRC SUBB A,31H ;A←(A)-Y MOV B,32H ;B←Z MUL AB MOV 34H,B ;34H←A*B的高字節(jié) MOV 35H,A;35H←A*B的低字節(jié) SJMP $3.6.2分支結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)可以有兩種形式,單分支結(jié)構(gòu)和多分支結(jié)構(gòu),如下圖所示:?jiǎn)畏种ЫY(jié)構(gòu)多分支結(jié)構(gòu)§3.651系列單片機(jī)匯編程序設(shè)計(jì)在51指令系統(tǒng)的編程中,單分支程序使用條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn),即根據(jù)條件對(duì)程序的執(zhí)行進(jìn)行判斷,滿足條件就進(jìn)行程序跳轉(zhuǎn),否則按順序執(zhí)行。例3-27:假設(shè)外部RAM中有三個(gè)8位無(wú)符號(hào)數(shù)據(jù),它們的地址分別為7111H、5687H和8766H,找出它們之中最大的數(shù)放入寄存器A中。解:先將地址為7111H、5687H的兩個(gè)數(shù)相比較,將其中較大的數(shù)放置于R0。然后將R0和地址為8766H的數(shù)相比較,將其中較大數(shù)置于A中?!?.651系列單片機(jī)匯編程序設(shè)計(jì) ORG 0000H MOVDPTR,#7111H MOVXA,@DPTR MOVR0,A MOVDPTR,#5687H MOVXA,@DPTR MOVR1,A CLRC SUBBA,R0 JCBIG1; R0>R1轉(zhuǎn)BIG1 MOVA,R1 MOVR0,A§3.651系列單片機(jī)匯編程序設(shè)計(jì)BIG1:MOVDPTR,#8766H MOVXA,@DPTR MOVR2,A CLRC SUBBA,R0 JCBIG2;R0>R2轉(zhuǎn)BIG2 MOVA,R2 SJMPLABLASTBIG2:MOVA,R0LABLAST:SJMP$ END§3.651系列單片機(jī)匯編程序設(shè)計(jì)多分支結(jié)構(gòu)的特點(diǎn)是判定條件有n種可能的值,根據(jù)不同值,程序執(zhí)行不同的程序段。在圖中,這些程序段分別為A1、A2、...、An。和某些高級(jí)語(yǔ)言不一樣,51指令系統(tǒng)中沒(méi)有專門的多分支指令,要實(shí)現(xiàn)多分支結(jié)構(gòu),一般采用多條條件轉(zhuǎn)移指令的方法來(lái)實(shí)現(xiàn)。這種方法的優(yōu)點(diǎn)是層次很清晰,程序簡(jiǎn)單易懂。缺點(diǎn)是分支速度較慢。特別是分支很多時(shí),由于每個(gè)分支都有可能被判斷,因此執(zhí)行效率大大降低。

§3.651系列單片機(jī)匯編程序設(shè)計(jì)例3-28:寄存器A中存放了一個(gè)成績(jī)值(0≤A≤100),編寫一程序,判定該成績(jī)所屬的級(jí)別,放入寄存器B中。判定標(biāo)準(zhǔn)是:1級(jí)(100≤A≤90)、2級(jí)(89≤A≤80)、3級(jí)(79≤A≤70)、4級(jí)(69≤A≤60)、5級(jí)(A≤59)。解:按照題意,該程序的流程圖如下:

§3.651系列單片機(jī)匯編程序設(shè)計(jì)§3.651系列單片機(jī)匯編程序設(shè)計(jì) ORG 0000H MOVR0,A;將A寄存器保存到R0中 CLRC SUBA,#90 JNCLONEGREE;如果大于等于90,則跳轉(zhuǎn)到LONEGREE MOVXA,@DPTR MOVA,R0 CLRC SUBBA,#80 JNCLTWOGREE;如果大于等于80,則跳轉(zhuǎn)到LTWOGREE MOVA,R0

§3.651系列單片機(jī)匯編程序設(shè)計(jì) CLRC SUBBA,#70 JNCLTHREEGREE;如果大于等于70,則跳轉(zhuǎn)到THREEGREE MOVA,R0 CLRC SUBBA,#60 JNCLFOURGREE;如果大于等于60,則跳轉(zhuǎn)到LFOURGREE MOVB,#5;否則就是第五等級(jí)LEND:SJMP$

§3.651系列單片機(jī)匯編程序設(shè)計(jì)LONEGREE:MOVB,#1 SJMPLENDLTWOGREE:MOVB,#2 SJMPLENDLTHREEGREE:MOVB,#3 SJMPLENDLFOURGREE:MOVB,#4 SJMPLEND END從以上的程序可以看出,如果A寄存器的成績(jī)值小于60,那么要做四個(gè)減法和條件判斷才能最后得到所需要的等級(jí)值,所以這種多分支的程序結(jié)構(gòu)的效率是比較低的。為了提高多分支程序的效率,往往采用地址表查詢等方式來(lái)實(shí)現(xiàn),這將在后面進(jìn)行分析?!?.651系列單片機(jī)匯編程序設(shè)計(jì)3.6.3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)是為了重復(fù)執(zhí)行一個(gè)程序段。在51指令系統(tǒng)的匯編語(yǔ)言中,循環(huán)次數(shù)固定的循環(huán)常常采用DJNZ指令來(lái)實(shí)現(xiàn)。在循環(huán)初始化時(shí),將循環(huán)次數(shù)放置于某個(gè)通用寄存器中或某個(gè)內(nèi)部RAM單元中;在循環(huán)結(jié)束處放置一條DJNZ,可同時(shí)完成對(duì)循環(huán)計(jì)數(shù)單元的減1和條件跳轉(zhuǎn)功能(如果循環(huán)計(jì)數(shù)單元不為0,則跳轉(zhuǎn)到循環(huán)程序段的起始處)。對(duì)于循環(huán)次數(shù)依賴于循環(huán)體中執(zhí)行結(jié)果的循環(huán)程序,則需要其他類型的有條件跳轉(zhuǎn)指令。§3.651系列單片機(jī)匯編程序設(shè)計(jì)例3-29:外部RAM中,從地址2000H開始存放了100個(gè)有符號(hào)字節(jié)數(shù)據(jù),編寫一程序,統(tǒng)計(jì)其中小于0的數(shù)據(jù)個(gè)數(shù),將其存放在R0寄存器中。解:很顯然,該程序是一個(gè)循環(huán)次數(shù)固定的程序,循環(huán)次數(shù)是100次。將R1作為循環(huán)計(jì)數(shù)寄存器,其初始值為100。在循環(huán)體中是一個(gè)分支結(jié)構(gòu),用于判定一個(gè)數(shù)是否小于0的依據(jù)是該數(shù)的最高位是否為1。程序流程圖如下:§3.651系列單片機(jī)匯編程序設(shè)計(jì)§3.651系列單片機(jī)匯編程序設(shè)計(jì) 程序如下: ORG0000H MOVR0,#0 MOVR1,#100 MOVDPTR,#2000HLOOP: MOVXA,@DPTR INCDPTR JNBACC.7,NEXT;如果A最高位為0,則;大于等于0,不計(jì)入 INCR0

§3.651系列單片機(jī)匯編程序設(shè)計(jì)NEXT:DJNZR1,LOOP;將R1減1,如果大于0表明循環(huán)繼續(xù) SJMP$END §3.651系列單片機(jī)匯編程序設(shè)計(jì)例3-30:一個(gè)字符串存放在外部RAM中,起始地址為3000H,求這個(gè)字符串的長(zhǎng)度,放入R0寄存器中。解:根據(jù)字符串的原理,將字符串的每個(gè)字符所對(duì)應(yīng)的ASCII碼按順序存放在存儲(chǔ)器中,字符串的結(jié)尾是一個(gè)ASCII碼為0的結(jié)尾符。很顯然,該程序是一個(gè)循環(huán)次數(shù)不固定的程序,該循環(huán)的結(jié)束條件是從外部RAM中得到的當(dāng)前字符的ASCII碼是否為0。如果是0,表明該字符串到此結(jié)束。

程序流程圖如下:§3.651系列單片機(jī)匯編程序設(shè)計(jì)§3.651系列單片機(jī)匯編程序設(shè)計(jì)

ORG0000H MOVR0,#-1;在循環(huán)中,至少要進(jìn)行一次加法,所以計(jì)數(shù)值初始值為-1 MOVDPTR,#3000HL00P: MOVXA,@DPTR;將當(dāng)前字符的ASCII碼送入A寄存器 INCDPTR INCR0 CJNEA,#0,LOOP;如果當(dāng)前字符的ASCII碼不為0,循環(huán)繼續(xù)LEND:SJMP$ END§3.651系列單片機(jī)匯編程序設(shè)計(jì)3.6.4查表程序設(shè)計(jì)在程序設(shè)計(jì)中,查表功能是一項(xiàng)非常重要的功能。查表就是根據(jù)自變量x,在表格中尋找y,使y=f(x)。自變量x的范圍一般是一個(gè)連續(xù)變化的整數(shù),比如0~99之間的整數(shù)。因此,可以將所對(duì)應(yīng)的y值按自變量x的順序排列在一起,就得到了一個(gè)線性表。根據(jù)x的值求取y值,只需要在這個(gè)線性表中查詢相應(yīng)的單元即可,稱之為查表功能。指令“MOVCA,@A+DPTR”完成把A中的內(nèi)容作為一個(gè)無(wú)符號(hào)數(shù)與DPTR中的內(nèi)容相加,所得結(jié)果為某一程序存儲(chǔ)單元的地址,然后把該地址單元中的內(nèi)容送到累加器A中。§3.651系列單片機(jī)匯編程序設(shè)計(jì)

例3-31:在一個(gè)以MCS-51為核心的溫度控制器中,溫度傳感器輸出的

溫馨提示

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