語言程序設(shè)計基礎(chǔ)_第1頁
語言程序設(shè)計基礎(chǔ)_第2頁
語言程序設(shè)計基礎(chǔ)_第3頁
語言程序設(shè)計基礎(chǔ)_第4頁
語言程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第7 7章章 MCS-51MCS-51匯編語言程序設(shè)計基礎(chǔ)匯編語言程序設(shè)計基礎(chǔ)7.1 匯編語言程序設(shè)計概述7.2 匯編語言程序的基本結(jié)構(gòu)形式第7章 MCS-51匯編語言程序設(shè)計基礎(chǔ)7.2 7.2 匯編語言程序的基本結(jié)構(gòu)形式匯編語言程序的基本結(jié)構(gòu)形式 2 7.1 7.1 匯編語言程序設(shè)計概述匯編語言程序設(shè)計概述1ContentsClick to add title in here Click to add title in here Click to add title in here Click to add title in here 4123ThemeGallery is a Desig

2、n Digital Content & Contents mall developed by Guild Design Inc.7.1 7.1 匯編語言程序設(shè)計概述匯編語言程序設(shè)計概述 7.1.1 7.1.1 機器語言、匯編語言和高級語言機器語言、匯編語言和高級語言二進制代碼表示的指令、數(shù)字和符號簡稱為二進制代碼表示的指令、數(shù)字和符號簡稱為機器。語言不易懂,難記憶,易出錯。機器。語言不易懂,難記憶,易出錯。英文助記符表示的指令稱為符號語言或英文助記符表示的指令稱為符號語言或匯編語言匯編語言不受具體機器的限制不受具體機器的限制, ,使用了許多數(shù)學(xué)公式使用了許多數(shù)學(xué)公式和數(shù)學(xué)計算上的習(xí)慣用語。和數(shù)

3、學(xué)計算上的習(xí)慣用語。機器語言機器語言匯編語言匯編語言高級語高級語言言匯編語言特點:匯編語言特點:(1) (1) 面向機器的語言,程序設(shè)計員須對面向機器的語言,程序設(shè)計員須對MCS-51MCS-51的硬件有相當(dāng)深的硬件有相當(dāng)深入的了解。入的了解。(2) (2) 助記符指令和機器指令一一對應(yīng),用匯編語言編寫的程序助記符指令和機器指令一一對應(yīng),用匯編語言編寫的程序效率高,占用存儲空間小,運行速度快,用匯編語言能編寫出效率高,占用存儲空間小,運行速度快,用匯編語言能編寫出最優(yōu)化的程序。最優(yōu)化的程序。(3) (3) 能直接管理和控制硬件設(shè)備(功能部件),它能處理中能直接管理和控制硬件設(shè)備(功能部件),它

4、能處理中斷,也能直接訪問存儲器及斷,也能直接訪問存儲器及I/OI/O接口電路。接口電路。 匯編語言和機器語言都脫離不開具體機器的硬件,均是面匯編語言和機器語言都脫離不開具體機器的硬件,均是面向向“機器機器”的語言,缺乏通用性。的語言,缺乏通用性。 高級語言優(yōu)點:通用性強,直觀、易懂、易學(xué),可讀性好??筛呒壵Z言優(yōu)點:通用性強,直觀、易懂、易學(xué),可讀性好???使用使用C C語言(語言(C51C51)、)、PL/MPL/M語言來進行語言來進行MCS-51MCS-51的應(yīng)的應(yīng) 用程序設(shè)計。用程序設(shè)計。 對于程序的空間和時間要求很高的場合,匯編語言仍是必對于程序的空間和時間要求很高的場合,匯編語言仍是必

5、不可缺的。不可缺的。 在很多需要直接控制硬件的應(yīng)用場合,則更是非用匯編語在很多需要直接控制硬件的應(yīng)用場合,則更是非用匯編語言不可。言不可。 可可C C語言和匯編語言混合編程。語言和匯編語言混合編程。7.1.2 7.1.2 匯編語言語句的種類和格式匯編語言語句的種類和格式 兩種基本類型:指令語句和偽指令語句兩種基本類型:指令語句和偽指令語句(1 1)指令語句)指令語句 每一條指令語句在匯編時都產(chǎn)生一個指令代碼每一條指令語句在匯編時都產(chǎn)生一個指令代碼機器代碼機器代碼(2 2)偽指令語句)偽指令語句 是為匯編服務(wù)的。在匯編時沒有機器代碼與之對是為匯編服務(wù)的。在匯編時沒有機器代碼與之對應(yīng)。應(yīng)。 MCS

6、-51MCS-51的匯編語言的的匯編語言的四分段格式四分段格式如下:如下: 標(biāo)號字段標(biāo)號字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段規(guī)則:規(guī)則:(1 1)標(biāo)號字段和操作字碼段之間要有冒號)標(biāo)號字段和操作字碼段之間要有冒號“:”相隔;相隔;(2 2)操作碼字段和操作數(shù)字段間的分界符是空格;)操作碼字段和操作數(shù)字段間的分界符是空格;(3 3)雙操作數(shù)之間用逗號相隔;)雙操作數(shù)之間用逗號相隔; (4 4)操作數(shù)字段和注釋字段之間的分界符用分號)操作數(shù)字段和注釋字段之間的分界符用分號“;”相隔。相隔。 操作碼字段和操作數(shù)字段為必選項,其余各段為任選操作碼字段和操作數(shù)字段為必選項,

7、其余各段為任選 項。項。 例例 下面是一段匯編語言程序的四分段書寫格式下面是一段匯編語言程序的四分段書寫格式 標(biāo)號字段標(biāo)號字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段 STARTSTART: MOV AMOV A,#00H #00H ;0A0A MOV R1 MOV R1,#10 #10 ;10R110R1 MOV R2 MOV R2,#00000011B #00000011B ;3R23R2 LOOP LOOP: ADD AADD A,R2 R2 ;(;(A A)+ +(R2R2)A A DJNZ R1 DJNZ R1,LOOP LOOP ;R1R1內(nèi)容減內(nèi)容減1 1不

8、為零,則循環(huán)不為零,則循環(huán) NOPNOP HERE HERE: SJMP HERESJMP HERE基本語法規(guī)則:基本語法規(guī)則:1 1標(biāo)號字段標(biāo)號字段 是語句所在地址的標(biāo)志符號是語句所在地址的標(biāo)志符號 (1 1)標(biāo)號后邊必須跟以冒號)標(biāo)號后邊必須跟以冒號“:” (2 2)由)由1-81-8個個ASCIIASCII字符組成字符組成(3 3)同一標(biāo)號在一個程序中只能定義一次)同一標(biāo)號在一個程序中只能定義一次 (4 4)不能使用匯編語言已經(jīng)定義的符號作為標(biāo)號)不能使用匯編語言已經(jīng)定義的符號作為標(biāo)號 2 2操作碼字段操作碼字段 匯編程序就是根據(jù)這一字段來生成機器代碼的。匯編程序就是根據(jù)這一字段來生成機

9、器代碼的。3 3操作數(shù)字段操作數(shù)字段 通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號隔開。雙操作數(shù),則操作數(shù)之間,要以逗號隔開。(1 1)十六進制、二進制和十進制形式的操作數(shù)表示采用十六)十六進制、二進制和十進制形式的操作數(shù)表示采用十六進制形式來表示進制形式來表示 ,某些特殊場合才采用二進制或十進制的表,某些特殊場合才采用二進制或十進制的表示形式示形式 。 十六進制,后綴十六進制,后綴“H H” ;二進制,后綴;二進制,后綴“B B” 。 十進制,后綴十進制,后綴“D D”,也可省略。,也可省略。 若十六進制

10、的操作數(shù)以字符若十六進制的操作數(shù)以字符A A- -F F中的某個開頭時,則需在它中的某個開頭時,則需在它前面加一個前面加一個 “0 0”,以便在匯編時把它和字符,以便在匯編時把它和字符A AF F區(qū)別開來。區(qū)別開來。(2 2)工作寄存器和特殊功能寄存器的表示)工作寄存器和特殊功能寄存器的表示 采用工作寄存器和特殊功能寄存器的代號來表示,也可采用工作寄存器和特殊功能寄存器的代號來表示,也可 用其地址來表示。用其地址來表示。 例如,累加器可用例如,累加器可用A A(或(或AccAcc)表示。也可用)表示。也可用0E0H0E0H來表來表 示,示,0E0H0E0H為累加器為累加器A A的地址。的地址。

11、(3 3)美元符號)美元符號$ $的使用的使用 用于表示該轉(zhuǎn)移指令操作碼所在的地址。用于表示該轉(zhuǎn)移指令操作碼所在的地址。 例如,如下指令:例如,如下指令: HEREHERE:SJMP HERESJMP HERE 可寫為:可寫為: SJMP $SJMP $4 4注釋字段注釋字段 必須以分號必須以分號“;”開頭,換行書寫,但必須注意也要以分號開頭,換行書寫,但必須注意也要以分號“;”開頭。開頭。 匯編時,注釋字段不會產(chǎn)生機器代碼。匯編時,注釋字段不會產(chǎn)生機器代碼。7.1.3 7.1.3 偽指令偽指令 在在MCS-51MCS-51匯編語言源程序中應(yīng)有向匯編程序發(fā)出的指示信匯編語言源程序中應(yīng)有向匯編程

12、序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過使用偽指令來實現(xiàn)息,告訴它如何完成匯編工作,這是通過使用偽指令來實現(xiàn)的。的。 也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令。經(jīng)過匯編得到目標(biāo)程序(機器代碼)后,偽指令已無存指令。經(jīng)過匯編得到目標(biāo)程序(機器代碼)后,偽指令已無存在的必要,所以在的必要,所以“偽偽”體現(xiàn)在匯編時,偽指令沒有相應(yīng)的機器體現(xiàn)在匯編時,偽指令沒有相應(yīng)的機器代碼產(chǎn)生。代碼產(chǎn)生。常用的偽指令:常用的偽指令: 1.ORG1.ORG(ORiGinORiGin)匯編起始地址命令)匯編起始地址命令 在匯編語言源程序的開始

13、,通常都用一條在匯編語言源程序的開始,通常都用一條ORGORG偽指令偽指令來實現(xiàn)規(guī)定程序的起始地址。如不用來實現(xiàn)規(guī)定程序的起始地址。如不用ORGORG規(guī)定,則匯規(guī)定,則匯編得到的目標(biāo)程序?qū)木幍玫降哪繕?biāo)程序?qū)?000H0000H開始。開始。 例如例如: ORG 2000HORG 2000H START START:MOV A,#00HMOV A,#00H 規(guī)定標(biāo)號規(guī)定標(biāo)號STARTSTART代表地址為代表地址為2000H2000H開始。開始。 在一個源程序中,可多次使用在一個源程序中,可多次使用ORGORG指令,來規(guī)定不同的指令,來規(guī)定不同的程序段的起始地址。但是,地址必須由小到大排列,程序

14、段的起始地址。但是,地址必須由小到大排列,地址不能交叉、重疊。地址不能交叉、重疊。例如:例如: ORG 2000HORG 2000H ORG 2500H ORG 2500H ORG 3000H ORG 3000H 2. END(END of assembly)2. END(END of assembly)匯編終止命令匯編終止命令 匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序的匯編工作。在整個源程序中只能有一條的匯編工作。在整個源程序中只能有一條ENDEND命令,命令,且位于程序的最后。且位于程序的最后。3 3DBDB(Define ByteDefine By

15、te)定義字節(jié)命令)定義字節(jié)命令 在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。 ORG 2000HORG 2000H DB 30H DB 30H,40H40H,2424,“C”C”,“B”B” 匯編后:匯編后: (2000H2000H)=30H=30H (2001H2001H)=40H=40H (2002H2002H)=18H=18H(1010進制數(shù)進制數(shù)2424) (2003H2003H)=43H=43H(字符(字符“C”C”的的ASCIIASCII碼)碼) (2004H2004H)=42H=42H(字符(字符“B”B”的的ASCIIASCII碼)碼) DBD

16、B功能是從指定單元開始定義(存儲)若干個字功能是從指定單元開始定義(存儲)若干個字節(jié),節(jié),1010進制數(shù)自然轉(zhuǎn)換成進制數(shù)自然轉(zhuǎn)換成1616進制數(shù),字母按進制數(shù),字母按ASCIIASCII碼存儲。碼存儲。4 4DWDW(Define WordDefine Word)定義數(shù)據(jù)字命令)定義數(shù)據(jù)字命令 從指定的地址開始,在程序存儲器的連續(xù)單元中定義從指定的地址開始,在程序存儲器的連續(xù)單元中定義1616位位的數(shù)據(jù)字。的數(shù)據(jù)字。 例如:例如: ORG 2000HORG 2000H DW 1246H DW 1246H,7BH7BH,1010 匯編后:匯編后: (2000H2000H)=12H=12H;第;第

17、1 1個字個字 (2001H2001H)=46H =46H (2002H2002H)=00H=00H;第;第2 2個字個字 (2003H2003H)=7BH=7BH (2004H2004H)=00H=00H;第;第3 3個字(個字(2005H2005H)=0AH=0AH (2005H2005H)=0AH =0AH 5 5EQUEQU(EQUateEQUate)賦值命令)賦值命令 用于給標(biāo)號賦值。賦值以后,其標(biāo)號值在整個程用于給標(biāo)號賦值。賦值以后,其標(biāo)號值在整個程序有效。序有效。 例如:例如: TEST EQU 2000HTEST EQU 2000H 表示標(biāo)號表示標(biāo)號TEST=2000HTEST

18、=2000H,在匯編時,凡是遇到標(biāo)號,在匯編時,凡是遇到標(biāo)號TESTTEST時,均以時,均以2000H2000H來代替。來代替。 程序存儲器六個入口程序存儲器六個入口 ORG 0000HORG 0000H; ; 主程序入口主程序入口 AJMP MAINAJMP MAIN ORG 0003HORG 0003H LJMP INT0LJMP INT0; ; 外中斷外中斷INT0INT0中斷子程序入中斷子程序入 ORG 000BHORG 000BHLJMP T0 LJMP T0 ; ; 定時器定時器T0T0中斷子程序入口中斷子程序入口ORG 0013HORG 0013H LJMP INT1LJMP I

19、NT1; ; 外中斷外中斷INT1INT1中斷子程序入口中斷子程序入口 ORG 001BHORG 001BH LJMP T1LJMP T1; ; 定時器定時器T1T1中斷子程序入口中斷子程序入口 ORG 0023HORG 0023HLJMP SIOLJMP SIO; ; 串行口中斷子程序入口串行口中斷子程序入口 ORG XXXXHORG XXXXHMAINMAIN:; ; 主程序主程序INT0INT0:; ; 外中斷外中斷INT0INT0中斷子程序中斷子程序 T0T0:; ; 定時器定時器T0T0中斷子程序中斷子程序 INT1INT1: ; ; 外中斷外中斷INT1INT1中斷子程序中斷子程序

20、 T1T1: ; ; 定時器定時器T1T1中斷子程序中斷子程序 SIOSIO: ; ; 串行口中斷子程序串行口中斷子程序 7.2 7.2 匯編語言程序的基本結(jié)構(gòu)形式匯編語言程序的基本結(jié)構(gòu)形式查表結(jié)構(gòu)查表結(jié)構(gòu)順序結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)子程序結(jié)構(gòu)7.2.1 7.2.1 順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序設(shè)計 順序結(jié)構(gòu)程序又稱簡單結(jié)構(gòu)程序,是程序設(shè)計順序結(jié)構(gòu)程序又稱簡單結(jié)構(gòu)程序,是程序設(shè)計中最基本的,在整個程序設(shè)計中所占比例極大,是中最基本的,在整個程序設(shè)計中所占比例極大,是程序設(shè)計的基礎(chǔ)。這里所說的簡單結(jié)構(gòu)程序是指一程序設(shè)計的基礎(chǔ)。這里所說的簡單結(jié)構(gòu)程序是指一種無分支的直

21、接程序,是按照邏輯操作順序,從第種無分支的直接程序,是按照邏輯操作順序,從第一條指令開始逐條執(zhí)行一條指令開始逐條執(zhí)行, ,直到最后一條指令為止。直到最后一條指令為止。 例:設(shè)有兩個例:設(shè)有兩個4 4位位BCDBCD碼,分別存放在碼,分別存放在23H23H、22H22H單元和單元和33H33H、 32H32H單元中,求它們的和,并送入單元中,求它們的和,并送入43H43H、42H42H單元中單元中. . (以上均為低位在低字節(jié),高位在高字節(jié))(以上均為低位在低字節(jié),高位在高字節(jié)) 開始(22H)AA+(32H)ABCD碼調(diào)整A(42H)(23H)AA+(33H)+CABCD碼調(diào)整A(43H)結(jié)束

22、ORG 2000HORG 2000HCLR CCLR CMOV AMOV A,22H22HADD AADD A,32H32HDADA A A;BCDBCD碼調(diào)整碼調(diào)整MOV 42HMOV 42H,A A;存結(jié)果低位;存結(jié)果低位MOV AMOV A,23H23HADDC AADDC A,33H33H DA ADA AMOV 43HMOV 43H,A A;存結(jié)果高位;存結(jié)果高位LLLL: SJMPSJMP LL LLEND END 例例2 2:求一個:求一個1616位二進制數(shù)的補碼。位二進制數(shù)的補碼。考慮加考慮加1 1可否用可否用INCINC指令來實現(xiàn)?指令來實現(xiàn)?不可以。因為不影響不可以。因為不

23、影響CYCY標(biāo)志。標(biāo)志。ORGORG2000H2000HMOVMOVA A,R0R0CPLCPLA AADDADDA A,#1#1MOVMOVR2R2,A A;低位字節(jié)補碼送;低位字節(jié)補碼送R2R2MOVMOVA A,R1R1CPLCPLA AADDCADDCA A,#0#0;高位加進位;高位加進位MOVMOVR3R3,A ALPLP:SJMPSJMPLPLPEND END 設(shè)此設(shè)此1616位二進制數(shù)存放在位二進制數(shù)存放在R1R1、R0R0中,求補后送存中,求補后送存R3R3、R2R2中。中。7.2.2 7.2.2 分支轉(zhuǎn)移程序設(shè)計分支轉(zhuǎn)移程序設(shè)計 轉(zhuǎn)移指令有分為轉(zhuǎn)移指令有分為無條件轉(zhuǎn)移和有條

24、件轉(zhuǎn)移無條件轉(zhuǎn)移和有條件轉(zhuǎn)移,因此分支,因此分支程序也可分為無條件分支轉(zhuǎn)移程序和有條件分支轉(zhuǎn)移程序。程序也可分為無條件分支轉(zhuǎn)移程序和有條件分支轉(zhuǎn)移程序。有條件分支轉(zhuǎn)移程序按結(jié)構(gòu)類型來分,又分為單分支轉(zhuǎn)移結(jié)有條件分支轉(zhuǎn)移程序按結(jié)構(gòu)類型來分,又分為單分支轉(zhuǎn)移結(jié)構(gòu)和多分支轉(zhuǎn)移結(jié)構(gòu)。構(gòu)和多分支轉(zhuǎn)移結(jié)構(gòu)。 無條件轉(zhuǎn)移無條件轉(zhuǎn)移 它的程序轉(zhuǎn)移方向是設(shè)計者事先安排的,與已執(zhí)行程序的它的程序轉(zhuǎn)移方向是設(shè)計者事先安排的,與已執(zhí)行程序的結(jié)果無關(guān),使用時只需給出正確的轉(zhuǎn)移目標(biāo)地址或位移量即結(jié)果無關(guān),使用時只需給出正確的轉(zhuǎn)移目標(biāo)地址或位移量即可??伞?條件轉(zhuǎn)移條件轉(zhuǎn)移 它是根據(jù)已執(zhí)行的程序,對標(biāo)志位或?qū)奂悠魉歉鶕?jù)

25、已執(zhí)行的程序,對標(biāo)志位或?qū)奂悠鰽 A或?qū)?nèi)部或?qū)?nèi)部RAMRAM某位的影響結(jié)果,決定程序的走向,形成各種分支。某位的影響結(jié)果,決定程序的走向,形成各種分支。1 1單分支轉(zhuǎn)移結(jié)構(gòu)單分支轉(zhuǎn)移結(jié)構(gòu) 僅有兩個出口,兩者選一。僅有兩個出口,兩者選一。例例 求單字節(jié)有符號數(shù)的二進制補碼求單字節(jié)有符號數(shù)的二進制補碼參考程序參考程序:CMPTCMPT: JNB Acc.7,RETURNJNB Acc.7,RETURN;(A A)00,不需轉(zhuǎn)換,不需轉(zhuǎn)換 MOV CMOV C,Acc.7 Acc.7 ;符號位保存符號位保存 CPL ACPL A ;(;(A A)求反,加)求反,加1 1 ADD A ADD A

26、,#1#1 MOV Acc.7 MOV Acc.7,C C ;符號位存;符號位存A A的最高位的最高位RETURNRETURN: RET RET 2多分支轉(zhuǎn)移結(jié)構(gòu)多分支轉(zhuǎn)移結(jié)構(gòu) 程序的判別部分有兩個以上的出口流向程序的判別部分有兩個以上的出口流向常見的兩種形式如下:常見的兩種形式如下: 指令系統(tǒng)提供了非常有用的兩種多分支選擇指令指令系統(tǒng)提供了非常有用的兩種多分支選擇指令: : 間接轉(zhuǎn)移指令間接轉(zhuǎn)移指令: JMP A+DPTR;: JMP A+DPTR;比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令: CJNE A,direct,rel: CJNE A,direct,rel; CJNE A,#data,relCJNE

27、 A,#data,rel; CJNE Rn,#data,relCJNE Rn,#data,rel; CJNE Ri,#data,relCJNE Ri,#data,rel; 需根據(jù)某一單元的內(nèi)容是需根據(jù)某一單元的內(nèi)容是0 0,1 1,n n,來分別轉(zhuǎn),來分別轉(zhuǎn)向處理程序向處理程序0 0,處理程序,處理程序1 1,處理程序處理程序n n。一個。一個典型的例子就是當(dāng)單片機系統(tǒng)中的典型的例子就是當(dāng)單片機系統(tǒng)中的鍵盤按下鍵盤按下時,時,就會得到一個就會得到一個鍵值鍵值,根據(jù)不同的鍵值,跳向不同,根據(jù)不同的鍵值,跳向不同的鍵處理程序入口。對于這種情況,可用直接轉(zhuǎn)的鍵處理程序入口。對于這種情況,可用直接轉(zhuǎn)移

28、指令(移指令(LJMPLJMP或或AJMPAJMP指令)組成一個轉(zhuǎn)移表,然指令)組成一個轉(zhuǎn)移表,然后把該單元的內(nèi)容讀入累加器后把該單元的內(nèi)容讀入累加器A A,轉(zhuǎn)移表首地址放,轉(zhuǎn)移表首地址放入入DPTRDPTR中,再利用間接轉(zhuǎn)移指令實現(xiàn)分支轉(zhuǎn)移。中,再利用間接轉(zhuǎn)移指令實現(xiàn)分支轉(zhuǎn)移。 例:按照例:按照R7R7的內(nèi)容轉(zhuǎn)向的內(nèi)容轉(zhuǎn)向5 5個操作程序。個操作程序。JUMP3JUMP3:MOVMOVA A,R7R7MOVMOVDPTRDPTR,#TAB3#TAB3MOVCMOVCA A,A+DPTRA+DPTRJMPJMPA+DPTRA+DPTRTAB3:TAB3:DBDBOPR0-TAB3OPR0-TA

29、B3DBDBOPR1-TAB3OPR1-TAB3DBDBOPR2-TAB3OPR2-TAB3DBDBOPR3-TAB3OPR3-TAB3DBDBOPR4-TAB3OPR4-TAB3OPR0:OPR0:操作程序操作程序0 0OPR1:OPR1:操作程序操作程序1 1OPR4:OPR4:操作程序操作程序4 47.2.3 7.2.3 循環(huán)程序設(shè)計循環(huán)程序設(shè)計 特點是程序中含有可以反復(fù)執(zhí)行的程序段,該程序段通特點是程序中含有可以反復(fù)執(zhí)行的程序段,該程序段通常稱為循環(huán)體。例如求常稱為循環(huán)體。例如求100100個數(shù)的累加和,則沒有必要連續(xù)個數(shù)的累加和,則沒有必要連續(xù)安排安排100100條加法指令,可以只用

30、一條加法指令并使其循環(huán)執(zhí)條加法指令,可以只用一條加法指令并使其循環(huán)執(zhí)行行100100次。次。 (1 1)可大大縮短程序長度)可大大縮短程序長度(2 2)使程序所占的內(nèi)存單元數(shù)量少)使程序所占的內(nèi)存單元數(shù)量少(3 3)使程序結(jié)構(gòu)緊湊和可讀性變好。)使程序結(jié)構(gòu)緊湊和可讀性變好。一、循環(huán)程序的結(jié)構(gòu)一、循環(huán)程序的結(jié)構(gòu) 循環(huán)控制循環(huán)控制在重復(fù)執(zhí)行循環(huán)體的過程在重復(fù)執(zhí)行循環(huán)體的過程中中, ,不斷修改循環(huán)控制變量不斷修改循環(huán)控制變量,直到符合結(jié)束條件,直到符合結(jié)束條件, ,就結(jié)就結(jié)束循環(huán)程序的執(zhí)行。束循環(huán)程序的執(zhí)行。循環(huán)初始化循環(huán)初始化循環(huán)前的的準(zhǔn)備工作循環(huán)前的的準(zhǔn)備工作, ,例循例循環(huán)控制計數(shù)初值的設(shè)置、

31、環(huán)控制計數(shù)初值的設(shè)置、地址指針的起始地址的設(shè)地址指針的起始地址的設(shè)置、為變量預(yù)置初值等。置、為變量預(yù)置初值等。循環(huán)結(jié)束循環(huán)結(jié)束對循環(huán)程序執(zhí)行的結(jié)果進對循環(huán)程序執(zhí)行的結(jié)果進行分析、處理和存放。行分析、處理和存放。循環(huán)體循環(huán)體要求重復(fù)執(zhí)行的程序段部要求重復(fù)執(zhí)行的程序段部分。主要完成計算或操作分。主要完成計算或操作任務(wù),同時也包括對初始任務(wù),同時也包括對初始值的修改。值的修改。圖圖4-84-8是計數(shù)循環(huán)控制結(jié)構(gòu),圖是計數(shù)循環(huán)控制結(jié)構(gòu),圖4-94-9是條件控制結(jié)構(gòu)。是條件控制結(jié)構(gòu)。 二、循環(huán)結(jié)構(gòu)的控制二、循環(huán)結(jié)構(gòu)的控制1 1計數(shù)循環(huán)結(jié)構(gòu)計數(shù)循環(huán)結(jié)構(gòu) 計數(shù)循環(huán)控制結(jié)構(gòu)是依據(jù)計數(shù)器的值來決定循環(huán)計數(shù)循環(huán)控

32、制結(jié)構(gòu)是依據(jù)計數(shù)器的值來決定循環(huán)次數(shù),一般為減次數(shù),一般為減“1 1” 計數(shù)器,計數(shù)器減到計數(shù)器,計數(shù)器減到“0 0”時,時,結(jié)束循環(huán)。計數(shù)器的初值是在初始化時設(shè)定。結(jié)束循環(huán)。計數(shù)器的初值是在初始化時設(shè)定。MCS-51MCS-51的指令系統(tǒng)提供了功能極強的循環(huán)控制指令:的指令系統(tǒng)提供了功能極強的循環(huán)控制指令:DJNZ Rn,relDJNZ Rn,rel;工作寄存器作控制計數(shù)器;工作寄存器作控制計數(shù)器DJNZ direct,relDJNZ direct,rel;以直接尋址單元作控制計數(shù)器。;以直接尋址單元作控制計數(shù)器。計數(shù)控制方法只有在循環(huán)次數(shù)已知的情況下才適用計數(shù)控制方法只有在循環(huán)次數(shù)已知的情

33、況下才適用 2 2條件控制結(jié)構(gòu)條件控制結(jié)構(gòu) 例例 50ms50ms延時程序延時程序。 延時程序與延時程序與MCS-51MCS-51指令執(zhí)行時間有很大的關(guān)系。在使用指令執(zhí)行時間有很大的關(guān)系。在使用12MHz12MHz晶振時,一個機器周期為晶振時,一個機器周期為1 1s,s,執(zhí)行一條執(zhí)行一條DJNZDJNZ指令的時指令的時間為間為2 2s s。這時,可用雙重循環(huán)方法寫出下面如下的延時。這時,可用雙重循環(huán)方法寫出下面如下的延時50ms50ms的程序:的程序:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#125DEL1: MOV R6,#125DEL2:

34、DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;125125* *2=2502=250s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;0.25ms0.25ms* *200=50ms200=50ms RET RET 以上延時程序不太精確,它沒有考慮到除以上延時程序不太精確,它沒有考慮到除“DJNZ R6,DEL2 DJNZ R6,DEL2 ”指令外的其它指令的執(zhí)行時間,如把其它指令的執(zhí)行時間指令外的其它指令的執(zhí)行時間,如把其它指令的執(zhí)行時間計算在內(nèi),它的延時時間為:計算在內(nèi),它的延時時間為: (250+1+2250+1+2)* *200+1=50.301ms200

35、+1=50.301ms 如果要求比較精確的延時,可按如下修改:如果要求比較精確的延時,可按如下修改:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#122DEL1: MOV R6,#122 NOP NOPDEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;2 2* *122+2=246122+2=246s s DJNZ R7,DEL1 DJNZ R7,DEL1 ;(246+1+1+2)(246+1+1+2)* *200+1=50.001ms200+1=50.001ms RET RET實際延遲時間為實際延遲時間為50.001m

36、s50.001ms,注意。軟件延時程序,不允許有中,注意。軟件延時程序,不允許有中斷,否則將嚴(yán)重影響定時的準(zhǔn)確性。斷,否則將嚴(yán)重影響定時的準(zhǔn)確性。例例 片內(nèi)片內(nèi)RAMRAM中存放一批數(shù)據(jù),中存放一批數(shù)據(jù),查找出最大值并存放于查找出最大值并存放于R3R3中。中。設(shè)設(shè)R0R0中存首地址,中存首地址,R2R2中存放字節(jié)中存放字節(jié)數(shù),程序框圖如圖數(shù),程序框圖如圖4-14-1所示。所示。 MOVMOVA A, R0 R0MOVMOVR3R3, A A ;假設(shè)第一次取的數(shù)為最大值;假設(shè)第一次取的數(shù)為最大值 INC INCR0R0;地址指針加;地址指針加1 1DEC R2DEC R2;字節(jié)數(shù)減;字節(jié)數(shù)減1

37、1LOOPLOOP: MOVMOV A A, R0 R0 CJNE ACJNE A,R3R3,LOOP1LOOP1;取出的數(shù)與存放的最大;取出的數(shù)與存放的最大 ;數(shù)比較;數(shù)比較 LOOP1 LOOP1: JC LOOP2JC LOOP2;C=1C=1,取出的數(shù)小跳轉(zhuǎn),取出的數(shù)小跳轉(zhuǎn) MOV R3MOV R3,A A;C=0C=0,取出的數(shù)大,替換,取出的數(shù)大,替換R3R3LOOP2:LOOP2:INCINCR0R0DJNZ R2, LOOPDJNZ R2, LOOP;是否比較結(jié)束;是否比較結(jié)束 RET RET 7.2.4 7.2.4 子程序結(jié)構(gòu)程序子程序結(jié)構(gòu)程序 一種能完成某一特定任務(wù)的程序段

38、。其資源要為所有調(diào)用一種能完成某一特定任務(wù)的程序段。其資源要為所有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨立性和通用性,在程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨立性和通用性,在編寫子程序時應(yīng)編寫子程序時應(yīng)注意以下問題:注意以下問題:1 1子程序的第一條指令的地址稱為子程序的入口地址。該指令子程序的第一條指令的地址稱為子程序的入口地址。該指令前必須有標(biāo)號。前必須有標(biāo)號。2 2主程序調(diào)用子程序,兩條子程序調(diào)用指令:主程序調(diào)用子程序,兩條子程序調(diào)用指令: (1 1)絕對調(diào)用指令:)絕對調(diào)用指令:ACALL addr11 ACALL addr11 (2 2)長調(diào)用指令:)長調(diào)用指令:LCALL ad

39、dr16LCALL addr163 3注意設(shè)置堆棧指針和現(xiàn)場保護注意設(shè)置堆棧指針和現(xiàn)場保護4 4最后一條指令必須是最后一條指令必須是RETRET指令指令5 5子程序可以嵌套,即子程序可以調(diào)用子程序子程序可以嵌套,即子程序可以調(diào)用子程序6 6在子程序調(diào)用時,還要注意參數(shù)傳遞的問題在子程序調(diào)用時,還要注意參數(shù)傳遞的問題 地址地址主程序主程序地址地址SUB2SUB2LCALL SB20 LCALL SB20 MAIN4MAIN4LCALL SB30 LCALL SB30 RETRET RETRETSB20SB20S1S1SB30SB30SUB1SUB1 MAIN4 MAIN4 高位高位 S1 S1

40、高位高位S1 S1 低位低位MAIN4 MAIN4 低位低位SP+4SP+3SP+2SP+1SP堆棧存儲區(qū)堆棧存儲區(qū) 例:用例:用P1P1口作為數(shù)據(jù)讀入口,為了讀取穩(wěn)定的值,要求連續(xù)讀口作為數(shù)據(jù)讀入口,為了讀取穩(wěn)定的值,要求連續(xù)讀8 8次后取平均。次后取平均。 設(shè)設(shè)R0R0,R1R1作為連續(xù)作為連續(xù)8 8次累加的次累加的1616位工作寄存器,最后取平均值,即除以位工作寄存器,最后取平均值,即除以8 8,相當(dāng)于除以,相當(dāng)于除以2 23 3。在此采。在此采用將用將R0R0,R1R1各右移一次的操作重復(fù)三次。最后結(jié)果在各右移一次的操作重復(fù)三次。最后結(jié)果在R1R1中。中。 ORGORG2000H200

41、0H MOV MOVR0R0,#00H#00H;清;清1616位中間寄存器位中間寄存器 MOVMOVR1R1,#00H#00H MOV MOVR2R2,#08H#08H;累加次數(shù)送;累加次數(shù)送R2R2LP2LP2:MOVMOV P1P1,#0FFH#0FFH;輸入讀數(shù);輸入讀數(shù) MOVMOVA A,P1P1 ADD ADDA A,#R1#R1;加入中間寄存器低;加入中間寄存器低8 8位位 JNCJNCLP1LP1;無進位則暫存結(jié)果;無進位則暫存結(jié)果 INCINCR0R0;有進位則中間寄存器高;有進位則中間寄存器高8 8位增位增1 1LP1LP1: MOV MOVR1R1,A A;暫存低;暫存低

42、8 8位結(jié)果位結(jié)果 DJNZDJNZR2R2,LP2LP2;未完循環(huán);未完循環(huán) MOVMOVR2R2,#03H#03HLP3LP3: MOV MOVA A,R0R0;高;高8 8位結(jié)果送入位結(jié)果送入A A RRC RRCA A;A A中最低位右移入中最低位右移入C C MOV MOVR0R0,A A MOV MOVA A,R1R1 RRC RRCA A;低;低8 8位結(jié)果帶進位右移,則高位結(jié)果帶進位右移,則高8 8位的位的 ;低位進入低;低位進入低8 8位的最高位位的最高位 MOVMOVR1R1,A A DJNZ DJNZR2R2,LP3LP3LPLP: SJMPSJMPLPLP開始清累加器R

43、0,R1,設(shè)R2計數(shù)器P1口讀入數(shù),加入R0,R1R2-1=0結(jié)束NY累加結(jié)果取平均例:編制一個循環(huán)閃爍燈的程序。有例:編制一個循環(huán)閃爍燈的程序。有8 8個發(fā)光二極管,每次其中個發(fā)光二極管,每次其中某個燈閃爍點亮某個燈閃爍點亮1010次后,轉(zhuǎn)移到下一個閃爍次后,轉(zhuǎn)移到下一個閃爍1010次,循環(huán)不止。次,循環(huán)不止。 D0 Q0D0 Q0D7 Q7D7 Q7 LED0LED0LED7LED7+5V+5VP1.0P1.0P1.1P1.1P1.2P1.2P1.3P1.3P1.4P1.4P1.5P1.5P1.6 P1.6 P1.7P1.780C5180C5174LS24074LS240解:解:80518

44、051的的P1P1口輸出經(jīng)過口輸出經(jīng)過74LS240 874LS240 8路反相驅(qū)動后,點燃發(fā)光二極管。路反相驅(qū)動后,點燃發(fā)光二極管。 由圖可見,低電平發(fā)光二極管可被點亮。由圖可見,低電平發(fā)光二極管可被點亮。MOVMOVA A,#80#80;初值;初值SHIFT1SHIFT1:LCALLLCALL FLASHFLASH ;閃亮;閃亮1010次次RRRRA A;右移;右移SJMPSJMPSHIFT1SHIFT1;循環(huán);循環(huán)FLASHFLASH:MOVMOVR2R2,#0AH#0AH;閃爍;閃爍1010次次FLASH1FLASH1:MOVMOVP1P1,A A;點亮;點亮LCALLLCALL DE

45、LAYDELAY;延時;延時MOVMOVP1P1,#00H#00H;熄滅;熄滅LCALLLCALL DELAYDELAY;延時;延時DJNZDJNZR2R2,LFASH1LFASH1;循環(huán);循環(huán)RETRET DELAYDELAY:為延時子程序,初值可以自己按照延時要求編制。:為延時子程序,初值可以自己按照延時要求編制。 例:延時例:延時100ms100msDEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#247DEL1: MOV R6,#247 NOP NOPDEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;2 2* *247+2=496247+2=496s s DJNZ DJNZR7,DEL1 R7,DEL1 ;(246+1+1+2)(246+1+1+2)* *200+1=50.001ms200+1=50.001msRETRET7.2.5 7.2.5 查表結(jié)構(gòu)程序查表結(jié)構(gòu)程序 所謂查表法,即對一些復(fù)雜的函數(shù)運算,事先把其全部可能所謂查表法,即對一些復(fù)雜的函數(shù)運算,事先把其全部可能范圍的答案按照一定規(guī)律變成表格存放在計算機的程序存儲器范圍的答案按照一定規(guī)律變成表格存放在計算機的程序存儲器(一般為只讀存儲器)中。當(dāng)用戶程序中需要用到這些函數(shù)時,(一般為只讀存儲器)中。當(dāng)用戶

溫馨提示

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

最新文檔

評論

0/150

提交評論