第4章++80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì).PPT.ppt_第1頁(yè)
第4章++80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì).PPT.ppt_第2頁(yè)
第4章++80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì).PPT.ppt_第3頁(yè)
第4章++80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì).PPT.ppt_第4頁(yè)
第4章++80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì).PPT.ppt_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1,第四章 匯編語(yǔ)言程序設(shè)計(jì),高級(jí)語(yǔ)言如C+,匯編語(yǔ)言如MCS-51指令,匯編,目標(biāo)文件,按照語(yǔ)法格式編寫源程序*.ASM *.C,按照語(yǔ)法格式將源程序翻譯成機(jī)器代碼,計(jì)算機(jī)識(shí)別的二進(jìn)制代碼*.OBJ,編譯,目標(biāo)文件,2,本章結(jié)構(gòu),4.1 單片機(jī)程序設(shè)計(jì)語(yǔ)言概述 4.4 匯編語(yǔ)言編輯和匯編及其偽指令 4.2 匯編語(yǔ)言程序的基本結(jié)構(gòu)形式 順序程序結(jié)構(gòu) 分支程序結(jié)構(gòu) 循環(huán)程序結(jié)構(gòu) 4.3 匯編語(yǔ)言程序設(shè)計(jì)舉例,3,4.1.1、 程序設(shè)計(jì)語(yǔ)言及語(yǔ)言處理程序,程序設(shè)計(jì)語(yǔ)言分:機(jī)器語(yǔ)言、匯編語(yǔ)言和中高級(jí)語(yǔ)言 1.機(jī)器語(yǔ)言: 硬件識(shí)別,二進(jìn)制,無(wú)需翻譯、直接執(zhí)行,面向機(jī)器; 速度快,效率高,難以辨認(rèn)和記憶

2、,易錯(cuò),難修改。,4.1 概述,地址 機(jī)器碼源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0,4,2.匯編語(yǔ)言: 由字母,數(shù)字符號(hào)組成,翻譯成機(jī)器語(yǔ)言再由CPU執(zhí)行; 面向機(jī)器,編譯后執(zhí)行速度接近機(jī)器語(yǔ)言,易讀,不易錯(cuò),但必須熟悉指令系統(tǒng),移植性差; 程序精細(xì)、具體,結(jié)構(gòu)緊湊,運(yùn)行時(shí)間精確,高效; 運(yùn)算量大,實(shí)時(shí)性要求高時(shí)常用匯編。,地址 機(jī)器碼源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0,5,3.中高級(jí)語(yǔ)言: 面向過(guò)程和面向?qū)ο蟆⒄諗?shù)學(xué)語(yǔ)言又類

3、似日常會(huì)話語(yǔ)言。 高級(jí)語(yǔ)言中,一條高級(jí)語(yǔ)言指令,代替幾上百條匯編指令。 直觀,易學(xué),便于移植(由編譯器負(fù)責(zé)),也需經(jīng)過(guò)編譯、解釋成機(jī)器代碼后執(zhí)行。 C、BASIC、C,6,4.1.2、匯編語(yǔ)言特點(diǎn)及其格式 P77,2.語(yǔ)句格式 標(biāo)號(hào): 操作碼 操作數(shù), ;注釋 (1).標(biāo)號(hào): 標(biāo)號(hào)是由18個(gè)ASCII字符組成,但頭一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或其它特定字符。 不能使用本匯編語(yǔ)言已經(jīng)定義了的符號(hào)作為標(biāo)號(hào),如指令助記符、偽指令記憶符以及寄存器的符號(hào)名稱等。 標(biāo)號(hào)后邊必須跟以 “ :”。 同一標(biāo)號(hào)在一個(gè)程序中只能定義一次,不能重復(fù)定義,大小寫一樣。 一條語(yǔ)句可以有標(biāo)號(hào),也可以沒(méi)有標(biāo)號(hào)

4、。標(biāo)號(hào)的有無(wú)取決于本程序中的其它語(yǔ)句是否需要訪問(wèn)這條語(yǔ)句。,7,錯(cuò)誤的標(biāo)號(hào) 正確的標(biāo)號(hào) 1BT:BT1: BEGIN BEGIN: TB十5T: TA5T: ADD: ADD1: 3)操作數(shù):是參加運(yùn)算的數(shù)據(jù)或者數(shù)據(jù)的地址。 4)注 釋:解釋說(shuō)明,增加可讀性,匯編時(shí)不產(chǎn)生任 何機(jī)器碼,8,4.1.3 程序設(shè)計(jì)基本方法,在能完成規(guī)定的功能任務(wù)基礎(chǔ)上還要求: 執(zhí)行速度快、占用內(nèi)存少、條理清晰、 閱讀方便、便于移植、巧妙而實(shí)用。 步驟: 1分析問(wèn)題 2確定算法 3設(shè)計(jì)程序流程圖4分配內(nèi)存單元 5編寫匯編語(yǔ)言源程序6匯編并調(diào)試程序,9,4.1.4、MCS-51匯編語(yǔ)言的偽指令: P93 作用:告訴匯編

5、程序如何完成匯編,不產(chǎn)生機(jī)器碼。 (1)、ORG:起始偽指令Origin 指明程序和數(shù)據(jù)塊起始地址。 指令地址 機(jī)器碼 源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0 ORG 3000H 3000H 23 DB 23H,100,A 3001H 64 3002H 41,10,(2)、END 匯編結(jié)束偽指令。 P94 例:START: END (3)、EQU 賦值偽指令。 格式:EQU 賦值項(xiàng)可以是常數(shù)、地址、標(biāo)號(hào)或表達(dá)式; 其值可以是8位或16位二進(jìn)制數(shù); 賦值后的字符名稱可以當(dāng)作地址使用,也可以當(dāng)作立即數(shù)使用。 字符名稱

6、必須是以字母開(kāi)題的字母數(shù)字串,必須先前未定義過(guò)。 X1 EQU 2000HX2 EQU 0FHMAIN:MOV DPTR,#X1 ADD A,#X2,11,(4)DB定義字節(jié)偽指令 格式:標(biāo)號(hào):DB 將項(xiàng)表中的字節(jié)數(shù)據(jù)存放到從標(biāo)號(hào)開(kāi)始的連續(xù)字節(jié)單元; 項(xiàng)表可以是一個(gè)字節(jié)、用逗號(hào)隔開(kāi)的字節(jié)串或中的ASCII字符串; 例如: ORG2300H SEG:DB0C2H DB30H,97H,100,AC 匯編結(jié)果: 2300H=?2301H=?2302H=?,12,(5)DW定義字偽指令(Define Word) 格式:標(biāo)號(hào):DW 用于定義16位的地址表。 匯編后,每個(gè)16位二進(jìn)制數(shù)按照低地址存高位字節(jié)

7、,高地址存放低位字節(jié)的順序存放。 例如: ORG1000H TAB:DW2030H,8CH,AB 匯編后:(1000H)20H,(1001H)30H,13,(6)DS定義存儲(chǔ)區(qū)偽指令 格式:標(biāo)號(hào) DS 從指定地址開(kāi)始,保留指定數(shù)目的字節(jié)單元作為存儲(chǔ)區(qū)備用。 例如: ORG1000H DS20 匯編后從1000H地址開(kāi)始保留20個(gè)連續(xù)的單元。 注意: 對(duì)于MCS51單片機(jī),DB/DW/DS偽指令只能對(duì)程序存儲(chǔ)區(qū)使用,而不能對(duì)數(shù)據(jù)存儲(chǔ)器使用。,14,(7)BIT位定義偽指令 格式: BIT 把一個(gè)可以位尋址的位單元賦給所規(guī)定的字符名稱。 例如: X1BIT30H X2BITP1.0 匯編后,位地址

8、30H賦給了X1,P1.0對(duì)應(yīng)的位地址(90H)賦給了X2。,15,4.2 匯編程序的基本結(jié)構(gòu),順序程序結(jié)構(gòu) 分支程序結(jié)構(gòu) 單分支程序結(jié)構(gòu) 多分支程序結(jié)構(gòu) 循環(huán)程序結(jié)構(gòu),16,17,4.2.1 順序程序結(jié)構(gòu),匯編語(yǔ)言程序中最簡(jiǎn)單、最基本的程序結(jié)構(gòu)。 程序執(zhí)行時(shí)一條接一條地按順序執(zhí)行指令,無(wú)分支、循環(huán)以及調(diào)用子程序。 ORG 0000H LJMP MAIN MAIN:MOVA , #30H ADDA , #58H MOV30H , A SJMP$,18,順序程序結(jié)構(gòu)分析: 找出關(guān)鍵的執(zhí)行實(shí)際功能操作的指令,然后將其前面與該指令相關(guān)的指令規(guī)類為該指令的前期配置指令。并需要對(duì)指令占用的資源和操作的影

9、響有全局的把握。 MOV R0,#52HDEC R1MOV A,R0 MOV R1,#55HMOV A,R0ADDC A,R1 MOV A,R0ADDC A,R1MOV R0,A ADD A,R1MOVR0,A CLR A MOV R0,ADECR0ADDC A,#00H DECR0DEC R1 MOV 20H,A,19,4.2.2 分支程序結(jié)構(gòu),程序分支是通過(guò)轉(zhuǎn)移指令實(shí)現(xiàn)的,也稱為選擇結(jié)構(gòu)??煞譃閱畏种Ш投喾种深?。 單分支程序結(jié)構(gòu),通過(guò)條件轉(zhuǎn)移指令實(shí)現(xiàn),即根據(jù)條件對(duì)程序的執(zhí)行進(jìn)行判斷、滿足條件則進(jìn)行程序轉(zhuǎn)移,不滿足條件就順序執(zhí)行程序。可用指令JZ、JNZ、CJNE、DJNZ;JC、JNC、

10、JB、JNB、JBC。 多分支程序是首先把分支程序按序號(hào)排列,然后按序號(hào)值進(jìn)行轉(zhuǎn)移。 指令:JMP A+DPTR,20,1、單分支程序結(jié)構(gòu),程序分支是通過(guò)條件轉(zhuǎn)移指令實(shí)現(xiàn)的,即根據(jù)條件對(duì)程序的執(zhí)行進(jìn)行判斷,滿足條件則進(jìn)行程序轉(zhuǎn)移,不滿足條件程序就順序執(zhí)行。 ( 1 )無(wú)條件轉(zhuǎn)移:LJMP,AJMP,SJMP ( 2 )條件轉(zhuǎn)移:JZ、JNZ、CJNE和DJNZ等。 ( 3 )按位轉(zhuǎn)移:JC、JNC、JB、JNB和JBC等。 使用這些指令,可以完成為0、為1、為正、為負(fù)以及相等、不相等等各種條件判斷。,21,例4.2 假定外部RAM中有ST1、ST2、ST3共3個(gè)連續(xù)單元,其中ST1和ST2單元

11、中分別存放著兩個(gè)8位無(wú)符號(hào)二進(jìn)制數(shù),要求找出其中的大數(shù)并存入ST3中。 START: CLRC MOV DPTR,#ST1 MOVXA,DPTR;取第一個(gè)數(shù) MOV R2,A INC DPTR MOVXA,DPTR;取第二個(gè)數(shù) SUBBA,R2 JNC BIG1 ;第二個(gè)數(shù)大轉(zhuǎn)BIG1 XCHA,R2;第一個(gè)數(shù)大,整字節(jié)交換繼續(xù) BIG0: INCDPTR MOVXDPTR,A;存大數(shù) RET BIG1: MOVXA,DPTR;將大數(shù)存入A SJMP BIG0,22,2.多分支程序結(jié)構(gòu),常使用CJNE、JMP A+DPTR指令 1.多重單分支:多條CJNE指令 2.JMP A+DPTR 與數(shù)據(jù)

12、表配合: 范圍有限,256字節(jié)。 3.JMP A+DPTR 與轉(zhuǎn)移指令配合: A中值為序號(hào)與轉(zhuǎn)移指令字節(jié)數(shù)的乘積。 4.利用RET指令,通過(guò)堆棧操作實(shí)現(xiàn): 將分支地址從入口地址表取出后,壓入堆棧,利用RET指令賦予PC分支地址。,23,2.1 使用多條CJNE指令 假定分支序號(hào)值保存在累加器A中,則可使用 CJNEA, #data, rel,24,例4.3某溫度控制系統(tǒng),采集的溫度值(Ta)放在累加器A中。此外,在內(nèi)部RAM54H單元存放控制溫度下限制(T54),在55H單元存放控制溫度上限制(T55)。若Ta T55,程序轉(zhuǎn)向JW(降溫處理程序);若TaT55,轉(zhuǎn)降溫程序 CJNEA,54H

13、,LOOP2 ;Ta T54,轉(zhuǎn)向LOOP2 AJMPFH; TaT54,返回 LOOP2:JCSW ;若C1,表明TaT54,轉(zhuǎn)升溫程序 FH: RET,25,2.2 通過(guò)查數(shù)據(jù)表(地址表)的方法 首先在程序中建立一個(gè)差值表,將各分支入口地址與該表首地址的差值按序排列其中; 差值表首地址送DPTR; 分支序號(hào)值送A中; 通過(guò)JMPA+DPTR指令進(jìn)行分支。,26,例: MOVA,R3 MOVDPTR,#BRTAB MOVCA,A+DPTR JMPA+DPTR BRTAB:DBBR0-BRTAB DBBR1-BRTAB DBBR2-BRTAB DBBR3-BRTAB BR0:MOVA,R0 S

14、JMPBRE BR1:MOVXA,R0 SJMPBRE,BR2:MOVA,R1 ANLA,#0FH ANLP2,#0F0H ORLP2,A MOVX A,R0 BR3:MOVDPL,R0 MOVDPH,R1 MOVX A,DPTR BRE:SJMP$,27,2.3 使用查轉(zhuǎn)移指令表的方法 表中放的是轉(zhuǎn)移指令 設(shè)置一個(gè)序號(hào)指針 轉(zhuǎn)移指令表首地址送給DPTR 通過(guò)JMP A+DPTR指令進(jìn)行分支,28,MOVDPTR,#3000H MOVA,R3 CLRC RLCA JMPA+DPTR 3000H 3001H 3002H AJMPDS 3003H 3004H AJMPXS 3005H 3006H

15、AJMPCR,例:假定鍵盤上有3個(gè)按鍵,功能說(shuō)明如下表,用程序?qū)崿F(xiàn):鍵值序號(hào)存放在R3中,29,2.4通過(guò)堆棧操作實(shí)現(xiàn) MOVDPTR,#BRTAB;分支入口地址表首址 MOVA,R3 RLA;分支轉(zhuǎn)移值乘以2 MOVR1,A;暫存A值 INCA MOVCA,A+DPTR;取低位地址 PUSHACC;低位地址入棧 MOVA,R1;恢復(fù)A值 MOVCA,A+DPTR;取高位地址 PUSHACC;高位地址入棧 RET;分支入口地址裝入PC BRTAB: DWBR0;分支程序入口地址表 DWBR1 DWBR127,30,4.2.3 循環(huán)程序,循環(huán)程序一般由4部分組成: (1)置循環(huán)初值。 (2)循環(huán)

16、體。 (3)循環(huán)修改。 (4)循環(huán)控制。 循環(huán)結(jié)構(gòu): 圖(a)結(jié)構(gòu)是“先執(zhí)行后判斷”,適用于循環(huán)次數(shù)已知的情況。 圖(b)結(jié)構(gòu)是“先判斷后執(zhí)行”,適用于循環(huán)次數(shù)未知的情況。,31,4.2.3 循環(huán)程序,32,例:設(shè)有一字符串以回車符為結(jié)束標(biāo)志,并存放在內(nèi)部RAM從40H單元開(kāi)始的連續(xù)存儲(chǔ)單元中,編寫測(cè)試字符串長(zhǎng)度的程序。 MOVR2,#0FFH;設(shè)置長(zhǎng)度計(jì)數(shù)器初值 MOVR0,#3FH;設(shè)置字符串指針初值 LOOP:INCR2 INCR0 CJNER0,#0DH,LOOP RET,33,例:把內(nèi)部RAM中其首地址為data的數(shù)據(jù)串傳送到外部RAM中以buffer為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字

17、符的ASCII碼為止。同時(shí)規(guī)定數(shù)據(jù)串的最大長(zhǎng)度為32個(gè)字節(jié)。,MOVR0,#data MOVDPTR,#buffer MOVR1,#20H LOOP:MOVA,R0 CLRC SUBBA,#24H JZLOOP1 MOV A,R0 MOVX DPTR,A INCDPTR INCR0 DJNZR1,LOOP LOOP1:RET,34,4.2.4 子程序設(shè)計(jì),一、子程序的概念 子程序:執(zhí)行過(guò)程相同的部分編成一個(gè)獨(dú)立的程序段。 子程序調(diào)用:控制從主程序轉(zhuǎn)向子程序的過(guò)程 子程序返回:子程序指向完畢后返回主程序的過(guò)程 返回地址:返回到主程序調(diào)用指令的下一條指令的地址,即斷點(diǎn)地址。 子程序的嵌套:子程序內(nèi)

18、部還可以再調(diào)用另一個(gè)子程序。,35,4.2.4 子程序設(shè)計(jì),二、子程序的調(diào)用返回 調(diào)用: 通過(guò)指令A(yù)CALL addr11和LCALL addr16來(lái)實(shí)現(xiàn):先將PC中的內(nèi)容(斷點(diǎn)地址)壓入堆棧保護(hù),然后再將調(diào)用地址送入PC,轉(zhuǎn)向子程序入口地址; 安排壓棧指令保護(hù)現(xiàn)場(chǎng),保護(hù)不希望被子程序更改內(nèi)容的寄存器,返回后再恢復(fù)現(xiàn)場(chǎng)。 返回: 通過(guò)指令RET實(shí)現(xiàn):將堆棧中的斷點(diǎn)地址彈出送入 PC。 安排相應(yīng)的指令,處理子程序提供的出口數(shù)據(jù)。,36,三、主程序與子程序的參數(shù)傳遞 入口參數(shù)和出口參數(shù)的存放參數(shù)傳遞; 用累加器或工作寄存器來(lái)傳遞參數(shù) 程序編制簡(jiǎn)單,容易閱讀。 工作寄存器數(shù)量有限,不能傳遞太多的參數(shù)

19、; 用指針寄存器來(lái)傳遞參數(shù) 若參數(shù)在片內(nèi)RAM中,可用R0或R1作指針寄存器; 若參數(shù)在外部RAM或程序寄存器中,可用DPTR作指針寄存器。 用堆棧來(lái)傳遞參數(shù) 調(diào)用前,主程序用PUSH指令將有關(guān)參數(shù)壓入堆棧中。 進(jìn)入子程序,通過(guò)堆棧指針來(lái)間接訪問(wèn)堆棧中的參數(shù)。子程序結(jié)束前,也可以把結(jié)果壓入堆棧保存起來(lái); 子程序返回后,主程序再用POP指令得到結(jié)果參數(shù)。,4.2.4 子程序設(shè)計(jì),37,四、子程序及調(diào)用舉例 例:求兩個(gè)無(wú)符號(hào)數(shù)據(jù)塊的最大值。設(shè)這兩個(gè)數(shù)據(jù)塊的首地址分別為30H和50H,每個(gè)數(shù)據(jù)塊的首字節(jié)存放著該數(shù)據(jù)塊的長(zhǎng)度,求最大值存入7FH中。 先編寫出求無(wú)符號(hào)數(shù)據(jù)塊最大值的子程序,然后在主程序中

20、通過(guò)兩次調(diào)用該子程序,分別求出兩個(gè)數(shù)據(jù)塊的最大值,再比較他們的大小。 規(guī)劃: 入口:數(shù)據(jù)塊的首地址送入R1; 出口:最大值在A中 占用資源:A,R1,R2,38,主程序: ORG0000H LJMPSTART ORG0100H STRAT:MOVR1,#30H ;置入口參數(shù) ACALLBMAX ;調(diào)用子程序 MOV7FH,A ;暫存最大值 MOVR1,#50H;置入口參數(shù) ACALLBMAX; CLRC SUBBA,7FH;比較兩個(gè)最大值 JCNEXT;A小則轉(zhuǎn) ADDA,7FH;A大恢復(fù)A MOV7FH,A NEXT:SJMP $,子程序: ORG2000H BMAX:MOVR2,R1;取數(shù)

21、據(jù)塊長(zhǎng)度 DECR2;設(shè)置循環(huán)計(jì)數(shù)值 INCR1;修改指針 MOVA,R1;取第一個(gè)數(shù) INCR1;指向第二個(gè)數(shù) LOOP:CLRC; SUBBA,R1;減法比較 JNCLP1;無(wú)借位A大 MOVA,R1;否則大者送A SJMPLP2 LP1:ADDA,R1;A大恢復(fù)A LP2:INCR1;修改地址指針 DJNZR2,LOOP ;未完繼續(xù)比較 RET;比較完,返回,39,4.3 程序設(shè)計(jì)舉例,4.3.1 算術(shù)運(yùn)算程序 1.加減法運(yùn)算 1.1 不帶符號(hào)的多個(gè)單字節(jié)數(shù)加法 R0數(shù)據(jù)指針;R1和的高位;R2和的低位;R3字節(jié)個(gè)數(shù)N - MOVR0,#21H MOVR3,#N MOVR1,#00H M

22、OVR2,#00H LOOP: MOVXA,R0 ADDA,R2 MOVR2,A JNCLOOP1 INCR1 LOOP1:INCR0 DJNZR3,LOOP,40,1.2不帶符號(hào)的兩個(gè)多字節(jié)數(shù)減法 字節(jié)數(shù)N;被減數(shù)單元地址R0;減數(shù)單元地址R1; 差地址R0 - CLRC MOVR2,#N LOOP :MOVA,R0 SUBBA,R1 MOVR0,A INCR0 INCR1 DJNZR2,LOOP JCQAZ;最高字節(jié)有借位轉(zhuǎn)溢出處理 RET,41,4.3.1 算術(shù)運(yùn)算程序,1.3 帶符號(hào)數(shù)加減運(yùn)算 減法運(yùn)算:將減數(shù)的符號(hào)位取反,即可把減法運(yùn)算按加法運(yùn)算的原則來(lái)處理; 加法運(yùn)算:首先要進(jìn)行兩

23、數(shù)符號(hào)的判斷。 符號(hào)相同,進(jìn)行兩數(shù)相加,并以被加數(shù)符號(hào)為結(jié)果符號(hào); 符號(hào)不同,進(jìn)行兩數(shù)相減。 若差數(shù)為正,則為最后結(jié)果,并以被減數(shù)符號(hào)為結(jié)果符號(hào); 若差數(shù)為負(fù),則應(yīng)將其差數(shù)取補(bǔ),并把被減數(shù)的符號(hào)取反作為結(jié)果符號(hào)。,42,2. 乘法運(yùn)算 例4.9:雙字節(jié)無(wú)符號(hào)數(shù)乘法程序:R2R3R6R7=R2R3R4R5,MULTD:MOVA,R3;計(jì)算R3R7 MOVB,R7 MULAB MOVR4,B;暫存部分積R3R7H MOVR5,A;低字節(jié)存入R5 MOVA,R2;計(jì)算R2R7 MOVB,R7 MULAB ADDA,R4;累加R3R7H+R2R7L MOVR4,A;暫存部分積 CLRA ADDCA,B

24、;R2R7H+CYA MOVR7,A;暫存A MOVA,R3;計(jì)算R3R6 MOVB,R6 MULAB ADDA,R4;R3R7H+R2R7L+R3R6L MOVR4,A MOVA,R7 ADDCA,B ;R2R7H+R3R6H低位進(jìn)位,MOVR3,A;暫存部分積 CLRA RLCA;進(jìn)位移入A最低位 XCHA,R2;計(jì)算R2R6 MOVB,R6 MULAB ADDA,R3;R2R7H+R3R6H+R2R6L MOVR3,A MOVA,R2;進(jìn)位送入A ADDCA,B;R2R6H+進(jìn)位 MOVR2,A:R2R6H進(jìn)位送R2 RET,R2 R3 R6 R7,R3R7H R3R7L,R2R7H R

25、2R7L,R3R6H R3R6L,R2R6H R2R6L,43,4.3.2 數(shù)制轉(zhuǎn)換程序,1.十六進(jìn)制轉(zhuǎn)換為ASCII碼 例:2位16進(jìn)制數(shù)存放于50H單元; 轉(zhuǎn)換結(jié)果存放于51H和52H單元; MAIN:主程序;HASC:子程序,HASC: DECSP DECSP POPACC ANLA,#0FH ADDA,#7 MOVCA,A+PC PUSHACC INCSP INCSP RET ASCTAB:DB“01234567” DB “89ABCDEF”,MOVSP,#3FH MAIN:PUSH50H ACALLHASC POP51H MOVA,50H SWAPA PUSHACC ACALLHAS

26、C POP52H,44,2.ASCII碼轉(zhuǎn)換為16進(jìn)制數(shù) “字符0”“字符9”的ASCII碼值為“30H”“39H”,它們與30H之差恰好為“00H”“09H”,結(jié)果均0AH。 “字符A”“字符F”的ASCII碼值為“41H”“46H”,它們各自減去37H后恰好為“0AH”“0FH”,結(jié)果0AH。 例:把外部RAM30H3FH單元中的ASCII碼依次轉(zhuǎn)換為16進(jìn)制數(shù),并存入內(nèi)部RAM60H67H單元之中。,45,R0:ASCII碼地址指針;R1:16進(jìn)制數(shù)存放地址指針;R7:16進(jìn)制數(shù)字節(jié)個(gè)數(shù) MAIN:MOVR0,#30H MOVR1,#60H MOVR7,#08H AB:ACALLTRAN

27、;調(diào)用轉(zhuǎn)換子程序 SWAPA;A高低4位交換 MOVXR1,A;存放于外部RAM INCR0 ACALLTRAN;調(diào)用轉(zhuǎn)換子程序 XCHDA,R1;16進(jìn)制數(shù)拼裝 INCR0 INCR1 DJNZR7,AB;繼續(xù) HALT:AJMPHALT TRAN:CLRC;清進(jìn)位位 MOVXA,R0;取ASCII碼 SUBBA,#30H;減30H CJNEA,#0AH,BB AJMPBC BB:JCDONE BC:SUBBA,#07H;大于等于0AH,再減07H DONE:RET,46,3.單字節(jié)二進(jìn)制數(shù)(0FFH)轉(zhuǎn)換為雙字節(jié)BCD碼(0255) 入口:A二進(jìn)制數(shù) 出口:存入R0所指定的單元 占用資源:

28、A、B、R0 - BINBCD:MOV B,#100 DIV AB ;A=百位數(shù) MOV R0,A INC R0 MOVA,#10 XCHA,B DIVA,B ;A=十位數(shù);B=個(gè)位數(shù) SWAPA ;十位移到高半字節(jié) ADDA,B ;形成十位和個(gè)位壓縮的BCD碼 MOV R0,A RET,47,4.3.3 定時(shí)程序,1.單循環(huán)定時(shí)程序 NOP:1個(gè)機(jī)器周期 DJNZ:2個(gè)機(jī)器周期 MOVR5,#TIME LOOP: NOP NOP DJNZR5,LOOP 該循環(huán)定時(shí)時(shí)間:4機(jī)器周期TIME 最大定時(shí)時(shí)間:4機(jī)器周期?,48,2.較長(zhǎng)時(shí)間的定時(shí)程序 采用多重循環(huán)的方法 例:雙重循環(huán) MOVR5,

29、#TIME1 ;1個(gè)機(jī)器周期 LOOP2:MOVR4,#TIME2 ;1個(gè)機(jī)器周期 LOOP1:NOP ;1個(gè)機(jī)器周期 NOP ;1個(gè)機(jī)器周期 DJNZR4,LOOP1 ;2個(gè)機(jī)器周期 DJNZR5,LOOP2 ;2個(gè)機(jī)器周期 RET ;2個(gè)機(jī)器周期 定時(shí)時(shí)間: (TIME24+2+1)TIME1機(jī)器周期(2+1)機(jī)器周期,49,例4-12: 延時(shí)程序設(shè)計(jì)。設(shè)8051單片機(jī)使用的晶振為12MHz,要求用軟件方法實(shí)現(xiàn)60ms延時(shí)程序。 分析:2us3000060ms DELAY:MOVR7,#200;1 DL1: MOVR6,#150;1 DL2:DJNZR6,DL2;2 DJNZR7,DL1;

30、2 SJMP$ 準(zhǔn)確延時(shí)時(shí)間:(300us2us+1us)200+1us60.601ms,50,3.調(diào)整定時(shí)時(shí)間 通過(guò)在循環(huán)程序段中增減指令的方法進(jìn)行微調(diào); 這些指令起到調(diào)節(jié)機(jī)器周期的作用,稱為啞指令,例如NOP。 使用啞指令注意: 不破壞有用存儲(chǔ)單元的內(nèi)容; 不破壞有用寄存器的內(nèi)容; 不破壞有用標(biāo)志位的狀態(tài);,51,例:晶振頻率6MHz MOVR0,#TIME;1 LOOP:ADD A,R1;1 INCDPTR;2 NOP;1 DJNZR0,LOOP;2,52,4.以一個(gè)基本的延時(shí)程序滿足不同的延時(shí)要求 先設(shè)計(jì)一個(gè)基本的延時(shí)程序,使其延時(shí)時(shí)間為各定時(shí)時(shí)間的最大公約數(shù); 然后以此基本程序?yàn)樽映?/p>

31、序,通過(guò)不同的循環(huán)次數(shù)進(jìn)行調(diào)用。 例如:要求定時(shí)時(shí)間為5us,10us,20us;設(shè)計(jì)一個(gè)1us的延時(shí)子程序,分別循環(huán)5次、10次、20次。,53,4.3.4 查表程序,1.查表指令 MOVC A,A+DPTR 可給DPTR賦予16位的地址; 查表范圍64KB; 數(shù)據(jù)表格可以在64KB范圍內(nèi)任意設(shè)置,可被多個(gè)程序塊公用。 MOVA,A+PC PC不能賦值,其基址固定; 查表范圍256B; 表格只能被本程序段使用。,54,例1 近程查表 設(shè)程序中的數(shù)據(jù)表格為: 1010H:02H 1011H:04H 1012H:06H 1013H:08H 執(zhí)行程序: 1000H:MOV A,#0DH 1002H

32、:MOVC A,A+PC 1003H:MOV R0,A 結(jié)果為:(A)= 02H ,(R0)= 02H ,(PC)= 1004H,55,例2 遠(yuǎn)程查表 設(shè)程序中的數(shù)據(jù)表格為: 執(zhí)行程序: 1000H:MOV A,#10H 1002H:PUSH DPH 1004H:PUSH DPL 1006H:MOV DPTR,#7000H 1009H:MOVC A,A+DPTR ; 100AH: POP DPH 100CH:POP DPL 結(jié)果為:(A)= ,(PC)= ,(DPTR)=,7010H:02H 7011H:04H 7012H:06H 7013H:08H,02H 100EH 原值高低字節(jié)互換,56

33、,4.3.5數(shù)據(jù)極值查找程序,例:內(nèi)部RAM20H單元開(kāi)始存放8個(gè)無(wú)符號(hào)8位二進(jìn)制數(shù),找出其中的最大數(shù)。 假定在比較過(guò)程中,以A存放最大數(shù),與之逐個(gè)比較的另一個(gè)數(shù)放在2AH單元中。比較結(jié)束后,把查到的最大數(shù)送到2BH單元。 占用資源 R0:數(shù)據(jù)區(qū)首址 R7:數(shù)據(jù)區(qū)長(zhǎng)度,57,58,MOVR0,#20H MOVR7,#08H MOVA,R0 DECR7 LOOP:INCR0 MOV2AH,R0 CJNEA,2AH,CHK CHK:JNCLOOP1 ;A大,轉(zhuǎn)移 MOVA,R0 LOOP1:DJNZR7,LOOP MOV2BH,A HERE:AJMPHERE,59,4.3.6 數(shù)據(jù)排序程序,1.算

34、法說(shuō)明(冒泡法) 冒泡法:相鄰數(shù)互換,類似氣泡上浮。 每次冒上去的不一定是本次最小的數(shù),但每次沉底的必是本次最大的數(shù)。,60,注: 每次冒泡都從前向后排定了一個(gè)大數(shù)(升序),因此每次冒泡所需進(jìn)行的比較次數(shù)都遞減1.實(shí)際編程時(shí),為了簡(jiǎn)化程序,一般把各次的比較次數(shù)都固定為(n1)次。 對(duì)于n個(gè)數(shù),理論上需進(jìn)行n1次冒泡才能完成排序。 判定排序是否完成的最簡(jiǎn)單方法是看各次冒泡中是否有互換發(fā)生。因此,一般控制程序結(jié)束不用計(jì)數(shù)法,而是使用設(shè)置互換標(biāo)志的方法。,61,62,例:8個(gè)數(shù)連續(xù)存放在20H單元開(kāi)始的內(nèi)部RAM中,用冒泡法排序。 R7:比較次數(shù)計(jì)數(shù)器;F0:交換標(biāo)志,“1”有交換,”0”無(wú)交換; R0:數(shù)據(jù)存儲(chǔ)區(qū)首址;2AH:存后數(shù);2BH:存前數(shù); SORT:MOVR0,#20H MOVR7,#07H CLRF0 LOOP:MOVA,R0 MOV2BH,A INCR0 MOV2AH,R0 CLRC SUBBA,R0 JCNEXT ;前數(shù)小,不交換 MOVR0,2BH ;前數(shù)大,交換 DECR0 MOVR0,2AH INCR0 SETBF0 NEXT:DJNZR7,LOOP JBF0,SORT SJMP$,63,4.3.7 數(shù)據(jù)檢索,1.順序檢索 把關(guān)鍵字與數(shù)據(jù)區(qū)中的數(shù)據(jù)從前向后逐個(gè)比較,判斷是否相等。

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論