版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 糖尿病二甲雙胍
- 招投標(biāo)糾紛處理政策解讀
- 2023年北京市平谷初三一模道德與法治試卷及答案
- 銷售考核試題復(fù)習(xí)測(cè)試卷
- 2024年新疆客運(yùn)資格證考試題庫(kù)模擬考試下載
- 社區(qū)工作者試用期工作總結(jié)
- 《成功銷售方程式》課件
- 賓館定制家具合同范例
- 國(guó)際貿(mào)易合同范例
- 各科教師思想工作總結(jié)-
- 項(xiàng)目風(fēng)險(xiǎn)識(shí)別與控制-年度總結(jié)
- 《決策心理學(xué)》課件
- +Unit+12大單元教學(xué)整體單元分析 人教版九年級(jí)英語(yǔ)全冊(cè)+
- 數(shù)控車床編程與加工 課件 任務(wù)7 內(nèi)溝槽加工
- 裝飾裝修工程施工流程方案
- 2023-2024學(xué)年深圳市初三中考適應(yīng)性考試英語(yǔ)試題(含答案)
- 《漏電保護(hù)器》課件
- 巖質(zhì)高陡邊坡穩(wěn)定性分析評(píng)價(jià)
- 私立民辦高中學(xué)校項(xiàng)目招商引資方案
- 《快遞操作須知》課件
- 工商管理學(xué)科發(fā)展前沿
評(píng)論
0/150
提交評(píng)論