單片機(jī)原理與應(yīng)用第2章-第二版_第1頁
單片機(jī)原理與應(yīng)用第2章-第二版_第2頁
單片機(jī)原理與應(yīng)用第2章-第二版_第3頁
單片機(jī)原理與應(yīng)用第2章-第二版_第4頁
單片機(jī)原理與應(yīng)用第2章-第二版_第5頁
已閱讀5頁,還剩245頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第2章MCS-51系列單片機(jī)指令系統(tǒng) 內(nèi)容提要 1、本章講解51系列單片機(jī)指令系統(tǒng)基礎(chǔ),匯編語言格式、常用符號,匯編語言對寄存器和標(biāo)志位的影響,尋址方式等。 2、為了讀者以后能熟練掌握和使用指令編程,本章把MCS-51系列單片機(jī)的111條指令按功能分為五大類:數(shù)據(jù)傳送、算術(shù)運(yùn)算、邏輯運(yùn)算、控制轉(zhuǎn)移和布爾指令。對這些指令逐條分類講解,并舉例說明各條指令的使用方法。 3、一臺單片機(jī),如果只有硬件,沒有任何軟件是不能工作的。配上了各種軟件,單片機(jī)才能發(fā)揮其運(yùn)算和控制功能。單片機(jī)通過運(yùn)行程序才能完成相應(yīng)的任務(wù),程序中最基礎(chǔ)的部分是單片機(jī)的指令。在本章練習(xí)中給出了簡單的程序,望大家能學(xué)會用程序來指揮存儲

2、器、寄存器、安排I/O口,完成單片機(jī)的控制任務(wù)。2.1 單片機(jī)指令系統(tǒng)基礎(chǔ) 2.1.1指令的概念 1、機(jī)器碼指令與匯編語言指令 指令是指揮計(jì)算機(jī)工作的命令。指令是計(jì)算機(jī)軟件的基本單元。指令有兩種表達(dá)形式。 機(jī)器碼指令:用二進(jìn)制代碼(或十六進(jìn)制數(shù))表示的指令稱為機(jī)器碼指令或目標(biāo)代碼指令。實(shí)際上是送給CPU執(zhí)行的程序編碼。 匯編語言指令:為了方便記憶,便于程序的編寫和閱讀,用英文助記符來表示每一條指令的功能。用助記符表示的指令不能被計(jì)算機(jī)硬件直接識別和執(zhí)行,必須通過匯編把它變成機(jī)器碼指令才能被機(jī)器執(zhí)行。 例如,計(jì)算機(jī)執(zhí)行操作:把數(shù)3AH(H表示十六進(jìn)制標(biāo)識符,標(biāo)明3A是十六進(jìn)制數(shù))傳送到累加器A中

3、,實(shí)現(xiàn)這種操作的匯編語言指令形式為: MOV A,#3AH ;A#3AH,把數(shù)3AH送A中,3AH的二進(jìn)制碼為0011 1010B,B為二進(jìn)制標(biāo)識符,其中“#”是數(shù)字3AH的標(biāo)識符。這條指令的機(jī)器碼為“743A”。 2、匯編語言指令格式 指令格式是指令的書面表達(dá)形式,匯編語言指令格式為: 每一部分構(gòu)成匯編指令的一個(gè)字段,各字段之間用空格或規(guī)定的標(biāo)點(diǎn)符號隔開,方括號內(nèi)的字段有時(shí)可以省略。標(biāo)號:操作碼助記符目的操作數(shù),源操作數(shù);注釋 例如: LOOP:MOV A,#3AH ;A#3AH 各字段的意義如下: 標(biāo)號:指令的符號地址。它通常代表一條指令的機(jī)器代碼存儲單元的地址,(如上例中的LOOP)。一

4、條語句之前是否要冠以標(biāo)號,要根據(jù)程序的需要而定。當(dāng)某條指令可能被調(diào)用或作為轉(zhuǎn)移的目的地址時(shí),通常要給該指令賦予標(biāo)號。一旦給某條指令賦予了標(biāo)號,該標(biāo)號可作為其它指令的操作數(shù)使用。 操作碼: 表示指令進(jìn)行何種操作,用助記符形式給出。助記符一般為英語單詞的縮寫(上例中的MOV 意為傳送)。 操作數(shù): 指令操作的對象。操作數(shù)分為目的操作數(shù)(上例累加器A)和源操作數(shù)(上例中的3AH)。目的操作數(shù)和源操作數(shù)的書寫順序不能顛倒。所有指令按英文習(xí)慣表達(dá)時(shí)先寫目的操作數(shù),即操作的結(jié)果在第一個(gè)操作數(shù)中,操作數(shù)可以是數(shù)字(地址、數(shù)據(jù)都用十六進(jìn)制數(shù)表示),也可以是標(biāo)號或寄存器的名稱等,也有些指令不需要指明操作數(shù)。 注

5、釋:對指令功能的說明,便于程序的閱讀和維護(hù)。它不參與計(jì)算機(jī)的操作(如上例中的;A#3AH)。也可用中文注釋。符號“;”后面的內(nèi)容為注釋,它也可單獨(dú)占據(jù)一行。 匯編指令各字段之間的標(biāo)點(diǎn)符號應(yīng)嚴(yán)格按照規(guī)定格式書寫。 機(jī)器碼指令的格式分為兩部分:操作碼和操作數(shù),都用十六進(jìn)制數(shù)表示。 機(jī)器碼指令按其指令的字節(jié)長度劃分為三種: (1)單字節(jié)指令。只有一個(gè)字節(jié)的操作碼,實(shí)際上操作數(shù)隱含在其中。如機(jī)器碼04H的指令是“INC A”。其功能為A的內(nèi)容加一,A為操作數(shù)。 (2)雙字節(jié)指令。由一個(gè)字節(jié)的操作碼和一個(gè)字節(jié)的操作數(shù)組成,如指令“ADD A,#22H”,其操作碼為24H,操作數(shù)為22H,目的操作數(shù)隱含在

6、操作碼中。這條指令的機(jī)器碼為2422H在程序存儲器中占用兩個(gè)字節(jié)。 (3)三個(gè)字節(jié)指令。由一個(gè)字節(jié)操作碼和兩個(gè)字節(jié)操作數(shù)組成。如指令“MOV 3AH,4BH”,該指令執(zhí)行時(shí)把4BH地址單元的內(nèi)容送到3AH地址單元中去。其機(jī)器碼為853A4BH在程序存儲器中占用三個(gè)字節(jié)。 以后在實(shí)驗(yàn)中和指令表中我們要經(jīng)常用這些,讀者可先看看書后面的指令表中有關(guān)字節(jié)的內(nèi)容。 3、指令系統(tǒng) 單片機(jī)的所有指令的集合稱為指令系統(tǒng)。指令系統(tǒng)與計(jì)算機(jī)硬件邏輯電路有著密切關(guān)系。它是表征計(jì)算機(jī)性能的一個(gè)重要指標(biāo),不同微機(jī)的指令系統(tǒng)是不同的。同一系列不同型號的微處理器的指令系統(tǒng)基本相同。 MCS-51系列單片機(jī)使用44種助記符,

7、有51種基本操作。通過助記符及指令的源操作數(shù)和目的操作數(shù)的不同組合構(gòu)成了MCS-51的共111條指令。 MCS-51的指令系統(tǒng)按字節(jié)數(shù)分為:單字節(jié)指令49條;雙字節(jié)指令46條;三字節(jié)指令16條。按指令執(zhí)行的周期劃分:一周期指令有57條;二周期指令52條;四周期指令2條(乘法和除法)。當(dāng)主頻為12MH時(shí),完成一條單周期指令的執(zhí)行時(shí)間為1us. MCS-51指令系統(tǒng)中有一個(gè)處理位變量的指令子集。這些指令在處理位變量時(shí)非常靈活、方便,使MCS-51更適合于工業(yè)控制。 2.1.2 51單片機(jī)指令系統(tǒng)說明 1、常用符號 在MCS-51匯編 語言指令系統(tǒng)中,規(guī)定了一些對指令格式描述的常用符號?,F(xiàn)將這些符號

8、的標(biāo)記和含義說明如下: Rn-選定當(dāng)前工作寄存器區(qū)的寄存器,為R0R7其中之一。 Ri通過寄存器R0和R1間接尋址的RAM單元。為間接尋址前綴符號,i=0或1。 direct-直接地址,一個(gè)內(nèi)部RAM單元地址(8位二進(jìn)制數(shù))或一個(gè)特殊功能寄存器。 #data-8位或16位常數(shù),亦稱立即數(shù)。#為立即數(shù)前綴標(biāo)志符號。 Addr16-16位目的地址,供LCALL和LJMP指令使用。標(biāo)示目標(biāo)程序所在地址。 Addr11-11位目的地址,供ACALL和AJMP指令使用。 rel-8位帶符號偏移量(以二進(jìn)制補(bǔ)碼表示),常用于相對轉(zhuǎn)移指令。 bit-位地址。一位二進(jìn)制數(shù)所在地址(8位二進(jìn)制數(shù))。 /位操作前

9、綴,表示該位內(nèi)容求反。 (x)表示以x為地址單元中的內(nèi)容。 (x)-表示以x地址單元中的內(nèi)容為地址的單元中的內(nèi)容。 當(dāng)前指令的地址。 -是數(shù)據(jù)傳輸方向。指向目的操作數(shù)2、指令對標(biāo)志位的影響 MCS-51指令系統(tǒng)中有些指令的執(zhí)行結(jié)果要影響PSW中的標(biāo)志位,現(xiàn)將影響標(biāo)志位的指令列表如下: 表2.1 影響標(biāo)志位的的指令示例指令 標(biāo)志 指令 標(biāo)志助記符 C OV AC 助記符 C OV ACADD CLR 0ADDC CPL SUBB ANL C, bit MUL 0 ANL C,/bit DIV 0 ORL C, bit DA ORL C,/bit RRV MOV C, bit RLC CJNE S

10、ETB C 12.1.3 51單片機(jī)尋址方式 指令的一個(gè)重要組成部分是操作數(shù),由它指定參與運(yùn)算的數(shù)據(jù)、數(shù)據(jù)所在的存儲器單元地址、寄存器、I/O接口的地址。指令中所規(guī)定的尋找操作數(shù)的方式就是尋址方式。每一種計(jì)算機(jī)都具有多種尋址方式,尋址方式越多,計(jì)算機(jī)的功能就越強(qiáng)大,靈活性也越大。尋址方式的多少及尋址功能是反映指令系統(tǒng)優(yōu)劣的主要因素之一。要掌握指令系統(tǒng)也可從尋址方式入手。 MCS-51指令系統(tǒng)的尋址方式有7種:立即尋址(#data)、寄存器尋址(Rn)、寄存器間接尋址(Ri、DPTR)、直接尋址(direct)、變址尋址(A+PC)、相對尋址(rel)和特定寄存器尋址(A)。有些書中把A當(dāng)寄存器

11、尋址,把位尋址單獨(dú)作為一種尋址方式,不管怎么分類其目的也是為了便于學(xué)習(xí)、記憶、掌握這111條指令。 1.立即尋址(#data) 操作數(shù)包含在指令字節(jié)中,操作數(shù)直接出現(xiàn)在指令中,并存放在程序存儲器中,這種尋址方式稱為立即尋址。 立即尋址指令的操作數(shù)是一個(gè)8位或16位的二進(jìn)制常數(shù),它前面以“#”號標(biāo)識,例如:ADD A,#56H,這條指令完成把數(shù)56H與累加器A的內(nèi)容(設(shè)為31H)相加,且結(jié)果(87H)存于累加器A中。這條指令的機(jī)器碼為2456H。 2.寄存器尋址(Rn) 由指令指出某一個(gè)寄存器中的內(nèi)容作為操作數(shù),這種尋址方式稱為寄存器尋址。在這種尋址方式中,指令的操作碼中包含了參加操作的工作寄存

12、器R0R7的代碼(指令操作碼字節(jié)的低3位指明所尋址的工作寄存器)。例如:ADD A,Rn指令中的Rn,指令完成把A的內(nèi)容加Rn的內(nèi)容,結(jié)果放在A中。當(dāng)n為0、1、2時(shí),操作碼分別為28、29、2A。 3.間接尋址(Ri/DPTR) 由指令指出某一個(gè)寄存器的內(nèi)容作為操作數(shù)的地址。該地址中的內(nèi)容參入操作。這種尋址方式稱為寄存器間接尋址。訪問外部RAM時(shí),只可使用R0,R1或DPTR作為地址指針,寄存器間接尋址用符號“”表示。 例如:MOV A,RO(機(jī)器碼是E6)是指:若RO內(nèi)容為66H(內(nèi)部RAM地址單元66H),而66H單元中內(nèi)容是27H,則指令的功能是將27H這個(gè)數(shù)送到累加器A中。 4.直接

13、尋址(direct) 在指令中直接給出操作數(shù)所在存儲單元的地址(一個(gè)8位二進(jìn)制數(shù),書寫成二位十六進(jìn)制數(shù),如36H),稱為直接尋址。在指令表中直接地址用direct表示,直接尋址方式中操作數(shù)所在存儲器的空間有三種: ()內(nèi)部數(shù)據(jù)存儲器的128個(gè)字節(jié)單元(內(nèi)部數(shù)據(jù)存儲器地址00H7FH) 例如MOV A, 36H指令是將直接地址36H單元的內(nèi)容送寄存器A中 ()位地址空間(有些書把這種尋址方式單獨(dú)作為一種尋址方式) 例如MOV C, 57H指令是將位地址57H的內(nèi)容送位累加器C中 ()特殊功能寄存器, 特殊功能寄存器只能用直接尋址方式進(jìn)行訪問。 例如MOV P1, 69H(或MOV 90H, 69

14、H)指令是將直接地址69H的內(nèi)容送P1口鎖存器(機(jī)器碼都為859069),其中P1為特殊功能寄存器,在機(jī)器碼中以直接地址90H出現(xiàn)。 5.基址加變址尋址(A+PC/A+DPTR) 以16位寄存器(DPTR或PC)作為基址寄存器,加上地址偏移量(累加器A中的8位無符號數(shù))形成操作數(shù)的地址。該地址的內(nèi)容參入操作。 基址加變址尋址方式有兩類: (1)以程序計(jì)數(shù)器的值為基址,例如指令: MOVC A,A+PC;(A)(A)+(PC) 指令的功能是先使PC指向本指令下一條指令地址(本指令已完成操作),然后PC內(nèi)容與累加器的內(nèi)容相加,形成變址尋址的單元地址,該地址的內(nèi)容(內(nèi)容為單字節(jié))送A。如本指令下一條

15、指令地址為2100H,A的內(nèi)容為35H,程序地址2135H單元的內(nèi)容為68H,則執(zhí)行指令后A的內(nèi)容為68H。注意地址為16位,數(shù)據(jù)為8位。 (2)以數(shù)據(jù)指針DPTR為基址,以數(shù)據(jù)指針內(nèi)容和累加器的內(nèi)容相加形成地址,例如: MOV DPTR #4200H ;給DPTR賦值 MOV A,#10H ;給A賦值 MOVC A ,A+DPTR ;變址尋址方式(A)(A)+(DPTR) 這三條指令的執(zhí)行結(jié)果是將程序存儲器 4210H地址單元的內(nèi)容送A中。 6.相對尋址(rel) 以程序計(jì)數(shù)器PC的當(dāng)前值為基址,加上相對尋址指令的字節(jié)長度,再加上指令中給定的偏移量rel的值(rel是一個(gè)8位帶符號數(shù),用二進(jìn)

16、制補(bǔ)碼表示),形成相對尋址的地址。 例如指令: JNZ rel (如果rel = 23H,則該指令的機(jī)器碼為7023) 當(dāng)A0時(shí),程序跳到這條指令后面,相距23個(gè)字節(jié)的程序地址運(yùn)行下一條指令。 7.特定寄存器尋址 累加器A和數(shù)據(jù)指針DPTR這兩個(gè)使用最頻繁的寄存器又稱為特定寄存器。對特定寄存器的操作指令,指令不再需要指出其地址字節(jié),指令碼本身隱含了操作對象A或DPTR。 例如: INC A (指令碼04) ;累加器加1,其中A的機(jī)器碼被隱含 MOV A,#12H (指令碼7412) ;數(shù)12送累加器 INC DPTR (指令碼A3) ;數(shù)據(jù)指針 DPTR的內(nèi)容加1 綜上所述,尋址方式與存儲器結(jié)

17、構(gòu)有著密切關(guān)系。一種尋址方式只適合于對一部分存儲器進(jìn)行操作,在使用時(shí)要加以注意。 2.2.數(shù)據(jù)傳送類指令 MCS-51單片機(jī)的指令系統(tǒng)按功能可分為五大類;數(shù)據(jù)傳送類指令、算術(shù)運(yùn)算類指令、邏輯運(yùn)算類指令、控制轉(zhuǎn)移類指令和布爾操作類指令。 數(shù)據(jù)傳送指令又分片內(nèi)、片外數(shù)據(jù)傳送,數(shù)據(jù)交換,堆棧操作四個(gè)部分,本節(jié)學(xué)習(xí)的目的是要求我們盡快記憶,掌握它們,并開始學(xué)習(xí)應(yīng)用指令編程。因此下面詳細(xì)介紹這些指令。 2.2.1 片內(nèi)數(shù)據(jù)傳送指令 1、內(nèi)部RAM數(shù)據(jù)傳送 表2.2給出了在內(nèi)部RAM中進(jìn)行數(shù)據(jù)傳送的基本操作及其在不同方式下的指令格式。 下面按指令的功能,對指令的基本操作分別敘述。 (1)一般數(shù)據(jù)傳送指令

18、指令: MOVdest,src ;dest表示目的操作數(shù)字節(jié),src為源操作數(shù)。 功能:字節(jié)變量傳送。 說明:將第二操作數(shù)(源操作數(shù))指定的字節(jié)變量傳送到由第一操作數(shù)(目的操作數(shù))(以后的指令多按英文的習(xí)慣把運(yùn)行的結(jié)果存放在第一個(gè)操作數(shù)中,并把第一個(gè)操作數(shù)叫目的操作數(shù))所指定的地址單元中。不改變源字節(jié)的內(nèi)容,不影響PSW中的標(biāo)志位。 此類指令參入的源和目的操作數(shù)有#data/A/Rn/Ri/direct五個(gè),其不同組合,共有16條指令,詳見表2.2。一般數(shù)據(jù)傳送指令按操作數(shù)的這種組合形式分類。其主要目的是便于記憶,僅供讀者學(xué)習(xí)時(shí)參考,讀者也可使用其它方法進(jìn)行分類。 以累加器A為目的操作數(shù),有4

19、種尋址方式的組合(源操作數(shù)是Ri/Rn/direct/#data)結(jié)果8位數(shù)送入A中。符號“;”后面是對指令的說明。 MOV A,#4DH ;立即尋址,將數(shù)4DH傳入A中 MOV A,3FH ;直接尋址,3F單元的內(nèi)容傳入A中,(A)(3FH) MOV A,RO ;間接尋址,R0的內(nèi)容作地址單元的內(nèi)容傳入A中 MOV A,R7 ;寄存器尋址,R7的內(nèi)容傳入A中 以Ri或Rn為目的操作數(shù),各有三種尋址方式的組合。源操作數(shù)是 (A/#data/direct),注:兩個(gè)R寄存器之間沒有數(shù)據(jù)傳送指令。 MOV Rn,A ;累加器,A的內(nèi)容送寄存器Rn中 MOV Rn,#data ;立即尋址,把數(shù)據(jù)da

20、ta送寄存器Rn中 MOV Rn ,direct ;直接尋址,地址direct的內(nèi)容送寄存器Rn中 MOV Ri,A ; A的內(nèi)容送到寄存器Ri的內(nèi)容為地址的單元中 MOV Ri,#data ;數(shù)據(jù)data送到寄存器Ri的內(nèi)容為地址的單元中 MOV Ri ,direct ;地址direct的內(nèi)容送到寄存器Ri的內(nèi)容為地址的單元中 如指令MOV R0 ,36H ;當(dāng)R0的內(nèi)容為47H,地址36H的內(nèi)容為58H,則該指令把數(shù)58H送到地址47H單元中去。當(dāng)指令是MOV R0 ,36H,則指令把數(shù)58H送R0中。 在兩個(gè)片內(nèi)RAM單元或?qū)S眉拇嫫鱏FR之間傳送數(shù)據(jù)。此類指令的目的操作數(shù)是直接地址(d

21、irect)、源操作數(shù)有A/#data/Rn/Ri/direct,結(jié)果8位數(shù)送入地址direct中。 MOV direct,#4DH ;立即尋址,數(shù)4DH送到地址direct中 MOV direct,A ;特殊寄存器尋址,A的內(nèi)容送地址direct中 MOV direct,RO ;間接尋址,R0間址的內(nèi)容送地址direct中 MOV direct,R7 ;寄存器尋址,R7的內(nèi)容送地址direct中 MOV direct, direct ;直接尋址,一地址單元內(nèi)容送另一地址單元中 【例2.1 】 內(nèi)部數(shù)據(jù)傳送指令練習(xí) MOV 3EH,#3FH ;數(shù)3FH傳送入3EH地址單元中 MOV 3DH,A

22、 ;A的內(nèi)容傳送入3DH單元中 MOV 3BH,R1 ;R1的內(nèi)容作地址單元的內(nèi)容送3BH單元中 MOV 3CH,R4 ;寄存器R4的內(nèi)容傳送入3CH單元中 MOV 39H, 3AH ;3AH單元內(nèi)容送39H單元 MOV A,3FH ;3FH單元的內(nèi)容送A寄存器中 MOV PSW, #08H ;定義工作寄存器區(qū)1,RS0=1、RS1=0,PSW為直接地址 MOV 30H,#32H ;立即數(shù)32H送30H存儲器地址單元中 MOV R7, 3FH ;3FH單元的內(nèi)容送指定的R7寄存器中 MOV RO,#30H ;立即數(shù)30H送指定的R0寄存器中,下面R0的內(nèi)容為30H MOV 40H,RO ;RO

23、間址的30H單元的內(nèi)容送直接地址40H單元中 MOV RO,#20H ;立即數(shù)20H送30H單元,因R0的內(nèi)容為30H MOV R0,20H ;20H單元內(nèi)容送地址30H單元中,R0的內(nèi)容為30H 顯然MCS-51的數(shù)據(jù)傳送類指令比較豐富,但尋址方式只有七種,內(nèi)部數(shù)據(jù)傳送指令只用其中的五種尋址方式。助記符也不多,大家可經(jīng)比較而掌握這些指令,下面給出一個(gè)圖2.1,以方便大家學(xué)習(xí)和記憶這些指令。16個(gè)箭頭表示用MOV寫出的片內(nèi)數(shù)據(jù)傳送有16條指令,方塊內(nèi)是尋址方式。圖2.1片內(nèi)數(shù)據(jù)存儲器傳送指令記憶圖 【例2.2】 設(shè)內(nèi)部RAM30H單元內(nèi)容為40H,40H單元的值為10H,P1口作為輸入口,其輸

24、入的數(shù)據(jù)為0CAH,試判斷下列程序連續(xù)執(zhí)行的結(jié)果。 機(jī)器碼 指 令 注 釋 7830H MOV RO,#30H ;數(shù)據(jù)30H送R0中 E6H MOV A,RO ;地址單元30H中的內(nèi)容40H送A中 F9H MOV R1,A ;A的內(nèi)容40H送寄存器R1中 87F0H MOV B R1 ;地址40H的內(nèi)容10H送B寄存器中 A790H MOV R1,P1 ;P1口的內(nèi)容0CAH送地址40H中 85A090H MOV P2,P1 ;P1口鎖存器內(nèi)容0CAH送P2中 執(zhí)行結(jié)果:(RO)=30H,(A)=(R1)=40H,(B)=10H,(40H)=0CAH,(P2)=0CAH 指令:MOV DPTR

25、,#data16 功能:把16位常數(shù)裝入數(shù)據(jù)指針,執(zhí)行操作(DPTR)data16 說明:注意這條三字節(jié)指令的編碼形式。第一字節(jié)為操作碼(90H),第二字節(jié)為數(shù)據(jù)高8位將存放入DPH,第三字節(jié)為數(shù)據(jù)低8位存放入DPL。以后這個(gè)16位數(shù)將作為數(shù)據(jù)地址使用。 2.棧操作指令 指令 PUSH direct 功能:把程序的中間數(shù)據(jù)送入堆棧,稱為進(jìn)棧。為直接尋址 說明:首先棧指針自動加1,執(zhí)行(SP)(SP)+1,將棧指針移向堆棧中無數(shù)據(jù)的地址單元,然后將直接地址(direct)單元的內(nèi)容送入SP所指定的堆棧單元中,執(zhí)行(SP)(direct),不影響標(biāo)志位?!纠?.3】設(shè)堆棧指針SP的內(nèi)容為09H,數(shù)

26、據(jù)指針DPTR的內(nèi)容為0123H,試分析下列指令的執(zhí)行結(jié)果。 PUSH DPL PUSH DPH 執(zhí)行第一條指令:(SP)+1=0AH(SP);(DPL)=23H(0AH)把23H壓入堆棧0AH中 執(zhí)行第二條指令:(SP)+1=0BH(SP);(DPH)=01H(0BH)把01H壓入堆棧0BH中 執(zhí)行結(jié)果為:(0AH)=23H,(0BH)=01H,(SP)=0BH堆棧指針SP的內(nèi)容為0BH 指令: POP direct 功能:把堆棧SP中的中間數(shù)據(jù)送入目的字節(jié),稱為出棧。和PUSH對應(yīng),出棧指令為: POP direct。 說明:讀出由棧指針SP尋址的內(nèi)部RAM單元內(nèi)容。送到指定的直接尋址的字

27、節(jié)單元,然后棧指針自動減1,即執(zhí)行操作: (direct)(SP),(SP) (SP)-1;指令執(zhí)行不影響標(biāo)志位。 【例2.4】設(shè)(SP)=32H,單片機(jī)內(nèi)部RAM的31H,32H單元中的內(nèi)容分別為23H,01H,試分析下列指令的執(zhí)行結(jié)果。 POP DPH ;(SP)=(32H)=01H(DPH)/(SP)-1=31H(SP) POP DPL ;(SP) =(31H)=23H(DPL)/(SP)-1=30H(SP) 執(zhí)行結(jié)果為(DPTR)=0123H。(SP)=30H。 在執(zhí)行棧操作時(shí),應(yīng)注意它們的操作對象。PUSH和POP指令的執(zhí)行過程中實(shí)際隱含著一個(gè)數(shù)據(jù)堆棧。PUSH指令把堆棧作為目的地址

28、,而POP指令則把堆棧作為源地址。進(jìn)棧和出棧都是對堆棧而言。SP的內(nèi)容是堆棧的地址。 3.數(shù)據(jù)交換指令 指令: XCH A,byte ;byte表示一個(gè)操作數(shù)字節(jié) 功能:交換累加器與字節(jié)變量中的數(shù)據(jù)。源操作數(shù)有Rn/direct/Ri 說明:XCH指令把指定字節(jié)的內(nèi)容裝入累加器A中,同時(shí)把累加器中原來的內(nèi)容寫入指定的字節(jié)中。源操作數(shù)有Rn/direct/Ri,目的操作數(shù)是A,共有三條指令。 XCH A,Rn ; XCH A,R6 ,A的內(nèi)容和R6的內(nèi)容交換 XCH A,Ri ; XCH A,R1 ,A的內(nèi)容和R1的內(nèi)容為地址單元的內(nèi)容交換 XCH A,direct ; XCH A,37H ,A

29、的內(nèi)容和37H單元的內(nèi)容交換 【例2.5】 設(shè)RO寄存器內(nèi)容為20H,累加器A的內(nèi)容為3FH,內(nèi)部RAM的20H單元內(nèi)容為75H,若執(zhí)行指令: XCH A,RO 則結(jié)果為:(20H)=3FH,(A)=75H 指令 XCHD A,Ri 功能:低半字節(jié)數(shù)據(jù)交換,執(zhí)行操作(A3-0)(Ri)3-0) 說明:累加器A中的低4位與由寄存器Ri間接尋址的內(nèi)部RAM單元的低4位數(shù)據(jù)進(jìn)行交換。該指令不影響各寄存器的高4位,也不影響標(biāo)志位。 【例2.6 】設(shè)RO內(nèi)容為20H,累加器內(nèi)容為36H,內(nèi)部RAM的20H單元內(nèi)容為75H,若執(zhí)行指令。 XCHD A,RO 其結(jié)果為 (20H)=01110110B=76H

30、 (A) =00110101B=35H 指令: SWAP A 功能:累加器高4位內(nèi)容與低4位內(nèi)容交換。 說明:把累加器A的高半字節(jié)(D7-D4)和低半字節(jié)(D3-D0)內(nèi)容互換,可看做連續(xù)4位循環(huán)移位指令,不影響標(biāo)志位。 SWAP A指令主要用于有關(guān)BCD碼數(shù)的轉(zhuǎn)換操作中。A的高四位和其低四位交換。如:當(dāng)A的內(nèi)容為36H時(shí),執(zhí)行指令SWAP A后A的內(nèi)容為63H。 2.2.2 片外數(shù)據(jù)傳送指令 1.外部RAM數(shù)據(jù)傳送 MCS-51單片機(jī)專用于訪問外部數(shù)據(jù)存儲器的指令只有4條,它們屬于同一種基本操作,見表2.2。 MOVX A,Ri ;Ri內(nèi)容為低8位地址的外部RAM單元把一個(gè)字節(jié)的數(shù)據(jù)傳送A

31、MOVX Ri, A ;A的內(nèi)容送Ri的內(nèi)容為低8位地址的外部RAM單元中 MOVX A,DPTR ;DPTR的內(nèi)容為16位地址的外部RAM單元把一個(gè)字節(jié)的數(shù)據(jù)傳送A MOVX DPTR,A ;A的內(nèi)容送DPTR的內(nèi)容為16位地址的外部RAM單元中 單片機(jī)與外部數(shù)據(jù)存儲器之間的數(shù)據(jù)傳送采用兩種尋址方式,這兩種尋址形式都是間接尋址。一種是單字節(jié)尋址Ri,Ri的內(nèi)容為數(shù)據(jù)的低8位地址,一種是雙字節(jié)尋址DPTR,DPTR的內(nèi)容為數(shù)據(jù)的16位地址,并且另一個(gè)操作數(shù)是A,共有4條指令。 選擇單字節(jié)尋址,以當(dāng)前寄存器區(qū)的RO或R1的內(nèi)容作低8位地址,地址與數(shù)據(jù)分時(shí)從P0口輸出,高8位地址由P2口默認(rèn)給出,

32、這種地址形式最多可訪問256個(gè)外部RAM存儲器單元。實(shí)際上也是十六位地址在起作用。如果與存儲器擴(kuò)展電路相配合,用P2口輸出高位地址。那么,使用單字節(jié)MOVX指令,也能在64KB地址范圍內(nèi)訪問外部RAM。 【例2.7】 設(shè)工作寄存器RO的內(nèi)容為21H,R1的內(nèi)容為43H,(P2)=40H,外部RAM4043H單元內(nèi)容為65H,執(zhí)行下列指令: MOVX A,R1 ;數(shù)65H 送A中(以R1寄存器間址的4043H單元內(nèi)容65H送A) MOVX RO ,A ;(21H)數(shù)65H,數(shù)65H送外部RAM的4021H單元 結(jié)果為把65H送入累加器A和外部RAM的4021H單元。 選擇雙字節(jié)地址。由數(shù)據(jù)指針產(chǎn)

33、生外部RAM的16位地址,如前所述,P2口輸出高8位地址(DPH內(nèi)容),PO口分時(shí)輸出低8位地址(DPL內(nèi)容)和8位數(shù)據(jù)。這種地址形式可以訪問64KB外部RAM存儲器空間。 這兩種地址形式可以混合使用,即通過Ri地址形式選擇一個(gè)小的RAM陣列(256字節(jié))而通過DPTR地址選擇較大的RAM空間,從而實(shí)現(xiàn)在外部RAM之間的數(shù)據(jù)傳送。 【例2.8 】 某單片機(jī)系統(tǒng)配有2KB的外部RAM,試設(shè)計(jì)一程序把第250(0FAH)單元內(nèi)容傳送到04FFH單元。 MOV P2, #00H ;確定地址00FAH高8位 MOV RO,#0FAH ;置地址指針,當(dāng)數(shù)據(jù)高位是字母時(shí)前面加0標(biāo)識。 MOVX A,RO

34、;讀片外數(shù)據(jù)存儲器地址0FAH單元內(nèi)容到A MOV DPTR,#04FFH ;置數(shù)據(jù)指針 MOVX DPTR,A ;將累計(jì)器中內(nèi)容寫入片外數(shù)據(jù)存儲器04FFH地址單元中 在進(jìn)行外部RAM的數(shù)據(jù)傳送時(shí),單片機(jī)將向外部發(fā)出讀(RD)或?qū)懀╓R)控制號。 2、查表指令 8051對程序存儲器的訪問,包括兩類操作。一是從PC指向程序的某一地址處開始執(zhí)行,轉(zhuǎn)移指令及其他與PC有關(guān)的指令,專用于完成這一功能。二是讀程序中的表格數(shù)據(jù)或常數(shù),專用于這一操作的指令有兩條,稱為查表指令。 指令: MOVC A, A+PC MOVC A, A+DPTR 功能:采用變址尋址的字節(jié)代碼傳送,執(zhí)行讀程序存儲器操作。 說明:

35、MOVC指令的功能是把程序存儲器中的單字節(jié)代碼或常數(shù)裝入累加器。助記符MOVC的含義為從程序存儲器取常數(shù)。其寄存器可以是數(shù)據(jù)指針或當(dāng)前程序計(jì)數(shù)器。程序存儲器一般用只讀存儲器ROM,所以這里只能讀不能寫。MOVC指令主要用于訪問程序存儲器中的表格數(shù)據(jù)或常數(shù),采用DPTR數(shù)據(jù)指針作為基址寄存器,可以訪問多至256項(xiàng)(0255)的表格,表格可以設(shè)置在64KB程序存儲器的任何位置。在進(jìn)行查表操作時(shí),使DPTR指向表格的首址,表格的序號裝入累加器,執(zhí)行指令后就能把表格中的常數(shù)裝入累加器A中。 以PC為基址寄存器的MOVC指令,其查表方法略為不同。表格位置設(shè)置有一定限制,只能設(shè)在查表指令操作碼下的256個(gè)

36、字節(jié)范圍之內(nèi)。如A的內(nèi)容為36H,DPTR的內(nèi)容為3000H,程序存儲器地址3036的內(nèi)容為58H,執(zhí)行MOVC A, A+DPTR后A的內(nèi)容為58H。 單片機(jī)和外部數(shù)據(jù)存儲器、程序存儲器數(shù)據(jù)傳送指令共有4+2條,指令中有一個(gè)操作數(shù)是A,分別用不同的助記符(MOVX/MOVC)。如圖2.2所示。圖2.2 片外數(shù)據(jù)存儲器和程序存儲器與片內(nèi)數(shù)據(jù)傳送第2章 MCS-51系列單片機(jī)指令系統(tǒng) 2.2.1 片內(nèi)數(shù)據(jù)傳送指令 1.內(nèi)部RAM數(shù)據(jù)傳送 2.堆棧操作指令 3.數(shù)據(jù)交換指令 2.2.2 片外數(shù)據(jù)傳送指令 1.外部RAM數(shù)據(jù)傳送 2.查表指令 2.2.數(shù)據(jù)傳送類指令 目的要求:初步掌握單片機(jī)數(shù)據(jù)傳送

37、類指令 使用方法,記憶分類方法。 教學(xué)重點(diǎn):初步掌握29條數(shù)據(jù)傳送指令。 記憶具體指令、理解其使用方法 復(fù)習(xí)內(nèi)容: 指令的格式:標(biāo)號:操作碼助記符目的操作數(shù),源操作數(shù);注釋 實(shí)際指令:LOOP:MOV A, #56H ;把數(shù)56H傳送到累加器A中。 MOV R1, A ;把A的內(nèi)容傳送到R1中. 51單片機(jī)共七種尋址方式:立即尋址(#data)、寄存器尋址(Rn)、間接尋址(Ri/DPTR)、直接尋址(direct)、特定寄存器尋址(A)、基址加變址尋址(A+PC/A+DPTR)、相對尋址(rel)。也就是說在指令中出現(xiàn)的操作數(shù)只有這七種。51單片機(jī)的111條指令 通常把51單片機(jī)的111條指

38、令按功能分為五大類;數(shù)據(jù)傳送類指令、算術(shù)運(yùn)算類指令、邏輯運(yùn)算類指令、控制轉(zhuǎn)移類指令和布爾操作類指令。其中數(shù)據(jù)傳送類指令又分為片內(nèi)數(shù)據(jù)傳送(MOV)、片外數(shù)據(jù)傳送(MOVX、MOVC),數(shù)據(jù)交換(XCH),堆棧操作(PUSH、POP)等四個(gè)部分,共29條指令,下面詳細(xì)介紹數(shù)據(jù)傳送指令。1、內(nèi)部RAM數(shù)據(jù)傳送 指令格式:MOV ,說明:把第二操作數(shù)(源操作數(shù))指定的字節(jié)變量傳送到由第一操作數(shù)所指定的地址單元中(目的操作數(shù)),該操作不改變源字節(jié)的內(nèi)容,不影響PSW中的標(biāo)志位。以A為目的操作數(shù)時(shí)影響PSW中的P位。(51單片機(jī)的指令多按英文的習(xí)慣把運(yùn)行的結(jié)果存放在第一個(gè)操作數(shù)中,并把第一個(gè)操作數(shù)叫目的

39、操作數(shù))。此類指令參入的源操作數(shù)和目的操作數(shù)只有#data/A/Rn/Ri/direct五個(gè),其不同組合,共有16條指令。以A為目的操作數(shù)的指令以累加器A為目的操作數(shù)有4條指令,(源操作數(shù)是Ri/Rn/direct/#data)執(zhí)行結(jié)果(8位數(shù))送入A中。助記符指令 具體指令 操作前內(nèi)容 操作后內(nèi)容 注 釋 MOV A,#data MOVA,#36H (A)=17H (A)=36H 00HFFH MOV A,Rn MOV A,R2 (A)=17H,(R2)=38H (A)=38H,(R2)=38H n=0 7MOV A,Ri MOV A,R1 (A)=17H,(R1)=38H(38H)=59H

40、 (A)=59H,(R1)=38H(38H)=59H i=0 1 MOV A,direct MOV A,47H (A)=17H,(47)=35H (A)=35H,(47)=35H 00HFFH 以Ri或Rn為目的操作數(shù)注意兩R之間沒有數(shù)據(jù)傳送指令。助記符指令 具體指令操作前內(nèi)容操作后內(nèi)容 MOV Rn,A MOV R0,A R0=12H,A/53HR0=53H,A/53HMOV Rn,#dataMOV R1,#35HR1=13H,R1=35H,MOV Rn ,direct MOV R2 ,45HR2/14H,45H/58HR2/58H,45H/58HMOV Ri,AMOV R0,AR0/30H

41、,A/75HR0/30H/75H,A/75HMOV Ri,#dataMOV R0,#36HR0/31H,R0/31H/36H,MOVRi ,directMOV R0 ,45HR0/32H,45H/78H32H/78H,45H/78H目的操作數(shù)是直接地址源操作數(shù)有A/#data/Rn/Ri/direct,結(jié)果8位數(shù)送入目的地址direct中。助記符指令具體指令操作前內(nèi)容操作后內(nèi)容MOV direct,#dataMOV 31H,#4DH 31H/15H,31H/4DHMOV direct,A MOV 32H,A 32H/16H,A/37H32H/37HMOV direct,RiMOV 33H,R0

42、33H/17H,R0/36H/57H33H/57HMOV direct,Rn MOV 34H,R7 34H/18H, R7 /37H34H/37HMOV direct, direct MOV 35H, 36H 35H/19H,36H59H35H/59H指令:MOV DPTR,#data16 功能:把16位常數(shù)裝入數(shù)據(jù)指針中,執(zhí)行操作(DPTR)data16說明:注意這條三字節(jié)指令的編碼形式。第一字節(jié)為操作碼(90H),第二字節(jié)為數(shù)據(jù)高8位將存放入DPH,第三字節(jié)為數(shù)據(jù)低8位存放入DPL。以后這個(gè)16位數(shù)將作為數(shù)據(jù)地址使用。用MOV寫出的片內(nèi)數(shù)據(jù)傳送指令有16條指令 51單片機(jī)尋址方式有七種,內(nèi)

43、部數(shù)據(jù)傳送指令只用其中的五種尋址方式。助記符是MOV,下面給出一個(gè)速記圖,以方便大家學(xué)習(xí)。2.堆棧操作指令 指令 PUSH direct 功能:把直接尋址中的數(shù)據(jù)送入堆棧,稱為進(jìn)棧。數(shù)據(jù)為程序 的中間結(jié)果說明:首先棧指針自動加1,執(zhí)行(SP)(SP)+1,將棧指針移向堆棧中無數(shù)據(jù)的地址單元,然后將直接地址(direct)單元的內(nèi)容送入SP所指定的堆棧單元中,執(zhí)行(SP)(direct),該操作不影響標(biāo)志位。【例2.3】堆棧操作設(shè)堆棧指針SP的內(nèi)容為09H,數(shù)據(jù)指針DPTR的內(nèi)容為0123H,試分析下列指令的執(zhí)行結(jié)果。PUSH DPLPUSH DPH 執(zhí)行第一條指令:(SP)+1=0AH(SP)

44、;(DPL)=23H(0AH)把23H壓入堆棧0AH中 執(zhí)行第二條指令:(SP)+1=0BH(SP);(DPH)=01H(0BH)把01H壓入堆棧0BH中 執(zhí)行結(jié)果為:(0AH)=23H,(0BH)=01H,(SP)=0BH堆棧指針SP的內(nèi)容為0BH指令: POP direct 功能:把堆棧SP中的中間數(shù)據(jù)送入目的字節(jié),稱為出棧。和PUSH對應(yīng),出棧指令為: POP direct。 說明:讀出由棧指針SP尋址的內(nèi)部RAM單元內(nèi)容。送到指定的直接尋址的字節(jié)單元,然后棧指針自動減1,即執(zhí)行操作:(direct)(SP),(SP) (SP)-1;該指令執(zhí)行不影響標(biāo)志位。3.數(shù)據(jù)交換指令 指令: XC

45、H A,byte;byte表示一個(gè)操作數(shù)字節(jié)功能:交換累加器與字節(jié)變量中的數(shù)據(jù)。源操作數(shù)有Rn/direct/Ri說明:XCH指令把指定字節(jié)的內(nèi)容裝入累加器A中,同時(shí)把累加器中原來的內(nèi)容寫入指定的字節(jié)中。源操作數(shù)有:Rn/direct/Ri,目的操作數(shù)是A,共有三條指令。 字節(jié)交換指令字節(jié)交換指令有三條:助記符指令具體指令操作前內(nèi)容操作后內(nèi)容XCH A,RnXCH A,R6 A/78H,R6/56HA/56H,R6/78HXCH A,RiXCH A,R1 A/78H,R1/32H/39HA/39H,R1/32H/78HXCH A,directXCH A,37H A/78H.,37H/93HA/

46、93H, 37H/78H半字節(jié)交換指令指令 XCHD A,Ri功能:低半字節(jié)數(shù)據(jù)交換,執(zhí)行操作(A3-0)(Ri)3-0) 指令: SWAP A 功能:累加器高4位內(nèi)容與低4位內(nèi)容交換例:XCHD A,RO;當(dāng)(A)=34H,(20H)=75H 其結(jié)果為 (20H)=01110100B=74H (A) =00110101B=35H如果是執(zhí)行 SWAP A ;則;(A)=43H2.2.2 片外數(shù)據(jù)傳送指令 1.外部RAM數(shù)據(jù)傳送 MCS-51單片機(jī)專用于訪問外部數(shù)據(jù)存儲器的指令只有4條 MOVX A,Ri ;把Ri內(nèi)容為低8位地址的外部RAM單元中的數(shù)據(jù)傳送AMOVX Ri, A ;把A的內(nèi)容送

47、Ri的內(nèi)容為低8位地址的外部RAM單元中MOVX A,DPTR ;把DPTR的內(nèi)容為16位地址的外部RAM單元中的數(shù)據(jù)傳送AMOVX DPTR,A ;把A的內(nèi)容送DPTR的內(nèi)容為16位地址的外部RAM單元中 2、查表指令 51單片機(jī)對程序存儲器的訪問指令有兩條:指令: MOVC A,A+PC MOVC A, A+DPTR 說明:MOVC指令的功能是把程序存儲器中的單字節(jié)代碼或常數(shù)裝入累加器。助記符MOVC的含義為從程序存儲器中取常數(shù)。其寄存器可以是數(shù)據(jù)指針或當(dāng)前程序計(jì)數(shù)器。程序存儲器一般使用只讀存儲器ROM,所以這里只能讀不能寫。 片外數(shù)據(jù)傳送舉例操作前(A)=37H,(P2)=41H,(R0

48、)=01H,數(shù)據(jù)存儲器(4101H)=35H, DPRT指向4101H,程序存儲器地址PC=2000H,(2037H)=45H,(4138H)=57H,當(dāng)不考慮上下指令的關(guān)系:MOVX A,R0 ;(A)=35H MOVX R0, A ;(4101H)=37H MOVX A,DPTR ;(A)=35H ;4101HMOVX DPTR,A ;(4101H)=37H MOVC A,A+PC ; (A)=45H ;37H+2000HMOVC A, A+DPTR ; (A)=57H ;37H+4101H片外數(shù)據(jù)存儲器和程序存儲器 片外數(shù)據(jù)存儲器和程序存儲器與片內(nèi)數(shù)據(jù)存儲器之間的傳送數(shù)據(jù)共有6條指令 。

49、可用 下圖加強(qiáng)記憶。 2.3 算術(shù)運(yùn)算類指令 MCS-51單片機(jī)算術(shù)運(yùn)算指令包括:加法指令(ADD)、帶進(jìn)位加法ADDC和帶借位減法指令(SUBB)、加1指令(INC)、減1指令(DEC)、十進(jìn)制調(diào)整指令(DA)、乘法(MUL)和除法(DIV)指令,共24條,加減法指令中有兩個(gè)操作數(shù)時(shí)目的操作數(shù)是A,源操作數(shù)是Ri/Rn/direct/#data之一,其中DPTR有一條加一指令,參入乘法和除法的操作數(shù)只能是A和B,見表2.3。 類別 指令 機(jī)器碼 字節(jié)數(shù) 執(zhí)行周期 PSW位 功能注釋加 ADD A,Rn 28-2F 1 12 CY OV AC (A)(A)+(Rn) 法 ADD A,Ri 26

50、/27 1 12 CY OV AC (A)(A)+(Ri) ADD A,direct 25 direct 2 12 CY OV AC (A)(A)+(direct) ADD A,#data 24 data 2 12 CY OV AC (A)(A)+ data帶 ADDC A,Rn 38-3F 1 12 CY OV AC (A)(A)+(C)+(Rn)進(jìn) ADDC A,Ri 36/37 1 12 CY OV AC 帶進(jìn)位C加法位 ADDC A,direct 35 direct 2 12 CY OV AC 加 ADDC A,#data 34 data 2 12 CY OV AC帶 SUBB A,R

51、n 98-9F 1 12 CY OV AC (A)(A)-(C)-(Rn)進(jìn) SUBB A,Ri 96/97 1 12 CY OV AC 帶借位C減法位 SUBB A,direct 95 direct 2 12 CY OV AC 減 SUBB A,#data 94 data 2 12 CY OV AC表:2.3算術(shù)運(yùn)算類指令加 INC A 04 1 12 (A)(A)+1 INC Rn 08-0F 1 12 操作數(shù)內(nèi)容加1一 INC Ri 06/07 1 12 INC direct 05 direct 2 12 INC DPTR A3 1 24 減 DEC A 14 1 12 操作數(shù)內(nèi)容減1

52、DEC Rn 18-1F 1 12一 DEC Ri 16/17 1 12 DEC direct 15 direct 2 12 MUL AB A4 1 48 OV (BA)(A)(B) DIV AB 84 1 48 OV (A)(A)/(B) DA A DA 1 12 余數(shù)送B2.3.1 加法指令 1.加法 ADD 說明:ADD指令把源字節(jié)變量與累加器A內(nèi)容相加,結(jié)果存放在累加器A中,如果位7(最高位D7)或位3(第四位D3)向高位有進(jìn)位,則分別將PSW的進(jìn)位Cy和半進(jìn)位AC標(biāo)志位置1;否則清0。此外,ADD指令還將影響標(biāo)志位OV和P。通常8位數(shù)據(jù)看成是用D7D6D5D4D3D2D1D0表示。A

53、DD指令有4種源操作數(shù)尋址方式:寄存器、直接、寄存器間址和立即數(shù)。當(dāng)有兩個(gè)操作數(shù)時(shí)有一個(gè)是A ,并且作為目的操作數(shù),見表2.3。 無符號整數(shù)相加時(shí),若C位為1,說明和數(shù)有溢出(大于255),在默認(rèn)條件下,本單片機(jī)只能進(jìn)行十六進(jìn)制運(yùn)算,但由于日常需要進(jìn)行十進(jìn)制或負(fù)數(shù)運(yùn)算(以后叫帶符號數(shù)),則可根據(jù)標(biāo)志位的變化通過軟件換算出結(jié)果,常把一個(gè)8位帶符號數(shù)的最高位看成符號位,這樣它只有七位有效數(shù)字,兩個(gè)帶符號數(shù)相加是否產(chǎn)生溢出,取決于和數(shù)位D6和位D7的進(jìn)位情況。 【例2.9 】 設(shè)A的內(nèi)容為十六進(jìn)制數(shù)98H,R0的內(nèi)容為十六進(jìn)制數(shù)56H,地址單元56H的內(nèi)容為十六進(jìn)制數(shù)0B9H。不考慮上下指令的關(guān)系。

54、 ADD A,R0 ;98H+56H=0 EEH,結(jié)果A的內(nèi)容為0EEH,進(jìn)位Cy和AC都為0 ADD A,R0 ;98H+0B9H=1 51H,結(jié)果A的內(nèi)容為51H,進(jìn)位Cy和AC都為1 ADD A,56H ;98H+0B9H=1 51H,結(jié)果A的內(nèi)容為51H,進(jìn)位Cy和AC都為1 ADD A,#5CH ;98H+5CH=0 F4H,結(jié)果A的內(nèi)容為0F4H,進(jìn)位Cy為0,AC為1 2.帶進(jìn)位加法。ADDC 說明:ADDC把指令中的源字節(jié)變量、低位來的進(jìn)位C與累加器內(nèi)容相加,結(jié)果存于累加器中。該指令對標(biāo)志位的影響,進(jìn)位和溢出情況和ADD指令完全相同。 ADDC指令有4種操作數(shù)尋址方式,相應(yīng)的4

55、條指令見表2.3。多字節(jié)數(shù)相加必須使用該指令,以保證低位字節(jié)的進(jìn)位加到高位字節(jié)中。 【例2.10】設(shè)(A)=0C3H ,(RO)=0AAH,當(dāng)(C)=1時(shí),執(zhí)行指令;ADDC A,RO (A) 11000011 ;看成有符號數(shù)為-3DH(100H- 0C3H),此為補(bǔ)碼運(yùn)算。 (RO)10101010 ;看成有符號數(shù)為-56H(100H- 0AAH) + (C) 1 ;低位送來的進(jìn)位為1或C的內(nèi)容 為1。 1 01101110 ;規(guī)定有符號數(shù)的最高位不是數(shù) 1,而是符號“負(fù)” 結(jié)果為:(C)=1,(OV)=1,(A)=6EH或看成符號數(shù)運(yùn)算-3DH+(-56H)+1=-92H 本例操作結(jié)果的值

56、,以及本單片機(jī)的其它算術(shù)運(yùn)算,本來都是十六進(jìn)制無符號數(shù)運(yùn)算。但可根據(jù)操作數(shù)是無符號數(shù)還是有符號數(shù),運(yùn)算時(shí)的進(jìn)位和溢出等情況進(jìn)行判別,從而通過軟件來進(jìn)行有符號數(shù)運(yùn)算,這里若操作數(shù)為無符號數(shù),則結(jié)果為366(十六進(jìn)進(jìn)制數(shù)為1 6EH),若是有符號數(shù)參入運(yùn)算,因最高位為符號位,則結(jié)果為-146(-92H,補(bǔ)碼是16EH)。因已超出了8位有符號數(shù)表示范圍(-128127)。(10 0000 0000-0 1001 0010=1 0110 1110)或(2 00H-92H=1 6EH)結(jié)果是9位有符號數(shù)。注意:由負(fù)數(shù)的補(bǔ)碼參入運(yùn)算,結(jié)果也是補(bǔ)碼,負(fù)數(shù)補(bǔ)碼的最高位是1,可看成符號位。 3 加一指令 INC

57、 byte 說明:把指令中的字節(jié)變量加1,結(jié)果仍存放在原字節(jié)中。若原字節(jié)變量為0FFH,加1后將溢出為00H。該指令不影響任何標(biāo)志。 INC 指令有4種尋址方式。A尋址、寄存器、直接和寄存器間址,共有4條指令。 INC A ;A的內(nèi)容加一 INC R1 ;R1的內(nèi)容加一 INC R1 ;R1的內(nèi)容為地址單元的內(nèi)容加一 INC 32H ;內(nèi)部RAM32H地址單元的內(nèi)容加一 【例2.11】 設(shè)(RO)=7EH,(7EH)=0FFH (7FH)=40H,執(zhí)行下列指令: INC R0 ;0FFH+1=00H(7EH) INC RO ;7EH+1=7FH(RO) INC RO ;40H+1=41H(7F

58、H) 結(jié)果為:(RO)=7FH,(7EH)=00H,(7FH)=41H 另外,對于指令“INC direct”,當(dāng)指令中的direct為端口地址P0P1時(shí),其功能是修改端口的內(nèi)容,其操作過程是先讀入端口的內(nèi)容,然后在CPU中加1,再輸出到端口。注意:讀入端口的值取自端口鎖存器,而不是引腳。 4.指令 INC DPTR 功能:把16位數(shù)據(jù)指針內(nèi)容加1。執(zhí)行16位無符號數(shù)加法,即先對數(shù)據(jù)指針的低8位DPL內(nèi)容加1,當(dāng)有溢出時(shí),再把DPH內(nèi)容加1,不影響任何標(biāo)志。這是唯一的16位寄存器加1指令。 2.3.2 十進(jìn)制調(diào)整指令 功能:對累加器A中的BCD碼加法運(yùn)算后的結(jié)果進(jìn)行二一十進(jìn)行調(diào)整。 說明:單片

59、機(jī)運(yùn)算指令是按十六進(jìn)制加法設(shè)計(jì),即8位二進(jìn)制數(shù)運(yùn)算之后,其結(jié)果(累加器A中的8位二進(jìn)制數(shù))可看成是二位十六進(jìn)制數(shù),而我們?nèi)粘S玫氖鞘M(jìn)制數(shù),當(dāng)我們把兩個(gè)十進(jìn)制數(shù)送單片機(jī)進(jìn)行十六進(jìn)制運(yùn)算,該指令是把十六進(jìn)制運(yùn)算的結(jié)果化為十進(jìn)制數(shù),如運(yùn)算06H+07H=0DH調(diào)整為十進(jìn)制數(shù)為13。也就是說兩個(gè)十進(jìn)制數(shù)的和應(yīng)在09之間時(shí),單片機(jī)中結(jié)果確是在0-F之間,“DA A”指令正是在這一前提下出現(xiàn)的。 “DA A”指令能夠根據(jù)加法運(yùn)算后累加器中的值和PSW中的AC和C標(biāo)志位的狀態(tài),自動選擇一個(gè)修正值(00H,06H,60H,66H中的一個(gè))和原運(yùn)算結(jié)果相加,從而在任何情況下,都能獲得正確的結(jié)果。這個(gè)過程稱為二

60、一十進(jìn)制調(diào)整。“DA A”指令在執(zhí)行過程中自動選擇修正值的規(guī)則是: 若(A30)9或(AC)=1,則執(zhí)行(A30)+6(A30) 若(A74)9或(C)=1,則執(zhí)行(A74)+6(A74)【例2.12】 設(shè)累加器A的內(nèi)容為56H,它表示十進(jìn)制數(shù)56的壓縮的BCD碼數(shù),寄存器R3的內(nèi)容為67H,表示十進(jìn)制數(shù)67的壓縮的BCD碼數(shù),進(jìn)位標(biāo)志為1,注:運(yùn)算前參入運(yùn)算的是十進(jìn)制數(shù)56和67,采用十六進(jìn)制運(yùn)算。執(zhí)行下列指令:ADDC A, R3 ;56H+67H=0BEHDA A ;0BEH+66H=1 24H,其中A的內(nèi)容為24,進(jìn)位為1 可以看出,執(zhí)行ADDC指令后,累加器中的和數(shù)為BEH,它不是所

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論