新編單片機(jī)原理及應(yīng)用第二章課件_第1頁
新編單片機(jī)原理及應(yīng)用第二章課件_第2頁
新編單片機(jī)原理及應(yīng)用第二章課件_第3頁
新編單片機(jī)原理及應(yīng)用第二章課件_第4頁
新編單片機(jī)原理及應(yīng)用第二章課件_第5頁
已閱讀5頁,還剩120頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第2章 MCS-51單片機(jī)指令系統(tǒng)與匯編語言程序設(shè)計主要內(nèi)容:MCS-51單片機(jī)的尋址方式、指令系統(tǒng)、基本程序結(jié)構(gòu)及匯編語言程序的開發(fā)與調(diào)試。重 點:尋址方式、各種指令的應(yīng)用、程序設(shè)計的規(guī)范、程序設(shè)計的思想及典型程序的理解和掌握。難 點:控制轉(zhuǎn)移、位操作指令的理解,各種指令的靈活應(yīng)用,程序設(shè)計的基本方法以及針對具體的硬件設(shè)計出最合理的軟件。要 求: 抽時間自學(xué)Keil,C51。第2章 MCS-51單片機(jī)指令系統(tǒng)與匯編語言程序設(shè)計2.1 概述2.2 MCS-51單片機(jī)的尋址方式2.3 MCS-51單片機(jī)的指令系統(tǒng)2.4 匯編語言及程序設(shè)計2.5 程序設(shè)計舉例2.6 匯編語言的開發(fā)環(huán)境指令系統(tǒng):一

2、臺計算機(jī)所能識別、執(zhí)行的指令的集合。機(jī)器語言:指令系統(tǒng)是一套控制計算機(jī)執(zhí)行操作的二進(jìn)制編碼,稱為機(jī)器語言。特點:機(jī)器語言指令是計算機(jī)惟一能直接識別和執(zhí)行的指令。 匯編語言:利用指令助記符來描述指令系統(tǒng)的一套計算機(jī)指令。特點:計算機(jī)的指令系統(tǒng)一般都是利用匯編語言描述的,是由計算機(jī)硬件設(shè)計所決定的。指令系統(tǒng)沒有通用性。 2.1 概述 單片機(jī)一般是空機(jī),未含任何系統(tǒng)軟件。因此在第一次使用前,必須對其進(jìn)行編程。指令:計算機(jī)用于控制各功能部件完成某一指定動作的指示和命令。識別指令的標(biāo)志指令的表示形式: (1)指令的二進(jìn)制形式 機(jī)器碼、源程序的目標(biāo)代碼二進(jìn)制。特點:直接為計算機(jī)識別和執(zhí)行。讀/寫和記憶困難

3、。 (2)指令的十六進(jìn)制形式 指令的十六進(jìn)代碼需翻譯成二進(jìn)制代碼才能被計算機(jī)識別和執(zhí)行。特點:方便讀,寫和記憶困難。 (3)指令助記符 用英文字母、單詞表征指令的功能。其源程序必須翻譯成機(jī)器碼(目標(biāo)代碼)才能被計算機(jī)識別和執(zhí)行。特點:方便讀/寫和記憶。2.1.1 匯編語言指令格式與偽指令2.1.2 指令的分類2.1.3 指令中的常用符號2.1 概述 2.1.1 匯編語言指令格式與偽指令 1常用單位與術(shù)語位(bit):計算機(jī)所能表示的最小的、最基本的數(shù)據(jù)單位,指一個二進(jìn)制位。字節(jié)(Byte):一個連續(xù)的8位二進(jìn)制數(shù)碼,1Byte=8bit。字(Word):通常由16位二進(jìn)制數(shù)碼組成,即1Word

4、=2Byte。字長:計算機(jī)一次處理二進(jìn)制數(shù)碼的位數(shù)。 MCS-51系列單片機(jī)都是以Intel公司最早的典型8位產(chǎn)品8051為核心,增加了一定的功能部件后構(gòu)成的。本章以8051為主介紹MCS-51系列單片機(jī)。 2匯編語言指令格式 指令格式:指令的表示方式,規(guī)定了指令的長度和內(nèi)部信息的安排。標(biāo)號: 操作碼 操作數(shù) ,操作數(shù) ;注釋其中: 項是可選項。標(biāo)號(符號地址):本條指令起始地址的符號,代表該條指令在程序編譯時的具體地址。操作碼(助記符):英文字母、單詞表征指令,一般是對應(yīng)英文的縮寫。特點:規(guī)定了指令具體的操作功能,描述指令的操作性質(zhì),是指令語句的關(guān)鍵,是一條指令中不可缺少的內(nèi)容。操作數(shù):一個

5、具體的數(shù)據(jù),或存放數(shù)據(jù)的地址。注釋:針對某指令而添加的說明性文字,增加程序的可讀性,不產(chǎn)生可執(zhí)行的目標(biāo)代碼。偽指令:匯編程序的控制命令。是程序員發(fā)給匯編程序的命令。功能:設(shè)置符號值、保留和初始化存儲空間、控制用戶程序代碼的位置。 3偽指令 偽指令只出現(xiàn)在匯編前的源程序中,僅提供匯編用的某些控制信息,不產(chǎn)生可執(zhí)行的目標(biāo)代碼,是CPU不能實際執(zhí)行的指令。(1)定位偽指令ORG格式:ORG n其中:n絕對地址,十六進(jìn)制數(shù)、標(biāo)號或表達(dá)式。功能:規(guī)定編譯后的機(jī)器代碼存放的起始位置。規(guī)定:在一個匯編語言源程序中允許存在多條定位偽指令,但每一個n值都應(yīng)和前面生成的機(jī)器指令存放地址不重疊。 例如: ORG 1

6、000H START:MOV A,#20H MOV B,#30H (2)結(jié)束匯編偽指令END格式:標(biāo)號: END 表達(dá)式功能:源程序的匯編到此結(jié)束,其后的任何內(nèi)容不予理睬。放在匯編語言源程序的末尾。(3)賦值偽指令EQU格式:字符名稱x EQU 賦值項n功能:將賦值項n的值賦予字符名稱x。程序中凡出現(xiàn)該字符名稱x就等同于該賦值項n,其值在整個程序中有效。規(guī)定:在使用時,必須先賦值后使用。賦值項n可以是常數(shù)、地址、標(biāo)號或表達(dá)式。 “字符名稱”與“標(biāo)號”表示形式的區(qū)別:“字符名稱”后無冒號,而“標(biāo)號”后面有冒號。(4)定義字節(jié)偽指令DB格式:標(biāo)號: DB x1, x2, xn功能:將8位數(shù)據(jù)(數(shù)據(jù)

7、組)x1, x2, xn順序存放在從當(dāng)前程序存儲器地址開始的存儲單元中。規(guī)定:xi8位常數(shù)(00HFFH )、ASCII碼(字符在單引號內(nèi))、表達(dá)式,字符串(在單引號內(nèi),長度80個字符)。兩個數(shù)據(jù)之間用逗號“,”分隔。(5)定義雙字節(jié)偽指令DW格式:標(biāo)號: DW x1, x2, xn功能:將雙字節(jié)數(shù)據(jù)(數(shù)據(jù)組)順序存放在從標(biāo)號指定地址單元開始的存儲單元中。規(guī)定:xi16位數(shù)值常數(shù),先存高8位入低位地址單元。(6)預(yù)留存儲空間偽指令DS格式:標(biāo)號: DS n功能:從標(biāo)號指定地址單元開始,預(yù)留n個存儲單元。規(guī)定:匯編時不對預(yù)留存儲單元賦值。n數(shù)據(jù),表達(dá)式。注意:DB、DW、DS偽指令只能對程序存儲

8、器進(jìn)行賦值和初始化工作,不能用來對數(shù)據(jù)存儲器進(jìn)行賦值和初始化工作。 (7)定義位地址符號偽指令BIT格式:字符名稱x BIT 位地址n功能:將位地址n的值賦予字符名稱x。規(guī)定:程序中凡出現(xiàn)該字符名稱x就代表該位地址。位地址n絕對地址,符號地址。(8)數(shù)據(jù)地址賦值偽指令DATA格式:字符名稱x DATA 表達(dá)式n功能:把表達(dá)式n的值賦值給左邊的字符名稱x。規(guī)定: n數(shù)據(jù)或地址,包含所定義的“字符名稱x”在內(nèi)的表達(dá)式,但不能為匯編符號。DATA與EQU的主要區(qū)別是:EQU必須先定義后使用,DATA無限制。 EQU 源程序的開頭,DATA源程序的開頭或末尾。 2.1.2 指令的分類 MCS-51指令

9、系統(tǒng)有111條指令,分類如下:1. 按指令字節(jié)數(shù)分類 單字節(jié)(49條),雙字節(jié)(46條),3字節(jié)(16條)。2. 按指令執(zhí)行時間分類 單機(jī)器周期指令(65條)、雙機(jī)器周期指令(44條)和四機(jī)器周期指令(2條)。3. 按功能分類 數(shù)據(jù)傳送指令(29條)、算術(shù)操作指令(24條)、邏輯操作指令(24條)、控制轉(zhuǎn)移指令(17條)和位操作指令(17條)。 4. 指令的字節(jié)數(shù): 指令操作碼1字節(jié);直接地址1字節(jié),8位數(shù)據(jù)1字節(jié), 16位數(shù)據(jù)2字節(jié);操作數(shù)中的A、B、R0R7、 C、 Ri、DPTR、 A+ DPTR、 A+ PC等均隱含在操作碼中。(1)1字節(jié)指令(單字節(jié)指令) 指令中只有操作碼。 NOP

10、 RET 操作數(shù)的寄存器號隱含在指令碼中。 MOV A,Rn;指令碼11101 rrr INC DPTR ;指令碼A3H(2)2字節(jié)指令(雙字節(jié)指令) 指令的格式:操作碼 操作數(shù)(操作碼為第一字節(jié),操作數(shù)為第二字節(jié)) MOV A,#data;指令碼為0111 0100 #data(3) 3字節(jié)指令(三字節(jié)指令) 指令的格式:操作碼 目的操作數(shù),源操作數(shù)(三字節(jié):操作碼,目的操作數(shù),源操作數(shù)) ANL direct,#data;指令碼0101 0011 direct #dataSWAP A23221232112MOV DPTR,#1000HMOVA,20HANLA,#0FHMOVC A,A+DP

11、TRMOV21H,AMOVSP,#60HANLA,#0F0HMOVC A,A+PCMOV22H,ASJMP注:部分特殊功能寄存器SFR占一個字節(jié)。2.1.3 指令中的常用符號 MCS-51指令系統(tǒng)共有44種助記符,類似于8086。常用符號如下:Rn(n=07):工作寄存器組R0R7中的任一個寄存器。Ri(i=0或1):工作寄存器組中用于間址的寄存器R0, R1。#data:8位直接參與操作的立即數(shù)。#data16:16位直接參與操作的立即數(shù)。direct:片內(nèi)RAM的8位單元地址。addr11:11位目的地址,主要用于ACALL和AJMP指令中。addr16:16位目的地址,主要用于LCALL

12、和LJMP指令中。 rel:8位二進(jìn)制地址偏移量(補(bǔ)碼),取值范圍為128+127,主要用于相對轉(zhuǎn)移指令,以形成轉(zhuǎn)移的目的地址。DPTR:數(shù)據(jù)指針,用于寄存器間接尋址方式和變址尋址方式。bit:片內(nèi)RAM的位尋址區(qū)、可以位尋址的SFR的位地址。A(或ACC):累加器。B :B寄存器。C:PSW中的進(jìn)位標(biāo)志位Cy。:用于間接尋址寄存器指針的前綴標(biāo)志。$:當(dāng)前指令的地址。 /:在位操作指令中,對該位先求反后再參與操作。(X):由X所指定的某寄存器或某單元中的內(nèi)容。 (X):由X間接尋址單元中的內(nèi)容。:指令的操作結(jié)果是將箭頭右邊的內(nèi)容傳送到左邊。:指令的操作結(jié)果是將箭頭左邊的內(nèi)容傳送到右邊。、 、

13、:表示邏輯或、與、異或。尋址方式:說明操作數(shù)所在地址的方法?;蛑噶畎吹刂帆@得操作數(shù)的方式。 計算機(jī)在設(shè)計時決定了它的尋址方式,尋址方式越多,計算機(jī)的靈活性越強(qiáng),指令系統(tǒng)也就越復(fù)雜。 MCS-51單片機(jī)的指令系統(tǒng)提供了七種尋址方式,分別為: 立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對尋址和位尋址。一條指令可能含多種尋址方式。2.2 MCS-51單片機(jī)的尋址方式 計算機(jī)執(zhí)行程序?qū)嶋H上是在不斷尋找操作數(shù)并進(jìn)行操作的過程。2.2.1 立即尋址 定義:立即參與操作的數(shù)據(jù)(立即數(shù))直接寫在指令中。特點:指令中直接含有所需8位/16位的操作數(shù)。處于指令的第二字節(jié)和第三字節(jié)的位置上。立即數(shù)

14、表示方法:#data8,#data16。 MOV A,#2DH ;(A) 立即數(shù)2DH MOV A,2DH ;(A) 內(nèi)部RAM的2DH單元內(nèi)容 ADD A,#05H ;(A)(A)+立即數(shù) 05H MOV DPTR,#1000H ; ( DPTR)立即數(shù) 1000H2.2.2 直接尋址定義:操作數(shù)的地址直接寫在指令中。特點:指令中含有操作數(shù)的地址指出了參與操作的數(shù)據(jù)所存放在存儲器單元(位)的地址。尋址范圍:ROM、片內(nèi)RAM、SFR和位地址空間。 MOV R1,2DH ;(R1) (2DH) MOV 30H,4AH ;(30H)(4AH)注意: MOV A, SP ; (A) (SP) MO

15、V A, 81H ; (A) (SP) MOV P1, #5AH ; (P1)(#5AH) MOV 90H, #5AH ; (P1)(#5AH) 2.2.3 寄存器尋址定義:操作數(shù)存放在MCS-51內(nèi)部的Rn或部分專用寄存器中。特點:指令中指出的寄存器的內(nèi)容作為操作數(shù)。尋址范圍:四組通用寄存器Rn(R0R7)、部分專用寄存器( A, B, DPTR, Cy )。 MOV A,R7 ; (A) (R7) MOV 30H,B ;(30H)(B) MOV DPTR,#1000H ; (DPTR) 1000H存放操作數(shù)的寄存器在指令代碼中不占據(jù)單獨的一個字節(jié),嵌入(隱含)到操作碼字節(jié)中。2.2.4 寄

16、存器間接尋址(寄存器間址)定義:指令的寄存器中存放的是操作數(shù)據(jù)的單元地址。特點:二次尋找操作數(shù)地址的尋址方式。 尋址范圍:內(nèi)部RAM低128B(只能用R0或R1), 外部RAM(R0、R1,DPTR)。 MOV R1,#30H ; (R1) 立即數(shù)30H MOV R1,#0FH ; (30H)立即數(shù)0FH MOV A,R1 ; (A)(30H)=立即數(shù)0FH寄存器間接尋址,寄存器前邊必須加前綴符號“”,不能用于尋址特殊功能寄存器SFR。 2.2.5 變址尋址(基址加變址寄存器間接尋址)定義:操作數(shù)存放在變址寄存器(累加器A)和基址寄存器(DPTR或PC)相加形成的16位地址單元中。特點:單字節(jié)

17、指令,指令操作碼中隱含基址寄存器和變址寄存器。執(zhí)行時,基地址+偏移地址操作數(shù)地址操作數(shù)完成相應(yīng)的操作。尋址范圍:ROM,主要用于查表性質(zhì)的訪問。注意:A中存放的偏移地址的范圍為00HFFH(無符號數(shù))。 MCS-51單片機(jī)共有以下三條變址尋址指令: MOVC A, A+PC ;(A)(A)+(PC)+1) MOVC A, A+DPTR ;(A)(A)+(DPTR) JMP A+DPTR ;(PC)(A)+(DPTR)如:(DPTR)= 1234H,(A)= 50H, ROM的(1284H)= 65H。 執(zhí)行MOVC A, A+DPTR 過程: (A)+(DPTR) = 1284H(1284H)

18、= 65H (A)=65H 2.2.6 相對尋址定義:將程序計數(shù)器PC的當(dāng)前值(取出本條指令后的PC值)與+rel新的轉(zhuǎn)移目標(biāo)地址。特點:用于程序的相對轉(zhuǎn)移,易于生成浮動代碼。如: SJMP rel ; (PC)(PC) + 2 + rel 雙字節(jié)指令 相對轉(zhuǎn)移指令的目的地址指令地址指令字節(jié)數(shù)偏移量尋址范圍:ROM。相對地址偏移量(rel):8位二進(jìn)制補(bǔ)碼,范圍為128127。在程序中,“rel” 通常用“標(biāo)號”代替。分析指令SJMP 06H的執(zhí)行過程及執(zhí)行結(jié)果。 執(zhí)行的過程如下圖所示。2.2.7 位尋址定義:指令中給出的操作數(shù)是一個可單獨尋址的位地址。特點:直接尋址方式的一種,對8位二進(jìn)制數(shù)

19、中的某一位的地址進(jìn)行操作。尋址范圍:片內(nèi)RAM低128B中位尋址區(qū)、部分SFR(83位)。可位尋址的位地址的表示形式:(1)直接使用位地址。 如: MOV 00H, C ;(00H)(Cy) 其中:00H是片內(nèi)RAM中20H地址單元的第0位。(2)字節(jié)地址加位序號的形式。如: MOV 20H.0, C ; (20H.0)(Cy) 其中:20H.0是片內(nèi)RAM中20H地址單元的第0位。(3)位的符號地址(位名稱)的形式。 利用部分特殊功能寄存器各位的特定名稱來訪問該位。 如: ANL C, P ; (C) (C)(P) 其中:P是PSW的第0位,C是PSW的第7位。(4)字節(jié)符號地址(字節(jié)名稱)

20、加位序號的形式。 利用部分特殊功能寄存器名稱加位序號形式來訪問該位。 如: CPL PSW.6 ; (AC) ( ) 其中: PSW.6表示該位是PSW的第6位。例題1 指出下列指令中源操作數(shù)的尋址方式寄存器尋址立即尋址寄存器間接尋址直接尋址變址尋址相對尋址位尋址MOV A,R1 ;(A)(R1)ADD A,#05H ; (A)(A)+立即數(shù) 05H MOV A,R1 ; (A) (R1) MOV 30H,4AH ;( 30H )(4AH)MOVC A,A+DPTR ;(A)(A)+(DPTR)SJMP LP ; (PC)(PC)+ 2 + 偏移量MOV 65H, C ;(65H)(Cy)2.

21、3 MCS-51單片機(jī)的指令系統(tǒng) MCS-51指令系統(tǒng):44種助記符,33種功能,51種操作,111條指令(指令助記符與操作數(shù)的各種尋址方式的結(jié)合)。 MCS-51單片機(jī)指令系統(tǒng)按其功能可分為五類: 數(shù)據(jù)傳送類指令 算術(shù)運算類指令 邏輯運算和移位類指令 控制轉(zhuǎn)移類指令 位操作類指令學(xué)習(xí)指令系統(tǒng)時,應(yīng)注意: (1)指令的格式、功能; (2)操作碼的含義,操作數(shù)的表示方法; (3)尋址方式,源、目的操作數(shù)的范圍; (4)對標(biāo)志位的影響; (5)指令的適用范圍; (6)正確估算指令的字節(jié)數(shù)。操作碼1字節(jié)。操作數(shù)中:直接地址derict1字節(jié),#data1字節(jié),#data16兩字節(jié);A、B、R0R7、

22、 C、 Ri、DPTR、 A+ DPTR、 A+ PC等均隱含在操作碼中。特殊功能寄存器SFR一個字節(jié)。2.3 MCS-51單片機(jī)的指令系統(tǒng)2.3.1 數(shù)據(jù)傳送類指令(29條)2.3.2 算術(shù)運算類指令(24條)2.3.3 邏輯運算及移位類指令(24條)2.3.4 控制轉(zhuǎn)移類指令(17條)2.3.5 位操作(布爾操作)類指令(17條)2.3.1 數(shù)據(jù)傳送指令 最基本、最主要的操作指令。29條,可分為五類:內(nèi)部RAM間傳送: (MOV16條)外部RAM與累加器間傳送:(MOVX4條)ROM向累加器傳送:(MOVC2條)數(shù)據(jù)交換:( SWAP, XCH,XCHD5條)堆棧操作: (PUSH,POP

23、2條)尋址范圍:累加器A、片內(nèi)RAM、SFR、片外RAM、ROM。功能:(目的地址)(源地址),表示為: 源地址單元的內(nèi)容不變。對標(biāo)志位的影響:除以累加器A為目的操作數(shù)的數(shù)據(jù)傳送指令對P標(biāo)志位有影響外,其余均不影響標(biāo)志位。1內(nèi)部RAM數(shù)據(jù)傳送指令(16條)格式: MOV , 范圍:片內(nèi)RAM、SFR中。指令形式:按目的操作數(shù)可將內(nèi)部數(shù)據(jù)傳送指令分為五類。(1)以累加器A為目的操作數(shù)(4條) MOV A , 其中: 包括Rn、Ri、direct、#data。影響P標(biāo)志。 如:MOV A,30H (A)(30H) (2)以工作寄存器Rn為目的操作數(shù)(3條) MOV Rn , 其中: 包括A、dir

24、ect、#data 。 如:MOV R7,#30H (R7) #30H(3)以直接地址單元為目的操作數(shù)(5條) MOV direct , 其中: 包括A、Rn、Ri、direct 、#data 。 如: MOV 30H, 20H; (30H) (20H)(4)以間址寄存器Ri為目的操作數(shù)(3條) MOV Ri , 其中: 包括A、direct 、#data 。 如: MOV R1,A ;(R1) (A)(5)16位數(shù)據(jù)傳送指令(1條) MOV DPTR , #data16 如: MOV DPTR,#1000H; (DPTR ) #1000H 注意:(2)、(3)、(4)、(5)均不影響標(biāo)志位。

25、 內(nèi)部數(shù)據(jù)傳送指令的傳送關(guān)系圖MCS-51允許在兩個內(nèi)部RAM的直接地址之間進(jìn)行傳送數(shù)據(jù),不允許在兩個工作寄存器之間直接進(jìn)行傳送數(shù)據(jù)。2外部RAM數(shù)據(jù)傳送指令(4條) 特點:只能通過A,采用寄存器間址(R0, R1和DPTR)。指令格式: MOVX A , MOVX , A 其中: 、 包括DPTR、Ri (R0, R1) 。 Ri片外RAM的低256個單元;DPTR片外RAM。對標(biāo)志位的影響: MOVX A , 只影響P標(biāo)志; MOVX , A不影響標(biāo)志位。 如: MOVX A , R1 ;(A) (R1) MOVX DPTR,A ;(DPTR) (A)3程序存儲器(ROM)數(shù)據(jù)傳送指令(查

26、表指令)(2條) 特點:單向傳送,只能讀到累加器A中。專用于查表。指令格式:MOVC A , A+DPTP ;(A)(A)+(DPTR) MOVC A , A+PC ;(PC)(PC)+1 (A)(A)+(PC) 兩條指令的異同:功能相同,使用中存在著差異。 (1)查表的位置要求不同A+DPTR(遠(yuǎn)程查表):表可放在64KB ROM的任何地址,使用方便。A+PC (近程查表):表只能放在ROM中查表指令后的256B的地址空間中。(2)偏移量的計算方法不同 查表地址: A+DPTP(遠(yuǎn)程查表):(A)+(DPTR) 。 A+PC (近程查表):(A)+(PC)+1 偏移量的計算方法: A+DPT

27、P(遠(yuǎn)程查表):A為欲查數(shù)距離表首地址的值。 A+PC (近程查表):A的值必須預(yù)先設(shè)置為: A表首地址當(dāng)前指令的PC值1 這兩條指令到程序設(shè)計時再詳細(xì)講解。 4數(shù)據(jù)交換指令(5條)功能:保存目的操作數(shù)。分兩類:(1)半字節(jié)數(shù)據(jù)交換指令(2條) 指令格式: SWAP A ;(A)30(A)74 XCHD A , Ri ;(A)30(Ri)30 (2)字節(jié)交換指令(3條) 指令格式:XCH A , 其中: 包括Rn、Ri、direct 。5堆棧操作指令(2條)指令格式: PUSH direct ; SP(SP)+1 , (SP)(direct) POP direct ;(direct)(SP)

28、, SP(SP)1特點:特殊的數(shù)據(jù)傳送指令,根據(jù)SP中的棧頂?shù)刂愤M(jìn)行操作。實質(zhì):以棧指針SP為間址寄存器的間址尋址方式。注意:堆棧區(qū)應(yīng)避開使用的工作寄存器區(qū)和其他需要使用的數(shù)據(jù)區(qū),系統(tǒng)復(fù)位后,SP的初始值為07H。一般初始化時要重新設(shè)置SP。 堆棧區(qū)如:已知:(40H)=0F0H; (41H)=11H ; (SP)60H執(zhí)行下面程序 PUSH 40H PUSH 41H POP 42H POP 43H 堆棧指令工作過程 SPSPSPF0H11H數(shù)據(jù)區(qū)43H42H41H40HF0H11H11HF0H如:設(shè)(A)=7BH; (35H)=11H 已知(SP)60H執(zhí)行下面程序,則: PUSH ACC

29、PUSH 35H POP ACC POP 5AH ; (61H) #7BH; (62H) (35H) 即:(62H) #11H; (A) (62H) 即:(A) #11H; (5AH) (61H) 即:(5AH) #7BH這是字節(jié)交換的一種方式。2.3.2 算術(shù)運算指令 (24條)操作數(shù):目的操作數(shù)A中;源操作數(shù)在Rn、片內(nèi)RAM(direct,Ri)中,或#data。 算術(shù)運算指令可分為:加法運算: (ADD4條)帶進(jìn)位加法運算: (ADDC4條)帶借位減法運算: (SUBB4條)加1/減1操作: (INC,DEC9條)單字節(jié)乘/除法運算: (MUL,DIV2條)十進(jìn)制調(diào)整: (DA A1條

30、)1.加法指令(4條)指令格式: ADD A , ; (A)(A)+ 包括Rn、Ri、direct、#data。對標(biāo)志位的影響:影響PSW中的所有標(biāo)志位。 2. 帶進(jìn)位的加法指令(4條)指令格式: ADDC A , ; (A)(A)+ + (Cy) 包括Rn、Ri、direct、#data。對標(biāo)志位的影響:影響PSW中的所有標(biāo)志位。 3. 帶借位的減法指令(4條) 指令格式: SUBB A , ; (A)(A) (Cy) 包括Rn、Ri、direct、#data。對標(biāo)志位的影響:影響PSW中的所有標(biāo)志位。 注意:MCS-51指令系統(tǒng)中無不帶借位的減法指令, 不帶借位的減法: CLR C( Cy

31、=0)SUBB。 4. 十進(jìn)制調(diào)整指令(BCD碼修正指令)(1條) 功能:跟在ADD、ADDC后面,對運算結(jié)果進(jìn)行壓縮BCD碼修正,完成十進(jìn)制加法運算功能。指令格式:DA A 特點:專用指令。兩個壓縮的BCD碼按二進(jìn)制數(shù)相加后必須經(jīng)本指令調(diào)整才能得到壓縮的BCD碼的和。操作數(shù):源操作數(shù)只能在累加器A中,結(jié)果存入A中。注意:只適用加法,不能對減法指令進(jìn)行修正。 5. 加1指令(增量指令)(5條) 功能:操作數(shù)所指定的單元的內(nèi)容加1 。指令格式:INC ; + 1 包括 A、Rn、direct、Ri、 DPTR 操作數(shù):只有一個操作數(shù),即是源操作數(shù)又是目的操作數(shù)。對標(biāo)志位的影響:除對累加器A操作影

32、響P標(biāo)志位外,其余均不影響PSW的各標(biāo)志位。 6. 減1指令(減量指令)(4條) 功能:操作數(shù)所指定的單元的內(nèi)容減1 。指令格式:DEC ; 1 包括 A、Rn、direct、Ri。(DPTR無減1)操作數(shù):只有一個操作數(shù)。對標(biāo)志位的影響:同加1指令。7. 乘除指令(2條) 功能:實現(xiàn)乘法或除法操作。特點:在指令系統(tǒng)中執(zhí)行時間最長,均為四周期指令。指令格式: MUL AB ;(B)(A)(A)(B) DIV AB ; (A)(A)/(B)(B)對標(biāo)志位的影響:影響PSW中的Cy, OV, P標(biāo)志位, 注意乘除運算后結(jié)果保存的位置!2.3.3 邏輯運算和移位指令 ( 24條)對標(biāo)志位的影響:除了

33、兩條帶進(jìn)位的循環(huán)移位指令外,其余均不影響PSW中的各標(biāo)志位;目的操作數(shù)是A時影響P標(biāo)志位。分類:5種,24條。 邏輯與運算:(ANL6條) 邏輯或運算:(ORL6條) 邏輯異或運算:(XRL6條) 累加器清零/取反:(CLR,CPL2條) 累加器移位操作: (RL,RLC,RR,RRC4條)功能:邏輯運算,模擬各種數(shù)字邏輯電路的功能,進(jìn)行邏輯電路的設(shè)計。1邏輯與運算指令(6條) 功能:實現(xiàn)兩個操作數(shù)的邏輯與。指令格式:ANL A , ; 包括Rn、Ri、direct、#data ANL direct , ; 包括A、#data適用場合:邏輯與,用于操作數(shù)的某些位不變(這些位與“1”),某些位置

34、0(這些位與“0”)。2邏輯或運算指令(6條)功能:實現(xiàn)兩個操作數(shù)的邏輯或。指令格式:ORL A , ; 包括Rn、Ri、direct、#data ORL direct , ; 包括A、#data適用場合:邏輯或,用于操作數(shù)的某些位不變(這些位或“0”),某些位置1(這些位或“1”)。3邏輯異或運算指令(6條) 功能:兩個操作數(shù)的邏輯異或。指令格式:XRL A , ; 包括Rn、Ri、direct、#data XRL direct , ; 包括A、#data適用場合:邏輯異或,用于操作數(shù)的某些位不變(這些位異或“0”),某些位取反(這些位異或“1”)。4循環(huán)移位指令(4條) 不帶進(jìn)位的循環(huán)左、

35、右移位(操作碼為RL, RR) 帶進(jìn)位的循環(huán)左、右移位(操作碼為RLC, RRC)特點:只能對累加器A進(jìn)行循環(huán)移位。指令格式: 操作碼 A功能:A中的數(shù)據(jù)逐位左移1位乘2,逐位右移1位除以2。5累加器清0與取反指令(2條) 指令格式:CLR A ;(A)00H CPL A ;(A)( )特點:節(jié)省存儲空間,提高程序執(zhí)行效率。 對標(biāo)志位的影響:CLR 只影響P標(biāo)志位,CPL 不影響標(biāo)志位。 循環(huán)移位指令示意圖2.3.4 控制轉(zhuǎn)移指令 (17條)功能:改變PC中的內(nèi)容,控制程序執(zhí)行的流向,實現(xiàn)程序分支轉(zhuǎn)向。分類:4種,17條。 無條件轉(zhuǎn)移:(LJMP,AJMP,SJMP,JMP4條) 條件轉(zhuǎn)移(判

36、斷跳轉(zhuǎn)):(JZ,JNZ,CJNE,DJNZ8條) 子程序調(diào)用及返回:(LCALL,ACALL,RET,RETI4條) 空操作: (NOP1條) “耗時”一個機(jī)器周期。 對標(biāo)志位的影響:除了CJNE影響Cy外,其余均不影響標(biāo)志位。 1無條件轉(zhuǎn)移指令(4條) 定義:不規(guī)定條件的程序轉(zhuǎn)移。 指令格式: 長轉(zhuǎn)移指令: LJMP addr16 ;(PC)addr150 絕對轉(zhuǎn)移指令: AJMP addr11 ;(PC)(PC)+2, PC100 addr11 相對(短)轉(zhuǎn)移指令:SJMP rel ;(PC)(PC)+2+rel 間接(散)轉(zhuǎn)移指令:JMP A+DPTR ;(PC) (DPTR)+(A)

37、注意:(1)指令中的地址或偏移量均可采用標(biāo)號,只有在執(zhí)行前才被匯編成實際的二進(jìn)制地址。(2)指令的轉(zhuǎn)移范圍: 在執(zhí)行當(dāng)前轉(zhuǎn)移指令后的PC值的基礎(chǔ)上: LJMP: 64KB AJMP :2KB SJMP : 128+127(用補(bǔ)碼表示) JMP : 64KB(3)SJMP rel 中地址偏移量rel的計算方法: rel = 轉(zhuǎn)移目標(biāo)地址轉(zhuǎn)移指令地址(當(dāng)前PC值) 2(4)原地踏步(暫停當(dāng)前的程序)的實現(xiàn) SJMP $ 或 LP: SJMP LP (5)JMP A+DPTR 功能:實現(xiàn)程序的分支轉(zhuǎn)移(散轉(zhuǎn)), DPTR為轉(zhuǎn)移目的的起始地址,A為轉(zhuǎn)移目的的偏移量。(6)在編程中,經(jīng)常使用短轉(zhuǎn)移指令S

38、JMP和相對轉(zhuǎn)移指令A(yù)JMP,以便生成浮動代碼,并不經(jīng)常使用長轉(zhuǎn)移指令LJMP。 2條件轉(zhuǎn)移指令(2條) 功能:實質(zhì)上是A判零指令。在規(guī)定的條件滿足時進(jìn)行程序轉(zhuǎn)移,否則程序往下順序執(zhí)行。指令格式: JZ rel ; 若(A)=0,則轉(zhuǎn)移 (PC) (PC)+2+rel 若(A)0,則順序執(zhí)行(PC) (PC) +2 JNZ rel ; 若(A)0 ,則轉(zhuǎn)移 (PC) (PC)+2+rel 若(A) =0 ,則順序執(zhí)行(PC) (PC) +2 指令的轉(zhuǎn)移范圍:rel的取值范圍為128+127(用補(bǔ)碼表示)。 可以采用符號地址表示。偏移量rel的計算方法: rel = 轉(zhuǎn)移目標(biāo)地址轉(zhuǎn)移指令地址(當(dāng)

39、前PC值) 23比較轉(zhuǎn)移指令(4條) 指令格式: CJNE 目的操作數(shù),源操作數(shù),rel操作數(shù):目的操作數(shù)為A時,源操作數(shù)為#data、direct。 目的操作數(shù)為Rn、Ri時,源操作數(shù)為#data; 即:CJNE A, direct, rel CJNE A, #data, rel CJNE Rn, #data, rel CJNE Ri, #data, rel(源為#data時,目的為 A 、 Rn 、 Ri;源為 direct ,目的為A。)用途:比較兩個操作數(shù)作為條件控制程序的轉(zhuǎn)移 。若(目的操作數(shù))=(源操作數(shù)),則程序繼續(xù)執(zhí)行,(PC)(PC) +3 若(目的操作數(shù))(源操作數(shù)),則程

40、序轉(zhuǎn)移,(PC)(PC) + rel +3,Cy0 若(目的操作數(shù))(源操作數(shù)),則程序轉(zhuǎn)移,(PC)(PC) + rel +3,Cy1功能:比較兩個操作數(shù)的大小。 對標(biāo)志位影響:影響Cy標(biāo)志位,不影響其他標(biāo)志位。指令的轉(zhuǎn)移范圍:rel的取值范圍128+127(用補(bǔ)碼表示)。 可以采用符號地址表示。注意:比較是通過不存最后的差值結(jié)果的減法實現(xiàn)的,影響Cy標(biāo)志位,指令執(zhí)行后兩個操作數(shù)的內(nèi)容不變。 4循環(huán)(減1條件)轉(zhuǎn)移指令(2條) 功能:減1判非0則轉(zhuǎn)移。主要用于控制循環(huán)程序的循環(huán)次數(shù)。特點:減1與條件轉(zhuǎn)移兩種功能結(jié)合在一起。指令格式: DJNZ , rel ; 1 若0,則轉(zhuǎn)移 (PC) (P

41、C)+2+rel 若0,則不轉(zhuǎn)移 (PC) (PC) +2 其中: 為Rn、direct條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令、循環(huán)(減1條件)轉(zhuǎn)移指令均為相對轉(zhuǎn)移指令,指令的轉(zhuǎn)移范圍有限128+127。若要實現(xiàn)64KB范圍內(nèi)的轉(zhuǎn)移,可借助于LJMP的過渡來實現(xiàn)。5子程序調(diào)用與返回指令(4條) 定義:具有完整功能的程序段定義為子程序。 功能: 供主程序在需要時調(diào)用。特點:子程序可以在程序中反復(fù)多次使用,以簡化源程序的書寫;可以嵌套,有利于模塊化程序設(shè)計。主程序調(diào)用子程序,必須有: 子程序調(diào)用指令:在主程序中使用; 子程序返回指令:子程序的最后一條指令。 調(diào)用與返回指令是成對使用的。子程序調(diào)用指令自動實現(xiàn):

42、PC中的斷點地址堆棧, 子程序入口地址PC。子程序返回指令自動實現(xiàn):堆棧中的斷點地址PC。注意:子程序調(diào)用時應(yīng)注意入口參數(shù)設(shè)置,子程序返回時應(yīng)注意出口參數(shù)的傳遞。主程序調(diào)用子程序兩級子程序嵌套指令格式:(1)絕對短調(diào)用指令 ACALL addr11 ; (PC) (PC) +2, (SP) (SP) +1,(SP)(PC)70 (SP) (SP) +1, (SP) (PC) 158, (PC) 100addr11 其中: addr11為11位地址,實際編程時可以用符號地址,只能在2KB范圍以內(nèi)調(diào)用子程序 。(2)絕對長調(diào)用指令 LCALL addr16 ; (PC) (PC) +3, (SP)

43、 (SP) +1,(SP)(PC)70 (SP) (SP) +1, (SP) (PC) 158, (PC) 150addr16 其中: addr16為16位地址,實際編程時可以用符號地址??梢栽?4KB范圍以內(nèi)調(diào)用子程序 。(3)子程序返回指令 RET ; (PC) 158(SP), (SP) (SP) 1, (PC) 70 (SP) , (SP) (SP) 1(4)中斷返回指令 RETI ; (PC) 158(SP), (SP) (SP) 1, (PC) 70 (SP) , (SP) (SP) 1注:中斷服務(wù)程序是一種特殊的子程序,它是在計算機(jī)響應(yīng)中斷時,由硬件完成調(diào)用而進(jìn)入相應(yīng)的中斷服務(wù)程

44、序。RETI與RET:指令相仿,都是子程序執(zhí)行的最后一條指令。區(qū)別在于RET是從子程序返回,RETI 是從中斷服務(wù)程序返回。6空操作指令NOP (1條)指令格式: NOP ; (PC) (PC) +1功能:不執(zhí)行任何操作,消耗了一個機(jī)器周期。適用場合:常用于軟件延時或在程序可靠性設(shè)計中用來穩(wěn)定程序。特點:NOP占據(jù)一個單元的存儲空間,除了使PC的內(nèi)容加1外,CPU不產(chǎn)生任何操作結(jié)果,只是消耗了一個機(jī)器周期。2.3.5 位操作指令 位操作(布爾變量操作):操作數(shù)不是字節(jié),而是字節(jié)中的某個位。每位的取值只能取0或1。尋址范圍:片內(nèi)RAM位尋址區(qū)20H2FH,SFR中的可尋址位。 特點:以進(jìn)位標(biāo)志C

45、y作為位累加器,可以實現(xiàn)布爾變量的傳送、運算和控制轉(zhuǎn)移等功能。 分類:以位為單位進(jìn)行邏輯運算及操作,可分為4種:位傳送:(MOV2條)位清零/置位:(CLR,SETB4條)位邏輯與/或/非運算:(ANL,ORL,CPL6條)位條件轉(zhuǎn)移: (JC,JNC,JB,JNB,JBC5條)指令中的位地址的表達(dá)方式:直接地址方式(如0AFH)、字節(jié)地址.位序號(如0D0H.0)、位名稱方式(如F0) 、特殊功能寄存器名.位序號(如PSW.3)等幾種方式。 1. 位數(shù)據(jù)傳送指令(2條)特點:在可尋址位與位累加器Cy之間進(jìn)行的。不能在兩個可尋址位間直接進(jìn)行傳送。 指令格式:MOV C, bit ;(Cy)(b

46、it) MOV bit, C ;(bit) (Cy)2. 位邏輯操作指令(6條) 指令格式:操作碼 C , ;操作碼包括ANL、ORL , 包括bit、/bit。 CPL ; ;CPL表示取反, 包括Cy、 bit。功能:位邏輯操作,組合邏輯電路模擬。采用位操作指令進(jìn)行組合邏輯電路的設(shè)計比采用字節(jié)型邏輯指令節(jié)約存儲空間,運算操作十分方便。 3. 位狀態(tài)(置位、清0)控制指令(4條) 指令格式:CLR ; 0 SETB ; 1 ; 包括Cy、 bit。4. 位條件(控制)轉(zhuǎn)移指令(5條) 特點:以位的狀態(tài)作為實現(xiàn)程序轉(zhuǎn)移的判斷條件。指令格式:(1)以進(jìn)位標(biāo)志位Cy內(nèi)容為條件的轉(zhuǎn)移指令 JC re

47、l ; 若(Cy )=1,則轉(zhuǎn)移(PC)(PC)+2+rel , 否則順序執(zhí)行 JNC rel ; 若(Cy )=0,則轉(zhuǎn)移(PC)(PC)+2+rel , 否則順序執(zhí)行(2)以位地址bit內(nèi)容為條件的轉(zhuǎn)移指令 JB bit, rel ; 若(bit)=1,則轉(zhuǎn)移(PC) (PC)+3+rel,否則順序執(zhí)行 JNB bit, rel ; 若(bit)=0,則轉(zhuǎn)移(PC) (PC)+3+rel,否則順序執(zhí)行 JBC bit, rel ; 若(bit)=1,則轉(zhuǎn)移(PC) (PC)+3+rel,且(bit )0, 否則順序執(zhí)行 2.4 匯編語言及程序設(shè)計 程序設(shè)計:編制計算機(jī)的程序。應(yīng)用計算機(jī)所能

48、識別的、接受的語言把要解決的問題的步驟有序地描述出來。 程序設(shè)計語言的種類:(1)機(jī)器語言:用二進(jìn)制代碼表示的計算機(jī)惟一能識別和執(zhí)行的最原始的程序設(shè)計語言。 (2)匯編語言:利用指令助記符描述的程序設(shè)計語言。(3)高級語言:用接近于人的自然語言描述的程序設(shè)計語言,是面向過程而獨立于機(jī)器的通用語言。匯編語言的指令類型:(1)基本指令:即指令系統(tǒng)中的指令??蓤?zhí)行指令,每一條指令都有對應(yīng)的機(jī)器碼。(2)偽指令:匯編時用于控制匯編的指令。非執(zhí)行指令,無指令機(jī)器碼。匯編語言的語句格式: 標(biāo)號: 操作碼 操作數(shù) ,操作數(shù) ;注釋數(shù)據(jù)的表示方法:(1)二進(jìn)制數(shù):由0、1組成,“逢2進(jìn)1”的數(shù)制。(0 1,后

49、綴B) (2)十六進(jìn)制數(shù):便于讀寫記憶的二進(jìn)制數(shù)的簡寫形式。(09,AF,后綴:H)(3)十進(jìn)制數(shù):可用二進(jìn)制數(shù)表示(也稱為BCD碼, 09表示為: 00001001B ),也可用十進(jìn)制數(shù)表示(后綴D或無后綴)。2.4 匯編語言及程序設(shè)計2.4.1 匯編語言程序設(shè)計的步驟2.4.2 順序程序設(shè)計2.4.3 分支程序設(shè)計2.4.4 循環(huán)程序設(shè)計2.4.5 查表程序設(shè)計2.4.6 子程序設(shè)計2.4.1 匯編語言程序設(shè)計的步驟 匯編語言程序設(shè)計:根據(jù)任務(wù)要求,采用匯編語言編制程序的過程。匯編語言程序設(shè)計的步驟: (1)擬訂設(shè)計任務(wù)書 (2)建立數(shù)學(xué)模型 (3)確定算法 (4)分配內(nèi)存單元,編制程序流

50、程圖 (5)編制源程序:合理分配存儲器單元、I/O接口地址;明確各程序之間的相互關(guān)系;編寫注釋。 (6)上機(jī)調(diào)試 (7)程序優(yōu)化 編制程序流程圖:用各種圖形、符號、指向線等來說明程序設(shè)計的過程。編制程序流程圖通用的圖形符號2.4.2 順序程序設(shè)計 特點:最簡單、最基本的程序設(shè)計。順序執(zhí)行每一條指令??蔀閺?fù)雜程序的子程序。例題1 將片內(nèi)RAM 30H單元中的兩位壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)送到片內(nèi)RAM 40H單元中。解:兩位壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)的算法為: (a1a 0)BCD=10a1a0 程序設(shè)計過程2.4.3 分支程序設(shè)計特點:根據(jù)條件,確定程序的走向。采用指令:條件轉(zhuǎn)移指令、比較轉(zhuǎn)移

51、指令和位轉(zhuǎn)移指令。分支程序的設(shè)計要點如下: (1)建立可供轉(zhuǎn)移指令測試的條件; (2)選用合適的轉(zhuǎn)移指令; (3)在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號。解:此題有三個條件,所以有三個分支程序。這是一個三分支歸一的條件轉(zhuǎn)移問題。 X是有符號數(shù),判斷符號位是0還是1可利用JB或JNB指令。判斷X是否等于0則直接可以使用累加器A的判0指令。例題2 求符號函數(shù)的值。已知片內(nèi)RAM的 40H單元內(nèi)有一自變量X,編制程序按如下條件求函數(shù)Y的值,并將其存入片內(nèi)RAM 的41H單元中。 1 X0Y= 0 X=0 -1X255,單重循環(huán)程序無法實現(xiàn),采用雙重循環(huán)。 程序設(shè)計過程延時時間為:( 2123 1 21)2002

52、1=50.003ms 3設(shè)計循環(huán)程序時應(yīng)注意的問題(1)有始有終,循環(huán)執(zhí)行的條件,避免從循環(huán)體外直接轉(zhuǎn)到循環(huán)體內(nèi)部。(2)多重循環(huán)程序從外向內(nèi)進(jìn)入,結(jié)束時由內(nèi)向外退出。只允許外循環(huán)嵌套內(nèi)循環(huán)。不允許循環(huán)相互交叉及從循環(huán)程序的外部跳入內(nèi)部。(3)確定程序結(jié)構(gòu),處理好邏輯關(guān)系。第一次執(zhí)行情況畫出重復(fù)執(zhí)行的程序框圖循環(huán)初值循環(huán)控制。(4)優(yōu)化循環(huán)體,改進(jìn)算法、優(yōu)選指令,縮短程序執(zhí)行時間。 4排序程序設(shè)計(冒泡法) 例題6 設(shè)MCS-51單片機(jī)內(nèi)部RAM起始地址為30H的數(shù)據(jù)塊中共存有64個無符號數(shù),編制程序使它們按從小到大的順序排列。解:設(shè)64個無符號數(shù)在數(shù)據(jù)塊中的順序為:e64, e63, e2,

53、 e1,排序方法很多,現(xiàn)以經(jīng)典的冒泡法為例進(jìn)行介紹。冒泡法(兩兩比較法): e64和e63比較e64e63交換,否則不交換e63和e62比較,是否交換一直比較N01=63次e1位置為數(shù)據(jù)塊中最大值。 一個氣泡從水底冒出來冒泡法 第二次冒泡過程同第一次,冒泡后在e2位置為數(shù)據(jù)塊中的次大數(shù)。e1中為最大數(shù),不需要再比較,比較次數(shù)N2=N11=62。 如此冒泡共N=N01=63次,實現(xiàn)64個數(shù)的排序。循環(huán)次數(shù):冒泡次數(shù)N=N01=63次外循環(huán) 每次冒泡時循環(huán)次數(shù)N(i) =N(i-1)1 內(nèi)循環(huán)優(yōu)化方法:設(shè)置“交換標(biāo)志”,控制是否再需要冒泡。 剛進(jìn)行完的冒泡中發(fā)生過數(shù)據(jù)交換繼續(xù)冒泡。 剛進(jìn)行完的冒泡

54、中未發(fā)生過數(shù)據(jù)交換停止冒泡。例如:對于一個已經(jīng)排好序的數(shù)組:1, 2, 3, 63, 64,排序程序根據(jù)“交換標(biāo)志”的狀態(tài)只要進(jìn)行一次循環(huán),結(jié)束排序程序的再執(zhí)行。第一次冒泡排序過程第二次冒泡排序過程程序設(shè)計過程2.4.5 查表程序設(shè)計 查表:根據(jù)給定查找存放在ROM中數(shù)據(jù)表中與其對應(yīng)的值。 適用場合:數(shù)碼顯示、打印字符轉(zhuǎn)換、數(shù)據(jù)轉(zhuǎn)換、函數(shù)求值、非線性傳感器輸出等。 1. 采用MOVC A, A+DPTR指令查表程序的設(shè)計方法(1)自變量X,函數(shù)值Y,計算Y;在ROM中建立函數(shù)表(自變量為X)。(2)在ROM中建立函數(shù)表TABLE ,將Y按順序存放在起始(基)地址為TABLE的ROM中,X A

55、。(3)表首地址TABLE DPTR,執(zhí)行查表指令查表 Y A。 2. 采用MOVC A, A+PC指令查表程序的設(shè)計方法 與MOVC A, A+DPTR指令的 (1)、(2)相同。(3)X A,執(zhí)行ADD A, #data指令修正A。data=函數(shù)表首地址PC1(4)執(zhí)行查表指令查表 Y A。例題7利用查表的方法編寫Y=X2(X=0, 1, 2, 9)的程序。解:設(shè)變量X的值存放在內(nèi)部RAM的30H單元中,求得的Y的值存放在內(nèi)存31H單元中。平方表存放在首地址為TABLE的ROM中。MOVC A, A+DPTR指令查表工作過程MOVC A, A+PC指令查表工作過程2000H2019H201

56、9H2019H2019H2019H2019H2.4.6 子程序設(shè)計子程序:能夠完成確定任務(wù),并能為其他程序反復(fù)調(diào)用的程序段。特點:可以多次重復(fù)使用,縮短整個程序,節(jié)省程序存儲空間,簡化程序的邏輯結(jié)構(gòu),便于程序調(diào)試。 主程序(調(diào)用程序):調(diào)用子程序的程序。 1子程序的調(diào)用與返回主程序調(diào)用子程序的過程:執(zhí)行調(diào)用指令(LCALL或ACALL)子程序 執(zhí)行到子程序最后一條指令RET 返回到主程序斷點處繼續(xù)。 (1)子程序的調(diào)用子程序的入口地址:子程序的第一條指令地址。常用標(biāo)號表示。程序的調(diào)用過程:執(zhí)行LCALL指令當(dāng)前的PC值入堆棧(先低后高)子程序的入口地址送入PC 轉(zhuǎn)去執(zhí)行子程序。(2)子程序的返

57、回主程序的斷點地址:子程序執(zhí)行完畢后,返回主程序的地址。調(diào)用指令下一條指令的地址。子程序的返回過程:子程序執(zhí)行RET指令從堆棧中彈出斷點給PC (先高后低) 回到主程序斷點處繼續(xù)執(zhí)行。2保存與恢復(fù)寄存器內(nèi)容(1)保護(hù)現(xiàn)場:主程序轉(zhuǎn)入子程序后,保護(hù)主程序的信息不會在運行子程序時丟失的過程。(2)恢復(fù)現(xiàn)場:從子程序返回時,將保存在堆棧中的主程序的信息還原的過程。(3)實現(xiàn):用戶通過堆棧完成?;謴?fù)現(xiàn)場在從子程序返回之前,保護(hù)現(xiàn)場是在在進(jìn)入子程序時。如: PUSH PSW PUSH ACC ;保護(hù)現(xiàn)場 POP ACC POP PSW ;恢復(fù)現(xiàn)場 RET3子程序的參數(shù)傳遞參數(shù)傳遞:主程序在調(diào)用子程序時傳

58、送給子程序的參數(shù),子程序結(jié)束后送回主程序的參數(shù)。入口參數(shù):子程序需要的原始參數(shù)。主程序在調(diào)用子程序前將將入口參數(shù)送到約定的存儲器單元。出口參數(shù):子程序根據(jù)入口參數(shù)執(zhí)行程序后獲得的結(jié)果參數(shù)。子程序在結(jié)束前將出口參數(shù)送到約定的存儲器單元。傳送子程序參數(shù)的方法: Rn/A。程序簡單、速度較快, Rn/A有限; 指針寄存器。節(jié)省傳遞的工作量,可變長度; 堆棧。簡單,傳遞的數(shù)據(jù)量大,不必分配存儲單元。 位地址。4子程序的嵌套 在子程序中若再調(diào)用子程序。MCS-51單片機(jī)允許多重嵌套。5編寫子程序時應(yīng)注意的問題 子程序的入口地址用標(biāo)號表示,標(biāo)號習(xí)慣上以子程序的任務(wù)命名。 主程序通過調(diào)用指令調(diào)用子程序,子程

59、序返回主程序之前,必須有返回指令RET。 用戶只需保護(hù)和恢復(fù)現(xiàn)場,保護(hù)和恢復(fù)主程序的斷點地址是由單片機(jī)自動完成。 子程序內(nèi)部必須使用相對轉(zhuǎn)移指令,以便匯編時生成浮動代碼。 子程序的參數(shù)傳遞方法同樣適用于中斷服務(wù)程序。 例題9 編制程序?qū)崿F(xiàn)c=a2+b2,(a, b均為1位十進(jìn)制數(shù))。解:計算某數(shù)的平方采用查表的方法,編寫成子程序。只要兩次調(diào)用子程序,并求和即得運算結(jié)果。 設(shè)a, b分別存放于片內(nèi)RAM的30H, 31H兩個單元中,結(jié)果c存放于片內(nèi)RAM的40H單元。程序設(shè)計過程2.5 程序設(shè)計舉例2.5.1 多字節(jié)算術(shù)運算程序例題10 編制程序?qū)崿F(xiàn)兩位16進(jìn)制數(shù)乘法運算: (R7R6)16(R5R4)16(R3R2R1R0)16解: MCS-51乘法指令8位; 16位乘法分解成8位乘法; 方法:先乘后加和邊乘邊加。現(xiàn)以邊乘邊加為例設(shè)計。程序程序流程圖程序設(shè)

溫馨提示

  • 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

提交評論