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

下載本文檔

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

文檔簡介

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

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

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

4、。標(biāo)號的有無取決于本程序中的其它語句是否需要訪問這條語句。,7,錯誤的標(biāo)號 正確的標(biāo)號 1BT:BT1: BEGIN BEGIN: TB十5T: TA5T: ADD: ADD1: 3)操作數(shù):是參加運算的數(shù)據(jù)或者數(shù)據(jù)的地址。 4)注 釋:解釋說明,增加可讀性,匯編時不產(chǎn)生任 何機(jī)器碼,8,4.1.3 程序設(shè)計基本方法,在能完成規(guī)定的功能任務(wù)基礎(chǔ)上還要求: 執(zhí)行速度快、占用內(nèi)存少、條理清晰、 閱讀方便、便于移植、巧妙而實用。 步驟: 1分析問題 2確定算法 3設(shè)計程序流程圖4分配內(nèi)存單元 5編寫匯編語言源程序6匯編并調(diào)試程序,9,4.1.4、MCS-51匯編語言的偽指令: 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 賦值項可以是常數(shù)、地址、標(biāo)號或表達(dá)式; 其值可以是8位或16位二進(jìn)制數(shù); 賦值后的字符名稱可以當(dāng)作地址使用,也可以當(dāng)作立即數(shù)使用。 字符名稱

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

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

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

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),程序分支是通過轉(zhuǎn)移指令實現(xiàn)的,也稱為選擇結(jié)構(gòu)??煞譃閱畏种Ш投喾种深?。 單分支程序結(jié)構(gòu),通過條件轉(zhuǎn)移指令實現(xiàn),即根據(jù)條件對程序的執(zhí)行進(jìn)行判斷、滿足條件則進(jìn)行程序轉(zhuǎn)移,不滿足條件就順序執(zhí)行程序??捎弥噶頙Z、JNZ、CJNE、DJNZ;JC、JNC、

10、JB、JNB、JBC。 多分支程序是首先把分支程序按序號排列,然后按序號值進(jìn)行轉(zhuǎn)移。 指令:JMP A+DPTR,20,1、單分支程序結(jié)構(gòu),程序分支是通過條件轉(zhuǎn)移指令實現(xiàn)的,即根據(jù)條件對程序的執(zhí)行進(jìn)行判斷,滿足條件則進(jìn)行程序轉(zhuǎn)移,不滿足條件程序就順序執(zhí)行。 ( 1 )無條件轉(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個連續(xù)單元,其中ST1和ST2單元

11、中分別存放著兩個8位無符號二進(jìn)制數(shù),要求找出其中的大數(shù)并存入ST3中。 START: CLRC MOV DPTR,#ST1 MOVXA,DPTR;取第一個數(shù) MOV R2,A INC DPTR MOVXA,DPTR;取第二個數(shù) SUBBA,R2 JNC BIG1 ;第二個數(shù)大轉(zhuǎn)BIG1 XCHA,R2;第一個數(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中值為序號與轉(zhuǎn)移指令字節(jié)數(shù)的乘積。 4.利用RET指令,通過堆棧操作實現(xiàn): 將分支地址從入口地址表取出后,壓入堆棧,利用RET指令賦予PC分支地址。,23,2.1 使用多條CJNE指令 假定分支序號值保存在累加器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 通過查數(shù)據(jù)表(地址表)的方法 首先在程序中建立一個差值表,將各分支入口地址與該表首地址的差值按序排列其中; 差值表首地址送DPTR; 分支序號值送A中; 通過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è)置一個序號指針 轉(zhuǎn)移指令表首地址送給DPTR 通過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個按鍵,功能說明如下表,用程序?qū)崿F(xiàn):鍵值序號存放在R3中,29,2.4通過堆棧操作實現(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單元開始的連續(xù)存儲單元中,編寫測試字符串長度的程序。 MOVR2,#0FFH;設(shè)置長度計數(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碼為止。同時規(guī)定數(shù)據(jù)串的最大長度為32個字節(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è)計,一、子程序的概念 子程序:執(zhí)行過程相同的部分編成一個獨立的程序段。 子程序調(diào)用:控制從主程序轉(zhuǎn)向子程序的過程 子程序返回:子程序指向完畢后返回主程序的過程 返回地址:返回到主程序調(diào)用指令的下一條指令的地址,即斷點地址。 子程序的嵌套:子程序內(nèi)

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

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

20、通過兩次調(diào)用該子程序,分別求出兩個數(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;比較兩個最大值 JCNEXT;A小則轉(zhuǎn) ADDA,7FH;A大恢復(fù)A MOV7FH,A NEXT:SJMP $,子程序: ORG2000H BMAX:MOVR2,R1;取數(shù)

21、據(jù)塊長度 DECR2;設(shè)置循環(huán)計數(shù)值 INCR1;修改指針 MOVA,R1;取第一個數(shù) INCR1;指向第二個數(shù) LOOP:CLRC; SUBBA,R1;減法比較 JNCLP1;無借位A大 MOVA,R1;否則大者送A SJMPLP2 LP1:ADDA,R1;A大恢復(fù)A LP2:INCR1;修改地址指針 DJNZR2,LOOP ;未完繼續(xù)比較 RET;比較完,返回,39,4.3 程序設(shè)計舉例,4.3.1 算術(shù)運算程序 1.加減法運算 1.1 不帶符號的多個單字節(jié)數(shù)加法 R0數(shù)據(jù)指針;R1和的高位;R2和的低位;R3字節(jié)個數(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不帶符號的兩個多字節(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ù)運算程序,1.3 帶符號數(shù)加減運算 減法運算:將減數(shù)的符號位取反,即可把減法運算按加法運算的原則來處理; 加法運算:首先要進(jìn)行兩

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

24、;R2R7H+CYA MOVR7,A;暫存A MOVA,R3;計算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;計算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é)個數(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=個位數(shù) SWAPA ;十位移到高半字節(jié) ADDA,B ;形成十位和個位壓縮的BCD碼 MOV R0,A RET,47,4.3.3 定時程序,1.單循環(huán)定時程序 NOP:1個機(jī)器周期 DJNZ:2個機(jī)器周期 MOVR5,#TIME LOOP: NOP NOP DJNZR5,LOOP 該循環(huán)定時時間:4機(jī)器周期TIME 最大定時時間:4機(jī)器周期?,48,2.較長時間的定時程序 采用多重循環(huán)的方法 例:雙重循環(huán) MOVR5,

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

30、2 SJMP$ 準(zhǔn)確延時時間:(300us2us+1us)200+1us60.601ms,50,3.調(diào)整定時時間 通過在循環(huán)程序段中增減指令的方法進(jìn)行微調(diào); 這些指令起到調(diào)節(jié)機(jī)器周期的作用,稱為啞指令,例如NOP。 使用啞指令注意: 不破壞有用存儲單元的內(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.以一個基本的延時程序滿足不同的延時要求 先設(shè)計一個基本的延時程序,使其延時時間為各定時時間的最大公約數(shù); 然后以此基本程序為子程

31、序,通過不同的循環(huán)次數(shù)進(jìn)行調(diào)用。 例如:要求定時時間為5us,10us,20us;設(shè)計一個1us的延時子程序,分別循環(huán)5次、10次、20次。,53,4.3.4 查表程序,1.查表指令 MOVC A,A+DPTR 可給DPTR賦予16位的地址; 查表范圍64KB; 數(shù)據(jù)表格可以在64KB范圍內(nèi)任意設(shè)置,可被多個程序塊公用。 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單元開始存放8個無符號8位二進(jìn)制數(shù),找出其中的最大數(shù)。 假定在比較過程中,以A存放最大數(shù),與之逐個比較的另一個數(shù)放在2AH單元中。比較結(jié)束后,把查到的最大數(shù)送到2BH單元。 占用資源 R0:數(shù)據(jù)區(qū)首址 R7:數(shù)據(jù)區(qū)長度,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、法說明(冒泡法) 冒泡法:相鄰數(shù)互換,類似氣泡上浮。 每次冒上去的不一定是本次最小的數(shù),但每次沉底的必是本次最大的數(shù)。,60,注: 每次冒泡都從前向后排定了一個大數(shù)(升序),因此每次冒泡所需進(jìn)行的比較次數(shù)都遞減1.實際編程時,為了簡化程序,一般把各次的比較次數(shù)都固定為(n1)次。 對于n個數(shù),理論上需進(jìn)行n1次冒泡才能完成排序。 判定排序是否完成的最簡單方法是看各次冒泡中是否有互換發(fā)生。因此,一般控制程序結(jié)束不用計數(shù)法,而是使用設(shè)置互換標(biāo)志的方法。,61,62,例:8個數(shù)連續(xù)存放在20H單元開始的內(nèi)部RAM中,用冒泡法排序。 R7:比較次數(shù)計數(shù)器;F0:交換標(biāo)志,“1”有交換,”0”無交換; R0:數(shù)據(jù)存儲區(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ù)從前向后逐個比較,判斷是否相等。

溫馨提示

  • 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

提交評論