MCS單片機(jī)指令系統(tǒng)講義_第1頁
MCS單片機(jī)指令系統(tǒng)講義_第2頁
MCS單片機(jī)指令系統(tǒng)講義_第3頁
MCS單片機(jī)指令系統(tǒng)講義_第4頁
MCS單片機(jī)指令系統(tǒng)講義_第5頁
已閱讀5頁,還剩116頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第二章:MCS-51單片機(jī)指令系統(tǒng)2.1概述2.2尋址方式

2.3數(shù)據(jù)傳送指令2.4算邏運(yùn)算和移位指令2.5控制轉(zhuǎn)移和位操作指令2.1:MCS-51指令系統(tǒng)的概述MCS-51共有111條指令,指令的長度和執(zhí)行時間因不同的指令而各不相同。2.1.1指令格式

指令的三種表示形式2.1.3指令的字節(jié)數(shù)

指令的分類繼續(xù)2.1.1指令格式:指令格式:既指令的結(jié)構(gòu)形式。OPDATA

或ADDRESS操作碼操作數(shù)或操作數(shù)地址由操作碼和操作數(shù)(或操作數(shù)地址)構(gòu)成指令的結(jié)構(gòu)。舉例:MOV

A,#0FFH

ADD

A,R0返回指令的表示形式是識別指令的標(biāo)志。1,二進(jìn)制的表示形式:(以“累加器的內(nèi)容+08H”為例)

00100100B操作碼OP(加法)00001000B操作數(shù)DATA(08H)特點(diǎn):能被CPU直接識別、運(yùn)行的形式。也稱機(jī)器碼、匯編語言的目標(biāo)代碼。缺點(diǎn):不便于閱讀、記憶和調(diào)試修改。2.1.2指令的三種表示形式:2,十六進(jìn)制表示方式:它是對二進(jìn)制形式的一種簡化。00100100B24H

00001000B08H在實(shí)驗(yàn)室等少數(shù)環(huán)境下,可以將這種形式作為輸入程序的一種輔助手段。但是,這種形式的指令格式必須由對應(yīng)的監(jiān)控程序把它們翻譯成二進(jìn)制的“機(jī)器碼”后存入程序存儲器并運(yùn)行。二進(jìn)制表示的形式十六進(jìn)制表示的形式3,指令的“助記符”方式(也稱“匯編格式”):

00100100B

24H

00001000B

08H

ADDA,#08H

1,這是一種由英文單詞或字母、數(shù)字來表征指令功能的形式。是一種便于閱讀、書寫和交流的表示形式。2,這種“匯編”格式的指令必須把它“翻譯”為二進(jìn)制形式“機(jī)器碼”后才能為CPU所識別和執(zhí)行。3,三種不同的表示方法適用于不同的場合。

本章內(nèi)容都以匯編的形式介紹指令系統(tǒng)。二進(jìn)制表示形式

十六進(jìn)制表示

匯編格式返回2.1.3指令的字節(jié)數(shù)

在MCS-51單片機(jī)的指令系統(tǒng)中,因指令操作碼和操作數(shù)的不同,指令(在存儲器中)長度也各不相同。分為單字節(jié)、雙字節(jié)和三字節(jié)。單字節(jié)指令(49條):分無操作數(shù)、有操作數(shù)兩種。

無操作數(shù):如INCDPTR10100011B INCA00000100B

【特點(diǎn)】:操作數(shù)隱含在操作碼中。

含有操作數(shù)寄存器名稱的單字節(jié)指令:

如:MOVA,R011101000B

MOVA,R1

11101001B

【特點(diǎn)】:寄存器名以三位數(shù)代碼的形式在指令的后三位。雙字節(jié)指令(46條):指令的操作碼和操作數(shù)各占一個字節(jié)。如:

MOVA,#data01110100Bdata很明顯:8位的操作數(shù)本身占據(jù)一個字節(jié)。程序存儲器01110100datann+1mova,#data雙字節(jié)指令在程序存儲器的存放示意圖三字節(jié)指令(16條):

指令中的操作數(shù)為雙字節(jié)。如:

MOVDPTR,#data16

1001000B,data15-8,data7-0或者:指令中分別包含1個字節(jié)的操作數(shù)和1個字節(jié)的操作數(shù)地址。如:

MOVdirect,#data

舉例:MOV20H,#0FFH

10010000data15-8data8-0MOVdptr,#data16OP(75H)direct(20H)data(FFH)MOVdirect,#data三字節(jié)指令在存儲器中存放的方式示意圖指令的字節(jié)數(shù)與指令的運(yùn)行時間指令的字節(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)系返回指指令令的的分分類類MCS-51單單片片機(jī)機(jī)的的指指令令如如果果按按功功能能劃劃分分可可以以分分為為五五類類::1,數(shù)數(shù)據(jù)據(jù)傳傳送送類類指指令令::完成成數(shù)數(shù)據(jù)據(jù)在在單單片片機(jī)機(jī)內(nèi)內(nèi)部部之之間間的的傳傳送送。。分為為8位位數(shù)數(shù)和和16位位兩兩種種。。除除了了奇奇偶偶位位外外,,指指令令的的執(zhí)執(zhí)行行對對PSW無無影影響響。。2,算算術(shù)術(shù)運(yùn)運(yùn)算算指指令令::用于于操操作作數(shù)數(shù)之之間間的的加加、、減減、、乘乘除除運(yùn)運(yùn)算算。?!咎攸c(diǎn)點(diǎn)】:多多數(shù)數(shù)情情況況下下::操操作作數(shù)數(shù)之之一一在在累累加加器器A中中,,結(jié)結(jié)果果也也保保留留在在A中中,,運(yùn)運(yùn)算算結(jié)結(jié)果果要要影影響響PSW((進(jìn)進(jìn)位位標(biāo)標(biāo)志志、、奇奇偶偶和和溢溢出出標(biāo)標(biāo)志志等等))。。3,邏邏輯輯操操作作和循環(huán)環(huán)移移位位指指令令::操作作數(shù)數(shù)之之間間的的邏邏輯輯加加、、邏邏輯輯與與、、取取反反和和異異或或等等操操作作。。多多數(shù)數(shù)情情況況下下一一個個操操作作數(shù)數(shù)在在A中中,,結(jié)結(jié)果果也也存存于于A。。移移位位指指令令分分為為左左移移、、右右移移和和帶帶進(jìn)進(jìn)位位和和不不帶帶進(jìn)進(jìn)位位幾幾種種情情況況。。與與算算術(shù)術(shù)類類指指令令相相比比邏邏輯輯類類指指令令基基本本不不影影響響PSW的的內(nèi)內(nèi)容容。。4,控控制制轉(zhuǎn)轉(zhuǎn)移移類類指指令令::條件件轉(zhuǎn)轉(zhuǎn)移移、、無無條條件件轉(zhuǎn)轉(zhuǎn)移移,,調(diào)調(diào)用用和和返返回回。?!咎攸c(diǎn)點(diǎn)】:通通過過修修改改程程序序指指針針PC的的內(nèi)內(nèi)容容,,使使CPU轉(zhuǎn)轉(zhuǎn)到到另另一一處處執(zhí)執(zhí)行行,,從從而而改改變變程程序序的的流流向向。。5,,位位操操作作指指令令::位傳傳送送、、位位置置位位、、位位運(yùn)運(yùn)算算和和位位控控制制轉(zhuǎn)轉(zhuǎn)移移等等操操作作。。【特點(diǎn)點(diǎn)】:按按位位操操作作而而不不是是按按字字節(jié)節(jié)的的操操作作。。位位控控轉(zhuǎn)轉(zhuǎn)移移的的判判斷斷不不是是檢檢測測某某一一個個字字節(jié)節(jié)而而是是對對某某一一個個位位進(jìn)進(jìn)行行檢檢測測并并決決定定是是否否進(jìn)進(jìn)行行程程序序轉(zhuǎn)轉(zhuǎn)移移。。這類類指指令令基基本本不不影影響響PSW的的內(nèi)內(nèi)容容。。返回回2.2尋尋址址方方式式在指指令令的的操操作作數(shù)數(shù)位位置置上上,,用用于于表征征、、尋尋找找操操作作數(shù)數(shù)的的方方式式定義義為為““尋址址方方式式”。。正確確的的理理解解、、掌掌握握尋尋址址方方式式,,是是學(xué)學(xué)習(xí)習(xí)、、使使用用指指令令的的關(guān)關(guān)鍵鍵。在MCS-51單單片片機(jī)機(jī)中中,,共共使使用用了了七七種種尋尋址址方方式式。。它它們們分分別別是是::1,寄存存器器尋尋址址5,變址址尋尋址址;2,直接接尋尋址址6,相對對尋尋址址;3,立即即數(shù)數(shù)尋址址7,位尋尋址址。4,寄存存器器間間接接尋尋址址繼續(xù)續(xù)寄寄存存器器尋尋址址當(dāng)所所需需要要的的操作作數(shù)數(shù)在內(nèi)內(nèi)部部某某一一個個寄寄存存器器Rn中中時時,,將將此此寄寄存存器器名名Rn直接接寫寫在在指指令令的的操操作作數(shù)數(shù)的的位位置置上上。。如如::MOVA,R7;將將寄寄存存器器R7中中的的內(nèi)內(nèi)容容送送累累加加器器A中中。。MOV20H,R0;將將寄寄存存器器R0中中的的數(shù)數(shù)據(jù)據(jù)送送內(nèi)內(nèi)存存20H單單元元INCR1;將將寄寄存存器器R1中中的的內(nèi)內(nèi)容容加加一一ADDA,R3;A的的內(nèi)內(nèi)容容與與寄寄存存器器R3的的內(nèi)內(nèi)容容相相加加送送A寄存存器器尋尋址址方方式式的的指指令令大大多多是是單單字字節(jié)節(jié)指指令令。。指指令令本本身身并并不不帶帶有有操操數(shù)數(shù),,而而是是含含有有存存放放操操作作數(shù)數(shù)的的寄存存器器的的3位位代代碼碼。。以MOVA,Rn為例例,,使使用用R7寄寄存存器器,,所所以以rrr=111,既既指指令令的的機(jī)機(jī)器器碼碼為為::0EFH11101rrr操作作碼碼寄存存器器代代碼碼返回回E8H~~EFHMOVA,Rn直直接接尋尋址址指令令本本身身含含有有操操作作數(shù)數(shù)的的8位位或或16位位地地址址。。既既指指令令直接接給出出了了操操作作數(shù)數(shù)的的地地址址。。如如::MOVA,30H;將將RAM30H單單元元內(nèi)內(nèi)容容送送累累加加器器這里里30H是操操作作數(shù)數(shù)在在RAM中中的的地地址址。。很明明顯顯,,直直接接尋尋址址的的指指令令長長度度是是兩兩個個或或三三個個字字節(jié)節(jié)。。程序ROMOP30H數(shù)據(jù)RAM操作數(shù)xnn+130H累加加器器A直接接尋尋址址示示意意圖圖使用用直直接接尋尋址址應(yīng)應(yīng)注注意意的的三三個個問問題題::1,指指令令助助記記符符中中direct是是用用16進(jìn)進(jìn)制制數(shù)數(shù)表表示示的的操操作作數(shù)數(shù)地地址址。。當(dāng)?shù)氐刂分非∏『煤迷谠赟FR區(qū)區(qū)域域時時,指指令令也也可可以以用用寄寄存存器器名名來來表表示示。。如::MOVA,80H可以以寫寫成成MOVA,P0后者者用用SFR中中寄寄存存器器的的名名字字取取代代它它的的物物理理地地址址80H。。很很明明顯顯,,后后者者更更容容易易閱閱讀讀和和交交流流,,所以以我我們們提提倡倡使使用用SFR中中寄寄存存器器名名稱稱來來代代替替直直接接地地址址。如::MOVA,SBUF;串串口口數(shù)數(shù)據(jù)據(jù)緩緩沖沖器器數(shù)數(shù)據(jù)據(jù)送送AMOVIE,#00H;初初始始化化中中斷斷允允許許寄寄存存器器MOVTH1,#0FEH;為為定定時時器器1賦賦初初值值盡管管使使用用SFR的的寄寄存存器器名名稱稱來來取取代代直直接接地地址址,,可可以以帶帶來來程程序序的的可可讀讀性性,,但但是是在在匯匯編編時時,,仍仍要要將將寄寄存存器器名名字字轉(zhuǎn)轉(zhuǎn)換換為為直直接接地地址址。。2,當(dāng)當(dāng)直直接接地地址址時時在在工工作作寄寄存存器器區(qū)區(qū)中中時時,,可可以以使使用用兩兩種種尋尋址址方方式式來來訪訪問問。。如如::MOVA,00H;將將RAM中中00H單單元元數(shù)數(shù)據(jù)據(jù)送送累累加加器器AMOVA,R0;將將工工作作寄寄存存器器R0的的內(nèi)內(nèi)容容送送累累加加器器A這里里使使用用了了不不同同的的尋尋址址方方式式,,其其指指令令的的結(jié)結(jié)構(gòu)構(gòu)也也不不相相同同。。前者是::11100101(0E5H)、00000000(00H))雙字節(jié)。。后者的機(jī)機(jī)器碼是是:11101000(0E8H)單字節(jié);在物理結(jié)結(jié)構(gòu)上,,R0與與RAM的00H單元元恰好是是同一單單元,所所以不同同的指令令而執(zhí)行行結(jié)果是是一樣的的。類似的還還有累加加器A::INCA寄存器尋尋址方式式(單字字節(jié));;INCACC直接尋址址方式((雙字節(jié)節(jié));INC0E0H直接尋址址方式((雙字節(jié)節(jié))。3,在指指令系統(tǒng)統(tǒng)中:字節(jié)地址址與位地址是完全不不同的概概念。前者用direct表表示,而而后者用用bit表示示,但在在指令中中都是用用16進(jìn)進(jìn)制表示示的數(shù)。。如:MOVA,20H;;將將RAM的20H單元元內(nèi)容送送AMOVC,20H;;將將位尋址址區(qū)中的的位地址址為20H位內(nèi)內(nèi)容送PSW中中的Cy中。。片內(nèi)RAM((20H-2FH)中中的位尋尋址區(qū)結(jié)結(jié)構(gòu)圖7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837262524232221202F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F0E0D0C0B0A090807060504030201002FH20H字節(jié)地址址返回24H位地址返回前一一次2.2.3立即即尋址指令本身身直接含含有所需需要的8位或16位的的操作數(shù)數(shù)。將此數(shù)稱稱為“立立即數(shù)””(使用用#標(biāo)明明)。如如:MOVA,#30H;將(8位)立立即數(shù)送送累加器器AMOVDPTR,#2000H;16位位立即數(shù)數(shù)送DPTR積積存器【注意】】:MOVA,#30HMOVA,30H兩者的區(qū)區(qū)別。立即數(shù)尋尋址的指指令長度度為2或或3個字字節(jié)。74H30Hnn+1ROM累加器AMOVA,#30H指令執(zhí)行行流程90H20H00HROMDPTRMOVDPTR,#2000H指令的存存儲和執(zhí)執(zhí)行返回寄寄存器器間接尋尋址指令中含含有保存操作作數(shù)地址址的寄存器Ri。MOVA,@Ri(i=0、1)CPU首首先根據(jù)據(jù)指令中中寄存器器名Ri找到操操作數(shù)地地址,然然后再從從該地址址中找到到操作數(shù)數(shù)x。如:MOVR0,#30H;;立即數(shù)數(shù)送R0寄存器器MOVA,@R0;;從從RAM的H單單元取數(shù)數(shù)送累加加器A【注意】】MOVA,@R0和MOVA,R0指令的區(qū)區(qū)別。ROM11100110RAMx30H30HR000H累加器A123使用寄存存器間址址指令時時應(yīng)注意意的三個個問題::1,間址址寄存器器Ri只只能使用用R0、、R1寄寄存器((i=0、1))。2,間址址方式不不僅用于于片內(nèi)RAM,,同樣也也適用于于片外RAM。。對于片內(nèi)內(nèi)RAM使用Ri寄存存器,尋尋址范圍圍為00H~FFH。。對于片外外RAM,可以使使用Ri,也可可以使用用DPTR做間間址寄存存器。兩兩者區(qū)別別在于后后者尋址址范圍為為0000H~~FFFFH,,兩者都都可以RAM和和ROM。3,間址址方式的的指令不不能訪問問SFR中的單單元。如如下面的的程序是是錯誤的的:MOVR1,#80HMOVA,@R1((因因?yàn)?0H為SFR的的物理地地址)MCS-51片片內(nèi)、、片外外數(shù)據(jù)據(jù)存儲器器示意圖圖特殊功能能寄存器SFR通用數(shù)據(jù)據(jù)存儲器80H7FH00HFFH片內(nèi)數(shù)據(jù)據(jù)存儲器器片片外外數(shù)據(jù)存存儲器256B個字節(jié)節(jié)64KB個字字節(jié)片外數(shù)據(jù)據(jù)存儲器64KB0000HFFFFH注意:1,訪問問片內(nèi)RAM20H存存儲單元元;MOVA,20H2,訪問問片外RAM存存儲單元元;MOVR0,#20HMOVXA,@R03,盡管管片內(nèi)與與片外的的RAM單元的00H-FFH地址址相重疊疊但由于指令的的不同不不會發(fā)生生地址混亂。返回變變址尋址址指令使用用DPTR或PC中的內(nèi)容作為為基地址,再再與累加器A的內(nèi)容相加加,其和作為為操作數(shù)地址址。如:MOVXA,@A+PC;PC內(nèi)容與與A的內(nèi)容相相加得操作數(shù)數(shù)地址并將此操作數(shù)數(shù)送AMOVXA,@A+DPTR;DPTR內(nèi)容容與A的內(nèi)容容相加得操作作數(shù)地址并將此操操作數(shù)送A使用變址指令令時,要事先先分別為A、DPTR賦值,以便獲獲得操作數(shù)得得地址。變址指令只適適用于對ROM存儲器得得訪問,如查查表等?!九e例】:已知ROM中中0302H單元有一一個數(shù)x,現(xiàn)現(xiàn)要把它送到到累加器A中中,試編程。。MOVDPTR,#0300H;立即數(shù)送DPTRMOVA,#02H;立即數(shù)送累累加器AMOVCA,@A+DPTR;從ROM的的00302單元取數(shù)送送A變址尋址示意意圖02H0300HROM

XALU0302H累加器ADPTR0300H+02H0302HMOVCA,@A+DPTR返回相相對尋址轉(zhuǎn)移指令中使使用的一種尋尋址方式。MCS-51單片機(jī)的指指令系統(tǒng)中,,有兩類轉(zhuǎn)移移指令:相對轉(zhuǎn)移(2個或3個個字節(jié))絕對轉(zhuǎn)移(3個字節(jié))。。在絕對轉(zhuǎn)移指令令中,指令直接給給出轉(zhuǎn)移的目目標(biāo)地址(2字節(jié)地址)),執(zhí)行時將將目標(biāo)地址直直接送給PC,從而控制制程序轉(zhuǎn)移;;而相對轉(zhuǎn)移指令令在執(zhí)行中是將將PC值與指指令中的8位位偏移量進(jìn)行行相加,形成成指令要轉(zhuǎn)移移的目標(biāo)地址址。SJMPrel由指令中有一一個8位偏移移量rel為帶符號位的的補(bǔ)碼,所以以控制程序轉(zhuǎn)轉(zhuǎn)移的范圍為為+127~~-128。。54H2002H程序存儲器ROM80H54H

ALU2056H累加器APC2002H+54H2056H操作碼偏移量例如:SJMP54H;;(80H、54H)2000H2002H(LOOP1)相對尋址使用用中應(yīng)注意的的問題與絕對尋址相相比,相對尋尋址具有很好好的“浮動性性”,因此是是編程人員普普遍使用的一一種尋址方式式。使用時,要注注意3點(diǎn):1,CPU進(jìn)進(jìn)行地址計算算時,PC取取值是執(zhí)行本本指令后的地地址值。以上上面的例子說說明:指令本身的首首地址是2000H,執(zhí)執(zhí)行完后變?yōu)闉?002H(既下一條條指令的首地地址)。如果使用三字字節(jié)的相對轉(zhuǎn)轉(zhuǎn)移指令,則則PC=PC+3。返回上一頁2,偏移量的的計算:rel=目標(biāo)標(biāo)地址-源地地址-2(2字節(jié)指令))或:rel=目標(biāo)地址址-源地址-3(3字節(jié)節(jié)指令)結(jié)果用補(bǔ)碼的的形式書寫。。為了減少計算算偏移量的計計算,匯編程程序允許使用用“符號地址址”的方式代代替偏移量。。如:SJMPloop1匯編程序在翻翻譯時,自動動計算并將結(jié)結(jié)果替換符號號地址。3,如果轉(zhuǎn)轉(zhuǎn)移地址的范范圍超過相對對尋址的范圍圍(如:-127~+128)時,,就要采用別別的方式法,,否則在編譯譯時,提示出出錯。返回位位尋址在位尋址指令((位操作指令令)中使用的位地地址。在一般的情況況下,系統(tǒng)的的數(shù)據(jù)都是按按字節(jié)(8位位)來存放、、處理。單片機(jī)在控制制、檢測的應(yīng)應(yīng)用中,系統(tǒng)統(tǒng)的輸入、輸輸出數(shù)據(jù)有很很多屬于開關(guān)關(guān)量信號。這這些開關(guān)量信信號以bit---““位”的形式進(jìn)行行各種運(yùn)算、、處理和存儲儲的。MCS-51單片機(jī)控制、檢測系統(tǒng)驅(qū)動器電動機(jī)外設(shè)1外設(shè)2狀態(tài)信號狀態(tài)信號控制信號在MCS-51單片機(jī)的的硬件設(shè)計上上充分考慮了了這種“布爾爾”變量的處處理,不僅在在指令系統(tǒng)中中設(shè)計了“位位操作”指令令,而且在片片內(nèi)RAM區(qū)區(qū)中還專門開開辟了一個““位尋址區(qū)”。這樣,布布爾變量可以以向字節(jié)數(shù)據(jù)據(jù)一樣進(jìn)行存存儲、尋址。。除了位尋址區(qū)區(qū)外,RAM中的大多SFR都可以以按位尋址,,換句話,SFR除了有有自己的字節(jié)節(jié)地址外,在在寄存器內(nèi)的的每一位還有有其位地址。?!九e例】:SETB20H;將位地址為為20H的位位置一SETB90H;將P1口的的d0位置一一同字節(jié)尋址中中的直接尋址址一樣,為了了增加程序的的可讀性,凡凡在SFR中中的位地址都可以使用符號地址來替代。如第第二例中,完完全可以使用用下面的指令令格式:MOVP1.0;將P0口的的d0位置一一類似還有:MOVC,ACC.7;將累加器中中的d7位送送PSW的cy這種指令在匯匯編程序進(jìn)行行翻譯時,還還是要先將符符號地址轉(zhuǎn)換換為真正的位位地址。返回2.3數(shù)據(jù)據(jù)傳送指令2.3.0傳送指令的特特點(diǎn)2.3.1內(nèi)部數(shù)據(jù)傳送送類指令2.3.2外部數(shù)據(jù)傳送送類指令2.3.3堆棧操作指令令2.3.4數(shù)據(jù)交換指令令繼續(xù)數(shù)據(jù)傳送是編編程中使用最最多、最主要要的操作。它它的功能是將將數(shù)據(jù)在累加加器、片內(nèi)的的RAM、SFR及片外外ROM、RAM之間進(jìn)進(jìn)行傳送。在傳送類指令令中,必須指指定被傳送數(shù)數(shù)據(jù)的源地址和目標(biāo)地址。在傳送過程程中,源地址的內(nèi)容容不被改變。傳送類指令除除了以累加器A為為目標(biāo)的傳送送對PSW的P有影響外,其其余的傳送類類指令對PWS一概無影影響。操作碼數(shù)據(jù)的目標(biāo)地址數(shù)據(jù)的源地址【舉例】:MOVA,R0;將R0寄存存器中的數(shù)據(jù)據(jù)送累加器A中((注意尋址方方式)指令通式:MOV<dest>,<src>傳傳送指令的的特點(diǎn)返回內(nèi)內(nèi)部數(shù)據(jù)傳傳送類指令特點(diǎn):指令的的源操作數(shù)和和目的操作數(shù)數(shù)都在單片機(jī)機(jī)內(nèi)部。1,立即尋址型傳送指令2,直接尋址型傳送指令3,寄存器尋址型型傳送指令4,寄存器間址型型傳送指令5,內(nèi)部數(shù)據(jù)傳送送類指令的使使用繼續(xù)1,立即尋址址型傳送指令令【特點(diǎn)】:原操作數(shù)字節(jié)節(jié)是立即數(shù),處在指令的的第二或第三三字節(jié),所以以這類指令都都是多字節(jié)指指令。這類指指令有如下4條。MOVA,#data;Adata(雙字節(jié)節(jié)指令)MOVRn,#data;Rndata(雙字節(jié)指令令)MOV@Ri,#data;(Ri))data(雙雙字節(jié)指令))MOVdirect,#data;directdata(三三字節(jié)指令))這類指令多用用于程序的初初始化。如::MOVR0,#20HMOVA,#00H立即尋址指令令舉例已知:R0=20H,試試問單片機(jī)執(zhí)執(zhí)行如下指令令后,累加器器A、R7、20H和21H單單元中的內(nèi)容容是什么。MOVA,#18H;;立即數(shù)18H送累加器AMOVR7,#28H;;立即數(shù)28H送寄存存器R7MOV@R0,#38H;;立即數(shù)38H送內(nèi)存存20H單單元MOV21H,#48H;;立即數(shù)48H送內(nèi)存存21H單單元返回2,直接尋尋址型傳送送指令【特點(diǎn)】:指令中至至少含有一一個源操作數(shù)或目的操作數(shù)數(shù)的地址。很明顯,,這也是2個或3個個字節(jié)的指指令格式,,其中直接接地址在第第2或第3個字節(jié)上上。這類指指令有如下下5條:MOVA,directMOVdirect,AMOVRn,directMOV@Ri,directMOVdirect2,direct1【注意】:direct為內(nèi)內(nèi)部寄存器器、RAM和SFR的地址,,換句話說說:direct適適用于片內(nèi)內(nèi)所有的地地址(寄存存器、SFR和RAM)。直接尋址指指令舉例MOVA,30H;;內(nèi)存RAM30h單單元數(shù)據(jù)送送AMOV50H,A;;A中內(nèi)容送送RAM的的50h單單元MOVR6,31H;;RAM的30h內(nèi)內(nèi)容送R6寄存器MOV@Ri,30H;;RAM30h內(nèi)容送送Ri指定定的RAM單元MOVP1,32H;;RAM32h內(nèi)容送送P1口((p1:符符號地址))MOV90H,32H;(同上,試試比較兩種種表示方法法)返回3,寄存器器尋址型傳傳送指令指令中含有有存放操作作數(shù)的寄存存器名Rn其中(n∈0,1,2,3,4,5,6,7)。共有如下三三條:MOVA,RnMOVRn,AMOVdirect,Rn返回4,寄存器器間接尋址址型傳送指指令指令特點(diǎn)::指令中Ri中存放放的不是操操作數(shù)本身身,而是操操作數(shù)在RAM中的的地址(i=0、1)。格式如下::MOVA,@RiMOV@Ri,AMOVdirect,@Ri【注意】;;Ri中存存放操作數(shù)數(shù)的地址是是有所選擇擇的,只有有非SFR的RAM單元才能能使用這種種尋址方式式。寄存器間接接尋址指令令舉例已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。。試問,下下面的指令令執(zhí)行后,,累加器A、40h、41h和42h單元中的的內(nèi)容是什什么。MOVA,@R0;RAM40h單元元內(nèi)容11h送AMOV@R1,A;A中的11h送RAM的41h單元元MOV42H,@R1;RAM的的41h單單元內(nèi)容11h送RAM42h中返回5,內(nèi)部數(shù)數(shù)據(jù)傳送類類指令的使使用1,在使用用傳送指令令時,可以以根據(jù)實(shí)際際情況選用用恰當(dāng)尋址址方式。上上面給出的的各種類型型的傳送指指令是INTEL公公司在設(shè)計計MCS-51的硬硬件時就已已經(jīng)確定下下來。編程程人員只能能像查字典典一樣去查查找、使用用。不能根根據(jù)主觀意意愿去“創(chuàng)創(chuàng)造”指令令。例如:要將將R0中的的數(shù)據(jù)傳送送到R1中中。如何使使用指令去去完成上面面的操作??movr1,r0是否可以??回答是否否定的!因因?yàn)樵贛CS-51的指令系系統(tǒng)中沒有有此條指令令!只能使使用:1,mova,r0或:2,mov01h,00hmovr1,a因此,必須須從MCS-51的的指令表中中選擇使用用指令。MCS-51內(nèi)部數(shù)據(jù)傳傳送類指令令方式圖累加器Adirect直接尋址@Ri間址Rn寄存器Data立即數(shù)返回上一次次2,以累加加器A為目目的寄存器器的傳送指指令會影響響PSW中中的奇偶位P,,而其余的的指令對PSW均無無影響。3,要會正正確地估計計指令的字字節(jié)。凡是是指令中包包含有立即即數(shù)、直接地地址的指令令,都應(yīng)當(dāng)當(dāng)在原有的的基礎(chǔ)上加加1。【舉例】::mova,@Ri()個字節(jié)節(jié)mova,direct()個字字節(jié)movdirect,data()個字節(jié)movdirect2,direct1()個字字節(jié)4,對于同同一問題可可以有不同同的編程方方法。使用用不同的方方法雖然都都可以實(shí)現(xiàn)現(xiàn)題目的要要求,但從從指令長度度、運(yùn)行時時間和可閱閱讀性上等等綜合因素素考慮,不不同的方法法就有合理理和不合理理、優(yōu)化和和繁雜之分分。所以,,在學(xué)習(xí)指指令系統(tǒng)和和編程時開開始就要養(yǎng)養(yǎng)成一個好好的、合理理的編程習(xí)習(xí)慣。5,注意給給程序進(jìn)行行正確的注注釋,這對對于閱讀、、編寫和修修改程序都都是非常重重要的。下下面就是一一些注釋的的例子:MOVA,30H;(30h)→AMOVA,R0;R0→AMOV40H,30H;(30h)→40hMOVA,@Ri;(Ri)→A內(nèi)部傳送類類指令舉例例試編出把30h和40h單元元內(nèi)容進(jìn)行行交換。MOVA,30H;(30h)→AMOV30H,40H;(40h)→30hMOV40H,A;A→40hRAMXY累加器A30H40H返回2.3.2外部數(shù)數(shù)據(jù)傳送類類指令1,16位數(shù)傳傳送指令2,外部ROM的字節(jié)傳傳送3,外部RAM的字節(jié)傳傳送指令繼續(xù)1,16位位數(shù)傳送指指令MCS-51指令系系統(tǒng)中唯一一的一條16位數(shù)據(jù)據(jù)傳送類指指令。MOVDPTR,#data16DPTR是是單片機(jī)內(nèi)內(nèi)部SFR中的兩個個寄存器DPH、DPL組合合而成。其其中DPH為高八位位,DPL為低八位位。DPTR是是一個專門門用于訪問問外部存儲儲器的間址址寄存器。。尋址能力力為64K(0~65535)。。返回2,外部ROM的字字節(jié)傳送指指令這類指令有有兩條,都都屬于變址址尋址指令令。MOVCA,@A+DPTR;;A←(A+DPTR)MOVCA,@A+PC;;PC←PC+1,A←(A+PC)該指令也稱稱為“查表表”指令。。在ROM中建立一一個數(shù)據(jù)表表,可以使使用DPTR、PC作為數(shù)據(jù)據(jù)表格的基基地址。在第一條指指令中:用用DPTR作為基地地址。使用用前,先將將數(shù)據(jù)表的的首地址送送入DPTR中,累累加器A作作為偏移量量。由兩者者數(shù)據(jù)相加加得到待查查的表中數(shù)數(shù)據(jù)地址并并取出。第二條指令令是以程序序計數(shù)器PC為基地地址。由于于PC的內(nèi)內(nèi)容與該指指令在ROM中的位位置有關(guān),,所以一旦旦該指令在在程序中的的位置確定定,其PC的值也就就確定。外部ROM的字節(jié)傳傳送指令舉例已知累加器器A中存有有0~9范范圍內(nèi)的數(shù)數(shù),試用查查表指令編編寫出查找找出該數(shù)平平方的程序序。1,采用DPTR作作基址寄存存器:設(shè)平方表的的首地址為為2000h,累加加器A中的的內(nèi)容恰好好是查表的的偏移量。。首先將表表的起始地地址2000h送入入DPTR中。MOVDPTR,#2000H;;指針針賦值MOVCA,@A+DPTR;;平方值值送AROM01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h2,采用PC作基址址寄存器:與DPTR不同,使使用PC作作為基地址址時,必須須對累加器A的數(shù)數(shù)據(jù)進(jìn)行修修正,以保保證@a+pc恰好好找到待查的平方方值地址。。ORG1FFBH1FFBH74dataADDA,#data;data=02h1FFDH83HMOVCA,@A+PC;PC=1FFE1FFEH80FEHSJMP$2000H00HDB0;平房表首首址2001H01HDB12002H04HDB42003H09HDB92004H10HDB162005H19HDB25:::2009H51HDB81ENDdata為為MOVC指令首地地址與表頭頭地址之間間的單元數(shù)。74hdata83h80hFEh01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh返回3,外部RAM的字字節(jié)傳送指指令實(shí)現(xiàn)外部RAM和累累加器A之之間的數(shù)據(jù)據(jù)傳送。只只有寄存器器間接尋址址的指令。。MOVXA,@Ri使使用Ri寄寄存器間址址尋址范圍圍0~255hMOVX@Ri,A在在硬件電路路中P0口口輸出8位位地址數(shù)據(jù)據(jù)。MOVXA,@DPTR使使用DPTR間址,,尋址范圍圍0~65535hMOVX@DPTR,A在在硬件電路路中,使用用P0口輸輸出低8位位,P2口輸出出高8位外外部RAM地址。外部RAM的字節(jié)傳傳送指令舉舉例已知外部RAM的88H單元元有一個數(shù)數(shù)x,試編編程將x送送外部RAM的1818H單單元?!窘狻浚和馔獠縍AM中的數(shù)據(jù)是是不能直接接傳送的,,因此必須須使用兩次次MOVX指令完成此此操作。ORG2000HMOVR0,#88H;為8位指指針賦值MOVDPTR,#1818H;為16位位指針賦值值MOVXA,@R0;取x到到累加器器AMOVX@DPTR,A;x送RAM的1818h單元SJMP$;停機(jī)END返回2.3.3堆棧操操作指令堆棧操作是是一種特殊殊的數(shù)據(jù)傳傳送指令。。堆棧:一個個用來保存存程序斷點(diǎn)點(diǎn)、數(shù)據(jù)的的特殊的存存儲區(qū)域。。在MCS-51單單片機(jī)中,,棧區(qū)是占占用片內(nèi)RAM的存存儲空間,,具體棧位位置由指針針SP來確確定(系統(tǒng)統(tǒng)上電時,,SP=07h)。。1,進(jìn)棧操作:pushdirect;sp+1→sp,(direct)→(sp)2,出棧操作:popdirect;(sp)→(direct),sp-1→sp【注意】::①尋址方式式為直接尋尋址,所以以pusha是錯誤的,,應(yīng)當(dāng)是pushacc或push0e0h,同理:pushr0也是錯誤的的。②進(jìn)棧是堆堆棧向上““生長”的的過程,即即sp+1;出棧則相相反。③系統(tǒng)上電電時,sp=07h。SP的值可以根根據(jù)需要進(jìn)進(jìn)行修改,,以適應(yīng)具具體編程的的需要。在在確定棧區(qū)區(qū)位置時要要考慮對數(shù)數(shù)據(jù)區(qū)的影影響,以避避免數(shù)據(jù)區(qū)區(qū)與棧區(qū)沖沖突。堆棧操作指指令舉例((一)下面是一個個BCD碼碼轉(zhuǎn)換為二二進(jìn)制的子子程序BCDB中有有關(guān)堆棧操操作的例子子。在這里里,進(jìn)棧操操作是為了了保護(hù)主程程序中相關(guān)關(guān)寄存器中中的數(shù)據(jù),,因?yàn)樽映坛绦蛞褂糜眠@些寄存存器。org0800hbcdb:pushpswpushaccpushb::popbpopaccpoppswretRAMbaccpsw棧底SP堆棧棧操操作作指指令令舉舉例例((二二))堆棧棧操操作作指指令令除除了了可可以以在在子子程程序序的的設(shè)設(shè)計計中中,,對對主主程程序序的的數(shù)數(shù)據(jù)據(jù)進(jìn)進(jìn)行行保保護(hù)護(hù)。。還還可可以以根根據(jù)據(jù)堆堆棧棧操操作作的的特特點(diǎn)點(diǎn)完完成成一一些些特特殊殊的的操操作作。。【舉舉例例】】::設(shè)設(shè)片片內(nèi)內(nèi)RAM的的30h單單元元存存有有x,,40h單單元元存存有有y。。試試將將兩兩個個單單元元內(nèi)內(nèi)容容互互換換。。push30hpush40hpop30hpop40hRAMxyyxyx棧底SP=07h40h30h繼續(xù)數(shù)數(shù)據(jù)交換指指令為提供一種方方便的累加器和寄存器或RAM之間的數(shù)據(jù)交交換。避免了了使用一般mov傳送指令完成成交換時的不不便。格式:xcha,Rn;;a?Rnxcha,direct;;a?(direct)xcha,@Ri;;a?(Ri)xchda,@Ri;;a3~0?(Ri)3~0舉例:已知,,片外RAM20h單元元、內(nèi)部RAM20h單單元分別有數(shù)數(shù)x和y,試編程互將將兩數(shù)相交換換。movR1,#20h;;指針賦初值movxa,@R1;;x→axcha,@R1;;交換a?(20h),y→amovx@R1,a;;y→(20h)片外RAM數(shù)據(jù)交換指令令舉例(一))舉例:已知,,片外RAM20h單元元、內(nèi)部RAM20h單單元分別有數(shù)數(shù)x和y,試編程互將將兩數(shù)相交換換。movR1,#20h;;指針賦賦初值movxa,@R1;;x→axcha,@R1;交換a?(20h),y→amovx@R1,a;;y→(20h)片外RAM片內(nèi)RAMy

(x)片外RAMx(y)(y)x20h20h累加器A123數(shù)據(jù)交換指令令舉例(二))已知RAM50h單元有有一個0~9的數(shù),試編編程將它變成成相應(yīng)的ASCII碼。?!窘狻浚?~9的ASCII碼是30h~39h,兩者相相差30h。。方法一:對50h單元的的數(shù)據(jù)高四位位組裝一個30h。movr0,#50h;指針賦值mova,#30h;30h→Axchda,@r0;A3~0?(r0)3~0,在A中組成成ASCII碼mov@r0,a;A中的ASCII送回50h單元0000010150h00110101A=30h交換后A=35h12繼續(xù)2.4算邏邏運(yùn)算和移位位指令功能:完成算算術(shù)運(yùn)算、邏邏輯運(yùn)算和循循環(huán)移位三大大功能。特點(diǎn):大多指指令都要由累累加器A來存存放一個源操操作數(shù),并把把操作結(jié)果放放回累加器A中。2.4.1:算術(shù)運(yùn)算算指令2.4.2:邏輯運(yùn)算指令2.4.3:移位指令繼續(xù)2.4.1:算術(shù)運(yùn)算算指令不帶進(jìn)位的加加法指令((ADD))1,加法指令:帶進(jìn)位位的加法指令令((ADC)加1指令((INC)(編程舉例)2,減法指令:帶進(jìn)位的的減法指令((SUBB))減1指令((DEC))3,十進(jìn)制調(diào)整指指令:((DAA)4,乘法和除法指指令:((MULDIV)加法指令(一一):不帶進(jìn)位的加加法指令格式:ADDA,Rn ;A+Rn→AADDA,direct;;A+(direct)→AADDA,@Ri ;A+(Ri)→AADDA,#data ;A+data→A【注意】:1,參加運(yùn)算的的數(shù)據(jù)都應(yīng)當(dāng)當(dāng)是8位的,,結(jié)果也是8位并影響PSW。2,根據(jù)編程者者的需要,8位數(shù)據(jù)可以以是無符號數(shù)數(shù)(0~255),也可以是有有符號數(shù)(-127~~+128))。3,不論編程者者使用的數(shù)據(jù)據(jù)是有符號數(shù)數(shù)還是無符號號數(shù),CPU都將它們視為為有符號數(shù)((補(bǔ)碼)進(jìn)行行運(yùn)算并影響響PSW。不帶進(jìn)位的加加法指令舉例例(一)試分析執(zhí)行下下列指令后累累加器A和PSW中各標(biāo)標(biāo)志的變化。。MOVA,#19HCy=0;ADDA,#66HAC=0OV=CP?CS=025A=00011001BP=1+102data=01100110B127001111111B1,若兩數(shù)都都是無符號數(shù)數(shù),則因Cy=0無溢出出,25+102=127。2,若兩個數(shù)數(shù)是有符號數(shù)數(shù),則因OV=0無溢出出。cy000CPCSAC不帶進(jìn)位的加加法指令舉例例(二)試分析執(zhí)行下下列指令后累累加器A和PSW中各標(biāo)標(biāo)志的變化。。MOVA,#5AHCy=0;ADDA,#6BHAC=0;OV=CP??CS=190A=01011010BP=0+107data=01101011B197011000101BCPCSAC1,若兩數(shù)是是無符號數(shù),,因Cy=0無溢出:90+107=1972,若兩數(shù)是是有符號數(shù),,因OV=1,故有溢出出,兩個正數(shù)數(shù)相加后變?yōu)闉樨?fù)數(shù),很明明顯結(jié)果是不不正確的。加法指令(二二):帶進(jìn)位的加加法指令格式:ADDCA,Rn;;A+Rn+Cy→AADDCA,direct;;A+(direct)+Cy→AADDCA,@Ri ;A+(Ri)+Cy→AADDCA,#data;;A+data+Cy→A【注意】:這這里的Cy是指令執(zhí)執(zhí)行前的Cy;對PSW的影影響同ADD指令。加1指令格式: INCA;;累加加器A加一INCRn;;Rn+1→RnINCdirect;;內(nèi)存存單元數(shù)據(jù)加加一INC@Ri;;內(nèi)存單單元數(shù)據(jù)加一一INCDPTR;;dptr+1→dptr【注意】:1,除了第一條對對PSW的P有影響外,其其余對PSW均無影響。2,由于上面的原原因,INC指令不能作作為一般的數(shù)數(shù)據(jù)算術(shù)運(yùn)算算使用,INC主要用用于修改數(shù)據(jù)據(jù)指針等控制制、循環(huán)語句句中使用。返回本節(jié)目錄錄編程舉例已知M1、M2單元中存存有兩個16位無符號數(shù)數(shù)x1、x2(低位在前))。試寫出x1+x2,并將結(jié)果放放入M1、M1+1單元元(低8位在在M1單元))。設(shè)兩數(shù)之之和不會超過過16位(65535))。【 解】:MOVR0,#M1;x1指針賦初初值MOVR1,#M2;x2指針賦初初值MOVA,@R0;取x1低8位位送AADDA,@R1;x1與x2低低8位相加MOV@R0,a;低8位和送m1單元INCR0INCR1;修改指針MOVA,@R0;取x1的高8位送AADDCA,@R1;x1與x2的的高8位和Cy相加MOV@R0,A;結(jié)果送M1+1單元RAMX2data8~15X2data0~7X1data8~15X1data0~7M1M1+1M2M2+1返回本節(jié)目錄錄減法指令(帶進(jìn)位的減法法指令)在MCS-51單片機(jī)的的指令系統(tǒng)中中,只有:①帶進(jìn)位的減法法SUBB②減一DEC兩兩種指令令。1減法指令::格式:SUBBA,Rn ;A–Rn–Cy→ASUBBA,direct;;A–(direct)–Cy→ASUBBA,@Ri ;A–(Ri)––Cy→ASUBBA,#data;;A–data–Cy→A使用減法指令令要注意的幾幾個問題1,在單片機(jī)機(jī)內(nèi)部,減法法指令實(shí)際上上是采用補(bǔ)碼碼的加法實(shí)現(xiàn)現(xiàn)的。但要判判定減法結(jié)果果編程者可以以按二進(jìn)制減減法法則驗(yàn)證證。2,無論相減減兩數(shù)是無符符號數(shù)還是有有符號數(shù),減減法操作總是是按有符號數(shù)數(shù)來處理、影影響PSW中中相關(guān)的標(biāo)志志(詳見舉例例)。3,在MCS-51的指指令系統(tǒng)中沒沒有不帶Cy的減法,所所以在使用SUBB指令前必須使使用一條清除除Cy的指令令:CLRC。減法指令應(yīng)用用舉例試分析執(zhí)行下下列指令后累累加器A和PSW中各標(biāo)標(biāo)志的變化。。CLRCMOVA,#52H01010010B=82SUBBA,#0B4H10110100B=-7682a=01010010–-76data=10110100158110011110=-62H=-98手工計算CPCSAC101【分析】:CPU的計計算得-98,很明顯答答案是錯誤的的。原因是OV=1,既既產(chǎn)生了溢出出。所以,對對于符號數(shù)的的減法在運(yùn)算算后一定要檢檢測OV=1?返回本節(jié)目錄錄減一指令格式: DECA;;累加加器A減一DECRn;;Rn-1→RnDECdirect;;內(nèi)存單元數(shù)數(shù)據(jù)減一DEC@Ri;;內(nèi)內(nèi)存單元數(shù)據(jù)據(jù)減一【注意】:1,除了第一條對對PSW的P有影響外,其其余對PSW均無影響。2,由于上面的原原因,DEC指令一般不不作為數(shù)據(jù)算算術(shù)運(yùn)算使用用(因?yàn)椴荒苣軐SW的的OV等位產(chǎn)產(chǎn)生影響,它它主要用于修修改數(shù)據(jù)指針針在控制、循循環(huán)語句中使使用)。返回本節(jié)目錄錄十進(jìn)制調(diào)整指指令在CPU進(jìn)行行BCD碼運(yùn)運(yùn)算時,必須須在運(yùn)算后進(jìn)進(jìn)行十進(jìn)制調(diào)調(diào)整,這是因因?yàn)椋珻PU在運(yùn)算時,,并不知道數(shù)數(shù)據(jù)是二進(jìn)制制還是BCD碼。格式:DAA;若AC=1或A3~0>9,則A+06h→A;若Cy=1或A7~4>9,則A+60h→A【注意】:1,DAA指令必須緊緊跟在加法指指令之后;2,DAA指令只適用用于加法指令令的調(diào)整。十進(jìn)制調(diào)整指指令應(yīng)用舉例例(一)1,BCD加加法運(yùn)算:試寫出完成85+59的的BCD碼的的加法程序。。MOVA,#85HADDA,#59HDAASJMP$85a=10000101B+59dtat=01011001低4位〉9,所所以加06h+00000110B11100100B高高4位〉9,所以加60h01100000B101000100B結(jié)結(jié)果果為144h((1包包含在在Cy)【注意意】::144H是是用16進(jìn)進(jìn)制數(shù)數(shù)來表表示十十進(jìn)制制,既既BCD碼碼。十進(jìn)制制調(diào)整整指令令應(yīng)用用舉例例(二二)2,BCD減法法運(yùn)算算:由于DAA指令只只能對對BCD碼碼的加加法進(jìn)進(jìn)行調(diào)調(diào)整,,所以以遇到到BCD碼的加加法時時就要要將其其減法變變?yōu)榧蛹臃ㄟ\(yùn)算,,然后后再使使用DAA指令進(jìn)進(jìn)行調(diào)調(diào)整。。減法變變加法法就是是使用用BCD碼的補(bǔ)補(bǔ)碼運(yùn)運(yùn)算法法則::將被減數(shù)數(shù)-減數(shù)變?yōu)楸粶p數(shù)數(shù)+減數(shù)的的補(bǔ)碼碼。減數(shù)的的補(bǔ)碼碼=BCD碼的模模-減減數(shù)其中BCD碼的的模為為100H=99H+01H=9AH已知::在M1、、M2中分分別存存有被被減數(shù)數(shù)91和減減數(shù)36。。試編程程求19-36并將將結(jié)果果存入入M3單元元。【解】】:1,算法::91-36=91+(100-36))=91+(9A-36)2,編程::CLRC;清清除除CyMOVA,#9AH;BCD碼碼的模模100送送ASUBBA,M2;計算算減數(shù)數(shù)的補(bǔ)補(bǔ)碼((結(jié)結(jié)果在在A中中)ADDA,M1;被減減數(shù)+減數(shù)數(shù)的補(bǔ)補(bǔ)碼((結(jié)果果在A中))DAA;十進(jìn)進(jìn)制調(diào)調(diào)整MOVM3,A;結(jié)果果送M3單單元CLRC;清除除進(jìn)位位位((不要要Cy)(請同同學(xué)自自己驗(yàn)驗(yàn)證一一下))返回本本節(jié)目目錄乘法和和除法法指令令這是MCS-51單單片機(jī)機(jī)唯一一的一一類單單字節(jié)節(jié)4周周期指指令,,它相相當(dāng)于于4條條加法法指令令的運(yùn)運(yùn)行時時間。。格式::MULAB;a×b=ba(b存存高8位,,a存存低8位))DIVAB;a÷b=a…b(a存存商,,b存存余數(shù)數(shù))【注意意】::指令令對標(biāo)標(biāo)志的的影響響:1,在在乘法法指令令中對PSW的的影響響有Cy、、OV、和和P。。具體如如下:Cy→0;P取決決于A中““1””的個個數(shù);;OV表明明積的的大小小。當(dāng)當(dāng)積超超過255(B≠0)時時,OV=1。。2,在在除法法指令令中,Cy、P與乘乘法相相同。。在執(zhí)執(zhí)行除除法指指令時時,若若B=0時時OV=1,表表示除除數(shù)=0除除法無無意義義,其其余情情況下下OV被復(fù)復(fù)位。。返回本本節(jié)目目錄2.4.2:邏邏輯輯運(yùn)算算指令令功能:對2個個8位位二進(jìn)進(jìn)制數(shù)數(shù)進(jìn)行行邏輯與與、或或、非非和異異或操作;;特點(diǎn):除了以以累加加器A為目目標(biāo)寄寄存器器的指指令影影響PSW的P位外外,其其余指指令對對PSW均均無影影響。。1,邏輯與運(yùn)算指令(ANL)2,邏輯或運(yùn)算指令(ORL)3,邏輯異或指令(XRL)4,累加器器清零和取反反指令(CLR&CPL)繼續(xù)邏輯與運(yùn)算算指令格式:ANLA,Rn;A∧Rn→→AANLA,direct;A∧(direct)→AANLA,@Ri;A∧(Ri)→→AANLA,#data;A∧data→AANLdirect,A;(direct)∧A→directANLdirect,#data;(direct)∧data→direct上面的指令令也可以分分為兩類::1,以累加器A為目標(biāo)寄存存器的邏輯輯運(yùn)算指令令;2,以內(nèi)存單元為目標(biāo)的邏邏輯運(yùn)算指指令。應(yīng)用舉例(一)已知R0=30H和和(30H)=0AAH,試試問執(zhí)行下下列指令后后累加器A和30H單元中的的內(nèi)容是什什么?1,MOVA,#0FFH2,MOVA,#0FHANLA,R0ANLA,30H(A=30H,(30H)=0AAH)((A=0AH,(30H)=0AAH)3, MOVA,#0F0H4, MOVA,#80HANLA,@R0ANL30H,A(A=0A0H,((30H))=0AAH)(A=80H,(30H)=80H)很明顯:ANL操作作可以從某某個存儲單單元中取出出某幾位,,而把其它它的為屏蔽蔽掉(清零零)。應(yīng)用舉例(二)已知:M1單元有一一個9的ASCII碼39H,試編程程將其變?yōu)闉锽CDM碼。解:1,使使用ANLdirect,#data的指令::ANLM1,#0FH解:2,使使用ANLA,#data指指令。MOVA,M1ANLA,#0FHMOVM1,A返回本節(jié)目目錄邏輯或運(yùn)算算指令格式:ORLA,Rn;A∨Rn→→AORLA,direct;A∨(direct)→AORA,@Ri;A∨(RI)→AORLA,#data;A∨data→AORLdirect,A;(direct)∨A→directORLdirect,#data;(direct)∨data→direct同與運(yùn)算一一樣,上面面的指令也也可以分為為兩類:1,以累加器A為目標(biāo)寄存存器的邏輯輯運(yùn)算指令令;2,以內(nèi)存單元為目標(biāo)的邏邏輯運(yùn)算指指令。應(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ù)數(shù)據(jù)【小結(jié)】::與運(yùn)算可以“屏屏蔽”某某些位;或運(yùn)算可以“置置位”某某些位。返回本節(jié)目目錄邏輯異或運(yùn)運(yùn)算指令格式:XRLA,Rn;A⊕Rn→→AXRLA,direct;A⊕(direct)→AXRA,@Ri;A⊕(RI)→AXRLA,#data;A⊕data→AXRLdirect,A;(direct)⊕A→directXRLdirect,#data;(direct)⊕data→direct特點(diǎn):按位位運(yùn)算,相相同時為0,不同時時為1。使使用異或可可以實(shí)現(xiàn)將將某個字節(jié)節(jié)的數(shù)據(jù)或或?qū)?shù)據(jù)的的某幾位變變反。舉例已知:外部部RAM的的30H單單元中有一一個數(shù)AAH,現(xiàn)要要將其高4位不變,,低4位取取反,試編編程。解1,利用用MOVXA,@Ri指指令:MOVR0,#30H10101010MOVXA,@R0⊕00001111XRLA,#0FH10100101MOVX@R0,A解2,利用用MOVXA,@DPTRMOVDPTR,,#0030HMOVXA,@DPTRXRLA,#0FHMOVX@DPTR,A返回本節(jié)目目錄累加器清零零和取反指指令用傳送指令令可以實(shí)現(xiàn)現(xiàn)對累加器器A的清零零和取反操操作,但是是它們都是是雙字節(jié)指指令。在MCS-51的指令令系統(tǒng)中專專門設(shè)計了了單字節(jié)、、單周期對對累加器清清零和取反反的指令。。格式:CLRA;累加器清清零CPLA;累加器取取反取反指令可可以方便的的實(shí)現(xiàn)求補(bǔ)補(bǔ)操作。舉例:已知30H單元中有有一個數(shù)x,寫出對對它求補(bǔ)的的程序。MOVA,30HCPLAINCAMOV30H,A邏輯運(yùn)算指令令應(yīng)用舉例設(shè)X、Y和Z分別存在X、Y和Z單單元。試編出出能實(shí)現(xiàn)此電電路功能的程程序,并將結(jié)結(jié)果送入F單單元。解:MOVA,XANLA,Y;;X∧Y→AMOVR1,A;;送R1暫暫存MOVA,YXRLA,Z;;Y∨Z→ACPLA;;A取反ORLA,R1;(X∧Y)∨(Y∨Z)→AMOVF,A;;A→F⊕+XYZF返回本節(jié)目錄錄2.4.3:移位指令令雖然MCS-51只有5條移位指令令,但它可以以處理所有移移位問題。格式:RLARRARLCARRCASWAPA【注意】:只只能對累加器器A進(jìn)行移位位。A7←A0A7→A0A7←A0CyCyA7A4

A3A0

A7→A0舉例(一)已知:在M1和M1+1單元有一個個16位數(shù)((M1存低8位),試編編程將其擴(kuò)大大2倍(設(shè)結(jié)結(jié)果小于65535)。。解:擴(kuò)大2倍倍可以用左移移一位來實(shí)現(xiàn)現(xiàn)。dataL=11001111

10011110dataH=00101100

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論