MCS-51單片機指令系統(tǒng)講義[通用]_第1頁
MCS-51單片機指令系統(tǒng)講義[通用]_第2頁
MCS-51單片機指令系統(tǒng)講義[通用]_第3頁
MCS-51單片機指令系統(tǒng)講義[通用]_第4頁
MCS-51單片機指令系統(tǒng)講義[通用]_第5頁
已閱讀5頁,還剩114頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、MCS-51單片機指令系統(tǒng)講義2.1:MCS-51指令系統(tǒng)的概述 MCS-51共有111條指令,指令的長度和執(zhí)行時間因不同的指令而各不相同。2.1.1 指令格式2.1.2 指令的三種表示形式2.1.3 指令的字節(jié)數(shù)2.1.4 指令的分類繼續(xù)2.1.1 指令格式:指令格式:既指令的結構形式。OPDATA 或 ADDRESS操作碼操作數(shù)或操作數(shù)地址由操作碼和操作數(shù)(或操作數(shù)地址)構成指令的結構。舉例:MOV A,#0FFH ADD A,R0返回指令的表示形式是識別指令的標志。1,二進制的表示形式:(以“累加器的內容+08H”為例) 00100100B 操作碼 OP (加法) 00001000B 操

2、作數(shù)DATA(08H)特點: 能被CPU直接識別、運行的形式。也稱機器碼、匯編語 言的目標代碼。缺點:不便于閱讀、記憶和調試修改。2.1.2 指令的三種表示形式:2,十六進制表示方式: 它是對二進制形式的一種簡化。 00100100B 24H 00001000B 08H 在實驗室等少數(shù)環(huán)境下,可以將這種形式作為輸入程序的一種輔助手段。但是,這種形式的指令格式必須由對應的監(jiān)控程序把它們翻譯成二進制的“機器碼”后存入程序存儲器并運行。二進制表示的形式 十六進制表示的形式3,指令的“助記符”方式(也稱“匯編格式”): 00100100B 24H 00001000B 08H ADD A,#08H 1,

3、這是一種由英文單詞或字母、數(shù)字來表征指令功能的 形式。是一種便于閱讀、書寫和交流的表示形式。 2,這種 “匯編”格式的指令必須把它“翻譯”為二進制形式 “機器碼”后才能為CPU所識別和執(zhí)行。 3,三種不同的表示方法適用于不同的場合。 本章內容都以匯編的形式介紹指令系統(tǒng)。二進制表示形式 十六進制表示 匯編格式返回2.1.3 指令的字節(jié)數(shù) 在MCS-51單片機的指令系統(tǒng)中,因指令操作碼和操作數(shù)的不同,指令(在存儲器中)長度也各不相同。 分為單字節(jié)、雙字節(jié)和三字節(jié)。單字節(jié)指令(49條):分無操作數(shù)、有操作數(shù)兩種。 無操作數(shù):如 INC DPTR 10100011B INC A 00000100B 【

4、特點】:操作數(shù)隱含在操作碼中。 含有操作數(shù)寄存器名稱的單字節(jié)指令: 如:MOV A,R0 11101000B MOV A,R1 11101001B 【特點】:寄存器名以三位數(shù)代碼的形式在指令的后三位。雙字節(jié)指令(46條): 指令的操作碼和操作數(shù)各占一個字節(jié)。 如: MOV A,#data 01110100B data 很明顯:8位的操作數(shù)本身占據(jù)一個字節(jié)。程序存儲器01110100datann+1mov a,#data雙字節(jié)指令在程序存儲器的存放示意圖三字節(jié)指令(16條): 指令中的操作數(shù)為雙字節(jié)。如: MOV DPTR,#data16 1001000B,data15-8,data7-0 或者

5、:指令中分別包含1個字節(jié)的操作數(shù)和1個字節(jié)的操作數(shù)地址。如: MOV direct,#data 舉例:MOV 20H,#0FFH 10010000data15-8data8-0MOV dptr,#data16OP (75H)direct (20H)data (FFH)MOV direct,#data三字節(jié)指令在存儲器中存放的方式示意圖指令的字節(jié)數(shù)與指令的運行時間指令的字節(jié)多是否意味著指令周期就長?指 令字節(jié)數(shù)周期數(shù)指令說明 MOV A,R011R0內容送累加器AMOV A,#0FFH21立即數(shù)FFH送AMOV 20H,#30H32立即數(shù)30H送內存20h單元MUL AB14乘法指令INC DP

6、TR1116位寄存器DPTR加一從表中可見,指令的字節(jié)數(shù)與指令周期不是對等的關系返回2.1.4 指令的分類 MCS-51單片機的指令如果按功能劃分可以分為五類:1,數(shù)據(jù)傳送類指令:完成數(shù)據(jù)在單片機內部之間的傳送。 分為8位數(shù)和16位兩種。除了奇偶位外,指令的執(zhí)行對 PSW無影響。2,算術運算指令:用于操作數(shù)之間的加、減、乘除運算。 【特點】:多數(shù)情況下:操作數(shù)之一在累加器A中,結果也保留在A中,運算結果要影響PSW(進位標志、奇偶和溢出標志等)。3,邏輯操作和循環(huán)移位指令:操作數(shù)之間的邏輯加、邏輯與、取反和異或等操作。多數(shù)情況下一個操作數(shù)在A中,結果也存于A。移位指令分為左移、右移和帶進位和不

7、帶進位幾種情況。與算術類指令相比邏輯類指令基本不影響PSW的內容。4,控制轉移類指令:條件轉移、無條件轉移,調用和返回。 【 特點】:通過修改程序指針PC的內容,使CPU轉到另一處執(zhí)行,從而改變程序的流向。5,位操作指令:位傳送、位置位、位運算和位控制轉移等操作。 【 特點】:按位操作而不是按字節(jié)的操作。位控轉移的判斷不是檢測某一個字節(jié)而是對某一個位進行檢測并決定是否進行程序轉移。 這類指令基本不影響PSW的內容。返回2.2 尋址方式在指令的操作數(shù)位置上,用于表征、尋找操作數(shù)的方式定義為“尋址方式”。正確的理解、掌握尋址方式,是學習、使用指令的關鍵。在MCS-51單片機中,共使用了七種尋址方式

8、。 它們分別是: 1,寄存器尋址 5,變址尋址; 2,直接尋址 6,相對尋址; 3,立即數(shù)尋址 7,位尋址。 4,寄存器間接尋址 繼續(xù)2.2.1寄存器尋址當所需要的操作數(shù)在內部某一個寄存器Rn中時,將此寄存器名Rn直接寫在指令的操作數(shù)的位置上。如: MOV A,R7 ;將寄存器R7中的內容送累加器A中。 MOV 20H,R0 ;將寄存器R0中的數(shù)據(jù)送內存20H單元 INC R1 ;將寄存器R1中的內容加一 ADD A,R3 ;A的內容與寄存器R3的內容相加送A 寄存器尋址方式的指令大多是單字節(jié)指令。指令本身并不帶有操數(shù),而是含有存放操作數(shù)的寄存器的3位代碼。以MOV A,Rn為例,使用R7寄存

9、器,所以rrr=111,既指令的機器碼為:0EFH1 1 1 0 1 r r r操作碼寄存器代碼返回E8HEFHMOV A,Rn2.2.2 直接尋址指令本身含有操作數(shù)的8位或16位地址。既指令直接給出了操作數(shù)的地址。如: MOV A,30H ;將RAM30H單元內容送累加器 這里30H是操作數(shù)在RAM中的地址。很明顯,直接尋址的指令長度是兩個或三個字節(jié)。程序ROMOP30H數(shù)據(jù)RAM操作數(shù)xnn+130H累加器A直接尋址示意圖使用直接尋址應注意的三個問題:1,指令助記符中direct是用16進制數(shù)表示的操作數(shù)地址。 當?shù)刂非『迷赟FR區(qū)域時,指令也可以用寄存器名來表示。 如: MOV A,80

10、H 可以寫成 MOV A,P0 后者用SFR中寄存器的名字取代它的物理地址80H。很明顯,后者更容易閱讀和交流,所以我們提倡使用SFR中寄存器名稱來代替直接地址。 如:MOV A,SBUF ;串口數(shù)據(jù)緩沖器數(shù)據(jù)送A MOV IE,#00H ;初始化中斷允許寄存器 MOV TH1,#0FEH ;為定時器1賦初值 盡管使用SFR的寄存器名稱來取代直接地址,可以帶來程序的可讀性,但是在匯編時,仍要將寄存器名字轉換為直接地址。2,當直接地址時在工作寄存器區(qū)中時,可以使用兩種尋址方式來訪問。 如: MOV A,00H ;將RAM中00H單元數(shù)據(jù)送累加器A MOV A,R0 ;將工作寄存器R0的內容送累加

11、器A 這里使用了不同的尋址方式,其指令的結構也不相同。 前者是:11100101(0E5H)、00000000(00H) 雙字節(jié)。 后者的機器碼是:11101000(0E8H) 單字節(jié); 在物理結構上,R0與RAM的00H單元恰好是同一單元,所以不同的指令而執(zhí)行結果是一樣的。 類似的還有累加器A: INC A 寄存器尋址方式(單字節(jié)); INC ACC 直接尋址方式(雙字節(jié)); INC 0E0H 直接尋址方式(雙字節(jié))。 3,在指令系統(tǒng)中:字節(jié)地址與位地址是完全不同的概念。 前者用direct表示,而后者用bit 表示,但在指令中都是用16進制表示的數(shù)。 如: MOV A,20H ;將RAM的

12、20H單元內容送A MOV C,20H ;將位尋址區(qū)中的位地址為20H位內容送 PSW 中的Cy中。片內 RAM(20H-2FH)中的位尋址區(qū)結構圖7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A393837262524232221202F2E2D2C2B2A292827262524232221201F1E1D1C1B1A191817161514131211100F

13、0E0D0C0B0A090807060504030201002FH20H字節(jié)地址返回24H位地址返回前一次2.2.3立即尋址指令本身直接含有所需要的8位或16位的操作數(shù)。 將此數(shù)稱為“立即數(shù)”(使用#標明)。如: MOV A,#30H ;將(8位)立即數(shù)送累加器A MOV DPTR,#2000H ;16位立即數(shù)送DPTR積存器 【注意】:MOV A,#30H MOV A,30H 兩者的區(qū)別。立即數(shù)尋址的指令長度為2或3個字節(jié)。74H30Hnn+1ROM累加器AMOV A,#30H 指令執(zhí)行流程90H20H00HROMDPTRMOV DPTR,#2000H指令的存儲和執(zhí)行返回2.2.4 寄存器間

14、接尋址指令中含有保存操作數(shù)地址的寄存器Ri。 MOV A,Ri ( i=0、1) CPU首先根據(jù)指令中寄存器名Ri找到操作數(shù)地址,然后再從該地址中找到操作數(shù) x。 如:MOV R0,#30H ;立即數(shù)送R0寄存器 MOV A,R0 ;從RAM的H單元取數(shù)送累加器A【注意】MOV A,R0 和 MOV A,R0 指令的區(qū)別。ROM11100110RAMx30H30HR000H累加器A123使用寄存器間址指令時應注意的三個問題:1,間址寄存器Ri只能使用R0、R1寄存器(i=0、1)。2,間址方式不僅用于片內RAM,同樣也適用于片外RAM。 對于片內RAM使用Ri寄存器,尋址范圍為00HFFH。

15、對于片外RAM,可以使用Ri,也可以使用DPTR做間址寄存器。兩者區(qū)別在于后者尋址范圍為0000HFFFFH,兩者都可以RAM和ROM。3,間址方式的指令不能訪問SFR中的單元。如下面的程序是錯誤的: MOV R1,#80H MOV A,R1 (因為80H為SFR的物理地址)MCS-51 片內 、片外 數(shù)據(jù)存儲器示意圖 特殊功能寄存器SFR通用數(shù)據(jù)存儲器80H7FH00HFFH片內數(shù)據(jù)存儲器 片外數(shù)據(jù)存儲器256B個字節(jié) 64KB個字節(jié)片外數(shù)據(jù)存儲器64KB0000HFFFFH注意:1,訪問片內RAM20H存儲單元;MOV A,20H2,訪問片外RAM存儲單元; MOV R0,#20HMOVX

16、 A,R03,盡管片內與片外的RAM單元 的00H-FFH地址相重疊但由于指令的不同不會發(fā)生地址混亂。返回2.2.5 變址尋址指令使用DPTR或PC中的內容作為基地址,再與累加器A的內容相加,其和作為操作數(shù)地址。如: MOVX A,A+PC ;PC內容與A的內容相加得操作數(shù)地址 并將此操作數(shù)送A MOVX A,A+DPTR;DPTR內容與A的內容相加得操作數(shù) 地址并將此操作數(shù)送A使用變址指令時,要事先分別為A、DPTR賦值,以便獲得操作數(shù)得地址。變址指令只適用于對ROM存儲器得訪問,如查表等?!九e例】:已知ROM中0302H 單元有一個數(shù)x,現(xiàn)要把它送到累加器A中,試編程。 MOV DPTR,

17、#0300H ;立即數(shù)送DPTR MOV A,#02H ;立即數(shù)送累加器A MOVC A,A+DPTR ;從ROM的00302單元取數(shù)送A變址尋址示意圖02H0300HROM XALU0302H累加器ADPTR0300H+ 02H0302HMOVC A,A+DPTR返回2.2.6 相對尋址轉移指令中使用的一種尋址方式。MCS-51單片機的指令系統(tǒng)中,有兩類轉移指令:相對轉移( 2個或3個字節(jié)) 絕對轉移(3個字節(jié))。 在絕對轉移指令中,指令直接給出轉移的目標地址(2字節(jié)地址),執(zhí)行時將目標地址直接送給PC,從而控制程序轉移; 而相對轉移指令在執(zhí)行中是將PC值與指令中的8位偏移量進行相加,形成指

18、令要轉移的目標地址。 SJMP rel由指令中有一個8位偏移量 rel 為帶符號位的補碼,所以控制程序轉移的范圍為+127-128。54H2002H程序存儲器ROM80H54H ALU2056H累加器APC2002H+ 54H2056H操作碼偏移量例如:SJMP 54H ;(80H、54H)2000H2002H(LOOP1)相對尋址使用中應注意的問題 與絕對尋址相比,相對尋址具有很好的“浮動性”,因此是編程人員普遍使用的一種尋址方式。 使用時,要注意3點:1,CPU進行地址計算時,PC取值是執(zhí)行本指令后的地址值。以上面的例子說明: 指令本身的首地址是2000H,執(zhí)行完后變?yōu)?002H(既下一條

19、指令的首地址)。 如果使用三字節(jié)的相對轉移指令,則PC=PC+3。返回上一頁2,偏移量的計算: rel=目標地址-源地址-2 (2字節(jié)指令) 或: rel=目標地址-源地址-3 (3字節(jié)指令) 結果用補碼的形式書寫。 為了減少計算偏移量的計算,匯編程序允許使用“符號地址”的方式代替偏移量。如: SJMP loop1 匯編程序在翻譯時,自動計算并將結果替換符號地址。3, 如果轉移地址的范圍超過相對尋址的范圍(如:-127+128)時,就要采用別的方式法,否則在編譯時,提示出錯。返回2.2.7 位尋址在位尋址指令(位操作指令)中使用的位地址。 在一般的情況下,系統(tǒng)的數(shù)據(jù)都是按字節(jié)(8位)來存放、處

20、理。 單片機在控制、檢測的應用中,系統(tǒng)的輸入、輸出數(shù)據(jù)有很多屬于開關量信號。這些開關量信號以 bit - “位”的形式進行各種運算、處理和存儲的。MCS-51單片機控制、檢測系統(tǒng)驅動器電動機外設1外設2狀態(tài)信號狀態(tài)信號控制信號在MCS-51單片機的硬件設計上充分考慮了這種“布爾”變量的處理,不僅在指令系統(tǒng)中設計了“位操作”指令,而且在片內RAM區(qū)中還專門開辟了一個 “位尋址區(qū)”。這樣,布爾變量可以向字節(jié)數(shù)據(jù)一樣進行存儲、尋址。除了位尋址區(qū)外,RAM中的大多SFR都可以按位尋址,換句話,SFR除了有自己的字節(jié)地址外,在寄存器內的每一位還有其位地址。 【舉例】:SETB 20H ;將位地址為20H

21、的位置一 SETB 90H ;將P1口的d0位置一同字節(jié)尋址中的直接尋址一樣,為了增加程序的可讀性,凡在SFR中的位地址都可以使用符號地址來替代。如第二例中,完全可以使用下面的指令格式: MOV P1.0 ;將P0口的d0位置一 類似還有:MOV C,ACC.7 ;將累加器中的d7位送PSW的cy 這種指令在匯編程序進行翻譯時,還是要先將符號地址轉換為真正的位地址。返回2.3 數(shù)據(jù)傳送指令2.3.0 傳送指令的特點2.3.1 內部數(shù)據(jù)傳送類指令2.3.2 外部數(shù)據(jù)傳送類指令2.3.3 堆棧操作指令2.3.4 數(shù)據(jù)交換指令繼續(xù)數(shù)據(jù)傳送是編程中使用最多、最主要的操作。它的功能是將數(shù)據(jù)在累加器、片內

22、的RAM、SFR及片外ROM、RAM之間進行傳送。在傳送類指令中,必須指定被傳送數(shù)據(jù)的源地址和目標地址。在傳送過程中,源地址的內容不被改變。傳送類指令除了以累加器A為目標的傳送對PSW的P有影響外,其余的傳送類指令對PWS一概無影響。操作碼數(shù)據(jù)的目標地址數(shù)據(jù)的源地址【舉例】:MOV A,R0 ;將R0寄存器中的數(shù)據(jù)送 累加器A中(注意尋址方式)指令通式:MOV ,2.3.0 傳送指令的特點返回2.3.1 內部數(shù)據(jù)傳送類指令特點:指令的源操作數(shù)和目的操作數(shù)都在單片機內部。1,立即尋址型傳送指令2,直接尋址型傳送指令3,寄存器尋址型傳送指令4,寄存器間址型傳送指令5,內部數(shù)據(jù)傳送類指令的使用繼續(xù)1

23、,立即尋址型傳送指令【特點】:原操作數(shù)字節(jié)是立即數(shù),處在指令的第二或第三字節(jié),所以這類指令都是多字節(jié)指令。這類指令有如下4條。 MOV A,#data ; A data (雙字節(jié)指令) MOV Rn,#data ; Rn data (雙字節(jié)指令) MOV Ri,#data ; (Ri) data (雙字節(jié)指令) MOV direct,#data ; direct data (三字節(jié)指令) 這類指令多用于程序的初始化。如: MOV R0,#20H MOV A,#00H立即尋址指令舉例已知:R0=20H,試問單片機執(zhí)行如下指令后,累加器A、 R7、20H和21H單元中的內容是什么。 MOV A,#

24、18H ;立即數(shù)18H送累加器A MOV R7,#28H ;立即數(shù)28H送寄存器R7MOV R0,#38H ;立即數(shù)38H送內存20H單元MOV 21H,#48H ;立即數(shù)48H送內存21H單元返回2,直接尋址型傳送指令【特點】:指令中至少含有一個源操作數(shù)或目的操作數(shù)的地址。很明顯,這也是2個或3個字節(jié)的指令格式,其中直接地址在第2或第3個字節(jié)上。這類指令有如下5條: MOV A,directMOV direct,AMOV Rn,directMOV Ri,directMOV direct2,direct1 【注意】:direct為內部寄存器、RAM和SFR的地址,換句話說:direct適用于片

25、內所有的地址(寄存器、SFR和RAM)。直接尋址指令舉例 MOV A,30H ;內存RAM30h單元數(shù)據(jù)送AMOV 50H,A ;A中內容送RAM的50h單元MOV R6,31H ;RAM的30h 內容送R6寄存器MOV Ri,30H ;RAM30h內容送Ri指定的RAM單元MOV P1,32H ;RAM32h內容送P1口(p1:符號地址)MOV 90H,32H ;(同上,試比較兩種表示方法)返回3,寄存器尋址型傳送指令指令中含有存放操作數(shù)的寄存器名Rn 其中(n0,1,2,3,4,5,6,7)。 共有如下三條:MOV A,RnMOV Rn,AMOV direct,Rn返回4,寄存器間接尋址型

26、傳送指令指令特點:指令中Ri中存放的不是操作數(shù)本身,而是操作數(shù)在RAM中的地址(i=0、1)。 格式如下:MOV A,RiMOV Ri,AMOV direct,Ri 【注意】;Ri中存放操作數(shù)的地址是有所選擇的,只有非SFR的RAM單元才能使用這種尋址方式。寄存器間接尋址指令舉例已知(40h)=11h,(41h)=22h,R0=40h和R1=41h。試問,下面的指令執(zhí)行后,累加器A、40h、41h和42h單元中的內容是什么。 MOV A,R0 ;RAM40h單元內容11h送A MOV R1,A ;A中的11h送RAM的41h單元 MOV 42H,R1 ;RAM的41h單元內容11h送 RAM4

27、2h中返回5,內部數(shù)據(jù)傳送類指令的使用1,在使用傳送指令時,可以根據(jù)實際情況選用恰當尋址方式。上面給出的各種類型的傳送指令是INTEL公司在設計MCS-51的硬件時就已經確定下來。編程人員只能像查字典一樣去查找、使用。不能根據(jù)主觀意愿去“創(chuàng)造”指令。 例如:要將R0中的數(shù)據(jù)傳送到R1中。如何使用指令去完成上面的操作? mov r1,r0 是否可以?回答是否定的!因為在MCS-51的指令系統(tǒng)中沒有此條指令!只能使用: 1,mov a,r0 或: 2, mov 01h,00h mov r1,a 因此,必須從MCS-51的指令表中選擇使用指令。MCS-51內部數(shù)據(jù)傳送類指令方式圖累加器Adirect

28、直接尋址Ri間址Rn寄存器Data立即數(shù)返回上一次2,以累加器A為目的寄存器的傳送指令會影響PSW中的 奇偶位P,而其余的指令對PSW均無影響。3,要會正確地估計指令的字節(jié)。凡是指令中包含有立即 數(shù)、直接地址的指令,都應當在原有的基礎上加1。 【舉例】: mov a,Ri ( )個字節(jié) mov a,direct ( )個字節(jié) mov direct,data ( )個字節(jié) mov direct2,direct1 ( )個字節(jié)4,對于同一問題可以有不同的編程方法。使用不同的方法雖然都可以實現(xiàn)題目的要求,但從指令長度、運行時間和可閱讀性上等綜合因素考慮,不同的方法就有合理和不合理、優(yōu)化和繁雜之分。所

29、以,在學習指令系統(tǒng)和編程時開始就要養(yǎng)成一個好的、合理的編程習慣。5,注意給程序進行正確的注釋,這對于閱讀、編寫和修改程序都是非常重要的。下面就是一些注釋的例子: MOV A,30H ;(30h) A MOV A,R0 ; R0 A MOV 40H,30H ;(30h) 40h MOV A,Ri ; ( Ri ) A內部傳送類指令舉例試編出把30h和40h單元內容進行交換。MOV A,30H ;(30h) AMOV 30H,40H ;(40h) 30h MOV 40H,A ; A 40h RAMXY累加器A30H40H返回2.3.2 外部數(shù)據(jù)傳送類指令1,16位數(shù)傳送指令2,外部ROM的字節(jié)傳送

30、3,外部RAM的字節(jié)傳送指令繼續(xù)1,16位數(shù)傳送指令MCS-51指令系統(tǒng)中唯一的一條16位數(shù)據(jù)傳送類指令。 MOV DPTR,#data16 DPTR是單片機內部SFR中的兩個寄存器DPH、DPL組合而成。其中DPH為高八位,DPL為低八位。 DPTR是一個專門用于訪問外部存儲器的間址寄存器。尋址能力為 64K (065535)。返回2,外部ROM的字節(jié)傳送指令這類指令有兩條,都屬于變址尋址指令。 MOVC A,A+DPTR ;A (A+DPTR) MOVC A,A+PC ;PC PC+1, A (A+PC) 該指令也稱為“查表”指令。在ROM中建立一個數(shù)據(jù)表,可以使用DPTR、PC作為數(shù)據(jù)表

31、格的基地址。 在第一條指令中:用DPTR作為基地址。使用前,先將數(shù)據(jù)表的首地址送入DPTR中,累加器A作為偏移量。由兩者數(shù)據(jù)相加得到待查的表中數(shù)據(jù)地址并取出。 第二條指令是以程序計數(shù)器PC為基地址。由于PC的內容與該指令在ROM中的位置有關,所以一旦該指令在程序中的位置確定,其PC的值也就確定。外部ROM的字節(jié)傳送指令舉例已知累加器A中存有09范圍內的數(shù),試用查表指令編寫出查找出該數(shù)平方的程序。1,采用DPTR作基址寄存器: 設平方表的首地址為2000h,累加器A中的內容恰好是查表的偏移量。首先將表的起始地址2000h送入DPTR中。 MOV DPTR,#2000H ;指針賦值 MOVC A,

32、A+DPTR ;平方值送AROM01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h2,采用PC作基址寄存器:與DPTR不同,使用PC作為基地址時,必須對累加器A的數(shù)據(jù)進行修正,以保證a+pc恰好找到待查的平方值地址。 ORG 1FFBH1FFBH 74 data ADD A,#data ;data=02h1FFDH 83H MOVC A,A+PC ;PC=1FFE1FFEH 80FEH SJMP $2000H 00H DB 0 ;平房表首址2001H 01H DB 12002H 04H DB 42003H 09H

33、 DB 92004H 10H DB 162005H 19H DB 25 : : :2009H 51H DB 81 ENDdata為MOVC指令首地址與表頭地址之間的單元數(shù)。74hdata83h80hFEh01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh返回3,外部RAM的字節(jié)傳送指令實現(xiàn)外部RAM和累加器A之間的數(shù)據(jù)傳送。只有寄存器間接尋址的指令。 MOVX A,Ri 使用Ri寄存器間址尋址范圍0255h MOVX Ri,A 在硬件電路中P0口輸出8位地址數(shù)據(jù)。

34、MOVX A,DPTR 使用DPTR間址,尋址范圍065535hMOVX DPTR,A 在硬件電路中,使用P0口輸出低8位, P2口輸出高8位外部RAM地址。外部RAM的字節(jié)傳送指令舉例已知外部RAM的88H單元有一個數(shù)x,試編程將x送外部RAM的1818H單元?!窘狻浚和獠縍AM中的數(shù)據(jù)是不能直接傳送的,因此必須使用兩次 MOVX 指令完成此操作。ORG 2000HMOV R0,#88H ;為8位指針賦值MOV DPTR,#1818H ;為16位指針賦值MOVX A,R0 ;取 x 到累加器AMOVX DPTR,A ;x 送RAM的1818h單元SJMP $ ;停機END返回2.3.3 堆棧

35、操作指令堆棧操作是一種特殊的數(shù)據(jù)傳送指令。堆棧:一個用來保存程序斷點、數(shù)據(jù)的特殊的存儲區(qū)域。在MCS-51單片機中,棧區(qū)是占用片內RAM的存儲空間,具體棧位置由指針SP來確定(系統(tǒng)上電時,SP=07h)。 1,進棧操作: push direct ;sp+1sp,(direct)(sp) 2,出棧操作: pop direct ;(sp)(direct),sp -1sp【注意】:尋址方式為直接尋址,所以 push a 是錯誤的,應當是push acc或push 0e0h,同理:push r0也是錯誤的。進棧是堆棧向上“生長”的過程,即sp+1;出棧則相反。系統(tǒng)上電時,sp=07h。SP的值可以根據(jù)

36、需要進行修改,以適應具體編程的需要。在確定棧區(qū)位置時要考慮對數(shù)據(jù)區(qū)的影響,以避免數(shù)據(jù)區(qū)與棧區(qū)沖突。堆棧操作指令舉例(一)下面是一個BCD碼轉換為二進制的子程序BCDB中有關堆棧操作的例子。在這里,進棧操作是為了保護主程序中相關寄存器中的數(shù)據(jù),因為子程序要使用這些寄存器。org 0800hbcdb:push pswpush accpush b : :pop bpop accpop pswretRAMbaccpsw棧底SP堆棧操作指令舉例(二) 堆棧操作指令除了可以在子程序的設計中,對主程序的數(shù)據(jù)進行保護。還可以根據(jù)堆棧操作的特點完成一些特殊的操作?!九e例】:設片內RAM的30h單元存有x,40h

37、單元存有y。試將兩個單元內容互換。push 30hpush 40hpop 30hpop 40hRAMx y y xyx棧底SP=07h40h30h繼續(xù)2.3.4 數(shù)據(jù)交換指令為提供一種方便的累加器和寄存器或RAM之間的數(shù)據(jù)交換。避免了使用一般mov 傳送指令完成交換時的不便。格式:xch a,Rn ;a Rn xch a,direct ;a (direct) xch a,Ri ;a (Ri) xchd a,Ri ;a30(Ri)30舉例:已知,片外RAM20h單元、內部RAM20h單元分別有數(shù)x和y,試編程互將兩數(shù)相交換。mov R1,#20h ;指針賦初值movx a,R1 ;xaxch a

38、,R1 ;交換 a(20h),ya movx R1,a ;y(20h)片外RAM數(shù)據(jù)交換指令舉例(一)舉例:已知,片外RAM20h單元、內部RAM20h單元分別有數(shù)x和y,試編程互將兩數(shù)相交換。mov R1,#20h ;指針賦初值movx a,R1 ;xaxch a,R1 ;交換 a(20h),ya movx R1,a ;y(20h)片外RAM片內RAMy (x)片外RAMx (y)(y) x20h20h累加器A123數(shù)據(jù)交換指令舉例(二)已知RAM50h單元有一個09的數(shù),試編程將它變成相應的ASCII碼。 【解】:09的ASCII碼是30h39h,兩者相差30h。 方法一:對50h單元的數(shù)

39、據(jù)高四位組裝一個30h。mov r0,#50h ;指針賦值mov a,#30h ;30hAxchd a,r0 ; A30(r0)30,在A中組成ASCII碼mov r0,a ;A中的ASCII送回50h單元0000010150h00110101A=30h交換后A=35h12繼續(xù)2.4 算邏運算和移位指令功能:完成算術運算、邏輯運算和循環(huán)移位三大功能。特點:大多指令都要由累加器A來存放一個源操作數(shù),并把操作結果放回累加器A中。2.4.1: 算術運算指令2.4.2: 邏輯運算指令2.4.3: 移位指令繼續(xù)2.4.1: 算術運算指令 不帶進位的加法指令 ( ADD )1,加法指令: 帶進位的加法指令

40、 ( ADC ) 加1指令 ( INC ) (編程舉例)2,減法指令: 帶進位的減法指令 ( SUBB ) 減1指令 ( DEC )3,十進制調整指令: ( DA A )4,乘法和除法指令: (MUL DIV)加法指令(一):不帶進位的加法指令格式: ADD A,Rn;A+RnAADD A,direct;A+(direct)AADD A,Ri;A+(Ri)AADD A,#data;A+dataA【注意】:1,參加運算的數(shù)據(jù)都應當是8位的,結果也是8位并影響PSW。2,根據(jù)編程者的需要,8位數(shù)據(jù)可以是無符號數(shù)(0255),也可以是有符號數(shù)(-127+128)。3,不論編程者使用的數(shù)據(jù)是有符號數(shù)還

41、是無符號數(shù),CPU都將它們視為有符號數(shù)(補碼)進行運算并影響PSW。不帶進位的加法指令舉例(一)試分析執(zhí)行下列指令后累加器A和PSW中各標志的變化。MOV A,#19H Cy=0;ADD A,#66H AC=0 OV=CPCS=0 25 A= 0 0 0 1 1 0 0 1 B P=1 + 102 data= 0 1 1 0 0 1 1 0 B 127 0 0 1 1 1 1 1 1 1 B 1,若兩數(shù)都是無符號數(shù),則因Cy=0無溢出,25+102=127。 2,若兩個數(shù)是有符號數(shù),則因OV=0無溢出。cy0 0 0 CP CS AC 不帶進位的加法指令舉例(二)試分析執(zhí)行下列指令后累加器A和

42、PSW中各標志的變化。MOV A,#5AH Cy=0;ADD A,#6BH AC=0; OV=CPCS=1 90 A= 0 1 0 1 1 0 1 0 B P=0 + 107 data=0 1 1 0 1 0 1 1 B 197 0 1 1 0 0 0 1 0 1 B CP CS AC1,若兩數(shù)是無符號數(shù),因Cy=0無溢出:90+107=1972,若兩數(shù)是有符號數(shù),因OV=1,故有溢出,兩個正數(shù)相加后變?yōu)樨摂?shù),很明顯結果是不正確的。加法指令(二):帶進位的加法指令格式: ADDC A,Rn;A+Rn+CyA ADDC A,direct;A+(direct) +CyA ADDC A,Ri;A+(

43、Ri) +CyA ADDC A,#data;A+data+CyA【注意】:這里的Cy是指令執(zhí)行前的Cy; 對PSW的影響同ADD指令。加1指令格式:INC A ;累加器A加一INC Rn ;Rn+1RnINC direct ;內存單元數(shù)據(jù)加一INC Ri ;內存單元數(shù)據(jù)加一INC DPTR ;dptr+1dptr【注意】: 1,除了第一條對PSW的P有影響外,其余對PSW均無影響。 2,由于上面的原因,INC指令不能作為一般的數(shù)據(jù)算術運算 使用,INC主要用于修改數(shù)據(jù)指針等控制、循環(huán)語句中使用。返回本節(jié)目錄編程舉例已知M1、M2單元中存有兩個16位無符號數(shù)x1、x2(低位在前)。試寫出x1+x

44、2,并將結果放入M1、M1+1單元(低8位在M1單元)。設兩數(shù)之和不會超過16位(65535)。【解】:MOV R0,#M1 ;x1指針賦初值MOV R1,#M2 ;x2指針賦初值MOV A,R0 ;取x1低8位送AADD A,R1 ;x1與x2低8位相加MOV R0,a ;低8位和送m1單元INC R0INC R1 ;修改指針MOV A,R0 ;取x1的高8位送AADDC A,R1 ;x1與x2的高8位和Cy相加MOV R0,A ;結果送M1+1單元RAMX2 data815X2 data07X1data815X1data07M1M1+1M2M2+1返回本節(jié)目錄減法指令(帶進位的減法指令)在

45、MCS-51單片機的指令系統(tǒng)中,只有: 帶進位的減法 SUBB 減一 DEC 兩種指令。1減法指令:格式:SUBB A,Rn ;A Rn Cy A SUBB A,direct ;A (direct) Cy A SUBB A,Ri ;A (Ri) Cy A SUBB A,#data ;A data Cy A使用減法指令要注意的幾個問題1,在單片機內部,減法指令實際上是采用補碼的加法實現(xiàn)的。但要判定減法結果編程者可以按二進制減法法則驗證。2,無論相減兩數(shù)是無符號數(shù)還是有符號數(shù),減法操作總是按有符號數(shù)來處理、影響PSW中相關的標志(詳見舉例)。3,在MCS-51的指令系統(tǒng)中沒有不帶Cy的減法,所以在

46、使用SUBB指令前必須使用一條清除Cy的指令:CLR C。減法指令應用舉例試分析執(zhí)行下列指令后累加器A和PSW中各標志的變化。CLR CMOV A,#52H 01010010B = 82SUBB A,#0B4H 10110100B = - 76 82 a= 0 1 0 1 0 0 1 0 -76 data= 1 0 1 1 0 1 0 0 158 1 1 0 0 1 1 1 1 0 =-62H= -98 手工計算 CP CS AC 1 0 1 【分析】:CPU的計算得-98,很明顯答案是錯誤的。原因是OV=1,既產生了溢出。所以,對于符號數(shù)的減法在運算后一定要檢測OV=1?返回本節(jié)目錄減一指令

47、格式:DEC A ;累加器A減一DEC Rn ;Rn-1RnDEC direct ;內存單元數(shù)據(jù)減一DEC Ri ;內存單元數(shù)據(jù)減一【注意】: 1,除了第一條對PSW的P有影響外,其余對PSW均無影響。 2,由于上面的原因,DEC指令一般不作為數(shù)據(jù)算術運算使用(因為不能對PSW的OV等位產生影響,它主要用于修改數(shù)據(jù)指針在控制、循環(huán)語句中使用)。返回本節(jié)目錄十進制調整指令在CPU進行BCD碼運算時,必須在運算后進行十進制調整,這是因為,CPU在運算時,并不知道數(shù)據(jù)是二進制還是BCD碼。格式:DA A ;若AC=1或A30 9,則A+06hA ;若Cy =1或A74 9,則A+60hA【注意】:1

48、,DA A指令必須緊跟在加法指令之后;2,DA A指令只適用于加法指令的調整。十進制調整指令應用舉例(一)1,BCD加法運算:試寫出完成85+59的BCD碼的加法程序。MOV A,#85HADD A,#59HDA ASJMP $ 85 a= 1 0 0 0 0 1 0 1B+ 59 dtat= 0 1 0 1 1 0 0 1B 144 1 1 0 1 1 1 1 0B 低4位9,所以加06h + 0 0 0 0 0 1 1 0B 1 1 1 0 0 1 0 0B 高4位9,所以加60h 0 1 1 0 0 0 0 0B 1 0 1 0 0 0 1 0 0B 結果為144h(1包含在Cy)【注意

49、】: 144H是用16進制數(shù)來表示十進制,既BCD碼。十進制調整指令應用舉例(二)2,BCD減法運算:由于DA A 指令只能對BCD碼的加法進行調整,所以遇到BCD碼的加法時就要將其減法變?yōu)榧臃ㄟ\算,然后再使用DA A指令進行調整。減法變加法就是使用BCD碼的補碼運算法則: 將被減數(shù)-減數(shù)變?yōu)楸粶p數(shù)+減數(shù)的補碼。 減數(shù)的補碼 = BCD碼的模-減數(shù) 其中BCD碼的模為100H = 99H+01H = 9AH已知:在M1、M2中分別存有被減數(shù)91和減數(shù)36。 試編程求19-36并將結果存入M3單元。【解】:1,算法:91-36=91+(100-36)=91+(9A-36) 2,編程: CLR C

50、 ; 清除CyMOV A,#9AH ;BCD碼的模100送ASUBB A,M2 ;計算減數(shù)的補碼 (結果在A中) ADD A,M1 ;被減數(shù)+減數(shù)的補碼(結果在A中)DA A ;十進制調整MOV M3,A ;結果送M3單元CLR C ;清除進位位(不要Cy)(請同學自己驗證一下)返回本節(jié)目錄乘法和除法指令這是MCS-51單片機唯一的一類單字節(jié)4周期指令,它相當于4條加法指令的運行時間。 格式:MUL A B ;ab=b a (b存高8位,a存低8位) DIV A B ;ab=ab (a存商,b存余數(shù))【注意】:指令對標志的影響: 1,在乘法指令中對PSW的影響有Cy、OV、和P。 具體如下:C

51、y0;P取決于A中“1”的個數(shù);OV表明積的大小。當積超過255(B0)時,OV=1。 2,在除法指令中,Cy、P與乘法相同。在執(zhí)行除法指令時,若B=0時OV=1,表示除數(shù)=0除法無意義,其余情況下OV被復位。返回本節(jié)目錄2.4.2: 邏輯運算指令功能:對2個8位二進制數(shù)進行邏輯與、或、非和異或操作;特點:除了以累加器A為目標寄存器的指令影響PSW的P位外,其余指令對PSW均無影響。1,邏輯與運算指令 (ANL)2,邏輯或運算指令 (ORL)3,邏輯異或指令 (XRL)4,累加器清零和取反指令 (CLR & CPL)繼續(xù)邏輯與運算指令格式:ANL A,Rn;A R n A ANL A,dire

52、ct ; A (direct) A ANL A,Ri; A ( Ri) A ANL A,#data; A data A ANL direct,A; (direct) A direct ANL direct,# data; (direct) data direct上面的指令也可以分為兩類: 1,以累加器A為目標寄存器的邏輯運算指令; 2,以內存單元為目標的邏輯運算指令。應用舉例(一)已知R0=30H和(30H)=0AAH,試問執(zhí)行下列指令后累加器A和30H單元中的內容是什么? 1, MOV A,#0FFH 2,MOV A,#0FHANL A,R0 ANL A,30H(A=30H,(30H)=0A

53、AH) (A=0AH,(30H)=0AAH)3,MOV A,#0F0H 4,MOV A,#80HANL A,R0 ANL 30H,A(A=0A0H,(30H)=0AAH)(A=80H,(30H)=80H)很明顯:ANL操作可以從某個存儲單元中取出某幾位,而把其它的為屏蔽掉(清零)。應用舉例(二)已知:M1單元有一個9的ASCII碼39H,試編程將其變?yōu)锽CDM碼。解:1,使用 ANL direct,#data的指令: ANL M1,#0FH解:2,使用 ANL A,#data指令。 MOV A,M1 ANL A,#0FH MOV M1,A返回本節(jié)目錄邏輯或運算指令格式:ORL A,Rn ;A

54、R n A ORL A,direct ; A (direct) A OR A,Ri ; A ( R I ) A ORL A,#data ; A data A ORL direct,A ; (direct) A direct ORL direct,# data ; (direct) data direct同與運算一樣,上面的指令也可以分為兩類: 1,以累加器A為目標寄存器的邏輯運算指令; 2,以內存單元為目標的邏輯運算指令。應用舉例設累加器A=0AAH,P1口=0FFH。試編程將累加器A中的第四位送P1口的低四位,而P1口的高四位不變。 解:MOV R0,A;累加器A中的數(shù)據(jù)暫存ANL A,#0

55、FH;屏蔽A的高4位ANL P1,#0F0H;屏蔽P1口的低4位ORL P1,A;在P1口組裝MOV A,R0;恢復累加器A的數(shù)據(jù)【小結】:與運算可以 “屏蔽” 某些位;或運算可以 “置位” 某些位。返回本節(jié)目錄邏輯異或運算指令格式:XRL A,Rn; A R n A XRL A,direct ; A (direct) A XR A,Ri; A ( R I ) A XRL A,#data; A data A XRL direct,A; (direct) A direct XRL direct,# data; (direct) data direct特點:按位運算,相同時為0,不同時為1。使用異

56、或可以實現(xiàn)將某個字節(jié)的數(shù)據(jù)或將數(shù)據(jù)的某幾位變反。舉例已知:外部RAM的30H單元中有一個數(shù)AAH,現(xiàn)要將其高4位不變,低4位取反,試編程。解1,利用MOVX A,Ri指令:MOV R0,#30H 1 0 1 0 1 0 1 0MOVX A,R0 0 0 0 0 1 1 1 1XRL A,#0FH 1 0 1 0 0 1 0 1MOVX R0,A解2,利用MOVX A,DPTRMOV DPTR,#0030HMOVX A,DPTRXRL A,#0FHMOVX DPTR,A返回本節(jié)目錄累加器清零和取反指令用傳送指令可以實現(xiàn)對累加器A的清零和取反操作,但是它們都是雙字節(jié)指令。在MCS-51的指令系統(tǒng)中

57、專門設計了單字節(jié)、單周期對累加器清零和取反的指令。格式:CLR A ;累加器清零CPL A ;累加器取反 取反指令可以方便的實現(xiàn)求補操作。舉例:已知30H單元中有一個數(shù)x,寫出對它求補的程序。MOV A,30HCPL AINC AMOV 30H,A邏輯運算指令應用舉例設X、Y和Z分別存在X、Y和Z單元。試編出能實現(xiàn)此電路功能的程序,并將結果送入F單元。解: MOV A,XANL A,Y ;XYAMOV R1,A ;送R1暫存MOV A,YXRL A,Z ;YZACPL A ;A取反ORL A,R1;(XY) (YZ)AMOV F,A ;AF+XYZF返回本節(jié)目錄2.4.3: 移位指令雖然MCS

58、-51只有5條移位指令,但它可以處理所有移位問題。格式:RL ARR ARLC ARRC ASWAP A【注意】:只能對累加器A進行移位。A7 A0A7 A0A7 A0CyCyA7 A4 A3 A0 A7 A0舉例(一)已知:在M1和M1+1單元有一個16位數(shù)(M1存低8位),試編程將其擴大2倍(設結果小于65535)。解:擴大2倍可以用左移一位來實現(xiàn)。dataL=11001111 10011110dataH=00101100 01011001M1M1+11001110101011010程序清單 CLR C;清除Cy位MOV R1,#M1;指針賦值MOV A,R1;取低8位數(shù)據(jù)RLC A;循環(huán)

59、左移,Cy進低位,高位進CyMOV R1,A;移位后數(shù)據(jù)回送INC R1;指針加一MOV A,R1;取高8位數(shù)據(jù)RLC A;循環(huán)左移Cy進低位MOV R1,A;數(shù)據(jù)回送舉例(二)已知:M1、M2單元中有2個BCD碼,試編程將其緊縮為一個字節(jié)并存入M1單元。解:MOV R1,#M1MOV A,R1SWAP AINC R1ORL A,R1MOV M1,A0000BCD10000BCD2M1M1+1BCD1 0000BCD1 BCD20000 BCD1返回本章目錄累加器A2.5 控制轉移和位操作指令 2.5.1 控制轉移指令 1,無條件轉移指令 2,條件轉移指令 3,子程序調用和返回 4,空操作指令

60、2.5.2,位操作指令 1,位傳送指令: 2,位置位和位清零指令: 3,位運算指令: 4,位控制轉移指令:返回本章目錄1,無條件轉移指令: 格式: LJMP addr16 長轉移指令,尋址范圍65535; AJMP addr11 絕對轉移,尋址范圍2K; SJMP rel 短轉移,轉移范圍(+127-128); JMP A+DPTR 變址轉移,尋址范圍65535。02Haddr158addr70a108 00001a7 a080Hr e l73HLJMP指令(三字節(jié))AJMP指令(雙字節(jié))SJMP指令(雙字節(jié))JMP指令(單字節(jié))長轉移指令:(三字節(jié)雙周期指令) 指令執(zhí)行時,將指令碼中的add

溫馨提示

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

評論

0/150

提交評論