第4章 89S51的匯編語言程序設計_第1頁
第4章 89S51的匯編語言程序設計_第2頁
第4章 89S51的匯編語言程序設計_第3頁
第4章 89S51的匯編語言程序設計_第4頁
第4章 89S51的匯編語言程序設計_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2022-3-71第第4 4章章 89S5189S51的匯編語言程序設計的匯編語言程序設計 程序編制的程序編制的方法方法和和技巧技巧4.1 源程序的源程序的編輯編輯和和匯編匯編4.2 基本基本程序結構程序結構4.3 子程序子程序及其調用及其調用4.42022-3-72v 單片機應用系統(tǒng)由單片機應用系統(tǒng)由硬件系統(tǒng)硬件系統(tǒng)和和應用程序應用程序構成。構成。v 匯編語言匯編語言v 高級語言高級語言 ( (例如,例如,C C語言語言) )v 應用程序設計方法應用程序設計方法 匯編語言匯編語言,生成的目標程序占內存空間少、運行速,生成的目標程序占內存空間少、運行速度快,具有效率高、實時性強的特點。度快,具

2、有效率高、實時性強的特點。 高級語言高級語言,對系統(tǒng)的描述與實現(xiàn)與人的思維相似,程序,對系統(tǒng)的描述與實現(xiàn)與人的思維相似,程序閱讀、修改和移植方便,適合于編寫復雜的程序。閱讀、修改和移植方便,適合于編寫復雜的程序。 2022-3-734.1 程序編制的方法和技巧程序編制的方法和技巧4.1.1 4.1.1 程序編制的步驟程序編制的步驟v 明確任務:功能要求、技術指標明確任務:功能要求、技術指標v 運行環(huán)境調研運行環(huán)境調研v 任務分析任務分析v 將實際問題轉化為計算機處理的程序算法。將實際問題轉化為計算機處理的程序算法。v 算法比較與優(yōu)化(內存需求、運行速度、效率)。算法比較與優(yōu)化(內存需求、運行速

3、度、效率)。v 算法設計算法設計2022-3-74v 強化模塊觀念強化模塊觀念v 使程序結構清晰。使程序結構清晰。v 簡化代碼。簡化代碼。v 程序模塊(主程序模塊、各種子程序模塊)程序模塊(主程序模塊、各種子程序模塊)v 模塊化優(yōu)點:分塊設計、層次清晰、便于接口。模塊化優(yōu)點:分塊設計、層次清晰、便于接口。4.1.2 4.1.2 程序編制的方法和技巧程序編制的方法和技巧v 采用循環(huán)和子程序的優(yōu)點采用循環(huán)和子程序的優(yōu)點注意:注意:1 1、循環(huán)初值和結束條件,避免、循環(huán)初值和結束條件,避免“死循環(huán)死循環(huán)”現(xiàn)象。現(xiàn)象。 2 2、子程序的現(xiàn)場保護。、子程序的現(xiàn)場保護。2022-3-754.1.3 4.1

4、.3 匯編語言的語句格式匯編語言的語句格式v 標號代表本行程序所在的地址。標號代表本行程序所在的地址。v 標號由標號由18個個ASCII碼字符組成,第一個字符必須是字母。碼字符組成,第一個字符必須是字母。v 不能用已定義的關鍵字(指令助記符、偽指令等)。不能用已定義的關鍵字(指令助記符、偽指令等)。v 同一標號在一個程序中只能定義一次,不能重復定義。同一標號在一個程序中只能定義一次,不能重復定義。v 標號后跟英文冒號標號后跟英文冒號“:”:”。v 標號(即符號地址)標號(即符號地址)標號: 指令助記符指令助記符 操作數(shù)1, 操作數(shù)2, 操作數(shù)3, ;注釋2022-3-76v 數(shù)據(jù):二進制(數(shù)據(jù)

5、:二進制(B B)v 十進制(十進制(D D或省略或省略D D) 十六進制(十六進制(H H)。)。 注意:若十六進制操作數(shù)以字符AF開頭,需在它前面加一個 “0”,以便匯編時把它和標號區(qū)分開。v 符號:符號名、標號或符號:符號名、標號或“$”$”。v 表達式:由運算符和數(shù)據(jù)構成。表達式:由運算符和數(shù)據(jù)構成。v 操作數(shù)操作數(shù)2022-3-77v 注釋注釋英文分號英文分號“;”;”開頭。開頭。匯編時,遇到匯編時,遇到“;” ” 就停止就停止“翻譯翻譯”。因此,注釋字。因此,注釋字段不會產生機器代碼。段不會產生機器代碼。2022-3-784.2.1 4.2.1 偽指令偽指令4.2 源程序的編輯源程

6、序的編輯4.2.2 4.2.2 源程序的編輯源程序的編輯2022-3-794.2.1 4.2.1 偽指令偽指令v 偽指令:用于指導匯編工作。偽指令:用于指導匯編工作。v 匯編后,偽指令沒有與之對應的機器代碼。匯編后,偽指令沒有與之對應的機器代碼。v 起始地址設定偽指令起始地址設定偽指令ORGORGORG ORG 表達式表達式表達式通常為十六進制地址,例:表達式通常為十六進制地址,例: ORG 8000HSTART:MOV A,#30H ORG ORG可多次使用,但地址值的順序要由小到大??啥啻问褂茫刂分档捻樞蛞尚〉酱?。2022-3-710v 結束匯編偽指令結束匯編偽指令ENDENDEND

7、該偽指令位于源程序的最后一行,表示匯編到此結束。該偽指令位于源程序的最后一行,表示匯編到此結束。整個源程序中只能有一條整個源程序中只能有一條ENDEND命令,且位于程序的最后。命令,且位于程序的最后。對于對于ENDEND之后的程序,將不進行匯編處理。之后的程序,將不進行匯編處理。2022-3-711v 定義字節(jié)數(shù)據(jù)表偽指令定義字節(jié)數(shù)據(jù)表偽指令DBDBv定義字數(shù)據(jù)表偽指令定義字數(shù)據(jù)表偽指令DWDW1000H 標號:標號: DB DB 字節(jié)數(shù)據(jù)表字節(jié)數(shù)據(jù)表ORG 1000HORG 1000HDB -2,-4,-6,8,10,18DB -2,-4,-6,8,10,18FEH FCHFAH08H0AH

8、12H1001H 標號:標號: DW DW 字數(shù)據(jù)表字數(shù)據(jù)表 ORG 1400H ORG 1400HDATA1:DW 32DATA1:DW 324A4AH,3CH H,3CH 1400H32H 4AH00H3CH1401H1402H1403H注意:字母按注意:字母按ASCIIASCII碼存儲。碼存儲。2022-3-712v 預留空間偽指令預留空間偽指令DSDS 標號:標號: DS DS 預留空間字節(jié)數(shù)預留空間字節(jié)數(shù) ORG 2000H ORG 2000HTAB1TAB1:DB 12HDB 12H,34H34H DS 4H DS 4H DB 5 DB 512H34H-35H3000H3001H3

9、002H3003H3004H3005H3006H2022-3-713v 定義常量值的偽指令定義常量值的偽指令EQUEQU符號名符號名 EQU EQU 常值表達式常值表達式 LENLEN EQUEQU 10 10 SUMSUM EQUEQU 21H 21HBLOCKBLOCK EQU EQU 22H 22H MOV R7, MOV R7,LENLEN MOV R0, MOV R0,BLOCKBLOCK MOV MOV SUMSUM,A ,A 2022-3-714v 位定義命令位定義命令 BITBIT用于給字符名稱賦予位地址,位地址可以是絕對位地址,用于給字符名稱賦予位地址,位地址可以是絕對位地址

10、,也可是符號地址。也可是符號地址。例如:例如:LEDLEDBIT P1.6BIT P1.6功能是把功能是把P1.6P1.6的位地址賦給變量的位地址賦給變量LEDLED。2022-3-7154.2.2 4.2.2 源程序的編輯源程序的編輯v 源程序的編輯源程序的編輯 ORG ORG 0000H LJMP MAIN ORG ORG 0040HMAIN:MOV R7,#16 MOV R0,#60H MOV A,#55HLOOP:MOV R0,A INC R0 DJNZ R7,LOOP SJMP $ ENDENDv 依據(jù)匯編語言規(guī)則依據(jù)匯編語言規(guī)則v 用好用好偽指令偽指令v 符號符號不用中文不用中文v

11、 匯編程序以匯編程序以.ASM.ASM存盤存盤2022-3-7164.3.1 4.3.1 順序程序順序程序(無分支、無循環(huán))(無分支、無循環(huán))4.3 基本程序結構基本程序結構 ORG 0040HORG 0040HSTART:MOV A,21H ;START:MOV A,21H ;取取21H21H的內容的內容 ANL A,#0FH ; ANL A,#0FH ;保留低半字節(jié)保留低半字節(jié) SWAP A ; SWAP A ;移至高半字節(jié)移至高半字節(jié) MOV 20H,A ; MOV 20H,A ;存于存于20H20H單元單元 MOV A,22H ; MOV A,22H ;取取22H22H的內容的內容 A

12、NL A,#0FH ; ANL A,#0FH ;保留低半字節(jié)保留低半字節(jié) ORL 20H,A ; ORL 20H,A ;合并到結果單元合并到結果單元 SJMP $ SJMP $ ;等待;等待 END END2022-3-7174.3.2 4.3.2 分支程序分支程序(雙分支)(雙分支)【例例】實現(xiàn)兩個實現(xiàn)兩個8 8位無符號數(shù)求和的子程序。位無符號數(shù)求和的子程序。SADD:MOV A,R3 ;SADD:MOV A,R3 ;取加數(shù)(在取加數(shù)(在R3R3中)中) CLR CCLR C ADD A,R4 ; ADD A,R4 ;被加數(shù)(在被加數(shù)(在R4R4中)加中)加A A JC PP1 JC PP1

13、 MOV R3,#00H ; MOV R3,#00H ;結果小于結果小于255255時,高字節(jié)時,高字節(jié)R3R3內容為內容為00H00H SJMP PP2 SJMP PP2 PP1:MOV R3,#01H ; PP1:MOV R3,#01H ;結果大于結果大于255255時,高字節(jié)時,高字節(jié)R3R3內容為內容為01H01H PP2:MOV R4,A ; PP2:MOV R4,A ;結果的低字節(jié)在結果的低字節(jié)在R4R4中中 RETRET入口入口: :(R3R3)= =加數(shù);加數(shù); (R4R4)= =被加數(shù)。被加數(shù)。出口出口: :(R3R3)= =和的高字節(jié);和的高字節(jié); (R4R4)= =和的低

14、字節(jié)。和的低字節(jié)。2022-3-718【例例】求單字節(jié)有符號數(shù)的二進制補碼。求單字節(jié)有符號數(shù)的二進制補碼。 正數(shù)補碼是其本身,負數(shù)補碼是其反碼加正數(shù)補碼是其本身,負數(shù)補碼是其反碼加1。因此,應首先判被轉換數(shù)。因此,應首先判被轉換數(shù)的符號,負數(shù)進行轉換,正數(shù)本身即為補碼。的符號,負數(shù)進行轉換,正數(shù)本身即為補碼。設二進制數(shù)放在設二進制數(shù)放在A中,其補碼放回到中,其補碼放回到A中。參考程序如下:中。參考程序如下: CMPT: JNB Acc.7,RETURN ;(A)0,不需轉換,不需轉換 MOV C,Acc.7 ;符號位保存;符號位保存 CPL A ;(A)求反,加求反,加1 ADD A,#1 M

15、OV Acc.7,C ;符號位存在;符號位存在A的最高位的最高位RETURN:RET2022-3-7194.3.2 4.3.2 分支程序分支程序(多分支)(多分支) 多分支結構是程序中常見的結構,在多分支結多分支結構是程序中常見的結構,在多分支結構的程序中,能夠按調用號執(zhí)行相應的功能,完成構的程序中,能夠按調用號執(zhí)行相應的功能,完成指定操作。指定操作。 若給出若給出調用號調用號來調用子程序,一般用查表方法,來調用子程序,一般用查表方法,查到查到子程序的地址子程序的地址,轉到相應,轉到相應子程序子程序。2022-3-720指令系統(tǒng)提供了非常有用的兩種多分支選擇指令:間接轉移指令間接轉移指令 JM

16、P A+DPTR比較轉移指令 CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel 間接轉移指令“JMP A+DPTR”由數(shù)據(jù)指針DPTR決定決定多分支轉移程序的首地址,由A的內容選擇對應分支。 4條比較轉移指令CJNE能對兩個欲比較的單元內容進行比較,當不相等時,程序實現(xiàn)相對轉移;若兩者相等,則順序往下執(zhí)行。2022-3-721【例例】設變量設變量x x存放在片內存放在片內RAMRAM的的30H30H單元,變量單元,變量y y與與x x的關系的關系是是: : 當當x x大于大于0 0時時,y=x;,y=x

17、; 當當x=0 x=0時時,y=20H;,y=20H; 當當x x小于小于0 0時時,y=x+5,y=x+5。編制程序編制程序, ,根據(jù)根據(jù)x x的大小求的大小求y y,并送回原單元。并送回原單元。2022-3-722 ORG 0040HORG 0040HSTART:MOV A,30H ;START:MOV A,30H ;取取x x至累加器至累加器 JZ NEXTJZ NEXT ;x = 0, ;x = 0,轉轉NEXTNEXT ANL A,#80H ; ANL A,#80H ;否,保留符號位否,保留符號位 JZ DONEJZ DONE ;x 0, ;x 0,轉結束轉結束 MOV A,#05H

18、 ;x 0MOV A,#05H ;x 0X 0X = 00-12022-3-724程序如下:程序如下:SIGNFUC:MOV A,40H CJNE A,#00H,NZEAR AJMP NEGTNZEAR: JB Acc.7, POSI MOV A,#01H AJMP NEGTPOSI: MOV A,#81HNEGT: MOV 41H, A END2022-3-725【例例】根據(jù)根據(jù)R7R7的內容的內容x x(轉移序號)轉向相應的處理程序。(轉移序號)轉向相應的處理程序。設設R7R7內容為內容為0 04 4,對應的處理程序入口地址分別為,對應的處理程序入口地址分別為PP0PP0PP4PP4。 2

19、022-3-726 START:MOV R7,#3 ; START:MOV R7,#3 ;轉移序號為轉移序號為3 3,欲轉向,欲轉向PP3PP3 ACALL JPNUM ;ACALL JPNUM ;子程序調用子程序調用 AJMP START AJMP START JPNUM:MOV DPTR,#TAB ;DPTR JPNUM:MOV DPTR,#TAB ;DPTR指向分支入口的表首地址指向分支入口的表首地址 MOV A,R7MOV A,R7 ADD A,R7ADD A,R7 ;R7 ;R7乘乘2 2,調整偏移量(,調整偏移量(3x2=63x2=6) MOV R3,A ;A=R3=6MOV R3

20、,A ;A=R3=6 MOVC A,A+DPTR ; MOVC A,A+DPTR ;先取先取PP3PP3的高字節(jié)(的高字節(jié)(PP3PP3是是DWDW) XCH A,R3 ; XCH A,R3 ;高字節(jié)暫存于高字節(jié)暫存于R3R3 INC A ; INC A ;增增1 1后,后,A=7A=7,指向下一個,指向下一個 MOVC A,A+DPTR ; MOVC A,A+DPTR ;再取再取PP3PP3的低字節(jié)的低字節(jié) MOV DPL,A ;MOV DPL,A ;處理程序入口地址低處理程序入口地址低8 8位送位送DPLDPL MOV DPH,R3 ; MOV DPH,R3 ;處理程序入口地址高處理程序入

21、口地址高8 8位送位送DPHDPH CLR A ;DPTR CLR A ;DPTR指向指向PP3PP3地址地址 JMP A+DPTRJMP A+DPTR ; ;跳轉向跳轉向PP3PP3服務程序服務程序2022-3-727 TAB:DW PP0 ; TAB TAB:DW PP0 ; TAB是轉移地址表是轉移地址表 DW PP1 DW PP1 DW PP2 DW PP2 DW PP3DW PP3 DW PP4 DW PP4 PP0:MOV 30H,#0 ; PP0:MOV 30H,#0 ;轉移序號為轉移序號為0 0時時, ,置功能號置功能號“0”0”于于30H30H單單元元 RETRET PP1:

22、MOV 30H,#1 ; PP1:MOV 30H,#1 ;轉移序號為轉移序號為1 1時時, ,置功能號置功能號“1”1”于于30H30H單單元元 RETRET PP2:MOV 30H,#2 ; PP2:MOV 30H,#2 ;轉移序號為轉移序號為2 2時時, ,置功能號置功能號“2”2”于于30H30H單單元元 RETRET PP3:MOV 30H,#3PP3:MOV 30H,#3 ; ;轉移序號為轉移序號為3 3時時, ,置功能號置功能號“3”3”于于30H30H單單元元 RETRET PP4:MOV 30H,#4 ; PP4:MOV 30H,#4 ;轉移序號為轉移序號為4 4時時, ,置功

23、能號置功能號“4”4”于于30H30H單單元元 RETRET 2022-3-7284.3.3 4.3.3 查表程序查表程序【例4-3】 設計一子程序,功能是根據(jù)累加器設計一子程序,功能是根據(jù)累加器A中的數(shù)中的數(shù)x(09之間)查之間)查x的平方表的平方表y,根據(jù),根據(jù)x的值查出相應的平方的值查出相應的平方y(tǒng)。本例中的。本例中的x和和y均為單字節(jié)數(shù)。均為單字節(jié)數(shù)。 ADD A,#01HMOVC A,A+PCRET DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H ;數(shù);數(shù)09的平方表的平方表2022-3-729 指令指令“ADD A,#01H”的作用是的作

24、用是A中的內容加上中的內容加上 “01H”, “01H”即為查表指令與平方表之間的即為查表指令與平方表之間的“RET”指令所占的字節(jié)數(shù)。指令所占的字節(jié)數(shù)。加上加上 “01H”后,可保證后,可保證PC指向表首,累加器指向表首,累加器A中原來的內容僅是從中原來的內容僅是從表首開始向下查找多少個單元。表首開始向下查找多少個單元。 在進入程序前,在進入程序前,A的內容在的內容在0009H之間,如之間,如A中的內容為中的內容為02H,它的平方為它的平方為04H,可根據(jù),可根據(jù)A的內容查出的內容查出x的平方。的平方。 指令指令“MOVC A,A+DPTR” 應用范圍較廣,使用該指令時應用范圍較廣,使用該指

25、令時不必計算偏移量,優(yōu)點是表格可以設在不必計算偏移量,優(yōu)點是表格可以設在64KB程序存儲器空間內的任程序存儲器空間內的任何地方,而不像何地方,而不像“MOVC A,A+PC”那樣只設在那樣只設在PC下面的下面的256個個單元中,所以使用較方便。單元中,所以使用較方便。2022-3-730 如果如果DPTR已被使用,則在查表前必須保護已被使用,則在查表前必須保護DPTR,且結束后恢復,且結束后恢復DPTR,例,例4-3可改成如下形式:可改成如下形式: PUSH DPH ;保存;保存DPH PUSH DPL ;保存;保存DPL MOV DPTR,#TAB1MOVC A,A+DPTRPOP DPL

26、;恢復;恢復DPLPOP DPH ;恢復;恢復DPHRETTAB1: DB 00H,01H,04H,09H,10H;平方表;平方表 DB 19H,24H,31H,40H,51H2022-3-731 【例4-4】有一巡回檢測報警裝置,需對有一巡回檢測報警裝置,需對16路(路(x)輸入)輸入進行檢測,每路有一個最大允許值(進行檢測,每路有一個最大允許值(y),為雙字節(jié)數(shù)。需),為雙字節(jié)數(shù)。需根據(jù)測量的路數(shù)(根據(jù)測量的路數(shù)(x),查表找出對應該路的最大允許值),查表找出對應該路的最大允許值(y),看輸入值是否大于最大允許值,如果大于就報警。),看輸入值是否大于最大允許值,如果大于就報警。 取路數(shù)為取

27、路數(shù)為x(0 x15),),y為最大允許值,放在表格為最大允許值,放在表格中。設進入查表程序前,假設路數(shù)中。設進入查表程序前,假設路數(shù)x已放于已放于R2中,查表后該中,查表后該路的最大允許值路的最大允許值y放于放于R3R4中。查表的程序如下:中。查表的程序如下: 理解:根據(jù)路數(shù)理解:根據(jù)路數(shù)x,查最大允許值,查最大允許值y。2022-3-732 TB3: MOV A,R2ADDA,R2 ;(R2)*2(A)MOV R3,A ;保存指針;保存指針 ADDA,#6 ;加偏移量;加偏移量MOVC A,A+PC ;查第一字節(jié);查第一字節(jié)XCH A,R3 ADD A,#3 MOVC A,A+PC ;查第

28、二字節(jié);查第二字節(jié) MOVR4,ARETTAB3: DW 1520,3721,42645,7580 ;最大值表;最大值表 DW 3483,32657,883,9943DW 10000,40511,6758,8931DW 4468,5871,13284,278082022-3-733 表格長度不能超過表格長度不能超過256B256B,且表格只能存放于,且表格只能存放于“MOVC AMOVC A,A+PCA+PC”指令以下的指令以下的256256個單元中,如需把表格放在程序存儲器個單元中,如需把表格放在程序存儲器空間的任何地方,應使用指令空間的任何地方,應使用指令“MOVC AMOVC A,A+D

29、PTRA+DPTR”。【例例4-54-5】 以以AT89S51AT89S51為核心的溫度控制器,溫度傳感器輸為核心的溫度控制器,溫度傳感器輸出的電壓與溫度為非線性關系,傳感器輸出的電壓已由出的電壓與溫度為非線性關系,傳感器輸出的電壓已由A/DA/D轉轉換為換為1010位二進制數(shù)。測得的不同溫度下的電壓值數(shù)據(jù)構成一個位二進制數(shù)。測得的不同溫度下的電壓值數(shù)據(jù)構成一個表,表中溫度值為表,表中溫度值為y y(雙字節(jié)無符號數(shù)),(雙字節(jié)無符號數(shù)),x x(雙字節(jié)無符號數(shù))(雙字節(jié)無符號數(shù))為電壓值數(shù)據(jù)。設測得電壓值為電壓值數(shù)據(jù)。設測得電壓值x x放入放入R2R3R2R3中,根據(jù)電壓值中,根據(jù)電壓值x x

30、,查,查找對應的溫度值找對應的溫度值y y,仍放入,仍放入R2R3R2R3中。參考程序:中。參考程序:理解:根據(jù)電壓值理解:根據(jù)電壓值x,查溫度值,查溫度值y。2022-3-734 LTB2: MOVDPTR,#TAB2 MOVA,R3 CLRC RLCA MOVR3,A XCHA,R2 RLCA XCHR2,A ADDA,DPL ;(R2R3)+(DPTR)(DPTR) MOVDPL,A MOVA,DPH ADDC A,R2 MOVDPH,A CLRA2022-3-735MOVC A,A+DPTR ;查第一字節(jié);查第一字節(jié)MOVR2,A ;第一字節(jié)存入;第一字節(jié)存入R2中中CLRAINCDP

31、TRMOVC A,A+DPTR ;查第二字節(jié);查第二字節(jié)MOVR3,A ;第二字節(jié)存入;第二字節(jié)存入R3中中RETTAB2: DW, , ;溫度值表;溫度值表 由于使用了指令由于使用了指令“MOVC A,A+DPTR”,表,表TAB2可放入可放入64KB程序存儲器空間任何位置,表格的長度可大于程序存儲器空間任何位置,表格的長度可大于256B。2022-3-7364.3.4 4.3.4 查找關鍵字查找關鍵字在表中查找關鍵字的操作,也稱為數(shù)據(jù)檢索。在表中查找關鍵字的操作,也稱為數(shù)據(jù)檢索?!纠?-6】 從從50個字節(jié)的表中查找一個關鍵字個字節(jié)的表中查找一個關鍵字“xxH”。ORG1000HMOV30

32、H,#xxH ;關鍵字;關鍵字xxH送送30H單元單元MOVR1,#50 ;查找次數(shù)送;查找次數(shù)送R1MOVA,#14;修正值送;修正值送AMOV DPTR,#TAB4;表首地址送;表首地址送DPTR2022-3-737LOOP:PUSH AccMOVC A, A+PC;查表結果送;查表結果送A CJNE A,40H,LOOP1;(40H)不等于關鍵字則轉不等于關鍵字則轉LOOP1 MOV R2,DPH;查到關鍵字,把地址送;查到關鍵字,把地址送R2,R3MOV R3,DPLDONE: RETLOOP1:POP Acc;修正值彈出;修正值彈出INC A;A+1AINC DPTR;修改數(shù)據(jù)指針;

33、修改數(shù)據(jù)指針DPTRDJNZ R1,LOOP;R10,未查完,繼續(xù)查找,未查完,繼續(xù)查找MOVR2,#00H;R1=0,R2和和R3清清0MOVR3,#00H;表中;表中50個數(shù)已查完個數(shù)已查完AJMPDONE;從子程序返回;從子程序返回 TAB4: DB ,;50個數(shù)據(jù)表個數(shù)據(jù)表2022-3-7384.3.5 4.3.5 查找最值查找最值 【例例4-7】片內片內RAM中存放一批數(shù)據(jù),查找出最大值并存放中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設于首地址中。設R0中存放首地址,中存放首地址,R2中存放字節(jié)數(shù)。中存放字節(jié)數(shù)。 程序如下:程序如下: MOV R2,n ;n為要比較的數(shù)據(jù)字節(jié)數(shù)為

34、要比較的數(shù)據(jù)字節(jié)數(shù) MOV A, R0 ;存首地址指針;存首地址指針 MOV R1,A DEC R2 MOV A,R12022-3-739LOOP: MOV R3, ADEC R1CLR CSUBB A,R1 ;兩個數(shù)比較;兩個數(shù)比較JNC LOOP1 ;C=0,A中數(shù)大,跳中數(shù)大,跳LOOP1MOV A,R1 ;C=1,則大數(shù)送,則大數(shù)送ASJMP LOOP2LOOP1:MOV A,R3 LOOP2:DJNZ R2, LOOP ;是否比較結束?;是否比較結束?MOV R0, A ;存最大數(shù);存最大數(shù) RET2022-3-740【例例】將內部將內部RAMRAM的的30H30H至至3FH3FH單

35、元初始化為單元初始化為00H00H。MOV 30H,#00H ;MOV 30H,#00H ;MOV 31H,#00H ;MOV 31H,#00H ;MOV 3EH,#00H ;MOV 3EH,#00H ;MOV 3FH,#00H ;MOV 3FH,#00H ;2022-3-7414.3.6 4.3.6 循環(huán)程序循環(huán)程序1 1循環(huán)程序的結構:循環(huán)程序的結構:主要由以下四部分組成。主要由以下四部分組成。(1 1)循環(huán)初始化)循環(huán)初始化完成循環(huán)前的準備工作。例如,設置循環(huán)控制計數(shù)初值、完成循環(huán)前的準備工作。例如,設置循環(huán)控制計數(shù)初值、起始地址、變量初值等。起始地址、變量初值等。(2 2)循環(huán)體)循環(huán)

36、體完成實際的處理工作,反復執(zhí)行循環(huán)體。完成實際的處理工作,反復執(zhí)行循環(huán)體。(3 3)循環(huán)控制)循環(huán)控制在重復執(zhí)行循環(huán)體的過程中,不斷修改循環(huán)控制變量,在重復執(zhí)行循環(huán)體的過程中,不斷修改循環(huán)控制變量,直到符合結束條件,就結束循環(huán)體的執(zhí)行。直到符合結束條件,就結束循環(huán)體的執(zhí)行。循環(huán)結束的控制方法有循環(huán)結束的控制方法有計數(shù)控制法計數(shù)控制法和和條件控制法條件控制法。(4 4)循環(huán)結束)循環(huán)結束對循環(huán)程序執(zhí)行的結果進行分析、處理和存放。對循環(huán)程序執(zhí)行的結果進行分析、處理和存放。2022-3-742(1 1)計數(shù)控制法)計數(shù)控制法 依據(jù)計數(shù)器的值來決定循環(huán)次數(shù),一般為減依據(jù)計數(shù)器的值來決定循環(huán)次數(shù),一般為

37、減1 1計數(shù)器,計數(shù)計數(shù)器,計數(shù)器減到器減到“0 0”時,結束循環(huán)。計數(shù)器初值在初始化設定。時,結束循環(huán)。計數(shù)器初值在初始化設定。 MCS-51 MCS-51指令系統(tǒng)提供了功能極強的循環(huán)控制指令:指令系統(tǒng)提供了功能極強的循環(huán)控制指令: DJNZ R DJNZ Rn n,relrel ;以工作寄存器作控制計數(shù)器;以工作寄存器作控制計數(shù)器 DJNZ direct DJNZ direct,relrel ;以直接尋址單元作控制計數(shù)器;以直接尋址單元作控制計數(shù)器 2022-3-743【例例】將內部將內部RAMRAM的的30H30H至至3FH3FH單元初始化為單元初始化為00H00H。MAIN:MOV R

38、0,#30H ;R0MAIN:MOV R0,#30H ;R0用作地址指針,置地址初值用作地址指針,置地址初值 MOV R7,#16 ; MOV R7,#16 ;計數(shù)值,計數(shù)值,1616個單元個單元 MOV A,#00H ; MOV A,#00H ;LOOP:MOV R0,A ;LOOP:MOV R0,A ;循環(huán)處理循環(huán)處理 INC R0 ;INC R0 ;指向下一個單元指向下一個單元 DJNZ R7,LOOP ; DJNZ R7,LOOP ;循環(huán)循環(huán) SJMP $ ;SJMP $ ;等待等待2022-3-744v 例:對例:對RAMRAM中中22H22H開始的開始的1010個單元的數(shù)據(jù)求和,個

39、單元的數(shù)據(jù)求和,v 并將求和的結果放在并將求和的結果放在21H21H單元中。單元中。 CLR A CLR A MOV R7, MOV R7,10 10 ;計數(shù)初值;計數(shù)初值 MOV R0, MOV R0,22H 22H ;R0R0作為數(shù)據(jù)單元指針作為數(shù)據(jù)單元指針 LOOP:ADD A,R0 LOOP:ADD A,R0 INC R0 INC R0 DJNZ R7,LOOP DJNZ R7,LOOP MOV MOV 21H21H,A ,A 2022-3-745(2 2)條件控制法)條件控制法 計數(shù)控制法只有在計數(shù)控制法只有在循環(huán)次數(shù)已知循環(huán)次數(shù)已知的情況下才適用。循環(huán)次的情況下才適用。循環(huán)次數(shù)未知

40、,不能用循環(huán)次數(shù)來控制,往往需要根據(jù)某種條件來判數(shù)未知,不能用循環(huán)次數(shù)來控制,往往需要根據(jù)某種條件來判斷是否應該結束循環(huán)。斷是否應該結束循環(huán)。 條件控制法:設置一個條件,判斷是否滿足該條件。如滿條件控制法:設置一個條件,判斷是否滿足該條件。如滿足,則循環(huán)結束;如不滿足該條件,則循環(huán)繼續(xù)。足,則循環(huán)結束;如不滿足該條件,則循環(huán)繼續(xù)。 2022-3-746【例例】將內部將內部RAMRAM起始地址為起始地址為60H60H的數(shù)據(jù)串傳送到外部的數(shù)據(jù)串傳送到外部RAMRAM中起始中起始地址為地址為1000H1000H的存儲區(qū)域,直到發(fā)現(xiàn)的存儲區(qū)域,直到發(fā)現(xiàn)$字符停止傳送。字符停止傳送。 MAIN:MOV

41、R0,#60H ; MAIN:MOV R0,#60H ;置初值置初值 MOV DPTR,#1000HMOV DPTR,#1000HLOOP0:MOV A,R0 ;LOOP0:MOV A,R0 ;取數(shù)據(jù)取數(shù)據(jù) CJNE A,#24H,LOOP1 ; CJNE A,#24H,LOOP1 ;循環(huán)結束?循環(huán)結束? SJMP DONE ; SJMP DONE ;是是LOOP1:MOVX DPTR,A ;LOOP1:MOVX DPTR,A ;把把A A的內容傳到片外的內容傳到片外 INC R0 ;INC R0 ;片內:指向下一個單元片內:指向下一個單元 INC DPTR ;INC DPTR ;片外:指向下

42、一個單元片外:指向下一個單元 SJMP LOOP0 ; SJMP LOOP0 ;繼續(xù)循環(huán)繼續(xù)循環(huán) DONE:SJMP DONE ; DONE:SJMP DONE ;等待等待2022-3-747【例例4-13】 一串字符,依次存放在內部一串字符,依次存放在內部RAM從從30H單元開單元開始的單元中,字符串以始的單元中,字符串以0AH為結束標志,測試字符串的長度。為結束標志,測試字符串的長度。 采用逐個字符依次與采用逐個字符依次與“0AH”比較(設置的條件)的方法。比較(設置的條件)的方法。設置一個累計字符串長度的計數(shù)器和一個指向字符串的指針。設置一個累計字符串長度的計數(shù)器和一個指向字符串的指針。

43、 如果字符與如果字符與“0AH”不等,則長度計數(shù)器和字符串指針都加不等,則長度計數(shù)器和字符串指針都加1;如果比較相等,則表示該字符為;如果比較相等,則表示該字符為“0AH”,字符串結束,計,字符串結束,計數(shù)器值就是字符串的長度。程序如下:數(shù)器值就是字符串的長度。程序如下:2022-3-748MOVR4,#0FFH;長度計數(shù)器初值送;長度計數(shù)器初值送R4MOV R1,#2FH;字符串指針初值送;字符串指針初值送R1NEXT: INC R4INC R1CJNE R1,#0AH,NEXT;比較,不等則進行下一;比較,不等則進行下一 ;字符比較;字符比較END 上面兩例都是在一個循環(huán)程序中不再包含其他

44、循環(huán)程序,則稱該循上面兩例都是在一個循環(huán)程序中不再包含其他循環(huán)程序,則稱該循環(huán)程序為環(huán)程序為單重循環(huán)單重循環(huán)。如果一個循環(huán)程序中包含了其他循環(huán)程序,則稱為。如果一個循環(huán)程序中包含了其他循環(huán)程序,則稱為多重循環(huán)多重循環(huán)。 常見的多重循環(huán)是由常見的多重循環(huán)是由DJNZ指令構成的軟件延時程序,是常用程序指令構成的軟件延時程序,是常用程序之一。之一。2022-3-749【例例4-14】 50ms的延時程序。的延時程序。 在使用在使用12MHz晶振時,一個機器周期為晶振時,一個機器周期為1s,執(zhí)行一條,執(zhí)行一條DJNZ指令的指令的時間為時間為2s。可用。可用多重循環(huán)的方法的延時的延時50ms程序:程序:

45、 DEL: MOV R7,#200 ;本指令執(zhí)行時間;本指令執(zhí)行時間1s DEL1:MOV R6,#125;本指令執(zhí)行時間;本指令執(zhí)行時間1s DEL2:DJNZ R6,DEL2 ;指令執(zhí)行;指令執(zhí)行1次為次為2s,共,共 ; 1252 s=250s DJNZ R7,DEL1 ;指令執(zhí)行時間;指令執(zhí)行時間2s,本循環(huán)體執(zhí)行,本循環(huán)體執(zhí)行125次次 RET ;指令執(zhí)行時間;指令執(zhí)行時間2s2022-3-750 以上延時程序以上延時程序不是太精確,把所有指令的執(zhí)行時間計,把所有指令的執(zhí)行時間計算在內,其延時時間為算在內,其延時時間為1+(1+250+2) 200+2s=50.603ms, 如要求比較精確的延時,應對上述

溫馨提示

  • 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

提交評論