《單片機(jī)原理及應(yīng)用》課件03-擴(kuò)展程序舉例_第1頁
《單片機(jī)原理及應(yīng)用》課件03-擴(kuò)展程序舉例_第2頁
《單片機(jī)原理及應(yīng)用》課件03-擴(kuò)展程序舉例_第3頁
《單片機(jī)原理及應(yīng)用》課件03-擴(kuò)展程序舉例_第4頁
《單片機(jī)原理及應(yīng)用》課件03-擴(kuò)展程序舉例_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

分支程序?qū)嵗?用單片機(jī)加重力傳感器作磅秤,秤出重量后算出行李運(yùn)費(fèi)價(jià)格,其秤出的重量以10kg為1個(gè)計(jì)價(jià)單位G,G已存入40H單元。

計(jì)價(jià)方法為50kg以內(nèi)按3元,

50kg以上分段計(jì)價(jià):

50kg按3元計(jì)價(jià),超過部分

按2元計(jì)價(jià)。

由此列出算式:5×3+(G-5)×2;當(dāng)G>5M=G×3;當(dāng)G≤5流程見左,程序如下:

ORG0100HFRT:MOVA,40H ;取行李重量計(jì)價(jià)單位G

MOVB,#03H ;運(yùn)費(fèi)M=G×3

CJNEA,#05H,L1 ;G≤5? SJMPWETC L1:JC WETC ;是,轉(zhuǎn)至WETC SUBBA,#05H ;否則M=3G+2(G-5)

RLCA ADDA,#15 SJMPDONEWETC:MULABDONE:MOV41H,A ;存運(yùn)費(fèi)M RET

多分支散轉(zhuǎn)程序的設(shè)計(jì)

有一類分支程序,它根據(jù)不同的輸入條件或不同的運(yùn)算結(jié)果,轉(zhuǎn)向不同的處理程序,稱之為散轉(zhuǎn)程序。這類程序通常利用JMP@A+DPTR間接轉(zhuǎn)移指令實(shí)現(xiàn)轉(zhuǎn)移。有如下兩種設(shè)計(jì)方法:

1.查轉(zhuǎn)移地址表

將轉(zhuǎn)移地址列成表格,將表格的內(nèi)容作轉(zhuǎn)移的目標(biāo)地址。

2.查轉(zhuǎn)移指令表

將轉(zhuǎn)移到不同程序的轉(zhuǎn)移指令列成表格,判斷條件后查表,轉(zhuǎn)到表中指令執(zhí)行,下面用兩個(gè)例子說明。1.利用轉(zhuǎn)移地址表實(shí)現(xiàn)轉(zhuǎn)移例:根據(jù)R3的內(nèi)容轉(zhuǎn)向?qū)?yīng)的程序,R3的內(nèi)容為0~n,處理程序的入口符號地址分別為PR0~PRn(n<128)。分析:將PR0—PRn入口地址列在表格中,每一項(xiàng)占兩個(gè)單元,PRn在表中的偏移量為2n,因此將R3的內(nèi)容乘2即得PRn在表中的偏移地址,從偏移地址2n和2n+1兩個(gè)單元分別取出PRn的高八位地址和低八位地址送DPTR寄存器,用JMP@A+DPTR指令(A先清零)即轉(zhuǎn)移到PRn入口執(zhí)行。設(shè)PR0—PRn入口地址分別為0110H,0220H,0330H,……。程序如下:ORG

0000HPR0

EQU0110HPR1EQU

0220HPR2EQU

0330H

……MOVA,R3;R3→AADDA,ACC;A*2MOVDPTR,#TABPUSHACCMOVCA,@A+DPTR;取地址表中高字節(jié)MOVB,A;暫存于BINCDPL;表地址加1POPACCMOVCA,@A+DPTR;取地址表中低字節(jié)MOVDPL,AMOVDPH,B;DPTR為表中地址CLRA;A=0JMP@A+DPTR;轉(zhuǎn)移TAB:DWPR0,PR1,PR2,…..,PRn;轉(zhuǎn)移地址表END01100220..TABTAB+2DPHDPL例如R3=1的操作0220

2.利用轉(zhuǎn)移指令表實(shí)現(xiàn)轉(zhuǎn)移

例:設(shè)有五個(gè)按鍵0、1、2、3、4其編碼分別為3AH、47H、65H、70H、8BH,要求根據(jù)按下的鍵轉(zhuǎn)向不同的處理程序,分別為PR0、PR1、PR2、PR3、PR4,設(shè)按鍵的編碼已在B寄存器中,編出程序。分析:將鍵碼排成表,將鍵碼表中的值和B中的鍵編碼比對,記下在鍵碼表中和B中的鍵編碼相等的序號,另安排一個(gè)轉(zhuǎn)移表,安排AJMP指令(機(jī)器碼),因每條AJMP指令占二字節(jié),將剛才記下的序號乘2即為轉(zhuǎn)移表的偏移地址,利用JMP@A+DPTR執(zhí)行表內(nèi)的AJMP指令,從而實(shí)現(xiàn)多分支轉(zhuǎn)移,設(shè)轉(zhuǎn)移表表頭JPT的地址為001AH、PR0……

ORG0000HMOVDPTR,#TAB;置鍵碼表首址

MOVA,#0;表的起始位的偏移量為0NEXT:PUSHACCMOVCA,@A+DPTR;取鍵碼表的編碼存于A

CJNEA,B,AGAN;將B中值和A中的鍵碼比較,不等轉(zhuǎn)移

POPACC;A=B,查到了B的鍵碼恢復(fù)鍵碼表的偏移量(序號)RLA;序號乘2得分支表內(nèi)偏移量

MOVDPTR,#JPT;置分支表首址

JMP@A+DPTR;如B=65H,該指令即為JMP001CHAGAN:POPACC;不相等比較下一個(gè)

INCA;序號加1CJNEA,#5,NEXTSJMP$;鍵碼查完還沒有B中按鍵編碼程序結(jié)束

JPT:AJMPPR0;分支轉(zhuǎn)移表

AJMPPR1AJMPPR2AJMPPR3AJMPPR4TAB:DB3AH,47H,65HDB70H,8BH;鍵碼表

上面程序中如B=65H執(zhí)行JMP001CH而001CH單元中是指令JMPPR2因而執(zhí)行JMPPR2指令若按的是其他鍵,也會自動(dòng)轉(zhuǎn)到相應(yīng)的PRn執(zhí)行。

MCS-51單片機(jī)有著優(yōu)異的位邏輯功能,可以方便的實(shí)現(xiàn)各種復(fù)雜的邏輯運(yùn)算.這種用軟件替代硬件的方法,可以大大簡化甚至完全不用硬件,但比硬件要多花運(yùn)算時(shí)間。例:編寫一程序,以實(shí)現(xiàn)圖3-7中的邏輯運(yùn)算電路.位操作程序設(shè)計(jì)

其中P1.1和P2.2分別是端口線上的信息,TF0和IE1分別是定時(shí)器定時(shí)溢出標(biāo)志和外部中請求標(biāo)志,25H和26H分別是兩個(gè)位地址,運(yùn)算結(jié)果由端口線P1.3輸出。

圖3-7硬件邏輯運(yùn)算電路程序如下:START:MOVC,P2.2ORLC,TF0ANLC,P1.1MOVF0,CMOVC,IE1ORLC,/25HANLC,F0ANLC,/26HMOVP1.3,CSJMP$例:設(shè)累加器A的各位ACC.0~ACC.7分別記為X0~X7,編制程序用軟件實(shí)現(xiàn)下式:

Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7

X0BITACC.0X1BITACC.1X2BITACC.2X3BITACC.3X4BITACC.4X5BITACC.5X6BITACC.6X7BITACC.7

ORG0000HMOVC,X0ANLC,X1ANLC,X2MOV00H,C;X0X1X2MOVC,X0ANLC,/X1MOV01H,C;X0X1ANLC,/X2ORLC,00HMOV00H,CMOVC,X2ANLC,01H

ANLC,X3;X0X1X2X3ORLC,/00HMOV00H,CMOVC,X7ANLC,/X6ANLC,/X5ANLC,/X4;X4X5X6X7ORLC,00H;最終結(jié)果

Y→CSJMP$Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7子程序是構(gòu)成單片機(jī)應(yīng)用程序必不可少的部分,通過ACALL和LCALL兩條子程序調(diào)用指令,可以十分方便地用來調(diào)用任何地址處的子程序。子程序節(jié)省占用的存儲單元,使程序簡短、清晰,善于靈活的使用子程序,是程序設(shè)計(jì)的重要技巧之一。子程序必須以RET指令結(jié)尾.

在調(diào)用子程序時(shí),有以下幾點(diǎn)應(yīng)注意:子程序當(dāng)一段程序需多次應(yīng)用,或?yàn)槎嗳藨?yīng)用時(shí),這段程序編為子程序.

1)保護(hù)現(xiàn)場。如果在調(diào)用前主程序已經(jīng)使用了某些存儲單元或寄存器,在調(diào)用時(shí),這些寄存器和存儲單元又有其他用途,就應(yīng)先把這些單元或寄存器中的內(nèi)容壓入堆棧保護(hù),調(diào)用完后再從堆棧中彈出以便加以恢復(fù)。如果有較多的寄存器要保護(hù),應(yīng)使主、子程序使用不同的寄存器組。

2)設(shè)置入口參數(shù)和出口參數(shù)。用之前主程序要按子程序的要求設(shè)置好地址單元或存儲器(稱為入口參數(shù)),以便子程序從指定的地址單元或存儲器獲得輸入數(shù)據(jù);子程序經(jīng)運(yùn)算或處理后的結(jié)果存放到指定的地址單元或寄存器(稱為出口參數(shù)),主程序調(diào)用后從指定的地址單元或寄存器讀取運(yùn)算或處理后的結(jié)果,只有這樣,才能完成子程序和主程序間的數(shù)據(jù)的正確傳遞。3)子程序中可包括對另外子程序的調(diào)用,稱為子程序嵌套。例

用程序?qū)崿F(xiàn)c=a2+b2,設(shè)a,b均小于10。a存放在31H單元,b存放在32H單元,把c存入34H和33H單元。(和要求為BCD碼)。解:因該算式兩次用到平方值,所以在程序中采用把求平方編為子程序的方法。求平方采用查表法,主程序和子程序編寫如下:主程序:ORG0000HMOVSP,#3FHMOVA,31H;取aLCALLSQR;求a方MOVR1,AMOVA,32H;取bLCALLSQR;求b方ADDA,R1;求和DAA;調(diào)整MOV33H,AMOVA,#0ADDCA,#0

MOV34H,ASJMP$子程序:

ORG0030HSQR:INCAMOVCA,@A+PCRETTAB:DB00H,01H,04HDB09H16H,25H,DB36H,49H64H,81HEND求兩個(gè)無符號數(shù)數(shù)據(jù)塊中的最大值的乘積。數(shù)據(jù)塊的首地址分別為60H和70H,每個(gè)數(shù)據(jù)塊的第一個(gè)字節(jié)都存放數(shù)據(jù)塊長度,結(jié)果存入5FH和5EH單元中。分析本例可采用分別求出兩個(gè)數(shù)據(jù)塊的最大值然后求積的方法,求最大值的過程可采用子程序。子程序的入口參數(shù)是數(shù)據(jù)塊首地址,存放在R1中;出口參數(shù)為最大值,存放在A中.主程序:ORG000HMOVR1,#60H ;置第一個(gè)數(shù)據(jù)塊入口參數(shù)ACALLQMAX ;調(diào)求最大值子程序MOVB,A ;第一個(gè)數(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論