06-第四章程序設(shè)計(jì)ppt課件_第1頁(yè)
06-第四章程序設(shè)計(jì)ppt課件_第2頁(yè)
06-第四章程序設(shè)計(jì)ppt課件_第3頁(yè)
06-第四章程序設(shè)計(jì)ppt課件_第4頁(yè)
06-第四章程序設(shè)計(jì)ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩39頁(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、第四章:MCS-51程序設(shè)計(jì)計(jì)算機(jī)與通訊工程學(xué)院李耀明.一、匯編言語(yǔ)概述1、指令系統(tǒng)語(yǔ)句格式:;指令編碼長(zhǎng)短:?jiǎn)巫止?jié),雙字節(jié),三字節(jié)執(zhí)行周期:一個(gè)機(jī)器周期占12個(gè)振蕩周期,單周期指令,雙周期,4周期尋址方式:指令中所規(guī)定的尋覓操作地址的方式立刻、直接、存放器、存放器間接尋址、基址加變址、相對(duì)尋址、位尋址指令分類:數(shù)據(jù)傳送、算術(shù)、邏輯、位操作、控制轉(zhuǎn)移2、程序設(shè)計(jì)的步驟1分析問(wèn)題,編制闡明要處理問(wèn)題的程序框圖。2確定數(shù)據(jù)構(gòu)造、算法、任務(wù)單元、變量設(shè)定(與高級(jí)言語(yǔ)不同)3根據(jù)所用的指令系統(tǒng),按照已編制的程序框圖用匯編言語(yǔ)編制出源程序。4將編制出的程序在計(jì)算機(jī)上調(diào)試,直至實(shí)現(xiàn)預(yù)定的功能。.二、程序設(shè)

2、計(jì)分類1、順序程序:執(zhí)行時(shí)按順序一條條地執(zhí)行指令2、分支程序:當(dāng)程序不再順序執(zhí)行,而向一個(gè)方向或多個(gè)方向轉(zhuǎn)移時(shí),叫分支程序。3、循環(huán)程序:對(duì)于需求反復(fù)的程序段,常采用循環(huán)方法,以縮短程序。4、子程序及其調(diào)用程序主程序運(yùn)用子程序時(shí),用調(diào)用指令A(yù)CALL,子程序最后放一條RET指令。.三、程序設(shè)計(jì)準(zhǔn)那么構(gòu)造明晰:便于分析層次清楚:便于閱讀言語(yǔ)簡(jiǎn)約:便于分析易于了解:便于閱讀.4.1 簡(jiǎn)單程序設(shè)計(jì)簡(jiǎn)單程序又稱順序程序。計(jì)算機(jī)是按指令在存儲(chǔ)器中存放的先后次序來(lái)順序執(zhí)行程序的。除非用特殊指令讓它跳轉(zhuǎn),不然它會(huì)在PC控制下執(zhí)行。.例4-1兩個(gè)8位無(wú)符號(hào)數(shù)相加ORG 0000H AJMP BEGINORG

3、0030HBEGIN: MOV 40H,#01H MOV 41H,#02HLOOP: MOV R0,#40H MOV A,R0 INC R0 ADD A,R0 INC R0 MOV R0,A JMP LOOP END開場(chǎng)R040HAR0A送42H40H+41H和送A前往圖4-1 例1流程圖例:將加數(shù)和被加數(shù)分別送入40H、41H單元,加完后和送入42H單元.例4-2將兩個(gè)半字節(jié)數(shù)合并成一個(gè)單字節(jié)數(shù) 程序ORG 0000H AJMP startORG 0030HSTART: MOV sp,#60H MOV 40h,#01h MOV 41h,#02hloop: MOV R1,#40H MOV A,

4、R1 ANL A,#0FH ;取第一個(gè)半字節(jié) SWAP A INC R1 XCH A,R1 ;取第二字節(jié) ANL A,#0FH ;取第二個(gè)半字節(jié) ORL A,R1 ;拼字 INC R1 MOV R1,A ;存放結(jié)果 AJMP $ END執(zhí)行完后如何不改動(dòng)內(nèi)存和存放器的值?開場(chǎng)40H內(nèi)容送A,屏蔽高位,交換高低位AR0A與R1或后送42H取41H內(nèi)容,屏蔽高位,送A前往圖4-2 例2流程圖.4.2 分支程序設(shè)計(jì)在處置實(shí)踐事務(wù)中,只用簡(jiǎn)單程序設(shè)計(jì)的方法是不夠的。由于大部分程序總包含有判別、比較等情況。根據(jù)判別、比較的結(jié)果轉(zhuǎn)向不同的分支.例4-3:兩個(gè)無(wú)符號(hào)數(shù)比較大小設(shè)兩個(gè)延續(xù)外部RAM單元ST1和

5、ST2中存放不帶符號(hào)的二進(jìn)制數(shù),找出其中的大數(shù)存入ST3單元中。ST1 EQU 8040HORG 0000H JMP STARTORG 0030HSTART: MOV DPTR,#ST1 MOV A,#12H MOVX DPTR,A INC DPTR MOV A,#34H MOVX DPTR,ALOOP: CLR C ;進(jìn)位位清零 MOV DPTR,#ST1 ;設(shè)數(shù)據(jù)指針 MOVX A,DPTR ;取第一數(shù) MOV R2,A ;暫存R2 INC DPTR MOVX A,DPTR ;取第二個(gè)數(shù) SUBB A,R2 ; 兩數(shù)比較 JNC BIG1 XCH A,R2 ;第一數(shù)大BIG0: INC D

6、PTR MOVX DPTR,A ;存大數(shù) SJMP $BIG1: MOVX A,DPTR;第二數(shù)大 SJMP BIG0 END 開場(chǎng)設(shè)置指針DPTR初始值取第一個(gè)數(shù)存入R2取第二個(gè)數(shù)后者減前者進(jìn)位標(biāo)志能否為0?存后者終了存前者圖5-3 例4流程.例4-4:編制計(jì)算符號(hào)函數(shù)y=SGN(x)的程序ARE EQU 8040HBUF EQU 8060HORG 0000H JMP STARTORG 0030HSTART: MOV DPTR,#ARE MOV A,#0F0H MOVX DPTR,ALOOP: MOV DPTR,#ARE ;進(jìn)位位清零 MOVX A,DPTR ;取第一數(shù) JZ SUL JB

7、ACC.7,NEG MOV A,#01HSUL: MOV DPTR,#BUF MOVX DPTR,A JMP LOOPNEG: MOV A,#0FFH SJMP SUL END .4.3 循環(huán)程序設(shè)計(jì)簡(jiǎn)單程序,每條指令只執(zhí)行一次分支程序那么根據(jù)條件的不同,會(huì)跳過(guò)一些指令,執(zhí)行另一些指令。它們的特點(diǎn)是,每一條指令至多執(zhí)行一次。在處置實(shí)踐事務(wù)時(shí),有時(shí)會(huì)遇到多次反復(fù)處置的問(wèn)題,用循環(huán)程序的方法來(lái)處理就比較適宜。循環(huán)程序中的某些指令可以反復(fù)執(zhí)行多次。采用循環(huán)程序,使程序縮短,節(jié)省存儲(chǔ)單元。反復(fù)次數(shù)越多,循環(huán)程序的優(yōu)越性就越明顯。程序的執(zhí)行時(shí)間并不節(jié)省。由于要有循環(huán)預(yù)備、終了判別等指令,速度要比簡(jiǎn)單程序

8、稍慢些。 .循環(huán)程序組成循環(huán)程序普通由五部分組成:1、初始化部分:為循環(huán)程序做預(yù)備。如:設(shè)置循環(huán)次數(shù)計(jì)數(shù)器的初值,地址指針置初值,為循環(huán)變量賦初值等。2、處置部分:為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實(shí)體。3、修正部分:每執(zhí)行一次循環(huán)體后,對(duì)指針作一次修正,使指針指向下一數(shù)據(jù)所在位置,為進(jìn)入下一輪處置作預(yù)備。4、控制部分:根據(jù)循環(huán)次數(shù)計(jì)數(shù)器的形狀或循環(huán)條件,檢查循環(huán)能否能繼續(xù)進(jìn)展,假設(shè)循環(huán)次數(shù)到或循環(huán)條件不滿足,應(yīng)控制退出循環(huán),否那么繼續(xù)循環(huán)。通常2、3、4部分又稱為循環(huán)體。5、終了部分:分析及存放執(zhí)行結(jié)果。 .循環(huán)程序的構(gòu)造循環(huán)程序的構(gòu)造普通有兩種方式:先進(jìn)入處置部分,再控制循環(huán)。至少執(zhí)行一次循

9、環(huán)體。先控制循環(huán),后進(jìn)入處置部分。即先根據(jù)判別結(jié)果,控制循環(huán)的執(zhí)行與否,有時(shí)可以不進(jìn)入循環(huán)體就退出循環(huán)程序。.主要語(yǔ)句尋址方式存放器間接尋址MOV A,RiMOVX A,DPTRMOVX A,Ri基址存放器+變址存放器間接尋址MOVC A,A+DPTRMOVC A,A+PC循環(huán)計(jì)數(shù)DJNZ Rn,relDJNE A,direct,relJZ(JNZ,JC,JNC,JB,JNB) rel.例4-5 任務(wù)單元清零將40H為起點(diǎn)的8個(gè)單元清“0ORG 0000HCLEAR:CLR A ;A清0 MOV R0,#40H ;確定清0單元起始地址 MOV R7,#08 ;確定要去除的單元個(gè)數(shù)LOOP: M

10、OV R0,A ;清單元 INC R0 ;指向下一個(gè)單元 DJNZ R7,LOOP ;控制循環(huán) END.例4-5 任務(wù)單元清零例如:設(shè)有50個(gè)外部RAM單元要清“0,即為循環(huán)次數(shù)存放在R2存放器中,其首址存放在DPTR中,設(shè)為2000H ORG 0000H MOV DPTR,#2000H CLEAR: CLR A MOV R2,#32H ; 置計(jì)數(shù)值LOOP: MOVX DPTR,A INC DPTR ; 修正地址指針 DJNZ R2,LOOP ; 控制循環(huán) END .例4-5 任務(wù)單元清零寫成通用子程序方式:CLEAR: CLR ALOOP: MOVX DPTR,A INC DPTR ; 修

11、正地址指針 DJNZ R2,LOOP ; 控制循環(huán) RET完好調(diào)用 ORG 0000H MOV DPTR,#2000H MOV R2,#50 ACALL CLEAR SJMP $CLEAR: CLR ALOOP: MOVX DPTR,A INC DPTR ; 修正地址指針 DJNZ R2,LOOP ; 控制循環(huán) RET END.例4-6 多個(gè)單字節(jié)數(shù)據(jù)求和知有n個(gè)單字節(jié)數(shù)據(jù),依次存放在內(nèi)部RAM 40H單元開場(chǎng)的延續(xù)單元中。要求把計(jì)算結(jié)果存入R2,R3中高位存R2,低位存R3。程序如下: ORG 8000HSAD: MOV R0,#40H ;設(shè)數(shù)據(jù)指針 MOV R5,#NUM ; 計(jì)數(shù)值0AH

12、R5SAD1: MOV R2,#0 ; 和的高8位清零 MOV R3,#0 ; 和的低8位清零LOOP: MOV A,R3 ; 取加數(shù) ADD A,R0 MOV R3,A ; 存和的低8位 JNC LOP1 ; 無(wú)進(jìn)位,直接計(jì)算高8位 INC R2 ; 有進(jìn)位,和的高8位+1LOP1: INC R0 ; 指向下一數(shù)據(jù)地址 DJNZ R5,LOOP RETNUM EQU 0AH END 上述程序中,用R0作間址存放器,每作一次加法,R0加1,數(shù)據(jù)指針指向下一數(shù)據(jù)地址,R5為循環(huán)次數(shù)計(jì)數(shù)器,控制循環(huán)的次數(shù)。 .例4-7 測(cè)試字符串長(zhǎng)度設(shè)有一串字符依次存放在從50H單元開場(chǎng)的延續(xù)單元中,該字符串以回

13、車符(0DH)為終了標(biāo)志,測(cè)得的字符串長(zhǎng)度存入R2中。測(cè)字符串長(zhǎng)度程序是將該字符串中的每一個(gè)字符依次與回車符相比,假設(shè)比較不相等,那么統(tǒng)計(jì)字符串長(zhǎng)度的計(jì)數(shù)器加1。繼續(xù)比較,假設(shè)比較相等,那么表示該字符串終了,計(jì)數(shù)器中的值就是字符串的長(zhǎng)度。程序如下: ORG 0000HCONT: MOV R2,#00H ;初始長(zhǎng)度設(shè)置 MOV R0,#50H ;數(shù)據(jù)指針R0置初值NEXT: CJNE R0,#0DH,LOOP1 RETLOOP1: INC R0 INC R2 SJMP NEXT END待測(cè)字符以ASCII碼方式存放在RAM中,回車符的ASCII碼為0DH,程序中用一條CJNE R0,#0DH,L

14、OOP指令實(shí)現(xiàn)字符比較及控制循環(huán)的義務(wù),當(dāng)循環(huán)終了時(shí),R2的內(nèi)容為字符串長(zhǎng)度 .例4-9 10秒延時(shí)程序延時(shí)程序與MCS-51執(zhí)行指令的時(shí)間有關(guān),假設(shè)運(yùn)用6MHz晶振,一個(gè)機(jī)器周期為2s,計(jì)算出執(zhí)行一條指令以致一個(gè)循環(huán)所需求的時(shí)間,給出相應(yīng)的循環(huán)次數(shù),便能到達(dá)延時(shí)的目的。程序如下:DEL: MOV R5,#100DEL0: MOV R6,#200DEL1: MOV R7,#248DEL2: DJNZ R7,DEL2 ;248*2+4 DJNZ R6,DEL1 ;248*2+4*200+4 DJNZ R5,DEL0 ;248*2+4*200+4*100+4 RET上例延時(shí)程序?qū)嵺`延時(shí)為10.00

15、0406秒。它是一個(gè)三重循環(huán)程序,利用程序嵌套的方法對(duì)時(shí)間實(shí)行延遲是程序設(shè)計(jì)中常用的方法。運(yùn)用多重循環(huán)程序時(shí),必需留意以下幾點(diǎn):1循環(huán)嵌套,必需層次清楚,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。2外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入,終了時(shí)由里往外一層層退出。3內(nèi)循環(huán)體可以直接轉(zhuǎn)入外循環(huán)體,實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制的循環(huán)構(gòu)造方式。.例4-10 冒泡程序 MOV R6,#CNT DEC R6 LOOPA: MOV R0,#30H MOV A,R6 MOV R7,A CLR 20H.0 NEXT: MOV A,R0 INC R0 CLR C SUBB A,R0 JC NXCH MOV A,R0 DEC R0 XCH

16、A,R0 INC R0 MOV R0,A SETB 20H.0CNT EQU 07HORG 0000H AJMP STARTORG 0030HSTART: MOV DPTR,#LIST MOV R0,#30H MOV R7,#CNTLOOPD: CLR A MOVC A,A+DPTR MOV R0,A INC DPTR INC R0 DJNZ R7,LOOPDNXCH: DJNZ R7,NEXT JNB 20H.0,OVER DJNZ R6,LOOPAOVER: AJMP $LIST: DB 70H,13H,3H,90H,27H,32H,11Hend.例4-13 無(wú)符號(hào)數(shù)雙字節(jié)乘法 R2 R3

17、 R6 R7- R3 R7 R2 R7 R3 R6 R2 R6- R4 R5 R6 R7.例4-13 無(wú)符號(hào)數(shù)雙字節(jié)乘法ORG 0000H AJMP MAINORG 0030HMAIN: MOV SP,#60HSTART: MOV R2,#0FFH MOV R3,#0FFH MOV R6,#0FFH MOV R7,#0FFH LCALL DBMUL AJMP STARTDBMUL: MOV A,R3 MOV B,R7 MUL AB XCH A,R7 MOV R5,B MOV B,R2 MUL AB ADD A,R5 MOV R4,A CLR A ADDC A,B MOV A,R5 MOV A,

18、R6 MOV B,R3 MUL AB ADD A,R4 XCH A,R6 XCH A,B ADDC A,R5 MOV R5,A MOV F0,C MOV A,R2 MUL AB ADD A,R5 MOV R5,A CLR A MOV ACC.0,C MOV C,F0 ADDC A,B MOV R4,A RET END.4.4 散轉(zhuǎn)程序設(shè)計(jì)散轉(zhuǎn)程序是分支程序的一種。它由輸入條件或運(yùn)算結(jié)果來(lái)確定轉(zhuǎn)入各自的處置程序。有多種方法能實(shí)現(xiàn)散轉(zhuǎn)程序,但通常用逐次比較法,即把一切各個(gè)情況逐一進(jìn)展比較,假設(shè)有符合便轉(zhuǎn)向?qū)?yīng)的處置程序。由于每一個(gè)情況都有判別和轉(zhuǎn)移,如對(duì)n個(gè)情況,需求n個(gè)判別和轉(zhuǎn)移,因此它的缺陷是

19、程序比較長(zhǎng)。MCS-51指令系統(tǒng)中有一條跳轉(zhuǎn)指JMP A+DPTR,用它可以容易地實(shí)現(xiàn)散轉(zhuǎn)功能。該指令是把累加器A的8位無(wú)符號(hào)數(shù)作地址的低8位與16位數(shù)據(jù)指針的內(nèi)容相加,其和送入程序計(jì)數(shù)器,作為轉(zhuǎn)移指令的地址。執(zhí)行JMP A+DPTR指令后,累加器和16位數(shù)據(jù)指針的內(nèi)容均不受影響。 .例4-16 用轉(zhuǎn)移指令表實(shí)現(xiàn)散轉(zhuǎn)根據(jù)某一單元的值0,1,2,n分別轉(zhuǎn)向處置程序0,處置程序1,處置程序n。這時(shí)可以用轉(zhuǎn)移指令A(yù)JMP或LJMP組成一個(gè)轉(zhuǎn)移表例4-16: 根據(jù)R6的內(nèi)容,轉(zhuǎn)向各個(gè)處置程序 MOV DPTR,#TAB1 MOV A,R6 ADD A,R6PAD: JMP A+DPTRTAB1: AJ

20、MP LOP0 AJMP LOP1 AJMP LOP2本例僅適用于散轉(zhuǎn)表首地址TAB1和處置程序入口地址LOP0,LOP1,LOPn在同一個(gè)2K范圍的存儲(chǔ)區(qū)的情況。假設(shè)一個(gè)2K范圍的存儲(chǔ)區(qū)內(nèi)放不下一切的處置程序時(shí),把一些較長(zhǎng)的處置程序放在其他存儲(chǔ)區(qū)域,只需在該處置程序的入口地址內(nèi)用LJMP指令即可。 .例4-16 用LJMP指令組成轉(zhuǎn)移表 PJ2: MOV DPTR,#TAB2 CLR C MOV R5,#0 MOV A,R6 RLC A ;R6*2 JNC AD1 INC R5 ;有進(jìn)位,高8位加1AD1: ADD A,R6 ;R6*3 JNC AD2 INC R5 ;有進(jìn)位,高8位加1AD

21、2: MOV A,R5 ADD A,DPH ;DPTR高8位調(diào)整 MOV A,R6 JMP A+DPTR ;得散轉(zhuǎn)地址TAB2: LJMB LOP0 LJMP LOP1 LJMP LOPn END 用AJMP組成的散轉(zhuǎn)表為二字節(jié)一項(xiàng),而用LJMP組成的散轉(zhuǎn)表那么為三字節(jié)一項(xiàng),根據(jù)R6中的內(nèi)容或乘2,或乘3得每一處置程序的入口地址表指針。PJ2: MOV DPTR,#TAB2 CLR C MOV R5,#0 MOV A,R6 RLC A ;R6*2 JNC AD1 INC DPH ;AD1: ADD A,R6 ;R6*3 JNC AD2 INC DPH ;AD2: JMP A+DPTR TAB2

22、: LJMB LOP0 LJMP LOP1 LJMP LOPn END.例4-17 用轉(zhuǎn)移地址表實(shí)現(xiàn)散轉(zhuǎn)例4-17: 根據(jù)R3的內(nèi)容轉(zhuǎn)向?qū)?yīng)處置程序。處置程序的入口分別是LOP0LOP2。PJ3: MOV DPTR,#TAB3 MOV A,R3 ADD A,R3 ;R3*2 JNC CAD INC DPH ;有進(jìn)位DPTR高位加1CAD: MOV R2,A ;暫存R2 MOVC A,A+DPTR XCH A,R2 ;處置程序入口地址高8位暫存R2 INC A MOVC A,A+DPTR MOV DPL,A ;處置程序入口地址低8位暫存DPL MOV DPH,R2 CLR A JMP A+DPT

23、RTAB3:DW LOP0 DW LOP1 DW LOP2.4.5 子程序和參數(shù)傳送方法在程序中,會(huì)多次進(jìn)展一些一樣的計(jì)算和操作,普通把他們寫成子程序如數(shù)制轉(zhuǎn)換、函數(shù)式計(jì)算等。一些常用的程序段,以子程序的方式,事先存放在存儲(chǔ)器的某一區(qū)域主程序在運(yùn)轉(zhuǎn)時(shí),需求用子程序時(shí),只需執(zhí)行調(diào)用子程序的指令,使程序轉(zhuǎn)至子程序。子程序處置終了,前往主程序,繼續(xù)進(jìn)展以后的操作。調(diào)用子程序有幾個(gè)優(yōu)點(diǎn):1、防止對(duì)一樣程序段的反復(fù)編制。2、簡(jiǎn)化程序的邏輯構(gòu)造,同時(shí)也便于子程序調(diào)試。3、節(jié)省存儲(chǔ)器空間。有兩條調(diào)用子程序指令A(yù)CALL及LCALL,和一條前往主程序的指令RET。子程序的調(diào)用,普通包含兩個(gè)部分:維護(hù)現(xiàn)場(chǎng)和恢復(fù)

24、現(xiàn)場(chǎng)。參數(shù)的傳送調(diào)用子程序時(shí),主程序先把有關(guān)的參數(shù)入口參數(shù)存放在商定的位置,子程序在執(zhí)行時(shí),從商定的位置獲得參數(shù),當(dāng)子程序執(zhí)行完,將得到的結(jié)果出口參數(shù)存入商定的位置,前往主程序后,主程序可以從這些商定的位置上取到需求的結(jié)果。.1、任務(wù)存放器或累加器傳送參數(shù)把入口參數(shù)或出口參數(shù)放任務(wù)存放器或累加器中。運(yùn)用這種方法程序最簡(jiǎn)單,運(yùn)算速度也最高。缺陷任務(wù)存放器數(shù)量有限,不能傳送太多的數(shù)據(jù);主程序必需先把數(shù)據(jù)送到任務(wù)存放器;參數(shù)個(gè)數(shù)固定,不能由主程序恣意改定。例:請(qǐng)編出能把R5單元內(nèi)兩個(gè)BCD數(shù)變換成相應(yīng)ASCII碼放在R6高位BCD數(shù)的ASCII碼和R7低位BCD數(shù)的ASCII碼單元的程序。根據(jù)ASC

25、II字符表,09的BCD數(shù)和它們的ASCII碼之間僅相差30H。因此,僅需把R5單元中兩個(gè)BCD數(shù)拆開,分別和30H相加就行了,可以編出程序如下:ASCH: MOV A,R5 ANL A,#0F0H ORL A,#30H MOV R6,A MOV A,R5 ANL A,#0FH ORL A,#30H MOV R7,A RET.2、用指針存放器來(lái)傳送參數(shù)由于數(shù)據(jù)普通存放在存貯器中,而不是任務(wù)存放器中,故可用指針來(lái)指示數(shù)據(jù)的位置,可以節(jié)省傳送數(shù)據(jù)的任務(wù)量,并可實(shí)現(xiàn)可變長(zhǎng)度運(yùn)算。普通如參數(shù)在內(nèi)部RAM中,可用R0或R1作指針??勺冮L(zhǎng)度運(yùn)算時(shí),可用一個(gè)存放器來(lái)指出數(shù)據(jù)長(zhǎng)度,也可在數(shù)據(jù)中指出其長(zhǎng)度如運(yùn)用

26、終了標(biāo)志符。 例: 將R0和R1指出的內(nèi)部RAM中兩個(gè)3字節(jié)無(wú)符號(hào)整數(shù)相加,結(jié)果送R0指出的內(nèi)部RAM中。入口時(shí),R0,R1分別指向加數(shù)和被加數(shù)的低位字節(jié),出口時(shí)R0指向結(jié)果的高位字節(jié)。利用MS-51的帶進(jìn)位加法指令,可以直接編寫出下面的程序。NADD: MOV R7,#3 CLR CNADD1: MOV A,R0 ADDC A,R1 MOV R0,A DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 INC R0 INC R0 RET.3、用堆棧來(lái)傳送參數(shù)堆棧可以用于傳送參數(shù)。調(diào)用時(shí),主程序用PUSH指令把參數(shù)壓入堆棧子程序可按棧指針訪問(wèn)堆棧中的參數(shù),同時(shí)可把結(jié)果參數(shù)送回

27、堆棧中。前往主程序后,可用POP指令得到這些結(jié)果參數(shù)。這種方法的優(yōu)點(diǎn)是簡(jiǎn)單,能傳送大量參數(shù),不用為特定的參數(shù)分配存貯單元。運(yùn)用這種方法時(shí),由于參數(shù)在堆棧中,故大大簡(jiǎn)化了中斷呼應(yīng)時(shí)的現(xiàn)場(chǎng)維護(hù)。 .例4-19 一位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼子程序HASC:MOV R0,SPDEC R0DEC R0 ;R0為參數(shù)指針XCH A,R0 ;維護(hù)ACC,取出參數(shù)ANL A,#0FH ADD A,#2 ;加偏移量MOVC A,A+PCXCH A,R0 ;查表結(jié)果放回堆棧中RETDB 0123456789 ;十六進(jìn)制數(shù)的ASCII字符表DB ABCDEF.例4-21 一個(gè)字節(jié)的兩位十六進(jìn)制數(shù)為轉(zhuǎn)換為兩個(gè)AS

28、CII碼子程序ORG 0000H AJMP STARTORG 0030HSTART: MOV SP,#60H MOV 40H,#7FH PUSH 40H MOV A,#78h LCALL HTA2 AJMP STARTHTA2: MOV R0,SPDEC R0DEC R0PUSH ACC ;維護(hù)累加器內(nèi)容(?)MOV A,R0 ;取出參數(shù)ANL A,#0FHMOV DPTR,#DATA1MOVC A,A+DPTRXCH A,R0 ;低位HEX的ASCII碼放入堆棧中SWAP AANL A,#0FHMOVC A,A+DPTRINC R0XCH A,R0 ;高位HEX的ASCII碼放入堆棧中INC

29、 R0XCH A,R0 ;高位前往地址放入堆棧,并恢復(fù)累加器內(nèi)容RETDATA1:DB 0123456789DB ABCDEFEND.例22將內(nèi)部RAM中50H、51H中的內(nèi)容以4位十六進(jìn)制數(shù)的ASCII方式在串行發(fā)送出去,可如下調(diào)用HTA2程序: ORG 0000HSCOT4: PUSH 50HACALL HTA2POP ACCACALL COUTPOP ACCACALL COUTPUSH 51HACALL HTA2POP ACCACALL COUTPOP ACCACALL COUTCOUT: JNB TI,COUT ;字符發(fā)送子程序CLR TIMOV SBUF,ARETEND.4、程序段參

30、數(shù)傳送參數(shù)傳送方法,多數(shù)是在調(diào)用子程序前,把值裝入適當(dāng)?shù)拇娣牌鱾魉蛥?shù)。假設(shè)有許多常數(shù)參數(shù),這種技術(shù)不太有效,每個(gè)參數(shù)需求一個(gè)存放器傳送,并且在每次調(diào)用子程序時(shí)需分別用指令把它們裝入存放器中。假設(shè)需求大量參數(shù),并且這些參數(shù)均為常數(shù)時(shí),程序段參數(shù)傳送方法有時(shí)也稱為直接參數(shù)傳送是傳送常數(shù)的有效方法。調(diào)用時(shí),常數(shù)作為程序代碼的一部分,緊跟在調(diào)用子程序后面。子程序根據(jù)棧內(nèi)的前往地址,決議從何處找到這些常數(shù)然后在需求時(shí),從程序存貯器中讀出這些參數(shù)。.例22字符串發(fā)送子程序。實(shí)踐運(yùn)用中,需求發(fā)送各種字符串。這些字符串,通常放在EPROM程序存貯器中。按通常方法,需求先把這些字符裝入RAM中,然后用傳送指針

31、的方法來(lái)實(shí)現(xiàn)參數(shù)傳送。為了簡(jiǎn)便,也可把字符串放在EPROM獨(dú)立區(qū)域中,然后用傳送字符串首地址的方法來(lái)傳送參數(shù)。子程序可按該地址用MOVC指令從EPROM中讀出并發(fā)送該字符串。最簡(jiǎn)單的方法是采用程序段參數(shù)傳送方法。下例中,字符串全以0終了。SOUT: POP DPH ;棧中指針 POP DPLSOT1: CLR A MOVC A,A+DPTR INC DPTR JZ SEND JNB TI,$ ;$為本條指令地址 CLR TI MOV SBUF,A SJMP SOT1SEND: JMP A+DPTRRET 下面從發(fā)送字符串MCS-51 CONTROLLER為例,闡明該子程序運(yùn)用方法。ACALL

32、SOUTDB MCS-51 CONTROLLERDB 0AH,0DH,0后面緊接其他程序。 .例22:總結(jié)上面子程序有幾個(gè)特點(diǎn):它不以普通的前往指令結(jié)尾,而是采用基存放器加變址存放器間接轉(zhuǎn)移指令來(lái)前往到參數(shù)表后的第一條指令。一開場(chǎng)的POP指令已調(diào)整了棧指針的內(nèi)容。它可適用與ACALL或LCALL,由于這兩種調(diào)用指令均把下一條指令或數(shù)據(jù)字節(jié)的地址壓入棧中。調(diào)用程序可位于MCS-51全部地址空間的任何地方,由于MOVC指令能訪問(wèn)一切64K字節(jié)。傳送到子程序的參數(shù)可按最方便的次序列表,而不用按運(yùn)用的次序陳列。子程序在每一條MOVC 指令前累加器裝入適當(dāng)?shù)膮?shù),這樣根本上可“隨機(jī)訪問(wèn)參數(shù)表。子程序只運(yùn)

33、用累加器A和數(shù)據(jù)指針DPTR,運(yùn)用程序可以在調(diào)用前,把這些存放器壓入堆棧中,維護(hù)它們的內(nèi)容。 .4.6查表程序設(shè)計(jì)查表程序是一種常用程序,它廣泛運(yùn)用于LED顯示器控制、打印機(jī)打印以及數(shù)據(jù)補(bǔ)償,計(jì)算、轉(zhuǎn)換等功能程序中,具有程序簡(jiǎn)單、執(zhí)行速度快等優(yōu)點(diǎn)。查表,就是根據(jù)變量x在表格中查找y,使y=fx。.1、用MOVC A,A+PC查表指令編程例:用查表方法編寫彩燈控制程序,編程使彩燈先依次點(diǎn)亮,再逆次點(diǎn)亮,然后連閃三下,反復(fù)循環(huán)。TAB: DB 01H,02H,04H,08H,10H,20H,40H,80H DB 80H,40H,20H,10H,08H,04H,02H,01H DB 00H,0FFH,00H,0FFH,00H,0FFH,03HDEL: MOV R7,#0FFHDEL1: MOV R6,#0FFHDEL2: DJNZ R6,DEL2 DJNZ R7,DEL1 RETEND ORG 0000HSTART: MOV R0,#00HLOOP: CLR A MOV A,R0ADD A,#0CHMOVC A,A+PCCJNE A,#03H,LOO

溫馨提示

  • 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)論