第2章MCS51單片機(jī)指令系統(tǒng)_第1頁(yè)
第2章MCS51單片機(jī)指令系統(tǒng)_第2頁(yè)
第2章MCS51單片機(jī)指令系統(tǒng)_第3頁(yè)
第2章MCS51單片機(jī)指令系統(tǒng)_第4頁(yè)
第2章MCS51單片機(jī)指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩81頁(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)介

第2章51單片機(jī)的指令系統(tǒng)概述計(jì)算機(jī)通過(guò)執(zhí)行程序完成人們指定的任務(wù),程序由一條一條指令構(gòu)成,能為CPU識(shí)別并執(zhí)行的指令的集合就是該CPU的指令系統(tǒng)。以助記符表示的指令是計(jì)算機(jī)的匯編語(yǔ)言,使用匯編語(yǔ)言編寫的程序稱為匯編語(yǔ)言程序。匯編指令與機(jī)器指令一一對(duì)應(yīng)。MCS-51單片機(jī)匯編語(yǔ)言指令格式:

操作符目的操作數(shù),源操作數(shù)操作符指明該指令完成什么操作;操作數(shù)是指明該指令的操作對(duì)象。目的操作數(shù)是存放結(jié)果的。指令中操作數(shù)提供的方式稱為尋址方式。2.1尋址方式指令的操作對(duì)象是操作數(shù),而操作數(shù)可以是立即數(shù)或存放立即數(shù)的地址,尋址方式就是尋找立即數(shù)的地址。51單片機(jī)的指令系統(tǒng)有7種尋址方式。1、立即尋址指令中直接給出操作數(shù)的尋址方式。在51系列單片機(jī)的指令系統(tǒng)中,立即數(shù)用一個(gè)前面加“#“號(hào)的8位數(shù)(#data,如#30H)或16位數(shù)(#data16,如#2052H)表示。立即尋址中的數(shù),稱為立即數(shù)。 【例2-1】MOVA,#80H2、直接尋址操作數(shù)的地址直接出現(xiàn)在指令中。

【例2-2】MOVA,25h ;假設(shè)(25h)=55h

執(zhí)行完A=55h MOVP0,#45h注意:

在指令中,立即數(shù)以#開(kāi)頭,地址直接給出;但是,在注釋時(shí)我們習(xí)慣上,立即數(shù)直接寫出,地址加括號(hào)。3、寄存器尋址操作數(shù)存放在寄存器中。

【例2-3】MOVA,R0 ;假設(shè)R0=3Ah

執(zhí)行完A=3Ah注意:movP0,#45h中的P0不是寄存器尋址,特殊功能寄存器不是真正的寄存器,只是符號(hào)地址,只有A,B,R0~R7,DPTR是真正的寄存器,初學(xué)者大致了解,不必深究。比如:movA,#12h ;寄存器尋址

mov0E0h,#12h ;直接尋址,E0h是A的地址

movACC,#12h ;直接尋址,ACC是的符號(hào)地址, 即E0h

第二條指令和第三條指令是相同指令4、寄存器間接尋址操作數(shù)存放在以寄存器內(nèi)容為地址的單元中。

【例2-4】MOV@R0,A ;假設(shè)R0=3Ah,A=55h

執(zhí)行完(3Ah)=55h

特別注意的是,間址寄存器只能用R0、R1或者DPTR。5、變址尋址變址尋址只用于訪問(wèn)程序存儲(chǔ)器。它是以DPTR或PC作基址寄存器,以累加器A作變址寄存器,并以兩者內(nèi)容相加形成的16位地址作為操作數(shù)地址,以達(dá)到訪問(wèn)操作數(shù)的目的。

MOVCA,@A+DPTR

MOVCA,@A+PC關(guān)于數(shù)據(jù)指針(DPTR):數(shù)據(jù)指針為16位寄存器,它是51單片機(jī)中唯一一個(gè)供用戶使用的16位寄存器,尋址范圍為64K。DPTR由兩個(gè)8位普通寄存器組成,分別為DPH(高8位)和DPL(低8位),一般用于片外RAM的尋址訪問(wèn)。6、相對(duì)尋址以當(dāng)前程序計(jì)數(shù)器PC的內(nèi)容為基值,加上指令給出的一字節(jié)補(bǔ)碼數(shù)(偏移量)形成新的PC值的尋址方式為相對(duì)尋址。相對(duì)尋址是為了解決程序轉(zhuǎn)移而專門設(shè)置的。

如:sjmp08h;PC=PC+8(當(dāng)前PC=?),跳轉(zhuǎn)到PC+0A地址

;運(yùn)行7、位尋址對(duì)片內(nèi)RAM中20H~2FH中的128個(gè)位地址及SFR中的可位尋址的位地址進(jìn)行操作。

【例2-6】MOV32h,C

MOV26h.2,C2.2數(shù)據(jù)傳送和交換指令

2.2.1傳送類指令1.內(nèi)部RAM數(shù)據(jù)傳送指令:完成寄存器、累加器、RAM單元以及專用寄存器之間(包括立即數(shù))的相互數(shù)據(jù)傳送。 格式如下:

mov<目的操作數(shù)>,<源操作數(shù)>

將源操作數(shù)復(fù)制到目的操作數(shù)。⑴以A為目的操作數(shù) 【例2-7】

movA,Rn ;如movA,R7 movA,dir ;如movA,20h movA,@Ri ;如movA,@R0 movA,#data ;如movA,#55h注意:Rn中的n可以為0~7,Ri中的i可以為0~1⑵以Rn為目的操作數(shù) 【例2-8】

movRn,A ;如movR5,A movRn,dir ;如movR7,40h movRn,#data ;如movR2,#30h⑶以DPTR為目的操作數(shù) 【例2-9】

movDPTR,#data16 ;如movDPTR,#0A123h

與下面兩條指令效果相同 movDPL,#data8 ;如movDPL,#23h movDPH,#data8 ;如movDPH,#0A1h(4)以直接地址為目的操作數(shù) 【例2-10】

movdir,A ;如mov30h,A movdir,Rn ;如mov30h,R6 movdir,dir ;如mov20h,40h movdir,@Ri ;如mov20h,@R1 movdir,#data ;如mov50h,#23h(5)以間接地址為目的操作數(shù) 【例2-11】

mov@Ri,A ;如mov@R0,A

mov@Ri,dir ;如mov@R1,30h

mov@Ri,#data ;如mov@R0,#40h

dir@Ri

Rn#dataA2.外部RAM數(shù)據(jù)傳送指令

movxA,@Ri ;i=0或1

movxA,@DPTR

movx@Ri,A

movx@DPTR,A3.程序存儲(chǔ)器數(shù)據(jù)傳送指令

movcA,@A+DPTR

movcA,@A+PC

注意:數(shù)據(jù)傳送指令不影響程序狀態(tài)字PSW。

在C語(yǔ)言中,賦值運(yùn)算符“=”例子要求:向端口P1寫55H匯編語(yǔ)言 org0000h

ljmpStart org0030h

Start:

movP1,#55h

sjmp$

endC語(yǔ)言#include<reg51.h>main()

{

P1=0x55;

while(1);

}查看反匯編例子已知內(nèi)部RAM中,(30h)=40h,(40h)=50h,(50h)=5Ah,試分析下段程序執(zhí)行后,A=

,R0=

,(30h)=

,(40h)=

,(50h)=

。 mov A,#50h mov R0,A mov @R0,30h 4.堆棧操作

堆棧是一種數(shù)據(jù)結(jié)構(gòu),所謂堆棧就是只允許在其一端進(jìn)行數(shù)據(jù)插入和數(shù)據(jù)刪除操作的線性表。數(shù)據(jù)寫入堆棧稱為入棧。數(shù)據(jù)從堆棧中讀出稱為出棧。堆棧的最大特點(diǎn)就是“后進(jìn)先出”,LIFO(Last-InFirst-Out)。⑴堆棧的功能堆棧主要是為子程序調(diào)用和中斷操作而設(shè)立的。其具體功能有兩個(gè):保護(hù)斷點(diǎn)和保護(hù)現(xiàn)場(chǎng)。此外,堆棧也可用于數(shù)據(jù)的臨時(shí)存放。⑵堆棧的開(kāi)辟堆棧只能開(kāi)辟在芯片的內(nèi)部數(shù)據(jù)存儲(chǔ)器中,方法就是在程序初始化時(shí),將堆棧指針(專用寄存器SP)指向棧底減1。⑶關(guān)于堆棧指針SPSP是專用寄存器的一員。系統(tǒng)復(fù)位后,SP的內(nèi)容為07h,在主程序初始化時(shí)需要更改,以將堆棧區(qū)開(kāi)辟在內(nèi)部RAM30h~7Fh區(qū)域。SP的內(nèi)容就是堆棧棧頂?shù)拇鎯?chǔ)單元地址。⑷堆棧的使用方式堆棧的使用有兩種方式:一種是自動(dòng)方式,用于在調(diào)用子程序或中斷時(shí)保存斷點(diǎn)和程序返回時(shí)恢復(fù)斷點(diǎn)。另一種是指令方式。⑸堆棧操作指令:有進(jìn)棧和出棧兩條。

pushdirect;sp←sp+1,(sp)←(direct)將內(nèi)部RAM低128單元或?qū)S眉拇嫫鲀?nèi)容送棧頂單元。

popdirect;(direct)←(sp),sp←sp-1

將棧頂單元內(nèi)容送內(nèi)部RAM低128單元或?qū)S眉拇嫫鳌?/p>

【教材第34頁(yè)末例子】××片內(nèi)RAM50H70h31h30hSP××片內(nèi)RAM50H70h50H××執(zhí)行前執(zhí)行前push70h指令后31hSP30h××片內(nèi)RAM50H60h31h30hSP××片內(nèi)RAM50H60h50H××執(zhí)行前執(zhí)行前pop60h指令后31hSP30h例子如圖為執(zhí)行push指令前的片內(nèi)RAM,問(wèn)執(zhí)行指令push60h后SP=

,(50h)=

,(51h)=

,(60h)=

。SP60h56h51h34h50h12h4.數(shù)據(jù)交換指令:將源操作數(shù)和目的操作數(shù)(A)的整字節(jié)或半字節(jié)交換。⑴整字節(jié)交換指令,共三條指令: 【教材第35例子】

xchA,Rn ;A?Rn xchA,direct ;A?(direct) xchA,@Ri ;A?(Ri)⑵半字節(jié)交換指令,只一條指令:

xchdA,@Ri ;A3~0?(Ri)3~0⑶累加器高低半字節(jié)交換指令:

swapA ;A3~0?A7~42.3算術(shù)運(yùn)算類指令1.加法指令

addA,Rn ;A←A+Rn addA,direct ;A←A+(direct) addA,@Ri ;A←A+(Ri) addA,#data ;A←A+data

注意,加法指令目的操作數(shù)必須是累加器A。加法指令對(duì)程序狀態(tài)字PSW的CY、AC和OV有影響。

2.帶進(jìn)位加法指令

addcA,Rn ;A←A+Rn+CY addcA,direct ;A←A+(direct)+CY addcA,@Ri ;A←A+(Ri)+CY addcA,#data ;A←A+data+CY

在C語(yǔ)言中,加法運(yùn)算符“+”例子計(jì)算兩個(gè)8位數(shù)12h+34h=36h,結(jié)果由P1端口輸出。匯編 程序格式略

movA,#12h

addA,#34h

movP1,AC

unsignedcharx;

x=0x12;

x=x+0x34;

P1=x;例子計(jì)算兩個(gè)16位數(shù)1082h+1094h=2116h,結(jié)果由P2、P0端口輸出。匯編

movA,#82h

addA,#94h

movP0,A

movA,#10h

addcA,#10h

movP2,AC

unsignedintx;

x=0x1082;

x=x+0x1094;

P0=x;

P2=x>>8;3.帶借位減法指令

subbA,Rn ;A←A-Rn-CY subbA,direct ;A←A-(direct)-CY subbA,@Ri ;A←A-(Ri)-CY subbA,#data ;A←A-data-CY

注意,減法指令目的操作數(shù)必須是累加器A。減法指令對(duì)程序狀態(tài)字PSW的CY、AC和OV有影響。⑴如果位7有借位,則進(jìn)位標(biāo)志CY置1,否則CY清0。⑵如果位3有借位,則進(jìn)位標(biāo)志AC置1,否則AC清0。

在C語(yǔ)言中,減法運(yùn)算符“-”例子計(jì)算兩個(gè)8位數(shù)34h-12h=21h,結(jié)果由P1端口輸出。匯編

movA,#34h

clrC

subbA,#12h

movP1,AC

unsignedcharx;

x=0x34;

x=x-0x12;

P1=x;4.加1指令

incA ;A←A+1 incRn ;Rn←Rn+1 incdirect ;(direct)←(direct)+1 inc@Ri ;(Ri)←(Ri)+1 incDPTR ;DPTR←DPTR+1

加1指令不影響程序狀態(tài)字PSW的狀態(tài).5.減1指令

decA ;A←A-1 decRn ;Rn←Rn-1 decdirect ;(direct)←(direct)-1 dec@Ri ;(Ri)←(Ri)-1

減1指令不影響程序狀態(tài)字PSW的狀態(tài).注:decDPTR非法。

在C語(yǔ)言中,自增、自減運(yùn)算符“++”、“--”例子已知內(nèi)部RAM中,(30h)=70h,(40h)=90h,(50h)=5Ah,試分析下段程序執(zhí)行后,A=

,R1=

,(30h)=

,(40h)=

,(50h)=

,C=

。 mov A,#30h

mov R1,A

mov A,40h

add A,@R1

mov 40h,A

dec A

mov 30h,A 6.乘法指令

mulAB ;BA←A*B

該指令將A與B中的兩個(gè)無(wú)符號(hào)數(shù)相乘,16位的積低位字節(jié)在A中,高位字節(jié)在B中。乘法指令影響PSW的狀態(tài),CY總被清0。如果乘積超過(guò)255,OV置1,否則清0。7.乘法指令

divAB ;A/B

該指令將A與B中的兩個(gè)無(wú)符號(hào)數(shù)相除,商存于A中,余數(shù)存于B中。除法指令影響PSW的狀態(tài),CY總被清0。如果除數(shù)為0,OV置1,否則清0。

在C語(yǔ)言中,乘除運(yùn)算符“*”,“/”8.十進(jìn)制調(diào)整指令⑴十進(jìn)制調(diào)整問(wèn)題在MCS-51中沒(méi)有專門的十進(jìn)制數(shù)(BCD碼)的加法指令,只能采用add和addc對(duì)十進(jìn)制數(shù)進(jìn)行加法運(yùn)算。但是有可能產(chǎn)生錯(cuò)誤。⑵十進(jìn)制調(diào)整指令的格式

daA

調(diào)整規(guī)則:若A低4位>9或AC=1,則A←A+06h;若A高4位>9或CY=1,則A←A+60h;若同時(shí)上述兩種情況,則A←A+66h;

6+3=98+7=158+9=17011010001000+0011+0111+10011001111110001√××2.3邏輯運(yùn)算和移位類指令1.邏輯與運(yùn)算指令

anlA,Rn ;A←A∧Rn anlA,direct ;A←A∧direct anlA,@Ri ;A←A∧(Ri) anlA,#data ;A←A∧data anldirect,A ;A←direct∧A anldirect,#data ;direct←direct∧data2.邏輯或運(yùn)算指令

orlA,Rn ;A←A∨Rn orlA,direct ;A←A∨direct orlA,@Ri ;A←A∨(Ri) orlA,#data ;A←A∨data orldirect,A ;A←direct∨A orldirect,#data ;direct←direct∨data3.邏輯異或運(yùn)算指令

xrlA,Rn ;A←A⊕Rn xrlA,direct ;A←A⊕direct xrlA,@Ri ;A←A⊕(Ri) xrlA,#data ;A←A⊕data xrldirect,A ;A←direct⊕A xrldirect,#data;direct←direct⊕data4.累加器清0和取反指令

clrA ;A←0 cplA ;A←A取反

在C語(yǔ)言中,位運(yùn)算符“&”,“|”,“^”,“~”例子將一個(gè)8位數(shù)34h的高四位清0,結(jié)果由P1端口輸出。匯編

movA,#34h

anlA,#0Fh

movP1,AC

unsignedcharx;

x=0x34;

x=x&0x0F;

P1=x;例子已知內(nèi)部RAM中,(30h)=23h,(40h)=65h,(50h)=5Ah,試分析下段程序執(zhí)行后,A=

,R0=

,(30h)=

,(40h)=

,(50h)=

。 mov A,#50h

mov R0,A

mov A,40h

anl A,@R0

mov 30h,A

orl A,#0Fh

mov 40h,A

xrl A,#0F0h

mov 50h,A 5.移位指令⑴循環(huán)左移

rlA ;An+1←An,A0←A7

該指令具有將A乘2的功能。⑵循環(huán)右移

rrA ;An←An+1,A7←A0

該指令具有將A除2的功能。⑶帶進(jìn)位位循環(huán)左移

rlcA ;An+1←An,CY←A7,A0←CY⑷帶進(jìn)位位循環(huán)右移

rrcA ;An←An+1,A7←CY,CY←A0

注:邏輯指令除了rlc和rrc影響CY以外,其它的一律不影響PSW的狀態(tài)。

在C語(yǔ)言中,移位運(yùn)算符“<<”,“>>”AAACYACY例子將一個(gè)8位數(shù)12h*4,結(jié)果由P1端口輸出。匯編

movA,#12h

rlA

rlA

movP1,AC

unsignedcharx;

x=0x12;

x=x<<2;

P1=x;例子已知內(nèi)部RAM中,(30h)=23h,(40h)=65h,(50h)=5Ah,試分析下段程序執(zhí)行后,(30h)=

,(40h)=

,(50h)=

。 mov A,30h

rl A

mov 30h,A

rl A

mov 40h,A

rl A

mov 50h,A 【教材例2-15】將21H單元的低三位和20H單元中的低五位合并為一個(gè)字送30H單元,要求(21H)的低三位放在高位上。

MOV 30H,20H ;(30H)=(20H)

ANL 30H,#1FH ;保留低五位

MOV A,21H ;A=(21H)

SWAPA ;高低四位交換

RL A ;低三位變到高三位位置

ANL A,#0E0H;保留高三位

ORL 30H,A ;和(30H)的低五位合并

SJMP$2.4控制轉(zhuǎn)移指令

2.4.1調(diào)用程序和返回類指令子程序是一種重要的程序結(jié)構(gòu)。在一個(gè)程序中經(jīng)常遇到反復(fù)多次執(zhí)行某程序段的情況,對(duì)次,可采用子程序結(jié)構(gòu),通過(guò)主程序調(diào)用而使用它。1、長(zhǎng)調(diào)用指令

lcalladdrl16;addr16→PC0~15說(shuō)明:(1)該指令功能是①保護(hù)斷點(diǎn),即當(dāng)前PC(本指令的下一條指令的首地址)壓入堆棧。②子程序的入口地址addr16送PC,轉(zhuǎn)子程序執(zhí)行。(2)本指令為64KB地址范圍內(nèi)的調(diào)子程序指令,子程序可在64KB地址空間的任一處。2、短調(diào)用(絕對(duì)調(diào)用) acalladdr11;addr11→PC0~10說(shuō)明:(1)該指令的功能是①保護(hù)斷點(diǎn),即當(dāng)前PC壓入堆棧。②addrl11→PC0~10,而PC11~15保持原值不變。(2)本指令為2KB地址范圍的調(diào)子程序指令,子程序入口距當(dāng)前PC不得超過(guò)2KB地址范圍。3、子程序返回指令 ret ;從調(diào)用子程序返回。功能:從棧頂彈出斷點(diǎn)到PC。 reti ;從中斷服務(wù)程序返回。功能:從棧頂彈出斷點(diǎn)到PC,并恢復(fù)中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器。

關(guān)于中斷服務(wù)程序返回指令以后再說(shuō)。

在C語(yǔ)言中,子程序在C語(yǔ)言中表現(xiàn)為函數(shù)例子: main() sub()

{ { … … sub(); } … }例子定義兩個(gè)子程序,由主程序調(diào)用,一個(gè)子程序向P2輸出55h,一個(gè)子程序向P0輸出AAh匯編

lcallSub1

lcallSub2

sjmp$Sub1:

movP2,#55h

retSub2:

movP0,#0AAh

ret C

Sub1()

{P2=0x55;

} Sub2()

{P0=0xAA;

} main()

{Sub1();

Sub2();

while(1);

}2.4.2轉(zhuǎn)移指令程序的順序執(zhí)行是由PC自動(dòng)加1實(shí)現(xiàn)的。要改變程序的執(zhí)行順序,實(shí)現(xiàn)分支轉(zhuǎn)向,應(yīng)通過(guò)強(qiáng)迫改變PC值的方法來(lái)實(shí)現(xiàn),這就是控制轉(zhuǎn)移類指令的基本功能。共有兩類指令:無(wú)條件轉(zhuǎn)移和有條件轉(zhuǎn)移。子程序調(diào)用也是通過(guò)改變PC實(shí)現(xiàn)的,只是子程序調(diào)用需要返回,轉(zhuǎn)移指令不需要返回。1.無(wú)條件轉(zhuǎn)移指令

MCS-51共有四條無(wú)條件轉(zhuǎn)移指令:(1)短轉(zhuǎn)移

ajmpaddr11;addr11→PC0~10說(shuō)明:轉(zhuǎn)移范圍:本指令為2KB地址范圍內(nèi)的轉(zhuǎn)移指令。對(duì)轉(zhuǎn)移目的地址的要求與ACALL指令對(duì)子程序入口地址的要求相同。(2)長(zhǎng)轉(zhuǎn)移 ljmpaddr16;addr16→PC0~15說(shuō)明:本指令為64KB程序存儲(chǔ)空間的全范圍轉(zhuǎn)移指令。轉(zhuǎn)移地址可為16位地址中的任意值。(3)間接轉(zhuǎn)移

jmp@A+DPTR;A+DPTR→PC例A=02H,DPTR=2000H,指令JMP@A+DPTR執(zhí)行后,PC=2002H。也就是說(shuō),程序轉(zhuǎn)移到2002H地址單元去執(zhí)行(4)無(wú)條件相對(duì)轉(zhuǎn)移(短轉(zhuǎn)移)

sjmprel;PC+rel→PC, 即As+2+rel→PC說(shuō)明:

As為源地址(本指令的首地址),該指令為2字節(jié)指令,執(zhí)行本指令時(shí)當(dāng)前PC=As+2,

rel為轉(zhuǎn)移的偏移量,轉(zhuǎn)移可以向前轉(zhuǎn)(目的地址小于源地址),也可以向后轉(zhuǎn)(目的地址大于源地址),因此偏移量rel是1字節(jié)有符號(hào)數(shù),用補(bǔ)碼表示(-128~+127),所以指令轉(zhuǎn)移范圍在離源地址As的-126~+129字節(jié)之間。

在C語(yǔ)言中,“goto”例子無(wú)條件跳轉(zhuǎn)到標(biāo)號(hào)為L(zhǎng)abel處匯編

ljmpLabel

ajmpLabel

sjmpLabel

C

gotoLabel;2.條件轉(zhuǎn)移指令組所謂條件轉(zhuǎn)移指令就是程序轉(zhuǎn)移是有條件的。規(guī)則是,執(zhí)行條件轉(zhuǎn)移指令時(shí),如指令中規(guī)定的條件滿足,則進(jìn)行程序轉(zhuǎn)移,否則程序順序執(zhí)行。注意,條件轉(zhuǎn)移指令所采用的尋址方式都是相對(duì)尋址方式,計(jì)算方法同sjmp指令。⑴累加器判零轉(zhuǎn)移指令

jzrel ;ifA=0jump,elsenext jnzrel ;ifA≠0jump,elsenext⑵減1條件轉(zhuǎn)移指令

djnzRn,rel ;Rn←Rn-1,ifRn!=0jump,elsenext djnzdirect,rel ;(direct)←(direct)-1,if(direct)!=0jump,elsenext⑶數(shù)值比較轉(zhuǎn)移指令

cjneA,#data,rel ;ifA!=datajump,elsenext cjneA,direct,rel ;ifA!=(direct)jump,elsenext cjneRn,#data,rel ;ifRn!=datajump,elsenext cjne@Ri,#data,rel ;if(Ri)!=datajump,elsenext

⑷以C狀態(tài)為條件的轉(zhuǎn)移指令 (教材第45頁(yè))

jcrel ;ifC=1jump,elsenext jncrel ;ifC=0jump,elsenext⑸以位狀態(tài)為條件的轉(zhuǎn)移指令

jbbit,rel ;if(bit)=1jump,elsenext jnbbit,rel ;if(bit)=0jump,elsenext jbcbit,rel ;if(bit)=1jumpand(bit)←0,elsenext

在C語(yǔ)言中,無(wú)條件轉(zhuǎn)移“goto”有條件轉(zhuǎn)移

ifelse 分支一

switchcase 分支二

for() 循環(huán)一

while() 循環(huán)二

do while() 循環(huán)三分支程序例子實(shí)現(xiàn)下列計(jì)算:

并由P1端口輸出開(kāi)始X=5?NYP1=0X>5?NYP1=1結(jié)束匯編

movA,#5

cjneA,#5,NotEqual

movP1,#0

sjmpExit

NotEqual:

clrC

subbA,#5

jncbigger

sjmpExit

bigger:

movP1,#1

Exit: C

unsignedcharx;

x=5;

if(x==5)P1=0;

elseif(x>5)P1=1;循環(huán)程序例子實(shí)現(xiàn)下列計(jì)算1+2+3+4+5+6+7+8+9+10,

并由P1端口輸出開(kāi)始Sum=0,i=10Sum=Sum+ii減1YX=0?NP1=Sum結(jié)束循環(huán)程序例子匯編

clrA

movR0,#10

Loop:

addA,R0

djnzR0,Loop

movP1,A C

unsignedchari,sum;

i=10;

sum=0;

do

{

sum=sum+i;

i--;

}

while(i);

P1=sum;例子已知內(nèi)部RAM中,(30h)=23h,(40h)=65h,試分析下段程序執(zhí)行后,P1=

。 mov A,30h

clr C

subb A,40h

jc Label

mov P1,#55h

sjmp Exit

Label:

mov P1,#0AAh

Exit: 【例2-28】將A累加器的低四位取反四次、高四位不變。每變換一次,從P1輸出。方法1:加1計(jì)數(shù): MOVR0,#0 ;計(jì)數(shù)初值送0LL: XRLA,#0FH ;高4位不變,低四位取反

INCR0 ;次數(shù)加1 MOVP1,A ;從P1輸出

CJNER0,#04,LL ;不滿四次循環(huán)

RET方法2:減1計(jì)數(shù): MOVR0,#04H;計(jì)數(shù)初值送4LL: XRLA,#0FH MOVP1,A DJNZR0,LL;次數(shù)減1不等于0循環(huán)

RET2.4.3空操作指令

nop該指令經(jīng)取指,譯碼后不進(jìn)行任何操作(空操作)而轉(zhuǎn)到下一條指令,常用于生產(chǎn)一個(gè)機(jī)器周期的延時(shí)。2.5

位操作指令所謂位處理,就是以位為單位進(jìn)行的運(yùn)算和操作。位操作的對(duì)象是內(nèi)部RAM位尋址區(qū)的128個(gè)可尋址位和專用寄存器的可尋址位。位累加器采用進(jìn)位位CY。在程序中位地址的表達(dá)有多種方式:1)用直接位地址表示,如D4H。2)用“·”操作符號(hào)表示,如PSW.4,或D0H.43)用位名稱表示,如RS11.位清零、位置1

CLR C ;0→CY

CLR bit ;0→bit SETB C ;1→CY SETB bit ;1→bit3.位傳送

MOVC,bit ;bit→CY MOVbit,C ;CY→bit

在C語(yǔ)言中,賦值運(yùn)算符“=”2.位與、位或、取反

ANLC,bit ;CY∧(bit)→CY

ANLC,/bit ;CY∧(/bit)→CY

ORLC,bit ;CY∨(bit)→CY

ORLC,/bit ;CY∨(/bit)→CY CPL C ;CY取反 CPL bit ;bit取反

在C語(yǔ)言中,位運(yùn)算符“&”、“|”、“~”例子將P1端口的引腳0置1,引腳1清0,引腳2取反匯編

setbP1.0

clrP1.1

cplP1.2 C

sbitx=P1^0;

sbity=P1^1;

sbitz=P1^2; x=1;

y=0;

z=~z;MCS-51匯編語(yǔ)言程序設(shè)計(jì)

無(wú)論哪一種嵌入式系統(tǒng),都有兩種編程語(yǔ)言---匯編語(yǔ)言和高級(jí)語(yǔ)言(一般為C語(yǔ)言)。匯編語(yǔ)言產(chǎn)生的目標(biāo)程序簡(jiǎn)短,占用存儲(chǔ)空間小,執(zhí)行快,能充分發(fā)揮計(jì)算機(jī)的硬件功能。無(wú)論是高級(jí)語(yǔ)言還是匯編語(yǔ)言,源程序都要轉(zhuǎn)換成目標(biāo)程序(機(jī)器語(yǔ)言)單片機(jī)才能執(zhí)行;高級(jí)語(yǔ)言編程快捷,但程序長(zhǎng),占用存儲(chǔ)空間大,執(zhí)行慢。

無(wú)論是高級(jí)語(yǔ)言還是匯編語(yǔ)言,源程序都要轉(zhuǎn)換成目標(biāo)程序(機(jī)器語(yǔ)言),經(jīng)Keil編譯后的51目標(biāo)程序?yàn)镠EX文件格式。參考教材第3章單片機(jī)匯編語(yǔ)言概述單片機(jī)匯編語(yǔ)言就是單片機(jī)匯編指令的集合,其采用了助記符的形式來(lái)描述指令。優(yōu)點(diǎn):程序代碼精煉,執(zhí)行速度快;每條指令的執(zhí)行時(shí)間確定,特別適合于對(duì)時(shí)序要求比較高的場(chǎng)合;占用內(nèi)存單元和CPU資源比較少;和硬件結(jié)構(gòu)和資源密切相關(guān),對(duì)于理解單片機(jī)的運(yùn)行和組成很有幫助。缺點(diǎn):指令和具體的硬件密切相關(guān),缺乏通用性;采用助記符描述的指令還是不夠清晰,代碼比較難懂;使用匯編語(yǔ)言編寫程序時(shí),必須熟悉單片機(jī)的指令系統(tǒng)、尋址方式、寄存器的設(shè)置和使用方法,以及系統(tǒng)的硬件資源等。分散了開(kāi)發(fā)人員用于程序結(jié)構(gòu)和功能上的精力;MCS-51匯編語(yǔ)言由四部分組成,格式如下:

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

標(biāo)號(hào)是指令的符號(hào)地址,有關(guān)標(biāo)號(hào)的規(guī)定如下:①標(biāo)號(hào)頭一個(gè)字符必須是字母;②不能使用本匯編語(yǔ)言已經(jīng)定義了的符號(hào)作為標(biāo)號(hào);③標(biāo)號(hào)后邊必須跟以冒號(hào)(:);④同一個(gè)標(biāo)號(hào)在一個(gè)程序中只能定義一次,不能重復(fù)定義。注釋用“;”開(kāi)頭,對(duì)語(yǔ)句解釋說(shuō)明。偽指令偽指令,顧名思義,并不是真正的單片機(jī)指令。偽指令僅為單片機(jī)匯編程序提供某種標(biāo)記信息,但卻是程序中不可缺少的部分。偽指令與單片機(jī)指令的區(qū)別如下:偽指令不能命令CPU執(zhí)行某種操作,也沒(méi)有對(duì)應(yīng)的機(jī)器代碼。單片機(jī)指令能使單片機(jī)的CPU執(zhí)行某種操作,并可以生成對(duì)應(yīng)的機(jī)器代碼。起始偽指令ORG起始偽指令ORG用于標(biāo)記一個(gè)匯編語(yǔ)言程序的開(kāi)始。這里,16位地址便是匯編程序塊或數(shù)據(jù)塊存放的起始地址。如果省略O(shè)RG偽指令,則單片機(jī)程序代碼將默認(rèn)從0000H單元開(kāi)始存放。[標(biāo)號(hào):] ORG 16位地址使用格式結(jié)束偽指令END結(jié)束偽指令END用于標(biāo)記一個(gè)匯編語(yǔ)言程序的結(jié)束。這里,標(biāo)號(hào)和表達(dá)式都可以省略。在匯編語(yǔ)言程序執(zhí)行時(shí),END之后所寫的任何指令都不予以處理。一個(gè)程序只能有一個(gè)END偽指令。[標(biāo)號(hào):] END [表達(dá)式]使用格式兩個(gè)最常用的偽指令

(1)ORG:匯編起始地址用來(lái)說(shuō)明其后一段程序在存儲(chǔ)器中存放的起始地址。(2)END:匯編結(jié)束 org0000h

ljmpStart org0030h

Start:

movP1,#55h

;端口P1寫55h

sjmp$

end注:匯編語(yǔ)言很有用,但初學(xué)者不要深究等值偽指令EQU等值偽指令EQU相當(dāng)于重命名的概念,其采用一個(gè)規(guī)定的字符名稱來(lái)代替一個(gè)數(shù)或特定的匯編符號(hào)。使用偽指令EQU時(shí)必須先賦值,后使用,而不能先使用后賦值。另外,給字符名稱所賦的值可以是8位數(shù),也可以是16位數(shù)。用EQU定義的字符名稱不能和匯編語(yǔ)言的關(guān)鍵字同名。字符名稱 EQU 數(shù)據(jù)或匯編符號(hào)或者字符名稱 = 數(shù)據(jù)或匯編符號(hào)使用格式地址賦值偽指令DATA地址賦值偽指令DATA是用指定的字符名稱來(lái)代替數(shù)據(jù)地址或代碼地址。DATA偽指令在程序中常用來(lái)定義數(shù)據(jù)地址。就功能上來(lái)說(shuō),偽指令DATA與EQU有些類似。區(qū)別如下:EQU偽指令必須先定義后使用,而DATA偽指令則無(wú)此限制;EQU偽指令可以把一個(gè)匯編符號(hào)賦給一個(gè)字符名稱,而DATA偽指令則不能;DATA偽指令可將一個(gè)表達(dá)式的值賦給一個(gè)字符變量,所定義的字符變量也可以出現(xiàn)在表達(dá)式中,而EQU定義的字符則不能這樣使用。字符名稱 DATA 表達(dá)式字節(jié)保存?zhèn)沃噶頓B字節(jié)保存?zhèn)沃噶頓B用于在單片機(jī)內(nèi)存中保存數(shù)據(jù)表,只能對(duì)程序存儲(chǔ)器進(jìn)行操作。其中,8位字節(jié)數(shù)據(jù)表可以是一個(gè)或多個(gè)字節(jié)數(shù)據(jù)、字符串或表達(dá)式。在數(shù)據(jù)表中,各項(xiàng)數(shù)據(jù)用“,”分隔,一個(gè)數(shù)據(jù)項(xiàng)占一個(gè)存儲(chǔ)單元。所有的數(shù)據(jù)項(xiàng)是從標(biāo)號(hào)指定的地址單元開(kāi)始,將數(shù)據(jù)表中的字節(jié)數(shù)據(jù)按順序依次保存。數(shù)據(jù)項(xiàng)可以采用十進(jìn)制、二進(jìn)制或者十六進(jìn)制表示。[標(biāo)號(hào):] DB 8位字節(jié)數(shù)據(jù)表字保存?zhèn)沃噶頓W字保存?zhèn)沃噶頓W用于在單片機(jī)內(nèi)存中保存雙字節(jié)數(shù)據(jù)表,只能對(duì)程序存儲(chǔ)器進(jìn)行操作。其中,16位字?jǐn)?shù)據(jù)表可以是一個(gè)或多個(gè)字節(jié)數(shù)據(jù)、字符串或表達(dá)式。在數(shù)據(jù)表中,各項(xiàng)數(shù)據(jù)用“,”分隔,一個(gè)數(shù)據(jù)項(xiàng)占一個(gè)存儲(chǔ)單元。所有的數(shù)據(jù)項(xiàng)是從標(biāo)號(hào)指定的地址單元開(kāi)始,將數(shù)據(jù)表中的字節(jié)數(shù)據(jù)按順序依次保存。16位數(shù)據(jù)要占用兩個(gè)單元的存儲(chǔ)器,高8位數(shù)據(jù)存入低地址字節(jié),低8位數(shù)據(jù)存入高地址字節(jié)。[標(biāo)號(hào):] ORG 16位地址空間預(yù)留偽指令DS空間預(yù)留偽指令DS用于在單片機(jī)內(nèi)存中劃分出一定的存儲(chǔ)空間用作備用區(qū)域,只能對(duì)程序存儲(chǔ)器進(jìn)行操作。這里,表達(dá)式表示了從標(biāo)號(hào)指定的地址單元開(kāi)始,保留存儲(chǔ)單元的個(gè)數(shù)。[標(biāo)號(hào):] DS 表達(dá)式位變量偽指令BIT位變量偽指令BIT用于給位地址定義一個(gè)字符名稱。其中,位地址需要參考單片機(jī)中的定義,字符名稱就是位變量。字符名稱 BIT 位地址單片機(jī)匯編語(yǔ)言的程序結(jié)構(gòu)程序結(jié)構(gòu)就是程序指令的組織方式。單片機(jī)匯編語(yǔ)言程序大致可以分為5種程序結(jié)構(gòu):順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)查表結(jié)構(gòu)順序結(jié)構(gòu)順序結(jié)構(gòu)程序是按照指令的書寫順序來(lái)執(zhí)行的程序結(jié)構(gòu),相當(dāng)于人們?cè)谧魇虑闀r(shí),嚴(yán)格按照一個(gè)計(jì)劃表來(lái)執(zhí)行。順序結(jié)構(gòu)是一種無(wú)分支的直線型程序結(jié)構(gòu),一種最簡(jiǎn)單、最基本的程序。在該程序中,單字節(jié)十六進(jìn)制數(shù)據(jù)在0~255之間,存放在單片機(jī)RAM的32H中。首先將其除100后,商為百位數(shù),余數(shù)除以10,商為十位數(shù),余數(shù)為個(gè)位數(shù)。程序轉(zhuǎn)換后,百位數(shù)存放于R5中,十位和個(gè)位分別存放于R6的高位和低位字節(jié)中。順序結(jié)構(gòu)01 ORG 0200H ;匯編程序起始指令02 MOV A, 32H ;將單字節(jié)數(shù)據(jù)存入累加器A中03 MOV B, #100 ;分離出百位數(shù)04 DIV AB05 MOV R5, A ;百位數(shù)送入寄存器R506 XCH A, B ;余數(shù)存入累加器A中07 MOV B, #10 ;分離出十位和個(gè)位08 DIV AB09 SWAP A ;十位存入高字節(jié)10 ADD A, B ;低位存入低字節(jié)中11 MOV R6, A12 END ;匯編程序結(jié)束命令分支結(jié)構(gòu)分支結(jié)構(gòu)是一種判斷形式的程序結(jié)構(gòu),相當(dāng)于人們?cè)谧魇虑闀r(shí),根據(jù)判斷的結(jié)果來(lái)覺(jué)得后面做那件事。分支結(jié)構(gòu)的程序判斷條件的滿足與否,產(chǎn)生一個(gè)或多個(gè)程序分支,以實(shí)現(xiàn)不同的程序走向。分支結(jié)構(gòu)按照采用指令的不同而分為兩類:雙分支結(jié)構(gòu)。這類分支結(jié)構(gòu)主要采用有條件轉(zhuǎn)移指令JC、JB等,比較條件轉(zhuǎn)移指令CJNE等和累加器A判斷指令JZ等。當(dāng)給定的條件成立時(shí),執(zhí)行分支程序1,否則執(zhí)行分支程序2。多分支結(jié)構(gòu)。這類結(jié)構(gòu)主要采用散轉(zhuǎn)指令JMP,根據(jù)運(yùn)算的結(jié)果指在多個(gè)分支中選擇一個(gè)執(zhí)行的程序結(jié)構(gòu)。分支結(jié)構(gòu)示例01 ORG 0200H ;匯編程序起始命令02 MOV A,R4 ;低字節(jié)送入累加器A03 CPL A ;取反04 ADD A,#01H ;加105 MOV 22H,A ;將結(jié)果送入地址22H06 JZ ZERO ;如果A的值為零則轉(zhuǎn)向ZERO07 MOV A,R3 ;高字節(jié)送入累加器A08 CPL A ;取反09 MOV 21H,A ;將結(jié)果送入地址21H10 SJMP FEND ;轉(zhuǎn)結(jié)束11 ZERO: MOV A,R3 ;高字節(jié)送入累加器A12 CPL A ;取反13 INC A ;加一14 MOV 21H,A ;將結(jié)果送入地址21H15 FEND:16 END ;程序結(jié)束循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)是一種重復(fù)執(zhí)行某段代碼的程序結(jié)構(gòu),相當(dāng)于人們?cè)谧魇虑闀r(shí),在一段時(shí)間內(nèi)進(jìn)行重復(fù)性的工作。一個(gè)典型的循環(huán)程序由4部分組成,即循環(huán)初始化部分、循環(huán)處理部分、循環(huán)控制部分和循環(huán)結(jié)束部分。初始化部分:主要用于設(shè)置循環(huán)的次數(shù)、有關(guān)的工作單元清零、變量設(shè)置和地址指針設(shè)置等循環(huán)初始參數(shù)。循環(huán)處理部分:也稱為循環(huán)體,這是循環(huán)結(jié)構(gòu)的主要代碼段,在程序運(yùn)行時(shí)將重復(fù)執(zhí)行。循環(huán)次數(shù)控制部分:主要用于控制循環(huán)的次數(shù),防止出現(xiàn)死循環(huán)。循環(huán)次數(shù)控制部分一般由兩個(gè)單元組成,修改控制變量和判斷循環(huán)結(jié)束。循環(huán)控制變量可以采用循環(huán)遞減計(jì)數(shù)法,即每循環(huán)一次,控制變量減1,并判斷是否為0,若不為0,則繼續(xù)執(zhí)行循環(huán)體程序,否則結(jié)束循環(huán)體的執(zhí)行;也可以采用條件控制,即判斷結(jié)束條件是否成立,如果不成立,則繼續(xù)執(zhí)行循環(huán)體,否則,結(jié)束循環(huán)。結(jié)束部分:當(dāng)循環(huán)處理部分執(zhí)行完畢后,需要對(duì)計(jì)算結(jié)果進(jìn)行處理和保存,已供后面的程序使用。循環(huán)轉(zhuǎn)移指令

在51系列單片機(jī)的指令系統(tǒng)中,提供了如下兩條循環(huán)轉(zhuǎn)移指令:DJNZRn,LOOP:這里采用工作寄存器Rn為控制寄存器??刂萍拇嫫鞯挠?jì)數(shù)方式一般都是減1計(jì)數(shù),即每循環(huán)一次,Rn自動(dòng)減1計(jì)數(shù),同時(shí)判斷寄存器Rn是否為0,若不為0,繼續(xù)執(zhí)行循環(huán);若為0,則結(jié)束循環(huán)程序的執(zhí)行。DJNZDirect,LOOP:這里采用直接尋址單元Direct作為控制寄存器??刂萍拇嫫鞯挠?jì)數(shù)方式一般都是減1計(jì)數(shù),即每循環(huán)一次,Direct單元自動(dòng)減1計(jì)數(shù),同時(shí)判斷Direct單元是否為0,若不為0,繼續(xù)執(zhí)行循環(huán);若為0,則結(jié)束循環(huán)程序的執(zhí)行。循環(huán)結(jié)構(gòu)示例在程序中,采用了比較和交換的方法來(lái)依次對(duì)比各個(gè)數(shù)據(jù)。數(shù)據(jù)塊的首地址為10H,先讀取第一個(gè)數(shù)據(jù)與第二個(gè)數(shù)據(jù),把第一個(gè)數(shù)據(jù)作為基準(zhǔn)送入累加器A,進(jìn)行比較。如果基準(zhǔn)數(shù)大,則不作交換,再取下一個(gè)數(shù)進(jìn)行比較;如果基準(zhǔn)數(shù)小,則將數(shù)值大的取代原來(lái)的基準(zhǔn)數(shù),即相當(dāng)于做一次數(shù)據(jù)交換。然后,再以新的基準(zhǔn)數(shù)與下一個(gè)數(shù)進(jìn)行比較,直至全部比較完畢。這里的基準(zhǔn)數(shù)始終保持為最大的數(shù)值,因此,全部比較完畢后,累加器A中的基準(zhǔn)數(shù)即是數(shù)據(jù)塊中的最大值。最后將最大值保存在通用寄存器R2中。01 ORG 0200H02 MOV R0,#10H ;數(shù)據(jù)塊首地址送入R003 MOV A,@R0 ;取第一個(gè)數(shù)作為基準(zhǔn)數(shù)送入累加器A04 MOV R1,#0AH ;比較次數(shù)10=0AH送入R105 LOOP1: INC R0 ;修改地址指針,使其指向下一個(gè)地址單元06 MOV 20H,@R0 ;將要比較的數(shù)暫存于20H單元07 CJNE A,20H,CHK ;兩個(gè)數(shù)進(jìn)行比較08 CHK: JNC LOOP2 ;如果A大,則轉(zhuǎn)換09 MOV A,@R0 ;如果A小,則將較大的數(shù)送入A10 LOOP2: DJNZ R1,LOOP1 ;R1減1,如果其不為0,則繼續(xù)循環(huán)11 MOV R2,A ;比較完畢,存結(jié)果12 END子程序結(jié)構(gòu)子程序結(jié)構(gòu)是一種模塊化的程序設(shè)計(jì)思想,其將某些運(yùn)算和操作設(shè)計(jì)成可被其他程序調(diào)用的子程序段,需要的時(shí)候直接調(diào)用這些程序段即可。一般來(lái)說(shuō),調(diào)用子程序的程序稱為主程序,調(diào)用子程序的過(guò)程稱為子程序調(diào)用。子程序執(zhí)行完后返回主程序的過(guò)程稱為子程序

溫馨提示

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