第二章 單片機指令系統(tǒng)_第1頁
第二章 單片機指令系統(tǒng)_第2頁
第二章 單片機指令系統(tǒng)_第3頁
第二章 單片機指令系統(tǒng)_第4頁
第二章 單片機指令系統(tǒng)_第5頁
已閱讀5頁,還剩104頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二章51單片機指令系統(tǒng)及程序設(shè)計補充:指令的字節(jié)數(shù)尋址方式指令系統(tǒng)及應(yīng)用舉例偽指令綜合程序舉例51系列單片機指令集含有111條指令

每條指令在執(zhí)行時要花去一定的時間,以機器周期為單位。按指令執(zhí)行時間分類:單周期(64條);雙周期(45條);4周期(2條)按指令的功能分類,可分為5大類:數(shù)據(jù)傳送類(29條);算術(shù)運算類(24條)邏輯運算及移位類(24);控制轉(zhuǎn)移類(17條)位操作類(17條)每條指令在程序存儲器ROM中占據(jù)一定的空間,以字節(jié)為單位。按指令所占字節(jié)數(shù)分類:單字節(jié)(49條);雙字節(jié)(46條);3字節(jié)(16條)補充:指令的字節(jié)數(shù)在51單片機的指令系統(tǒng)中,因指令操作碼和操作數(shù)的不同,指令(在存儲器中)長度也各不相同。分為單字節(jié)、雙字節(jié)和三字節(jié)。只要理解了指令占用這些字節(jié)是用來存放哪些量的,就自然會判斷不同的指令是多少字節(jié)指令了。1、操作碼占用一個字節(jié);2、8位立即數(shù)占用一個字節(jié),16位立即數(shù)占用兩個字節(jié);3、8位操作數(shù)地址占用一個字節(jié),16位操作數(shù)地址占用兩個字節(jié);4、CPU內(nèi)部的各種寄存器不占用指令字節(jié),如A、B、R0、R1、R2、R3、R4、R5、R6、R7、DPTR等。例如:1、MOVA,R0;這條指令是單字節(jié)指令,操作碼占一個字節(jié),操作數(shù)隱含在操作碼中。該指令的操作碼是11101000B,寄存器名以三位數(shù)代碼的形式在指令的后三位。2、MOVA,#07H;這是一個雙節(jié)字指令,其中MOV占用一個字節(jié),8位立即數(shù)07H占用一個字節(jié)。3、MOVDPTR,#0106H;這是一個三字節(jié)指令,MOV占用一個字節(jié),16位立即數(shù)0106H占用兩個節(jié)字;4、MOV07H,#07H;這是一個三字節(jié)指令,MOV占用一個字節(jié),8位地址07H占用一個字節(jié),8位立即數(shù)07H占用一個字節(jié)。指令的字節(jié)數(shù)與指令的運行時間指令的字節(jié)多是否意味著指令周期就長?指令字節(jié)數(shù)周期數(shù)指令說明MOVA,R011R0內(nèi)容送累加器AMOVA,#0FFH21立即數(shù)FFH送AMOV20H,#30H32立即數(shù)30H送內(nèi)存20h單元MULAB14乘法指令I(lǐng)NCDPTR1116位寄存器DPTR加一從表中可見,指令的字節(jié)數(shù)與指令周期不是對等的關(guān)系51單片機指令的尋址方式立即尋址直接尋址寄存器尋址寄存器間接尋址基址變址尋址相對尋址位尋址尋址方式:指令中所規(guī)定的尋找操作數(shù)的方式七種尋址方式,一條指令可能含多種尋址方式立即尋址操作數(shù)直接就出現(xiàn)在指令中例:MOVA,#64H;A←立即數(shù)64H

ADDA,#05H

;A←(A)+立即數(shù)05H注意:符號“#”表明其后跟的是立即數(shù),立即數(shù)——就是數(shù)字量本身。直接尋址指令中直接給出了操作數(shù)所在單元的地址或名稱例:MOVR1,1FH;R1←(1FH)

MOV30H,4AH;30H←(4AH)在本單片機中規(guī)定:訪問特殊功能寄存器SFR只能采用直接尋址方式。例如:MOVA,SP;A←(SP)MOVA,81H;A←(SP)

MOVP1,#5AH;P1←(#5AH)MOV90H,#5AH;P1←(#5AH)

MOVB,30H;B←(30H)相同相同寄存器尋址從寄存器中讀取操作數(shù)或存放操作數(shù)進寄存器例:MOVA,B;A←(B)

MOV30H,R0

;30H←(R0)

MOVA,R1;A←(R1)寄存器間接尋址寄存器中的內(nèi)容是一個地址,由該地址單元尋址到所需的操作數(shù)注意:1)“間接”表示某寄存器中的“內(nèi)容”只是一個“單元地址”,這個地址單元中存放的數(shù)據(jù)才是要找的“操作數(shù)”。2)符號“@”表示“在…”,其含義與讀音皆同“at”。例:MOVR1,#30H;R1←立即數(shù)30H

]

MOV@R1,#0FH;30H←立即數(shù)0FH

MOVA,@R1;A←((30H))=#0FH在本單片機中訪問特殊功能寄存器SFR只能采用直接尋址方式的原因:SFR分布在80H~0FFH范圍內(nèi),而52系列單片機有256字節(jié)的片內(nèi)RAM,其中的80H~0FFH的RAM與SFR所占地址重疊。MOVA,90H等效于MOVA,

P1屬直接尋址MOVA,@R0;[事先已知(R0)=#90H]執(zhí)行的操作:A←(90H)屬寄存器間接尋址,隨意寫的指令如:MOVA,85H則是非法的!于是規(guī)定:80H~0FFH范圍內(nèi)的RAM只能用寄存器間接尋址方式,而SFR只能用直接尋址方式。從而解決了地址沖突的問題。例如:存儲器配置(片內(nèi)RAM)51片內(nèi)RAM

128字節(jié)(00H—7FH)52片內(nèi)RAM

256字節(jié)(00H—0FFH)00H20H2FH7FH1FH30H80HFFH52子系列才有的RAM區(qū)普通RAM區(qū)位尋址區(qū)工作寄存器區(qū)SFR分布在80H-FFH其中92個位可位尋址80HFFH51子系列128字節(jié)52子系列256字節(jié)只能直接尋址只能寄存器間接尋址基址加變址尋址

以16位的地址指針寄存器DPTR或16位的PC寄存器為基址寄存器,以累加器A為變址寄存器,兩者中的“內(nèi)容”形成一個16位的“地址”,該“地址”所指的存儲單元中的內(nèi)容才是操作數(shù)。例:[設(shè):A中已存有#A4H,DPTR中已存有#1234H]

MOVCA,@A+DPTR;A←((A)+(DPTR))操作:將A4H+1234H=12D8H單元中的數(shù)放進累加器A相對尋址當(dāng)前PC值加上指令中規(guī)定的偏移量rel,構(gòu)成實際的操作數(shù)地址例:SJMPrel

操作:跳轉(zhuǎn)到的目的地址

=

當(dāng)前16位PC值+rel注意:1)“當(dāng)前PC值”指程序中下一條指令所在的首地址,是一個16位數(shù);2)符號“rel”表示“偏移量”,是一個帶符號的單字節(jié)數(shù),范圍是:-128—+127(80H—7FH),在實際編程中,“rel”通常用標(biāo)號代替位尋址指令中直接給出了操作數(shù)所在的位地址。例:CLRP1.0;P1.0←0

SETBACC.7;ACC.7←1

CPLC

;C←NOT(C)注意:1)位地址里的數(shù)據(jù)只可能是一個0

1

2)有的位地址十分明確,如

P1.0,ACC.7等,

有的位地址則“不太明確”,如:

[MOVA,17H;A←(17H),17H是字節(jié)地址]

MOVACC.0,17H;ACC.0←(17H),這里ACC.0是位地址所以該指令中的17H是22H單元的第7位片內(nèi)RAM中有128個位可按位尋址的位,位地址:00H—7FH分布在:20H—2FH單元;另外,在SFR中還有92個位可按位尋址00H20H2FH7FH1FH30H80HFFH52子系列才有的RAM區(qū)普通RAM區(qū)位尋址區(qū)工作寄存器區(qū)27H22H21H20H26H24H25H23H28H07060504030201000F0E0D0C0B0A090817161514131211101F1E1D1C1B1A191827262524232221202F2E2D2C2B2A292837363534333231303F3E3D3C3B3A393847464544434241402FH7F7E7D7C7B7A7978位地址總共128個可按位尋址的位單元地址17D7D6D5D4D3D2D1D051單片機的指令格式方括符[]表示可選項標(biāo)號代表指令所在地址,1-8個字母/數(shù)字,“:”結(jié)尾操作碼就是指令功能助記符,指令實體目的操作數(shù)源操作數(shù)注釋,以“;”開頭[標(biāo)號:]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]51單片機指令集功能分五類,共111條指令五大類功能數(shù)據(jù)傳送類指令:(29條)算術(shù)運算類指令:(24條)邏輯運算及移位類指令:(24條)控制轉(zhuǎn)移類指令:(17條)位操作(布爾操作)類指令:(17條)內(nèi)部存儲器間傳送:(MOV——16條)外部數(shù)據(jù)存儲器與累加器間傳送:(MOVX——4條)程序存儲器向累加器傳送:(MOVC——2條)數(shù)據(jù)交換:(XCH,XCHD,SWAP——5條)堆棧操作:(PUSH,POP——2條)(一)數(shù)據(jù)傳送類指令(5種/29條)Rn:R0—R7@Ri:@R0,@R1#data:8位立即數(shù)#data16:16位立即數(shù)direct:直接地址rel:8位帶符號偏移量(一)數(shù)據(jù)傳送類指令(5種/29條)內(nèi)部存儲器間傳送指令(15條):

MOV類指令的操作方向總是后面的操作數(shù)指向前面的操作數(shù)!例:MOVA,30H——A(30H)

累加器Adirect直接尋址@Ri間址Rn寄存器Data立即數(shù)內(nèi)部數(shù)據(jù)傳送類指令的使用1,在使用傳送指令時,可以根據(jù)實際情況選用恰當(dāng)尋址方式。上面給出的各種類型的傳送指令是INTEL公司在設(shè)計51的硬件時就已經(jīng)確定下來。編程人員只能像查字典一樣去查找、使用。不能根據(jù)主觀意愿去“創(chuàng)造”指令。

例如:要將R0中的數(shù)據(jù)傳送到R1中。如何使用指令去完成上面的操作?

MOVR1,R0

是否可以?回答是否定的!因為在51的指令系統(tǒng)中沒有此條指令!只能使用:

MOVA,R0或:MOV01H,00H

MOVR1,A

因此,必須從51的指令表中選擇使用指令。注意:MOVRn,Rn

MOV@Ri,@RiMOVRn,@Ri

MOV#data,A等等指令是非法指令。

2,以累加器A為目的寄存器的傳送指令會影響PSW中的奇偶位P,而其余的指令對PSW均無影響。3,要會正確地估計指令的字節(jié)。凡是指令中包含有立即數(shù)、直接地址的指令,都應(yīng)當(dāng)在原有的基礎(chǔ)上加1。

【舉例】:

mova,@Ri()個字節(jié)mova,direct()個字節(jié)movdirect,#data()個字節(jié)movdirect2,direct1()個字節(jié)4,對于同一問題可以有不同的編程方法。使用不同的方法雖然都可以實現(xiàn)題目的要求,但從指令長度、運行時間和可閱讀性上等綜合因素考慮,不同的方法就有合理和不合理、優(yōu)化和繁雜之分。所以,在學(xué)習(xí)指令系統(tǒng)和編程時開始就要養(yǎng)成一個好的、合理的編程習(xí)慣。5,注意給程序進行正確的注釋,這對于閱讀、編寫和修改程序都是非常重要的。下面就是一些注釋的例子:MOVA,30H ;(30h)→AMOVA,R0 ;(R0)→AMOV40H,30H ;(30h)→40hMOVA,@Ri ;((Ri))→A內(nèi)部傳送類指令舉例試編出把30h和40h單元內(nèi)容進行交換。

RAMXY累加器A30H40HMOVA,30H

;(30h)→A

MOV30H,40H

;(40h)→30h

MOV40H,A

;A→40h數(shù)據(jù)傳送類指令(續(xù))外部數(shù)據(jù)存儲器與累加器間傳送(5條):MOVX類指令可在累加器與以@DPTR或@Ri所代表的外部RAM之間進行數(shù)據(jù)傳送。例如:

MOVXA,@DPTR——A((DPTR))MOVXA,@Ri——A

((Ri))MOVX@DPTR,A——(DPTR)(A)MOVX@Ri,A——(Ri)(A)外部RAM的字節(jié)傳送指令舉例【解】:外部RAM中的數(shù)據(jù)是不能直接傳送的,因此必須使用兩次MOVX指令完成此操作。

ORG2000H

MOVDPTR,#88H;為8位指針賦值 MOVXA,@DPTR;取x到累加器AMOVDPTR,#1818H;為16位指針賦值 MOVX@DPTR,A;x送RAM的1818h單元試用R0,R1作間址寄存器編寫程序,看看會遇到什么問題?

已知外部RAM的88H單元有一個數(shù)x,試編程將x送外部RAM的1818H單元。程序存儲器向累加器傳送指令(2條):MOVCA,@A+DPTR

MOVCA,@A+PC

——通常稱為查表指令,尋址方式屬:“基址加變址尋址”數(shù)據(jù)傳送類指令(續(xù))@A+DPTR或@A+PC指向程序存儲器中的某單元。擬傳送給累加器ACC的數(shù)據(jù)就是程序中事先寫進去的表格數(shù)據(jù)。這些表格數(shù)據(jù)往往用偽指令DB,DW等定義在程序中。外部ROM的字節(jié)傳送指令舉例已知累加器A中存有0~9范圍內(nèi)的數(shù),試用查表指令編寫出查找出該數(shù)平方的程序。采用DPTR作基址寄存器:

設(shè)平方表的首地址為2000h,累加器A中的內(nèi)容恰好是查表的偏移量。首先將表的起始地址2000h送入DPTR中。

MOVDPTR,#2000H;指針賦值MOVCA,@A+DPTR;平方值送AROM01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h2,采用PC作基址寄存器:與DPTR不同,使用PC作為基地址時,必須對累加器A的數(shù)據(jù)進行修正,以保證@a+pc恰好找到待查的平方值地址。

ORG1FFBH1FFBH74data

ADDA,#data;data=02h1FFDH83H

MOVCA,@A+PC;PC=1FFE1FFEH80FEH

SJMP$2000H00H

DB0 ;平房表首址2001H01H

DB12002H04H

DB42003H09H

DB92004H10H

DB162005H19H

DB25

:::2009H51H

DB81

ENDdata為MOVC指令首地址與表頭地址之間的單元數(shù)。74hdata83h80hFEh01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh返回數(shù)據(jù)傳送類指令(續(xù))數(shù)據(jù)交換指令(5條):為提供一種方便的累加器和寄存器或RAM之間的數(shù)據(jù)交換。避免了使用一般mov傳送指令完成交換時的不便。XCHA,direct(字節(jié)互換)XCHA,@Ri(字節(jié)互換)XCHA,Rn(字節(jié)互換)(A)(direct)[或((Ri)),或(Rn)]XCHDA,@Ri累加器Acc的低4位與((Ri))的低4位互換,各自的高4位不變SWAPA累加器Acc的低4位與自身的高4位互換數(shù)據(jù)交換指令舉例MOVP2,#0

MOVR1,#20h;指針賦初值 MOVXa,@R1;x→a XCHa,@R1;交換a?(20h),y→aMOVX@R1,a;y→(20h)片外RAM片內(nèi)RAMy

(x)片外RAMx(y)(y)

x20h20h累加器A123舉例:已知,片外RAM20h單元、內(nèi)部RAM20h單元分別有數(shù)x和y,試編程互將兩數(shù)相交換。堆棧操作指令(2條):√堆棧區(qū)由特殊功能寄存器堆棧指針SP

管理√堆棧區(qū)可以安排在RAM區(qū)任意位置,一般不安排在工作寄存器區(qū)和可按位尋址的RAM區(qū),而是放在RAM區(qū)的靠后的位置√尋址方式為直接尋址√堆??偸侵赶驐m敗掏ǔUSH與POP兩條指令成對使用數(shù)據(jù)傳送類指令(續(xù))進棧操作:PUSHdirect;sp+1→sp,(direct)→(sp)出棧操作:POPdirect;(sp)→(direct),sp-1→sp【舉例】:設(shè)片內(nèi)RAM的30h單元存有x,40h單元存有y。試將兩個單元內(nèi)容互換。

RAMxyyxyx棧底SP=07h40h30hpush30h

push40h

pop30h

pop40h例如:設(shè)(A)=7BH;(35H)=11H并且知道(SP)=60HPUSHACC;61H#7BHPUSH35H;62H(35H)即:62H#11HPOPACC;A(62H)即:A#11HPOP5AH;5AH(61H)即:5AH#7BH執(zhí)行下列程序后,A中的內(nèi)容為多少?該程序是一個查表程序。

ORG2100H;各指令的地址為:MOVA,#09H;2100H

MOVCA,@A+PC;2102HRET;2103HORG210AHTAB:DB0C0H;210AHDB0F9H;210BHDB0A4H;210CHDB0B0H;210DH

運行結(jié)果:A=0A4H設(shè)累加器A中為16進制表示(00H~09H)的BCD碼。試編程將其轉(zhuǎn)換為ASCII碼,并將其送到50H地址單元中。這是一個數(shù)值轉(zhuǎn)換程序。解:

MOVR0,AMOVDPTR,#TABASC

MOVCA,@A+DPTRMOV50h,ATABASC:DB30H,31H,32H,33H,34H,35HDB36H,37H,38H,39H

將A中存放的2位BCD碼轉(zhuǎn)換為ASCⅡ碼,并送到50H,51H單元中。解:ORG0030HMOVB,A

ANLA,#0FH

ADDA,#30HMOV51H,AMOVA,B

SWAPAANLA,#0FHADDA,#30HMOV50H,ARET算術(shù)運算指令不帶進位的加法指令(ADD)1、加法指令:帶進位的加法指令(ADDC)加1指令(INC)2、減法指令:帶進位的減法指令(SUBB)減1指令(DEC)3、十進制調(diào)整指令:(DAA)4、乘法和除法指令:(MULDIV)加法指令(一):不帶進位的加法指令格式: ADDA,Rn ;(A)+(Rn)→A ADDA,direct ;(A)+(direct)→A ADDA,@Ri ;(A)+((Ri))→A ADDA,#data ;(A)+data→A【注意】:1.參加運算的數(shù)據(jù)都應(yīng)當(dāng)是8位的,結(jié)果也是8位并影響PSW。2.根據(jù)編程者的需要,8位數(shù)據(jù)可以是無符號數(shù)(0~255),也可以是有符號數(shù)(-127~+128)。3.不論編程者使用的數(shù)據(jù)是有符號數(shù)還是無符號數(shù),CPU都將它們視為補碼進行運算并影響PSW。不帶進位的加法指令舉例(一)試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOVA,#19HCy=0; ADDA,#66HAC=0

OV=025A=00011001BP=1

+102data=01100110B127001111111B1,若兩數(shù)都是無符號數(shù),則因Cy=0無溢出,25+102=127。2,若兩個數(shù)是有符號數(shù),則因OV=0無溢出。cy000C7’C6’AC不帶進位的加法指令舉例(二)試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOVA,#5AHCy=0; ADDA,#6BHAC=0;

OV=190A=01011010BP=0

+107data=01101011B

197

011000101B

C7’C6’1,若兩數(shù)是無符號數(shù),因Cy=0無溢出:90+107=1972,若兩數(shù)是有符號數(shù),因OV=1,故有溢出,兩個正數(shù)相加后變?yōu)樨摂?shù),很明顯結(jié)果是不正確的。加法指令(二):帶進位的加法指令格式:ADDCA,Rn ;(A)+(Rn)+Cy→A ADDCA,direct ;(A)+(direct)+Cy→A ADDCA,@Ri ;(A)+((Ri))+Cy→A ADDCA,#data ;(A)+data+Cy→A【注意】:這里的Cy是指令執(zhí)行前的Cy;對PSW的影響同ADD指令。加1指令格式: INCA;累加器A加一 INCRn;(Rn)+1→Rn INCdirect;內(nèi)存單元數(shù)據(jù)加一 INC@Ri;內(nèi)存單元數(shù)據(jù)加一 INCDPTR;(dptr)+1→dptr【注意】:1,除了第一條對PSW的P有影響外,其余對PSW均無影響。

2,由于上面的原因,INC指令不能作為一般的數(shù)據(jù)算術(shù)運算使用,INC主要用于修改數(shù)據(jù)指針等控制、循環(huán)語句中使用。編程舉例已知M1、M2單元中存有兩個16位無符號數(shù)x1、x2(低位在前)。試寫出x1+x2,并將結(jié)果放入M1、M1+1單元(低8位在M1單元)。設(shè)兩數(shù)之和不會超過16位(65535)。RAMX2data8~15X2data0~7X1data8~15X1data0~7M1M1+1M2M2+1【解】:MOVR0,#M1;x1指針賦初值MOVR1,#M2;x2指針賦初值MOVA,@R0;取x1低8位送AADDA,@R1;x1與x2低8位相加MOV@R0,a;低8位和送m1單元INCR0 INCR1 ;修改指針MOVA,@R0;取x1的高8位送AADDCA,@R1

;x1與x2的高8位和Cy相加MOV@R0,A;結(jié)果送M1+1單元減法指令(帶進位的減法指令)在51單片機的指令系統(tǒng)中,只有:

①帶進位的減法SUBB

②減一DEC兩種指令。減法指令:格式:SUBBA,Rn ;(A)–(Rn)–Cy→A SUBBA,direct;(A)–(direct)–Cy→A SUBBA,@Ri ;(A)–((Ri))–Cy→A SUBBA,#data;(A)–data–Cy→A使用減法指令要注意的幾個問題無論相減兩數(shù)是無符號數(shù)還是有符號數(shù),減法操作總是按有符號數(shù)來處理、影響PSW中相關(guān)的標(biāo)志(詳見舉例)。在51單片機的指令系統(tǒng)中沒有不帶Cy的減法,所以在使用SUBB指令前必須使用一條清除Cy的指令:CLRC。減法指令應(yīng)用舉例試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 CLRC MOVA,#52H01010010B=82 SUBBA,#0B4H10110100B=-76

82a=01010010

–-76

data=10110100

158110011110=-98

手工計算

C7’

C6’

AC

101

【分析】:CPU的計算得-98,很明顯答案是錯誤的。原因是OV=1,既產(chǎn)生了溢出。所以,對于符號數(shù)的減法在運算后一定要檢測OV=1減一指令格式: DECA;累加器A減一 DECRn;(Rn)-1→Rn DECdirect;內(nèi)存單元數(shù)據(jù)減一 DEC@Ri;內(nèi)存單元數(shù)據(jù)減一【注意】:1,除了第一條對PSW的P有影響外,其余對PSW均無影響。

2,由于上面的原因,DEC指令一般不作為數(shù)據(jù)算術(shù)運算使用(因為不能對PSW的OV等位產(chǎn)生影響,它主要用于修改數(shù)據(jù)指針在控制、循環(huán)語句中使用)。設(shè)(R0)=7FH,在內(nèi)RAM中,(7EH)=00H,(7FH)=40H

執(zhí)行:

DEC@R0DECR0DEC@R0答:(R0)=7EH,(7EH)=0FFH,(7FH)=3FH。

結(jié)果為:(R0)=

,(7EH)=

,(7FH)=

。

十進制調(diào)整指令在CPU進行BCD碼運算時,必須在運算后進行十進制調(diào)整,這是因為,CPU在運算時,并不知道數(shù)據(jù)是二進制還是BCD碼。格式:DAA;若AC=1或A3~0>9,則(A)+06h→A;若Cy=1或A7~4>9,則(A)+60h→A

;若上述2個條件均滿足,則A←(A)+66h【注意】:1,DAA指令必須緊跟在加法指令之后;2,DAA指令只適用于加法指令的調(diào)整。BCD碼是指“用二進制表達的十進制數(shù)”。如:十進制數(shù)20可以用二進制數(shù)00010100B表示;也可以用十六進制數(shù)14H表示;還可以用BCD碼00100000B或20H

表示。4個二進制位就可以表示一位BCD碼:0000~1001可表示十進制數(shù)(BCD數(shù))0~9;

8個二進制位就可以表示兩位壓縮的BCD碼:00000000~10011001表示00~99。十進制調(diào)整指令應(yīng)用舉例BCD加法運算:試寫出完成85H+59H的BCD碼的加法程序。 MOVA,#85H ADDA,#59H DAA SJMP$85a=10000101B+59dtat=01011001B1441101111

0B低4位〉9,所以加06h

+00000110B

11100100B高4位〉9,所以加60h

01100000B

101000100B結(jié)果為144h(1包含在Cy)【注意】:144H是用16進制數(shù)來表示十進制,即BCD碼。乘法和除法指令這是51單片機唯一的一類單字節(jié)4周期指令,它相當(dāng)于4條加法指令的運行時間。

格式:MULAB;a×b=ba(b存高8位,a存低8位)

DIVAB;a÷b=a…b(a存商,b存余數(shù))【注意】:指令對標(biāo)志的影響:

1,在乘法指令中對PSW的影響有Cy、OV、和P。具體如下:Cy←0;P取決于A中“1”的個數(shù);OV表明積的大小。當(dāng)積超過255(B≠0)時,OV=1。

2,在除法指令中,Cy、P與乘法相同。在執(zhí)行除法指令時,若B=0時OV=1,表示除數(shù)=0除法無意義,其余情況下OV被復(fù)位。BCD:MOVR0,#30H;R0指向被加數(shù)的十位、個位,MOVR1,#40H;R1指向加數(shù)的十位、個位,MOVA,@R0ADDA,@R1;被加數(shù)的十位、個位+加數(shù)的十位、個位DAA;十進制調(diào)整MOV@R0,A;送結(jié)果6位BCD碼加法程序。設(shè)被加數(shù)放在32H、31H、30H單元中,加數(shù)放在42H、41H、40H單元中,和放在32H、31H、30H中。INCR0;R0指向被加數(shù)的千位、百位INCR1;R1指向加數(shù)的千位、百位MOVA,@R0

ADDCA,@R1;被加數(shù)的千位、百位+加數(shù)的千位、百位DAA;十進制調(diào)整MOV@R0,A;送千位、百位的和INCR1INCR0MOVA,@R0ADDCA,@R1DAAMOV@R0,ARET無符號數(shù)的乘除運算。用MUL和DIV指令實現(xiàn)A中的二個BCD數(shù)的相乘,并再轉(zhuǎn)換成二位BCD碼放于A中。解:定義數(shù)據(jù)緩沖區(qū):入口:A—壓縮BCD數(shù);出口:A存放積。MULBCD:MOVB,#10H;10H=16

DIVAB;A中的BCD數(shù)除16分成兩個BCD數(shù),;高字節(jié)在A中,低字節(jié)在B中。

MULAB;兩個BCD數(shù)相乘,積在A中MOVB,#0AH

DIVAB;積除10,A中為十位數(shù),B中為個位數(shù)SWAPA;A中的十位數(shù)置高4位中

ORLA,B;數(shù)位組合,A中高4位為積的十位數(shù),;低4位為個位數(shù)RET邏輯運算指令功能:對2個8位二進制數(shù)進行邏輯與、或、非和異或操作;特點:除了以累加器A為目標(biāo)寄存器的指令影響PSW的P位外,其余指令對PSW均無影響。

1,邏輯與運算指令(ANL) 2,邏輯或運算指令(ORL) 3,邏輯異或指令(XRL) 4,累加器清零和取反指令(CLR&CPL)5,循環(huán)移位指令邏輯與運算指令格式:ANLA,Rn;(A)∧(Rn)→AANLA,direct;(A)∧(direct)→A ANLA,@Ri ;(A)∧((Ri))→A ANLA,#data ;(A)∧data→A ANLdirect,A ;(direct)∧(A)→direct ANLdirect,#data;(direct)∧data→direct上面的指令也可以分為兩類:1,以累加器A為目標(biāo)寄存器的邏輯運算指令;2,以內(nèi)存單元為目標(biāo)的邏輯運算指令。應(yīng)用舉例(一)已知R0=30H和(30H)=0AAH,試問執(zhí)行下列指令后累加器A和30H單元中的內(nèi)容是什么?

1,MOVA,#0FFH2, MOVA,#0FH ANLA,R0 ANLA,30H(A=30H,(30H)=0AAH)(A=0AH,(30H)=0AAH) 3, MOVA,#0F0H4, MOVA,#80H ANLA,@R0 ANL30H,A(A=0A0H,(30H)=0AAH)(A=80H,(30H)=80H)很明顯:ANL操作可以從某個存儲單元中取出某幾位,而把其它的為屏蔽掉(清零)。應(yīng)用舉例(二)已知:M1單元有一個9的ASCII碼39H,試編程將其變?yōu)锽CD碼。解:1,使用ANLdirect,#data的指令。ANLM1,#0FH解:2,使用ANLA,#data指令。

MOVA,M1 ANLA,#0FH MOVM1,A邏輯或運算指令格式:ORLA,Rn ;(A)∨(Rn)→AORLA,direct;(A)∨(direct)→A ORLA,@Ri ;(A)∨((RI))→A ORLA,#data;(A)∨data→A ORLdirect,A;(direct)∨(A)→direct ORLdirect,#data;(direct)∨data→direct同與運算一樣,上面的指令也可以分為兩類:1,以累加器A為目標(biāo)寄存器的邏輯運算指令;2,以內(nèi)存單元為目標(biāo)的邏輯運算指令。應(yīng)用舉例設(shè)累加器(A)=0AAH,(P1)=0FFH。試編程將累加器A中的低四位送P1口的低四位,而P1口的高四位不變。解: MOVR0,A ;累加器A中的數(shù)據(jù)暫存 ANLA,#0FH ;屏蔽A的高4位 ANLP1,#0F0H ;屏蔽P1口的低4位 ORLP1,A ;在P1口組裝 MOVA,R0 ;恢復(fù)累加器A的數(shù)據(jù)【小結(jié)】:與運算可以“屏蔽”某些位;

或運算可以“置位”某些位。邏輯異或運算指令格式:XRLA,Rn ;(A)⊕(Rn)→A XRLA,direct ;(A)⊕(direct)→A XRLA,@Ri ;(A)⊕

((Ri))→A XRLA,#data ;(A)⊕

data→A XRLdirect,A ;(direct)⊕(A)→direct XRLdirect,#data;(direct)⊕

data→direct特點:按位運算,相同時為0,不同時為1。使用異或可以實現(xiàn)將某個字節(jié)的數(shù)據(jù)或?qū)?shù)據(jù)的某幾位變反。舉例已知:外部RAM的30H單元中有一個數(shù)AAH,現(xiàn)要將其高4位不變,低4位取反,試編程。解1,利用MOVXA,@Ri指令: MOVR0,#30H10101010 MOVXA,@R0⊕

00001111 XRLA,#0FH1010

0101 MOVX@R0,A解2,利用MOVXA,@DPTR

MOVDPTR,#0030H MOVXA,@DPTR XRLA,#0FH MOVX@DPTR,A累加器清零和取反指令用傳送指令可以實現(xiàn)對累加器A的清零和取反操作,但是它們都是雙字節(jié)指令。在51單片機的指令系統(tǒng)中專門設(shè)計了單字節(jié)、單周期對累加器清零和取反的指令。格式: CLRA;累加器清零 CPLA;累加器取反

邏輯運算指令應(yīng)用舉例設(shè)X、Y和Z分別存在X、Y和Z單元。試編出能實現(xiàn)此電路功能的程序,并將結(jié)果送入F單元。⊕+XYZF解:MOVA,X ANLA,Y ;X∧Y→A MOVR1,A;送R1暫存 MOVA,Y XRLA,Z ;Y∨Z→A CPLA ;A取反 ORLA,R1;(X∧Y)∨(Y∨Z)→A MOVF,A ;A→F移位指令雖然51單片機只有4條移位指令,但它可以處理所有移位問題。格式:

【注意】:只能對累加器A進行移位。RLA左環(huán)移累加器A累加器ACy累加器ACy累加器ARRCA

帶進位位右環(huán)移RRA右環(huán)移RLCA帶進位位左環(huán)移舉例(一)已知:在M1和M1+1單元有一個16位數(shù)(M1存低8位),試編程將其擴大2倍(設(shè)結(jié)果小于65535)。解:擴大2倍可以用左移一位來實現(xiàn)。

CLRC ;清除Cy位 MOVR1,#M1 ;指針賦值 MOVA,@R1 ;取低8位數(shù)據(jù) RLCA ;循環(huán)左移,Cy進低位,高位進Cy MOV@R1,A ;移位后數(shù)據(jù)回送 INCR1 ;指針加一 MOVA,@R1 ;取高8位數(shù)據(jù) RLCA ;循環(huán)左移Cy進低位 MOV@R1,A ;數(shù)據(jù)回送舉例(二)已知:M1、M2單元中有2個BCD碼,試編程將其緊縮為一個字節(jié)并存入M1單元。解:MOVR1,#M1

MOVA,@R1

SWAPA INCR1

ORLA,@R1

MOVM1,A0000BCD10000BCD2M1M1+1BCD10000BCD1BCD20000BCD1累加器A書上部分例題編制一個循環(huán)閃爍燈的程序。有8個發(fā)光二極管,每次其中某個燈閃爍點亮5次后,轉(zhuǎn)移到下一個燈閃爍10次,循環(huán)不止。本程序的硬件連接如圖所示。當(dāng)P1.i輸出高電平時,LED燈亮,否則不亮。

MOVA,#01H;燈亮初值SHIFT:LCALLFLASH;調(diào)閃亮5次子程序RRA;右移一位SJMPSHIFT;循環(huán)FLASH:MOVR2,#05H;閃爍5次計數(shù)FLASH1:MOVP1,A;點亮LCALLDELAY;延時MOVP1,#00H;熄滅LCALLDELAY;延時DJNZR2,FLASH1;循環(huán)5次RETDELAY:MOVR6,#255;1TmLOOP1:MOVR7,#255LOOP2:DJNZR7,LOOP2;2TmNOP位操作指令特點:操作數(shù)不是字節(jié),而是某一位。每位的取值只能是“0”或“1”,因而也稱之為布爾變量操作。

布爾變量存在于片內(nèi)RAM的位尋址區(qū)(20H~2FH)、11個可以按位尋址的SFR。1.位傳送指令2.位置位、位清零和位取反指令3.位運算指令4.位控制轉(zhuǎn)移指令1.位傳送指令格式:MOVC,bit其中:C為PSW中的Cy; MOVbit,C bit為布爾變量的位地址。

【解】:兩個位互換必須找一個位作為緩沖位。MOVC,00HMOV01H,C MOVC,7FH MOV00H,C MOVC,01H MOV7FH,C舉例:試將00H位和7FH位中的內(nèi)容互換。2.位置位、位清零和取反指令格式: CLRC ;0→Cy CLRbit ;0→(bit) SETBC ;1→Cy SETBbit ;1→(bit) CPLC ;/C→C CPLbit ;/(bit)→bit例:編程通過P1.0線連續(xù)輸出128個寬度為5個機器周期長的方波。解:MOVR0,#128CLRP1.0LOOP:CPLP1.0NOPNOPDJNZR0,LOOP3.位運算指令格式: ANLC,bit ;C∧(bit)→C ANLC,/bit;C∧/(bit)→C ORLC,bit ;C∨(bit)→C ORLC,/bit ;C∨/(bit)→C

4.位控制轉(zhuǎn)移指令(一)以Cy內(nèi)容為條件的轉(zhuǎn)移指令格式:JCrel ;若Cy=1,則(PC)+2+rel→PC ;若Cy=0,則(PC)+2→PC JNCrel ;若Cy=0,則(PC)+2+rel→PC ;若Cy=1,則(PC)+2→PC(二)以位地址內(nèi)容為條件的轉(zhuǎn)移指令格式:JBbit,rel;若(bit)=1,則(PC)+3+rel→PC ;若(bit)=0,則(PC)+3→PC

JNBbit,rel;若(bit)=0,則(PC)+3+rel→PC ;若(bit)=1,則(PC)+3→PC JBCbit,rel;若(bit)=1,則(PC)+3+rel→PC,0→bit ;若(bit)=0,則(PC)+3→PC

解:ORG0000HMOVA,30H

CJNEA,40H,LOOP1

SETB7FHSJMP$LOOP1:JCLOOP2MOV20H,AMOV21H,40HSJMP$LOOP2:MOV20H,40HMOV21H,ASJMP$

比較內(nèi)部RAM的30H和40H單元中的二個無符號數(shù)的大小,將大數(shù)存入20H單元,小數(shù)存入21H單元,若二數(shù)相等,則使內(nèi)RAM的第127位置1。

試判斷30H中的數(shù)的正負,若為正數(shù),存入20H單元;若為負數(shù)則存入21H單元。解:

ORG0000HMOVA,30H

JB

ACC.7,LOOPMOV20H,ASJMP$LOOP:MOV21H,ASJMP$

控制轉(zhuǎn)移指令

1,無條件轉(zhuǎn)移指令 2,條件轉(zhuǎn)移指令 3,子程序調(diào)用和返回 4,空操作指令

1,無條件轉(zhuǎn)移指令格式:LJMPaddr16長轉(zhuǎn)移指令,尋址范圍65535;AJMPaddr11絕對轉(zhuǎn)移,尋址范圍2K;

SJMPrel短轉(zhuǎn)移,轉(zhuǎn)移范圍(+127~-128);JMP@A+DPTR變址轉(zhuǎn)移,尋址范圍65535。02Haddr15~8addr7~0a10~8

00001a7~a080Hrel73HLJMP指令(三字節(jié))AJMP指令(雙字節(jié))SJMP指令(雙字節(jié))JMP指令(單字節(jié))長轉(zhuǎn)移指令:(三字節(jié)雙周期指令)指令執(zhí)行時,將指令碼中的addr16送入PC中,使程序無條件的轉(zhuǎn)向addr16所指向的新地址執(zhí)行程序?!九e例】:已知某單片機的監(jiān)控程序地址為A080H,試問用什么方法使單片機開機后自動的轉(zhuǎn)向該監(jiān)控程序?【解】:因為單片機上電時,PC=0000H,所以在0000H單元存放一條LJMP0A080H的指令即可。LJMPA0H80HROM0000H0001H0002H0003H絕對轉(zhuǎn)移指令:雙字節(jié)、雙周期指令。將AJMP指令中的11位轉(zhuǎn)移地址替換掉原來PC中16位地址中的低11位地址。指令中的11位地址,確定了地址的轉(zhuǎn)移范圍在2K以內(nèi),所以AJMP也稱“頁內(nèi)轉(zhuǎn)移”指令。101

0000110100101

XXXX

X10110100101A10a9a8

操作碼a7~a0AJMP指令PC程序計數(shù)器51單片機的ROM系統(tǒng)是以2K為一頁來劃分程序存儲器,這樣對于4K的片內(nèi)ROM存儲器可以分為2頁;片外64K的ROM可以分為32頁。在執(zhí)行AJMP指令時,PC的高5位決定了ROM中的頁地址;而AJMP指令的低11位地址用來選擇頁內(nèi)地址。在一般情況下,AJMP指令應(yīng)當(dāng)與目標(biāo)地址在同一頁內(nèi)。更具體的說:目標(biāo)地址應(yīng)當(dāng)與AJMP指令取出后的PC值(PC=PC+2)在同一頁內(nèi)。否則轉(zhuǎn)移將會出現(xiàn)錯誤。ROM的64K存儲空間的頁面(部分)劃分表頁面PC高5位頁內(nèi)地址頁面PC高5位頁內(nèi)地址0頁000000000H~07FFH8頁010004000H~47FFH1頁000010800H~0FFFH9頁010014800H~4FFFH2頁000101000H~17FFH10頁010105000H~57FFH3頁000111800H~1FFFH11頁010115800H~5FFFH4頁001002000H~27FFH12頁011006000H~67FFH5頁001012800H~2FFFH13頁011016800H~6FFFH6頁001103000H~37FFH14頁011107000H~77FFH7頁001113800H~3FFFH15頁011117800H~7FFFHROM的64K存儲空間的頁面示意圖::::AAA:MOVA,R0MOVR1,A::AJMPAAA0100H07FEH000001111111

11111110PC值000010000000

00000000PC+2值000010010000

00000000AJMP指令中的11位地址原本AJMP指令要轉(zhuǎn)到本頁的0100H單元但是由于PC的高5位頁面地址發(fā)生了變化使AJMP指令實際轉(zhuǎn)到下一頁0900H單元。最后PC值發(fā)生跨頁錯誤AJMP轉(zhuǎn)一指令是用來做頁內(nèi)2K范圍的轉(zhuǎn)移,如果使用不當(dāng),會發(fā)生錯誤的“跨頁”操作。產(chǎn)生跨頁的原因是AJMP指令處于每一頁的最后兩個單元的結(jié)果,所以避免這種現(xiàn)象的方法就是不要在每一頁的最后兩個單元使用AJMP指令。如果目標(biāo)地址與AJMP地址不在同一頁內(nèi),建議使用LJMP指令替代AJMP。使用AJMP指令時,11位的絕對地址可以用符號地址取代正確使用AJMP轉(zhuǎn)移指令例:在以下三種情況,判斷執(zhí)行KRD:AJMPKWRD后能否實現(xiàn)正常跳轉(zhuǎn)。KRD為轉(zhuǎn)移指令所在的地址,KWRD為跳轉(zhuǎn)目標(biāo)標(biāo)號地址。

(1)KRD=0730H;KWRD=0100H(2)KRD=07FEH;KWRD=0100H(3)KRD=07FEH;KWRD=0830H第一種情況能夠?qū)崿F(xiàn)正常跳轉(zhuǎn),由于KRD+02=0732H與KWRD=0100H的高5位相同,在同1頁內(nèi)。第二種情況不能夠?qū)崿F(xiàn)正常跳轉(zhuǎn),由于KRD+02=0800H與KWRD=0100H的高5位不相同,不在同1頁內(nèi)。第三種情況能夠?qū)崿F(xiàn)正常跳轉(zhuǎn)。短轉(zhuǎn)移SJMP指令格式:SJMPrel

rel為偏移量(+127~-128)rel(偏移量)的計算公式:

rel=目標(biāo)地址–源地址–2(其中:2為SJMP指令的長度)【例1】:如圖,要轉(zhuǎn)到0116H時:

rel=0116H-0110H-2=04H【例2】:要轉(zhuǎn)到0109H時:rel=0109H-0110H-2=F7H(-9)實際編程時,使用符號地址取代rel以簡化計算,在匯編時由匯編程序來計算rel。SJMPrelPCPC+20109H0110H0116H變址轉(zhuǎn)移指令格式:JMP@A+DPTR單字節(jié)操作碼為73H特點:轉(zhuǎn)移地址由累加器A的內(nèi)容與DPTR相加形成。用途:用來制作一個多分支的轉(zhuǎn)移結(jié)構(gòu)。根據(jù)A的數(shù)值設(shè)計散轉(zhuǎn)表程序。

MOVR1,A

MOVB,#02

MULAB

MOVDPTR,#TABLE;DPTR指向數(shù)據(jù)散轉(zhuǎn)表首地址

JMP@A+DPTR

RETTABLE:AJMPROVT0;散轉(zhuǎn)表

AJMPROVTl

AJMPROVT2當(dāng)(A)=0時,散轉(zhuǎn)到ROVT0;(A)=1時,散轉(zhuǎn)到ROVTl……。

因為AJMP是雙字節(jié)指令,所以程序開始將A的內(nèi)容乘以2。2,條件轉(zhuǎn)移指令:(1)累加器A判零轉(zhuǎn)移指令(雙字節(jié)指令) JZrel ;若A=0,則PC=PC+2+rel

;若A≠0,則PC=PC+2JNZrel ;若A≠0,則PC=PC+2+rel

;若A=0,則PC=PC+2例1、將外RAM的一個數(shù)據(jù)塊(首地址為10H)傳送到內(nèi)部數(shù)據(jù)RAM(首地址為30H),遇到傳送的數(shù)據(jù)為零時停止傳送,試編程。解:MOVR0,#30HMOVDPTR,#10HLOOP1:MOVXA,@DPTR

JZLOOP2

MOV@R0,AINCR0INCDPTRSJMPLOOP1LOOP2:SJMPLOOP2

(2)比較條件轉(zhuǎn)移指令(3字節(jié))

a=data時:PC+3→PC,Cy=0

CJNEA,#data,rel

a>data時:PC+3+rel,Cy=0 CJNERn,#data,rel a<data時:PC+3+rel,Cy=1 CJNEA,direct,rel CJNE@Ri,#data,rel

比較+轉(zhuǎn)移的指令使編程更為方便?!咀⒁狻浚?,4條指令都是3字節(jié)指令,所以執(zhí)行時PC+3→PC。2,指令的執(zhí)行實際上就是做不回送的減法,通過Cy反映出無符號數(shù)的兩數(shù)的大小:Cy=0則X>=Y(jié); 若Cy=1則X<Y。3,若參加比較的是有符號數(shù)時,無法直接用Cy來判斷。必須事先對符號進行判斷,再根據(jù)四種情況具體處理。

a,當(dāng)x、y均>0時,同無符號數(shù)相同; b,當(dāng)x、y均<0時,同無符號數(shù)相同; c,當(dāng)x>0,y<0時,x>y; d,當(dāng)x<0、y>0時,x<y;X>0?Y>0?Y>0?Cy>0?X<YX>YYNNYYNNY(3)減一條件轉(zhuǎn)移指令1,DJNZRn,rel ;Rn-1→Rn,若Rn≠0則PC+2+rel→PC若Rn=0則PC+2→PC2,DJNZdirect,rel;(direct)-1→direct,若(direct)≠0則PC+3+rel→PC若(direct)=0則PC+3→PC注意:第一條指令為雙字節(jié),第二條指令為三字節(jié)。指令本身先做一個帶回送的減一運算操作,然后根據(jù)運算的結(jié)果是否為零作為轉(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論