




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、2022-5-81第第4 4章章 89S5189S51的匯編語言程序設(shè)計(jì)的匯編語言程序設(shè)計(jì) 程序編制的程序編制的方法方法和和技巧技巧4.1 源程序的源程序的編輯編輯和和匯編匯編4.2 基本基本程序結(jié)構(gòu)程序結(jié)構(gòu)4.3 子程序子程序及其調(diào)用及其調(diào)用4.42022-5-82 單片機(jī)應(yīng)用系統(tǒng)由單片機(jī)應(yīng)用系統(tǒng)由硬件系統(tǒng)硬件系統(tǒng)和和應(yīng)用程序應(yīng)用程序構(gòu)成。構(gòu)成。 匯編語言匯編語言 高級語言高級語言 ( (例如,例如,C C語言語言) ) 應(yīng)用程序設(shè)計(jì)方法應(yīng)用程序設(shè)計(jì)方法 匯編語言匯編語言,生成的目標(biāo)程序占內(nèi)存空間少、運(yùn)行速,生成的目標(biāo)程序占內(nèi)存空間少、運(yùn)行速度快,具有效率高、實(shí)時(shí)性強(qiáng)的特點(diǎn)。度快,具有效率高
2、、實(shí)時(shí)性強(qiáng)的特點(diǎn)。 高級語言高級語言,對系統(tǒng)的描述與實(shí)現(xiàn)與人的思維相似,程序,對系統(tǒng)的描述與實(shí)現(xiàn)與人的思維相似,程序閱讀、修改和移植方便,適合于編寫復(fù)雜的程序。閱讀、修改和移植方便,適合于編寫復(fù)雜的程序。 2022-5-834.1 程序編制的方法和技巧程序編制的方法和技巧4.1.1 4.1.1 程序編制的步驟程序編制的步驟 明確任務(wù):功能要求、技術(shù)指標(biāo)明確任務(wù):功能要求、技術(shù)指標(biāo) 運(yùn)行環(huán)境調(diào)研運(yùn)行環(huán)境調(diào)研 任務(wù)分析任務(wù)分析 將實(shí)際問題轉(zhuǎn)化為計(jì)算機(jī)處理的程序算法。將實(shí)際問題轉(zhuǎn)化為計(jì)算機(jī)處理的程序算法。 算法比較與優(yōu)化(內(nèi)存需求、運(yùn)行速度、效率)。算法比較與優(yōu)化(內(nèi)存需求、運(yùn)行速度、效率)。 算法
3、設(shè)計(jì)算法設(shè)計(jì)2022-5-84 強(qiáng)化模塊觀念強(qiáng)化模塊觀念使程序結(jié)構(gòu)清晰。使程序結(jié)構(gòu)清晰。簡化代碼。簡化代碼。程序模塊(主程序模塊、各種子程序模塊)程序模塊(主程序模塊、各種子程序模塊)模塊化優(yōu)點(diǎn):分塊設(shè)計(jì)、層次清晰、便于接口。模塊化優(yōu)點(diǎn):分塊設(shè)計(jì)、層次清晰、便于接口。4.1.2 4.1.2 程序編制的方法和技巧程序編制的方法和技巧 采用循環(huán)和子程序的優(yōu)點(diǎn)采用循環(huán)和子程序的優(yōu)點(diǎn)注意:注意:1 1、循環(huán)初值和結(jié)束條件,避免、循環(huán)初值和結(jié)束條件,避免“死循環(huán)死循環(huán)”現(xiàn)象?,F(xiàn)象。 2 2、子程序的現(xiàn)場保護(hù)。、子程序的現(xiàn)場保護(hù)。2022-5-854.1.3 4.1.3 匯編語言的語句格式匯編語言的語句格
4、式標(biāo)號代表本行程序所在的地址。標(biāo)號代表本行程序所在的地址。標(biāo)號由標(biāo)號由18個(gè)個(gè)ASCII碼字符組成,第一個(gè)字符必須是字母。碼字符組成,第一個(gè)字符必須是字母。不能用已定義的關(guān)鍵字(指令助記符、偽指令等)。不能用已定義的關(guān)鍵字(指令助記符、偽指令等)。同一標(biāo)號在一個(gè)程序中只能定義一次,不能重復(fù)定義。同一標(biāo)號在一個(gè)程序中只能定義一次,不能重復(fù)定義。標(biāo)號后跟英文冒號標(biāo)號后跟英文冒號“:”:”。 標(biāo)號(即符號地址)標(biāo)號(即符號地址)標(biāo)號: 指令助記符指令助記符 操作數(shù)1, 操作數(shù)2, 操作數(shù)3, ;注釋2022-5-86數(shù)據(jù):二進(jìn)制(數(shù)據(jù):二進(jìn)制(B B) 十進(jìn)制(十進(jìn)制(D D或省略或省略D D) 十
5、六進(jìn)制(十六進(jìn)制(H H)。)。 注意:若十六進(jìn)制操作數(shù)以字符AF開頭,需在它前面加一個(gè) “0”,以便匯編時(shí)把它和標(biāo)號區(qū)分開。v 符號:符號名、標(biāo)號或符號:符號名、標(biāo)號或“$”$”。v 表達(dá)式:由運(yùn)算符和數(shù)據(jù)構(gòu)成。表達(dá)式:由運(yùn)算符和數(shù)據(jù)構(gòu)成。 操作數(shù)操作數(shù)2022-5-87 注釋注釋英文分號英文分號“;”;”開頭。開頭。匯編時(shí),遇到匯編時(shí),遇到“;” ” 就停止就停止“翻譯翻譯”。因此,注釋字。因此,注釋字段不會產(chǎn)生機(jī)器代碼。段不會產(chǎn)生機(jī)器代碼。2022-5-884.2.1 4.2.1 偽指令偽指令4.2 源程序的編輯源程序的編輯4.2.2 4.2.2 源程序的編輯源程序的編輯2022-5-8
6、94.2.1 4.2.1 偽指令偽指令偽指令:用于指導(dǎo)匯編工作。偽指令:用于指導(dǎo)匯編工作。匯編后,偽指令沒有與之對應(yīng)的機(jī)器代碼。匯編后,偽指令沒有與之對應(yīng)的機(jī)器代碼。 起始地址設(shè)定偽指令起始地址設(shè)定偽指令ORGORGORG ORG 表達(dá)式表達(dá)式表達(dá)式通常為十六進(jìn)制地址,例:表達(dá)式通常為十六進(jìn)制地址,例: ORG 8000HSTART:MOV A,#30H ORG ORG可多次使用,但地址值的順序要由小到大??啥啻问褂茫刂分档捻樞蛞尚〉酱?。2022-5-810 結(jié)束匯編偽指令結(jié)束匯編偽指令ENDENDEND該偽指令位于源程序的最后一行,表示匯編到此結(jié)束。該偽指令位于源程序的最后一行,表示匯
7、編到此結(jié)束。整個(gè)源程序中只能有一條整個(gè)源程序中只能有一條ENDEND命令,且位于程序的最后。命令,且位于程序的最后。對于對于ENDEND之后的程序,將不進(jìn)行匯編處理。之后的程序,將不進(jìn)行匯編處理。2022-5-811 定義字節(jié)數(shù)據(jù)表偽指令定義字節(jié)數(shù)據(jù)表偽指令DBDB定義字?jǐn)?shù)據(jù)表偽指令定義字?jǐn)?shù)據(jù)表偽指令DWDW1000H 標(biāo)號:標(biāo)號: DB DB 字節(jié)數(shù)據(jù)表字節(jié)數(shù)據(jù)表ORG 1000HORG 1000HDB -2,-4,-6,8,10,18DB -2,-4,-6,8,10,18FEH FCHFAH08H0AH12H1001H 標(biāo)號:標(biāo)號: DW DW 字?jǐn)?shù)據(jù)表字?jǐn)?shù)據(jù)表 ORG 1400H ORG
8、 1400HDATA1:DW 32DATA1:DW 324A4AH,3CH H,3CH 1400H32H 4AH00H3CH1401H1402H1403H注意:字母按注意:字母按ASCIIASCII碼存儲。碼存儲。2022-5-812 預(yù)留空間偽指令預(yù)留空間偽指令DSDS 標(biāo)號:標(biāo)號: DS DS 預(yù)留空間字節(jié)數(shù)預(yù)留空間字節(jié)數(shù) ORG 2000H ORG 2000HTAB1TAB1:DB 12HDB 12H,34H34H DS 4H DS 4H DB 5 DB 512H34H-35H3000H3001H3002H3003H3004H3005H3006H2022-5-813 定義常量值的偽指令定
9、義常量值的偽指令EQUEQU符號名符號名 EQU EQU 常值表達(dá)式常值表達(dá)式 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-5-814 位定義命令位定義命令 BITBIT用于給字符名稱賦予位地址,位地址可以是絕對位地址,用于給字符名稱賦予位地址,位地址可以是絕對位地址,也可是符號地址。也可是符號地址。例如:例如:LEDLEDBIT P1.6BIT P1.6功能
10、是把功能是把P1.6P1.6的位地址賦給變量的位地址賦給變量LEDLED。2022-5-8154.2.2 4.2.2 源程序的編輯源程序的編輯 源程序的編輯源程序的編輯 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 $ ENDEND依據(jù)匯編語言規(guī)則依據(jù)匯編語言規(guī)則用好用好偽指令偽指令符號符號不用中文不用中文匯編程序以匯編程序以.ASM.ASM存盤存盤2022-5-8164.3.1 4.3.1 順序程序順序程序(無分
11、支、無循環(huán))(無分支、無循環(huán))4.3 基本程序結(jié)構(gòu)基本程序結(jié)構(gòu) ORG 0040HORG 0040HSTART:MOV A,21H ;START:MOV A,21H ;取取21H21H的內(nèi)容的內(nèi)容 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的內(nèi)容的內(nèi)容 ANL A,#0FH ; ANL A,#0FH ;保留低半字節(jié)保留低半字節(jié) ORL 20H,A ; ORL 20H
12、,A ;合并到結(jié)果單元合并到結(jié)果單元 SJMP $ SJMP $ ;等待;等待 END END2022-5-8174.3.2 4.3.2 分支程序分支程序(雙分支)(雙分支)【例例】實(shí)現(xiàn)兩個(gè)實(shí)現(xiàn)兩個(gè)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 MOV R3,#00H ; MOV R3,#00H ;結(jié)果小于結(jié)果小于255255時(shí),高字節(jié)時(shí),高字節(jié)R3R3
13、內(nèi)容為內(nèi)容為00H00H SJMP PP2 SJMP PP2 PP1:MOV R3,#01H ; PP1:MOV R3,#01H ;結(jié)果大于結(jié)果大于255255時(shí),高字節(jié)時(shí),高字節(jié)R3R3內(nèi)容為內(nèi)容為01H01H PP2:MOV R4,A ; PP2:MOV R4,A ;結(jié)果的低字節(jié)在結(jié)果的低字節(jié)在R4R4中中 RETRET入口入口: :(R3R3)= =加數(shù);加數(shù); (R4R4)= =被加數(shù)。被加數(shù)。出口出口: :(R3R3)= =和的高字節(jié);和的高字節(jié); (R4R4)= =和的低字節(jié)。和的低字節(jié)。2022-5-818【例例】求單字節(jié)有符號數(shù)的二進(jìn)制補(bǔ)碼。求單字節(jié)有符號數(shù)的二進(jìn)制補(bǔ)碼。 正數(shù)
14、補(bǔ)碼是其本身,負(fù)數(shù)補(bǔ)碼是其反碼加正數(shù)補(bǔ)碼是其本身,負(fù)數(shù)補(bǔ)碼是其反碼加1。因此,應(yīng)首先判被轉(zhuǎn)換。因此,應(yīng)首先判被轉(zhuǎn)換數(shù)的符號,負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)本身即為補(bǔ)碼。數(shù)的符號,負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)本身即為補(bǔ)碼。設(shè)二進(jìn)制數(shù)放在設(shè)二進(jìn)制數(shù)放在A中,其補(bǔ)碼放回到中,其補(bǔ)碼放回到A中。參考程序如下:中。參考程序如下: CMPT: JNB Acc.7,RETURN ;(A)0,不需轉(zhuǎn)換,不需轉(zhuǎn)換 MOV C,Acc.7 ;符號位保存;符號位保存 CPL A ;(A)求反,加求反,加1 ADD A,#1 MOV Acc.7,C ;符號位存在;符號位存在A的最高位的最高位RETURN:RET2022-5-8194.3.
15、2 4.3.2 分支程序分支程序(多分支)(多分支) 多分支結(jié)構(gòu)是程序中常見的結(jié)構(gòu),在多分支結(jié)多分支結(jié)構(gòu)是程序中常見的結(jié)構(gòu),在多分支結(jié)構(gòu)的程序中,能夠按調(diào)用號執(zhí)行相應(yīng)的功能,完成構(gòu)的程序中,能夠按調(diào)用號執(zhí)行相應(yīng)的功能,完成指定操作。指定操作。 若給出若給出調(diào)用號調(diào)用號來調(diào)用子程序,一般用查表方法,來調(diào)用子程序,一般用查表方法,查到查到子程序的地址子程序的地址,轉(zhuǎn)到相應(yīng),轉(zhuǎn)到相應(yīng)子程序子程序。2022-5-820指令系統(tǒng)提供了非常有用的兩種多分支選擇指令:間接轉(zhuǎn)移指令間接轉(zhuǎn)移指令 JMP A+DPTR比較轉(zhuǎn)移指令 CJNE A,direct,rel CJNE A,#data,rel CJNE R
16、n,#data,rel CJNE Ri,#data,rel 間接轉(zhuǎn)移指令“JMP A+DPTR”由數(shù)據(jù)指針DPTR決定決定多分支轉(zhuǎn)移程序的首地址,由A的內(nèi)容選擇對應(yīng)分支。 4條比較轉(zhuǎn)移指令CJNE能對兩個(gè)欲比較的單元內(nèi)容進(jìn)行比較,當(dāng)不相等時(shí),程序?qū)崿F(xiàn)相對轉(zhuǎn)移;若兩者相等,則順序往下執(zhí)行。2022-5-821【例例】設(shè)變量設(shè)變量x x存放在片內(nèi)存放在片內(nèi)RAMRAM的的30H30H單元,變量單元,變量y y與與x x的關(guān)系的關(guān)系是是: : 當(dāng)當(dāng)x x大于大于0 0時(shí)時(shí),y=x;,y=x; 當(dāng)當(dāng)x=0 x=0時(shí)時(shí),y=20H;,y=20H; 當(dāng)當(dāng)x x小于小于0 0時(shí)時(shí),y=x+5,y=x+5。編
17、制程序編制程序, ,根據(jù)根據(jù)x x的大小求的大小求y y,并送回原單元。并送回原單元。2022-5-822 ORG 0040HORG 0040HSTART:MOV A,30H ;START:MOV A,30H ;取取x x至累加器至累加器 JZ NEXTJZ NEXT ;x = 0, ;x = 0,轉(zhuǎn)轉(zhuǎn)NEXTNEXT ANL A,#80H ; ANL A,#80H ;否,保留符號位否,保留符號位 JZ DONEJZ DONE ;x 0, ;x 0,轉(zhuǎn)結(jié)束轉(zhuǎn)結(jié)束 MOV A,#05H ;x 0MOV A,#05H ;x 0X 0X = 00-12022-5-824程序如下:程序如下:SIGNF
18、UC: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-5-825【例例】根據(jù)根據(jù)R7R7的內(nèi)容的內(nèi)容x x(轉(zhuǎn)移序號)轉(zhuǎn)向相應(yīng)的處理程序。(轉(zhuǎn)移序號)轉(zhuǎn)向相應(yīng)的處理程序。設(shè)設(shè)R7R7內(nèi)容為內(nèi)容為0 04 4,對應(yīng)的處理程序入口地址分別為,對應(yīng)的處理程序入口地址分別為PP0PP0PP4PP4。 2022-5-826 START:MOV R7,#3 ; START:MOV R7,#3 ;轉(zhuǎn)移序號為轉(zhuǎn)移序號為3
19、 3,欲轉(zhuǎn)向,欲轉(zhuǎn)向PP3PP3 ACALL JPNUM ;ACALL JPNUM ;子程序調(diào)用子程序調(diào)用 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,調(diào)整偏移量(,調(diào)整偏移量(3x2=63x2=6) MOV R3,A ;A=R3=6MOV R3,A ;A=R3=6 MOVC A,A+DPTR ; MOVC A,A+DPTR ;先取先取PP3PP3的高字節(jié)
20、(的高字節(jié)(PP3PP3是是DWDW) XCH A,R3 ; XCH A,R3 ;高字節(jié)暫存于高字節(jié)暫存于R3R3 INC A ; INC A ;增增1 1后,后,A=7A=7,指向下一個(gè),指向下一個(gè) 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 ;處理程序入口地址高處理程序入口地址高8 8位送位送DPHDPH CLR A ;DPTR CLR A ;DPTR指向指向PP3PP3地址地址
21、JMP A+DPTRJMP A+DPTR ; ;跳轉(zhuǎn)向跳轉(zhuǎn)向PP3PP3服務(wù)程序服務(wù)程序2022-5-827 TAB:DW PP0 ; TAB TAB:DW PP0 ; TAB是轉(zhuǎn)移地址表是轉(zhuǎn)移地址表 DW PP1 DW PP1 DW PP2 DW PP2 DW PP3DW PP3 DW PP4 DW PP4 PP0:MOV 30H,#0 ; PP0:MOV 30H,#0 ;轉(zhuǎn)移序號為轉(zhuǎn)移序號為0 0時(shí)時(shí), ,置功能號置功能號“0”0”于于30H30H單單元元 RETRET PP1:MOV 30H,#1 ; PP1:MOV 30H,#1 ;轉(zhuǎn)移序號為轉(zhuǎn)移序號為1 1時(shí)時(shí), ,置功能號置功能號“
22、1”1”于于30H30H單單元元 RETRET PP2:MOV 30H,#2 ; PP2:MOV 30H,#2 ;轉(zhuǎn)移序號為轉(zhuǎn)移序號為2 2時(shí)時(shí), ,置功能號置功能號“2”2”于于30H30H單單元元 RETRET PP3:MOV 30H,#3PP3:MOV 30H,#3 ; ;轉(zhuǎn)移序號為轉(zhuǎn)移序號為3 3時(shí)時(shí), ,置功能號置功能號“3”3”于于30H30H單單元元 RETRET PP4:MOV 30H,#4 ; PP4:MOV 30H,#4 ;轉(zhuǎn)移序號為轉(zhuǎn)移序號為4 4時(shí)時(shí), ,置功能號置功能號“4”4”于于30H30H單單元元 RETRET 2022-5-8284.3.3 4.3.3 查表程
23、序查表程序【例4-3】 設(shè)計(jì)一子程序,功能是根據(jù)累加器設(shè)計(jì)一子程序,功能是根據(jù)累加器A中的數(shù)中的數(shù)x(09之間)之間)查查x的平方表的平方表y,根據(jù),根據(jù)x的值查出相應(yīng)的平方的值查出相應(yīng)的平方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-5-829 指令指令“ADD A,#01H”的作用是的作用是A中的內(nèi)容加上中的內(nèi)容加上 “01H”, “01H”即為查表指令與平方表之間的即為查表指令與平方表之間的“R
24、ET”指令所占的字節(jié)數(shù)。指令所占的字節(jié)數(shù)。加上加上 “01H”后,可保證后,可保證PC指向表首,累加器指向表首,累加器A中原來的內(nèi)容僅是從中原來的內(nèi)容僅是從表首開始向下查找多少個(gè)單元。表首開始向下查找多少個(gè)單元。 在進(jìn)入程序前,在進(jìn)入程序前,A的內(nèi)容在的內(nèi)容在0009H之間,如之間,如A中的內(nèi)容為中的內(nèi)容為02H,它的平方為它的平方為04H,可根據(jù),可根據(jù)A的內(nèi)容查出的內(nèi)容查出x的平方。的平方。 指令指令“MOVC A,A+DPTR” 應(yīng)用范圍較廣,使用該指令應(yīng)用范圍較廣,使用該指令時(shí)不必計(jì)算偏移量,優(yōu)點(diǎn)是表格可以設(shè)在時(shí)不必計(jì)算偏移量,優(yōu)點(diǎn)是表格可以設(shè)在64KB程序存儲器空間內(nèi)的程序存儲器空間
25、內(nèi)的任何地方,而不像任何地方,而不像“MOVC A,A+PC”那樣只設(shè)在那樣只設(shè)在PC下面的下面的256個(gè)單元中,所以使用較方便。個(gè)單元中,所以使用較方便。2022-5-830 如果如果DPTR已被使用,則在查表前必須保護(hù)已被使用,則在查表前必須保護(hù)DPTR,且結(jié)束后恢,且結(jié)束后恢復(fù)復(fù)DPTR,例,例4-3可改成如下形式:可改成如下形式: PUSH DPH ;保存;保存DPH PUSH DPL ;保存;保存DPL MOV DPTR,#TAB1MOVC A,A+DPTRPOP DPL ;恢復(fù);恢復(fù)DPLPOP DPH ;恢復(fù);恢復(fù)DPHRETTAB1: DB 00H,01H,04H,09H,10
26、H;平方表;平方表 DB 19H,24H,31H,40H,51H2022-5-831 【例4-4】有一巡回檢測報(bào)警裝置,需對有一巡回檢測報(bào)警裝置,需對16路(路(x)輸)輸入進(jìn)行檢測,每路有一個(gè)最大允許值(入進(jìn)行檢測,每路有一個(gè)最大允許值(y),為雙字節(jié)數(shù)。),為雙字節(jié)數(shù)。需根據(jù)測量的路數(shù)(需根據(jù)測量的路數(shù)(x),查表找出對應(yīng)該路的最大允許值),查表找出對應(yīng)該路的最大允許值(y),看輸入值是否大于最大允許值,如果大于就報(bào)警。),看輸入值是否大于最大允許值,如果大于就報(bào)警。 取路數(shù)為取路數(shù)為x(0 x15),),y為最大允許值,放在表為最大允許值,放在表格中。設(shè)進(jìn)入查表程序前,假設(shè)路數(shù)格中。設(shè)進(jìn)
27、入查表程序前,假設(shè)路數(shù)x已放于已放于R2中,查表后中,查表后該路的最大允許值該路的最大允許值y放于放于R3R4中。查表的程序如下:中。查表的程序如下: 理解:根據(jù)路數(shù)理解:根據(jù)路數(shù)x,查最大允許值,查最大允許值y。2022-5-832 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 ;查第二字節(jié);查第二字節(jié) MOVR4,ARETTAB3: DW 1520,3721,42645,7580 ;最大;最大
28、值表值表 DW 3483,32657,883,9943DW 10000,40511,6758,8931DW 4468,5871,13284,278082022-5-833 表格長度不能超過表格長度不能超過256B256B,且表格只能存放于,且表格只能存放于“MOVC AMOVC A,A+PCA+PC”指令以下的指令以下的256256個(gè)單元中,如需把表格放在程序存儲器個(gè)單元中,如需把表格放在程序存儲器空間的任何地方,應(yīng)使用指令空間的任何地方,應(yīng)使用指令“MOVC AMOVC A,A+DPTRA+DPTR”?!纠?-54-5】 以以AT89S51AT89S51為核心的溫度控制器,溫度傳感器為核心
29、的溫度控制器,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已由輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已由A/DA/D轉(zhuǎn)換為轉(zhuǎn)換為1010位二進(jìn)制數(shù)。測得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一位二進(jìn)制數(shù)。測得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,表中溫度值為個(gè)表,表中溫度值為y y(雙字節(jié)無符號數(shù)),(雙字節(jié)無符號數(shù)),x x(雙字節(jié)無符號(雙字節(jié)無符號數(shù))為電壓值數(shù)據(jù)。設(shè)測得電壓值數(shù))為電壓值數(shù)據(jù)。設(shè)測得電壓值x x放入放入R2R3R2R3中,根據(jù)電壓值中,根據(jù)電壓值x x,查找對應(yīng)的溫度值查找對應(yīng)的溫度值y y,仍放入,仍放入R2R3R2R3中。參考程序:中。參考程序:理解:根據(jù)電
30、壓值理解:根據(jù)電壓值x,查溫度值,查溫度值y。2022-5-834 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-5-835MOVC A,A+DPTR ;查第一字節(jié);查第一字節(jié)MOVR2,A ;第一字節(jié)存入;第一字節(jié)存入R2中中CLRAINCDPTRMOVC A,A+DPTR ;查第二字節(jié);查第二字節(jié)MOVR3,A ;第二字節(jié)存入;第二字節(jié)存入R3中中RET
31、TAB2: DW, , ;溫度值表;溫度值表 由于使用了指令由于使用了指令“MOVC A,A+DPTR”,表,表TAB2可放入可放入64KB程序存儲器空間任何位置,表格的長度可大于程序存儲器空間任何位置,表格的長度可大于256B。2022-5-8364.3.4 4.3.4 查找關(guān)鍵字查找關(guān)鍵字在表中查找關(guān)鍵字的操作,也稱為數(shù)據(jù)檢索。在表中查找關(guān)鍵字的操作,也稱為數(shù)據(jù)檢索。【例4-6】 從從50個(gè)字節(jié)的表中查找一個(gè)關(guān)鍵字個(gè)字節(jié)的表中查找一個(gè)關(guān)鍵字“xxH”。ORG1000HMOV30H,#xxH ;關(guān)鍵字;關(guān)鍵字xxH送送30H單元單元MOVR1,#50 ;查找次數(shù)送;查找次數(shù)送R1MOVA,#
32、14;修正值送;修正值送AMOV DPTR,#TAB4 ;表首地址送;表首地址送DPTR2022-5-837LOOP:PUSH AccMOVC A, A+PC;查表結(jié)果送;查表結(jié)果送A CJNE A,40H,LOOP1;(40H)不等于關(guān)鍵字則轉(zhuǎn)不等于關(guān)鍵字則轉(zhuǎn)LOOP1 MOV R2,DPH;查到關(guān)鍵字,把地址送;查到關(guān)鍵字,把地址送R2,R3MOV R3,DPLDONE: RETLOOP1:POP Acc;修正值彈出;修正值彈出INC A;A+1AINC DPTR;修改數(shù)據(jù)指針;修改數(shù)據(jù)指針DPTRDJNZ R1,LOOP;R10,未查完,繼續(xù)查,未查完,繼續(xù)查找找MOVR2,#00H;R
33、1=0,R2和和R3清清0MOVR3,#00H;表中;表中50個(gè)數(shù)已查完個(gè)數(shù)已查完AJMPDONE;從子程序返回;從子程序返回 TAB4:DB ,;50個(gè)數(shù)據(jù)表個(gè)數(shù)據(jù)表2022-5-8384.3.5 4.3.5 查找最值查找最值 【例例4-7】片內(nèi)片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)于首地址中。設(shè)R0中存放首地址,中存放首地址,R2中存放字節(jié)數(shù)。中存放字節(jié)數(shù)。 程序如下:程序如下: MOV R2,n ;n為要比較的數(shù)據(jù)字節(jié)數(shù)為要比較的數(shù)據(jù)字節(jié)數(shù) MOV A, R0 ;存首地址指針;存首地址指針 MOV R1,A DEC R2 MOV A,
34、R12022-5-839LOOP:MOV R3, ADEC R1CLR CSUBB A,R1 ;兩個(gè)數(shù)比較;兩個(gè)數(shù)比較JNC LOOP1 ;C=0,A中數(shù)大,跳中數(shù)大,跳LOOP1MOV A,R1 ;C=1,則大數(shù)送,則大數(shù)送ASJMP LOOP2LOOP1:MOV A,R3 LOOP2:DJNZ R2, LOOP ;是否比較結(jié)束?;是否比較結(jié)束?MOV R0, A ;存最大數(shù);存最大數(shù) RET2022-5-840【例例】將內(nèi)部將內(nèi)部RAMRAM的的30H30H至至3FH3FH單元初始化為單元初始化為00H00H。MOV 30H,#00H ;MOV 30H,#00H ;MOV 31H,#00H
35、 ;MOV 31H,#00H ;MOV 3EH,#00H ;MOV 3EH,#00H ;MOV 3FH,#00H ;MOV 3FH,#00H ;2022-5-8414.3.6 4.3.6 循環(huán)程序循環(huán)程序1 1循環(huán)程序的結(jié)構(gòu):循環(huán)程序的結(jié)構(gòu):主要由以下四部分組成。主要由以下四部分組成。(1 1)循環(huán)初始化)循環(huán)初始化完成循環(huán)前的準(zhǔn)備工作。例如,設(shè)置循環(huán)控制計(jì)數(shù)完成循環(huán)前的準(zhǔn)備工作。例如,設(shè)置循環(huán)控制計(jì)數(shù)初值、起始地址、變量初值等。初值、起始地址、變量初值等。(2 2)循環(huán)體)循環(huán)體完成實(shí)際的處理工作,反復(fù)執(zhí)行循環(huán)體。完成實(shí)際的處理工作,反復(fù)執(zhí)行循環(huán)體。(3 3)循環(huán)控制)循環(huán)控制在重復(fù)執(zhí)行循環(huán)
36、體的過程中,不斷修改循環(huán)控制變在重復(fù)執(zhí)行循環(huán)體的過程中,不斷修改循環(huán)控制變量,直到符合結(jié)束條件,就結(jié)束循環(huán)體的執(zhí)行。量,直到符合結(jié)束條件,就結(jié)束循環(huán)體的執(zhí)行。循環(huán)結(jié)束的控制方法有循環(huán)結(jié)束的控制方法有計(jì)數(shù)控制法計(jì)數(shù)控制法和和條件控制法條件控制法。(4 4)循環(huán)結(jié)束)循環(huán)結(jié)束對循環(huán)程序執(zhí)行的結(jié)果進(jìn)行分析、處理和存放。對循環(huán)程序執(zhí)行的結(jié)果進(jìn)行分析、處理和存放。2022-5-842(1 1)計(jì)數(shù)控制法)計(jì)數(shù)控制法 依據(jù)計(jì)數(shù)器的值來決定循環(huán)次數(shù),一般為減依據(jù)計(jì)數(shù)器的值來決定循環(huán)次數(shù),一般為減1 1計(jì)數(shù)器,計(jì)數(shù)計(jì)數(shù)器,計(jì)數(shù)器減到器減到“0 0”時(shí),結(jié)束循環(huán)。計(jì)數(shù)器初值在初始化設(shè)定。時(shí),結(jié)束循環(huán)。計(jì)數(shù)器初值
37、在初始化設(shè)定。 MCS-51 MCS-51指令系統(tǒng)提供了功能極強(qiáng)的循環(huán)控制指令:指令系統(tǒng)提供了功能極強(qiáng)的循環(huán)控制指令: DJNZ DJNZ R Rn n,relrel ;以工作寄存器作控制計(jì)數(shù)器;以工作寄存器作控制計(jì)數(shù)器 DJNZ direct DJNZ direct,relrel ;以直接尋址單元作控制計(jì)數(shù)器;以直接尋址單元作控制計(jì)數(shù)器 2022-5-843【例例】將內(nèi)部將內(nèi)部RAMRAM的的30H30H至至3FH3FH單元初始化為單元初始化為00H00H。MAIN:MOV R0,#30H ;R0MAIN:MOV R0,#30H ;R0用作地址指針,置地址初值用作地址指針,置地址初值 MOV
38、 R7,#16 ; MOV R7,#16 ;計(jì)數(shù)值,計(jì)數(shù)值,1616個(gè)單元個(gè)單元 MOV A,#00H ; MOV A,#00H ;LOOP:MOV R0,A ;LOOP:MOV R0,A ;循環(huán)處理循環(huán)處理 INC R0 ;INC R0 ;指向下一個(gè)單元指向下一個(gè)單元 DJNZ R7,LOOP ; DJNZ R7,LOOP ;循環(huán)循環(huán) SJMP $ ;SJMP $ ;等待等待2022-5-844 例:對例:對RAMRAM中中22H22H開始的開始的1010個(gè)單元的數(shù)據(jù)求和,個(gè)單元的數(shù)據(jù)求和, 并將求和的結(jié)果放在并將求和的結(jié)果放在21H21H單元中。單元中。 CLR A CLR A MOV R
39、7, MOV R7,10 10 ;計(jì)數(shù)初值;計(jì)數(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-5-845(2 2)條件控制法)條件控制法 計(jì)數(shù)控制法只有在計(jì)數(shù)控制法只有在循環(huán)次數(shù)已知循環(huán)次數(shù)已知的情況下才適用。循環(huán)次的情況下才適用。循環(huán)次數(shù)未知,不能用循環(huán)次數(shù)來控制,往往需要根據(jù)某種條件來判數(shù)未知,不能用循環(huán)次數(shù)來控制,往往需要根據(jù)某種條件來判斷是否應(yīng)該結(jié)束循環(huán)
40、。斷是否應(yīng)該結(jié)束循環(huán)。 條件控制法:設(shè)置一個(gè)條件,判斷是否滿足該條件。如滿條件控制法:設(shè)置一個(gè)條件,判斷是否滿足該條件。如滿足,則循環(huán)結(jié)束;如不滿足該條件,則循環(huán)繼續(xù)。足,則循環(huán)結(jié)束;如不滿足該條件,則循環(huán)繼續(xù)。 2022-5-846【例例】將內(nèi)部將內(nèi)部RAMRAM起始地址為起始地址為60H60H的數(shù)據(jù)串傳送到外部的數(shù)據(jù)串傳送到外部RAMRAM中起始中起始地址為地址為1000H1000H的存儲區(qū)域,直到發(fā)現(xiàn)的存儲區(qū)域,直到發(fā)現(xiàn)$字符停止傳送。字符停止傳送。 MAIN:MOV R0,#60H ; MAIN:MOV R0,#60H ;置初值置初值 MOV DPTR,#1000HMOV DPTR,#
41、1000HLOOP0:MOV A,R0 ;LOOP0:MOV A,R0 ;取數(shù)據(jù)取數(shù)據(jù) CJNE A,#24H,LOOP1 ; CJNE A,#24H,LOOP1 ;循環(huán)結(jié)束?循環(huán)結(jié)束? SJMP DONE ; SJMP DONE ;是是LOOP1:MOVX DPTR,A ;LOOP1:MOVX DPTR,A ;把把A A的內(nèi)容傳到片外的內(nèi)容傳到片外 INC R0 ;INC R0 ;片內(nèi):指向下一個(gè)單元片內(nèi):指向下一個(gè)單元 INC DPTR ;INC DPTR ;片外:指向下一個(gè)單元片外:指向下一個(gè)單元 SJMP LOOP0 ; SJMP LOOP0 ;繼續(xù)循環(huán)繼續(xù)循環(huán) DONE:SJMP D
42、ONE ; DONE:SJMP DONE ;等待等待2022-5-847【例例4-13】 一串字符,依次存放在內(nèi)部一串字符,依次存放在內(nèi)部RAM從從30H單元單元開始的單元中,字符串以開始的單元中,字符串以0AH為結(jié)束標(biāo)志,測試字符串的長度。為結(jié)束標(biāo)志,測試字符串的長度。 采用逐個(gè)字符依次與采用逐個(gè)字符依次與“0AH”比較(設(shè)置的條件)的方比較(設(shè)置的條件)的方法。設(shè)置一個(gè)累計(jì)字符串長度的計(jì)數(shù)器和一個(gè)指向字符串的指針。法。設(shè)置一個(gè)累計(jì)字符串長度的計(jì)數(shù)器和一個(gè)指向字符串的指針。 如果字符與如果字符與“0AH”不等,則長度計(jì)數(shù)器和字符串指針不等,則長度計(jì)數(shù)器和字符串指針都加都加1;如果比較相等,則
43、表示該字符為;如果比較相等,則表示該字符為“0AH”,字符串結(jié)束,字符串結(jié)束,計(jì)數(shù)器值就是字符串的長度。程序如下:計(jì)數(shù)器值就是字符串的長度。程序如下:2022-5-848MOVR4,#0FFH;長度計(jì)數(shù)器初值送;長度計(jì)數(shù)器初值送R4MOV R1,#2FH;字符串指針初值送;字符串指針初值送R1NEXT:INC R4INC R1CJNE R1,#0AH,NEXT;比較,不等則;比較,不等則進(jìn)行下一進(jìn)行下一 ;字符比較;字符比較END 上面兩例都是在一個(gè)循環(huán)程序中不再包含其他循環(huán)程序,則稱該上面兩例都是在一個(gè)循環(huán)程序中不再包含其他循環(huán)程序,則稱該循環(huán)程序?yàn)檠h(huán)程序?yàn)閱沃匮h(huán)單重循環(huán)。如果一個(gè)循環(huán)程
44、序中包含了其他循環(huán)程序,則稱。如果一個(gè)循環(huán)程序中包含了其他循環(huán)程序,則稱為為多重循環(huán)多重循環(huán)。 常見的多重循環(huán)是由常見的多重循環(huán)是由DJNZ指令構(gòu)成的軟件延時(shí)程序,是常用程指令構(gòu)成的軟件延時(shí)程序,是常用程序之一。序之一。2022-5-849【例例4-14】 50ms的延的延時(shí)程序。時(shí)程序。 在使用在使用12MHz晶振時(shí),一個(gè)機(jī)器周期為晶振時(shí),一個(gè)機(jī)器周期為1s,執(zhí)行一條,執(zhí)行一條DJNZ指指令的時(shí)間為令的時(shí)間為2s??捎谩?捎枚嘀匮h(huán)的方法的延時(shí)的延時(shí)50ms程序:程序: DEL: MOV R7,#200 ;本指令執(zhí)行時(shí)間;本指令執(zhí)行時(shí)間1s DEL1:MOV R6,#125 ;本指令執(zhí)行時(shí)間;本指令執(zhí)行時(shí)間1s DEL2:DJNZ R6,DEL2 ;指令執(zhí)行;指令執(zhí)行1次為次為2s,共,共 ; 1252 s=250s DJNZ R7,DEL1 ;指令執(zhí)行時(shí)間;指令執(zhí)行時(shí)間2s,本循環(huán)體執(zhí)行,本循環(huán)體執(zhí)行125次次 RET ;指令執(zhí)行時(shí)間;指令執(zhí)行時(shí)間2s2022-5-850 以上延時(shí)程序以上延時(shí)程序不是太精確,把所有指令的執(zhí)行時(shí)間,把所有指令的執(zhí)行時(shí)間計(jì)算在內(nèi),其延時(shí)時(shí)間為計(jì)算在內(nèi),其延時(shí)時(shí)間為1+(1+250+2) 200+2s=50.603ms, 如要求比較精確的延時(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45199-2025家禽遺傳資源瀕危等級評定
- 包車旅游有合同范本
- 出售店鋪合同范本
- 農(nóng)村護(hù)欄轉(zhuǎn)讓合同范本
- 買賣協(xié)議車子合同范本
- 冰品購銷合同范本
- 區(qū)塊鏈認(rèn)證合同范本
- 修建電站合同范本
- 企業(yè)合同范本清單
- 單位保密合同范本
- 橋梁鋼筋制作安裝施工方案
- 2025年語言文字工作計(jì)劃
- 金融類競聘主管
- 《國防動(dòng)員準(zhǔn)備》課件
- 2024年688個(gè)高考英語高頻詞匯
- 商標(biāo)合資經(jīng)營合同
- 第六講當(dāng)前就業(yè)形勢與實(shí)施就業(yè)優(yōu)先戰(zhàn)略-2024年形勢與政策
- 2024-2030年中國家政服務(wù)行業(yè)經(jīng)營策略及投資規(guī)劃分析報(bào)告
- 2025年護(hù)士資格證考核題庫及答案
- 湖北省黃岡市2023-2024學(xué)年五年級上學(xué)期數(shù)學(xué)期中試卷(含答案)
評論
0/150
提交評論