單片機(jī)程序設(shè)計(jì)_第1頁(yè)
單片機(jī)程序設(shè)計(jì)_第2頁(yè)
單片機(jī)程序設(shè)計(jì)_第3頁(yè)
單片機(jī)程序設(shè)計(jì)_第4頁(yè)
單片機(jī)程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

匯編語(yǔ)言設(shè)計(jì)

順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)1精選ppt3.1匯編語(yǔ)言程序設(shè)計(jì)方法

匯編語(yǔ)言程序設(shè)計(jì)同高級(jí)語(yǔ)言程序設(shè)計(jì)一樣,是有章可循的,只要按照一定的方法步驟去做,程序設(shè)計(jì)就會(huì)變成一件輕松愉快的事情,設(shè)計(jì)的程序也會(huì)規(guī)范、清晰、易讀、易懂。使用匯編語(yǔ)言設(shè)計(jì)程序大致上可分為以下幾個(gè)步驟。1.分析題意,明確要求。2.確定算法。3.畫(huà)程序流程圖。4.分配內(nèi)存工作單元。5.編寫(xiě)源程序。6.程序優(yōu)化。7.上機(jī)調(diào)試。2精選ppt3.2順序程序設(shè)計(jì)【例】程序初始化。初始化就是為變量、寄存器、存儲(chǔ)單元賦一初值,是最簡(jiǎn)單、最常用的操作。如將R0-R3,P1,30H,40H單元初始化為00H,把R4,R5初始化為0FFH。參考程序如下:

ORG0000H ;PC起始地址

LJMPSTART ;轉(zhuǎn)主程序

ORG0100H ;主程序起始地址START:MOVR0,#00H ;初始化

MOVR1,#00H MOVR2,#00H MOVR3,#00H MOVP1,#00H3精選ppt MOVR4,#0FFH MOVR5,#0FFH MOV30H,#00HMOV40H,#00HHERE:SJMPHERE ;反復(fù)執(zhí)行該指令,相當(dāng)于等待

END用立即數(shù)比較直觀,但用MOVA,#00H,MOVR0,A指令賦值,效果更好。4精選ppt【例】邏輯運(yùn)算。邏輯操作是控制過(guò)程中經(jīng)常使用的,掌握邏輯運(yùn)算的特點(diǎn)是提高程序效率的重要途徑。在邏輯運(yùn)算中,進(jìn)位標(biāo)標(biāo)志CY的地位很特殊,它是邏輯累加器,大多數(shù)邏輯操作要通過(guò)CY來(lái)完成。用程序?qū)崿F(xiàn)圖4-2所示的邏輯電路功能。圖3-2邏輯電路5精選ppt參考程序如下:

ORG0000H LJMPSTART ORG0100H MOVP1,#0FFH ;P1口初始化LOOP:MOVC,P1.1ORLC,P1.2 ;P1.1與P1.2邏輯或運(yùn)算

CPLC ;取反

ANLC,P1.0 ;C與P1.0邏輯與運(yùn)算

CPLCMOV07H,C ;暫存于07H單元中

MOVC,P1.3ANLC,/P1.4 ;P1.3與P1.4的反邏輯與運(yùn)算

CPLCORLC,07HMOVP1.5,C ;把結(jié)果在P1.5口輸出

SJMP$END6精選ppt3.3分支程序設(shè)計(jì)分支程序的主要特點(diǎn)是程序包含有判斷環(huán)節(jié),不同的條件對(duì)應(yīng)不同的執(zhí)行路徑。編程的關(guān)鍵任務(wù)是合理選用具有邏輯判斷功能的指令。由于選擇結(jié)構(gòu)程序的走向不再是單一的,因此,在程序設(shè)計(jì)時(shí),應(yīng)該借助程序框圖(判斷框)來(lái)明確程序的走向,避免犯邏輯錯(cuò)誤。一般情況下,每個(gè)選擇分支均需單獨(dú)一段程序,并有特定的名字,以便當(dāng)條件滿(mǎn)足時(shí)實(shí)現(xiàn)轉(zhuǎn)移。1.單分支選擇結(jié)構(gòu)當(dāng)程序的判斷是二選一時(shí),稱(chēng)為單分支選擇結(jié)構(gòu)。通常用條件轉(zhuǎn)移指令實(shí)現(xiàn)判斷及轉(zhuǎn)移。單分支選擇結(jié)構(gòu)有三種典型表現(xiàn)形式。7精選ppt圖3-3單分支選擇結(jié)構(gòu)8精選ppt(a)當(dāng)條件滿(mǎn)足時(shí)執(zhí)行分支程序1,否則執(zhí)行分支程序2。(b)當(dāng)條件滿(mǎn)足時(shí)跳過(guò)程序段1,從程序段2順序執(zhí)行;否則,順序執(zhí)行程序段1和程序段2。(c)當(dāng)條件滿(mǎn)足時(shí)程序順序執(zhí)行程序段2;否則,重復(fù)執(zhí)行程序段1,直到條件滿(mǎn)足為止。由于條件轉(zhuǎn)移指令均屬相對(duì)尋址方式,其相對(duì)偏移量rel是個(gè)帶符號(hào)的8位二進(jìn)制數(shù),可正可負(fù)。因此,它可向高地址方向轉(zhuǎn)移,也可向低地址方向轉(zhuǎn)移。對(duì)于第三種形式,可用程序段1重復(fù)執(zhí)行的次數(shù)作為判斷條件,當(dāng)重復(fù)次數(shù)達(dá)到某一數(shù)值時(shí),停止重復(fù),程序順序往下執(zhí)行。這是分支結(jié)構(gòu)的一種特殊情況,這實(shí)際是循環(huán)結(jié)構(gòu)程序。用這種方式可方便實(shí)現(xiàn)狀態(tài)檢測(cè)?!纠浚篖OOP:JBP1.1,LOOP單分支程序一般要使用狀態(tài)標(biāo)志,應(yīng)注意標(biāo)志位的建立。9精選ppt【例】設(shè)a存放在累加器A中,b存放在寄存器B中,若a≥0,Y=a-b;若a<0,則Y=a+b。這里的關(guān)鍵是判a是正數(shù),還是負(fù)數(shù);可通過(guò)判斷ACC.7確定。

ORG0000H LJMPBR ORG0100HBR: JBACC.7,MINUS ;負(fù)數(shù),轉(zhuǎn)到MINUS CLRC ;清進(jìn)位位

SUBBA,B ;A-B SJMPDONEMINUS:ADDA,B ;A+BDONE:SJMP$ ;等待

END10精選ppt2.雙向分支程序設(shè)計(jì)舉例【例4.3】設(shè)X存在30H單元中,根據(jù)下式

X+2 X>0Y= 100 X=0∣X∣ X<0求出Y值,將Y值存入31H單元。解:根據(jù)數(shù)據(jù)的符號(hào)位判別該數(shù)的正負(fù),若最高位為0,再判別該數(shù)是否為0。程序流程如圖4-4所示。

11精選pptA為負(fù)數(shù)?取數(shù),A←(30H)開(kāi)始結(jié)束A=0?YNNA←|X|A←64HA←X+2存數(shù),(31H)←A(30H)12精選ppt參考程序如下:ORG 1000H

MOV A,30H ;取數(shù)JB ACC.7,NEG;負(fù)數(shù),轉(zhuǎn)NEGJZ ZER0 ;為零,轉(zhuǎn)ZER0ADD A,#02H ;為正數(shù),求X+2AJMPSAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)ZER0:MOV A,#64H ;數(shù)據(jù)為零,Y=100AJMPSAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)NEG:DEC A CPL A ;求∣X∣SAVE: MOV 31H,A ;保存數(shù)據(jù)

SJMP $ ;暫停13精選ppt2.多分支選擇結(jié)構(gòu)當(dāng)程序的判別輸出有兩個(gè)以上的出口流向時(shí),稱(chēng)為多分支選擇結(jié)構(gòu)。8051的多分支結(jié)構(gòu)程序還允許嵌套,即分支程序中又有另一個(gè)分支程序。匯編語(yǔ)言本身并不限制這種嵌套的層次數(shù),但過(guò)多的嵌套層次將使程序的結(jié)構(gòu)變得十分復(fù)雜和臃腫,以致造成邏輯上的混亂。多分支選擇結(jié)構(gòu)通常有兩種形式,如圖4-4所示。圖4-4多分支選擇結(jié)構(gòu)14精選ppt8051的散轉(zhuǎn)指令和比較指令均可以實(shí)現(xiàn)多分支轉(zhuǎn)移。

散轉(zhuǎn)指令JMP@A+DPTR

比較指令CJNEA,direct,rel(共有4條)使用散轉(zhuǎn)指令前,先將各分支程序編寫(xiě)好,存放在程序存儲(chǔ)器中,并將各分支程序的入口地址組成一個(gè)表格放在一起,把表首地址送入DPTR,把子程序的序號(hào)放入A中。在8051指令中,還有4條功能極強(qiáng)的比較轉(zhuǎn)移指令:CJNEA,direct,rel CJNEA,#data,rel CJNERn,#data,relCJNE@Ri,#data,rel這4條指令對(duì)指定單元內(nèi)容進(jìn)行比較,當(dāng)不相等時(shí)程序作相對(duì)轉(zhuǎn)移,并指出其大小,以備作第二次判斷;若兩者相等,則程序順序執(zhí)行。15精選ppt【例】散轉(zhuǎn)程序。編寫(xiě)程序,根據(jù)20H單元中的內(nèi)容轉(zhuǎn)入相應(yīng)的分支,執(zhí)行指定的操作,將結(jié)果存入指定存儲(chǔ)器單元。程序流程框圖如圖4-5所示圖3-5散轉(zhuǎn)程序流程16精選ppt參考程序

ORG0000H LJMPMEMSRESULT EQU0050H ORG0100HMEMS: MOVA,20H MOVDPTR,#KKKK ;散轉(zhuǎn)程序入口地 址表首址

RLA;分支號(hào)乘2,每個(gè) 入口地址均為2字節(jié)

JMP@A+DPTR;轉(zhuǎn)移END1: SJMP$KKKK: AJMPMEMSP0;A=0加法

AJMPMEMSP1 ;A=1減法

AJMPMEMSP2 ;A=2乘法

SJMPMEMSP3 ;A=3除法

SJMPMEMSP4 ;A=4邏輯與

SJMPMEMSP5 ;A=5邏輯或17精選pptMEMSP0:MOVA,R0 ;相加分支

CLRC ADDA,R1MOVRESULT,A LJMPEND1MEMSP1:MOVA,R0 ;相減分支

CLRC SUBBA,R1 MOVRESULT,ALJMPEND1MEMSP2:MOVA,R0 ;乘法分支

MOVB,R1 CLRC MULABMOVRESULT,AMOVRESULT+1,BLJMPEND118精選pptMEMSP3:MOVA,R0 ;除法分支

MOVB,R1CLRCDIVABMOVRESULT,AMOVRESULT+1,BLJMPEND1MEMSP4:MOVA,R0 ;邏輯與分支

ANLA,R1MOVRESULT,ALJMPEND1MEMSP5:MOVA,R0 ;邏輯或分支

ORLA,R1MOVRESULT,ALJMPEND1END19精選ppt【例】?jī)蓚€(gè)無(wú)符號(hào)數(shù)比較大小。設(shè)外部RAM單元ST1和ST2中存放兩個(gè)無(wú)符號(hào)二進(jìn)制數(shù),要找出其中的大數(shù)存入ST3單元中。程序流程框圖如圖3-6所示。圖3-6求大數(shù)程序流程20精選ppt參考程序如下:

ORG0000HLJMPSTARTORG0100HSTART:MOVA,addr1 ;將addr1中內(nèi)容送ACJNEA,addr2,LOOP1;兩數(shù)比較,不相等則 轉(zhuǎn)LOOP1LOOP3:AJMP$;結(jié)束LOOP1:JCLOOP2 ;當(dāng)CY=1,轉(zhuǎn)LOOP2MOVaddr3,A;CY=0,(A)>(addr2)SJMPLOOP3;轉(zhuǎn)結(jié)束LOOP2:MOVaddr3,addr2 ;CY=1,(addr2)>(A)SJMPLOOP3 END21精選ppt3.4循環(huán)程序設(shè)計(jì)在實(shí)際應(yīng)用中經(jīng)常會(huì)遇到功能相同,需要多次重復(fù)執(zhí)行某段程序的情況,這時(shí)可把這段程序設(shè)計(jì)成循環(huán)結(jié)構(gòu),這有助于節(jié)省程序的存儲(chǔ)空間,提高程序的質(zhì)量。循環(huán)程序一般由4部分組成。1.初始化。即設(shè)置循環(huán)過(guò)程中有關(guān)工作單元的初始值,如置循環(huán)次數(shù)、地址指針及工作單元清零等。2.循環(huán)體。即循環(huán)處理部分,完成主要的計(jì)算或操作任務(wù),是重復(fù)執(zhí)行的程序段。

3.循環(huán)控制。每循環(huán)一次,就要修改循環(huán)次數(shù)、數(shù)據(jù)及地址指針等循環(huán)變量。并根據(jù)循環(huán)結(jié)束條件,判斷是否結(jié)束循環(huán)。

4.循環(huán)結(jié)束處理。對(duì)結(jié)果進(jìn)行分析、處理、保存。22精選ppt循環(huán)程序結(jié)構(gòu)有兩種,如圖3-7所示。圖3-7循環(huán)程序結(jié)構(gòu)23精選ppt圖(a)是“先執(zhí)行后判斷”結(jié)構(gòu),適用于循環(huán)次數(shù)已知的情況。其特點(diǎn)是進(jìn)入循環(huán)后,先執(zhí)行循環(huán)處理部分,然后根據(jù)循環(huán)次數(shù)判斷是否結(jié)束循環(huán)。圖(b)是“先判斷后執(zhí)行”結(jié)構(gòu),適用于循環(huán)次數(shù)未知的情況。其特點(diǎn)是將循環(huán)控制部分放在循環(huán)的入口處,先根據(jù)循環(huán)控制條件判斷是否結(jié)束循環(huán),若不結(jié)束,則執(zhí)行循環(huán)操作;若結(jié)束,則退出循環(huán)。24精選ppt【例】50ms軟件延時(shí)程序。

軟件延時(shí)程序一般都是由DJNZRn,rel指令構(gòu)成。執(zhí)行一條DJNZ指令需要兩個(gè)機(jī)器周期。軟件延時(shí)程序的延時(shí)時(shí)間主要與機(jī)器周期和延時(shí)程序中的循環(huán)次數(shù)有關(guān),在使用12MHz晶振時(shí),一個(gè)機(jī)器周期為1μs,執(zhí)行一條DJNZ指令需要兩個(gè)機(jī)器周期,即2μs。適當(dāng)設(shè)置循環(huán)次數(shù),即可實(shí)現(xiàn)延時(shí)功能。參考程序如下:

ORG0000H LJMPMEMS ORG0100HMEMS:DEL: MOVR7,#125 ;外循環(huán)次數(shù),該指令為一個(gè)機(jī)器周期DEL1: MOVR6,#200 ;內(nèi)循環(huán)次數(shù)DEL2: DJNZR6,DEL2 ;200×2=400μs(內(nèi)循環(huán)時(shí)間) DJNZR7,DEL1 ;0.4ms×125=50ms(外循環(huán)時(shí)間) SJMP$ END25精選ppt例2.循環(huán)程序設(shè)計(jì)舉例【例】有一數(shù)據(jù)塊從片內(nèi)RAM的30H單元開(kāi)始存入,設(shè)數(shù)據(jù)塊長(zhǎng)度為10個(gè)單元。根據(jù)下式:

X+2X>0Y=100X=0求出Y值,并將Y值放回原處。

∣X∣X<0解:設(shè)置一個(gè)計(jì)數(shù)器控制循環(huán)次數(shù),每處理完一個(gè)數(shù)據(jù),計(jì)數(shù)器減1。程序流程如圖4-8所示。26精選pptA=0?YYNNYNA為負(fù)數(shù)?取數(shù),A←((R1))開(kāi)始結(jié)束A←∣X∣A←64HA←X+2存數(shù),((R1))←A(30H)設(shè)置地址指針R1、計(jì)數(shù)器R0初值R1←R1+1;R0←R0-1R0=0?圖4-8例4.5的程序流程圖返回本節(jié)27精選ppt參考源程序如下:

ORG 2000H MOV R0,#10MOV R1,#30HSTART: MOV A,@R1 ;取數(shù)

JB ACC.7,NEG ;若為負(fù)數(shù),轉(zhuǎn)NEG JZ ZER0 ;若為零,轉(zhuǎn)ZER0 ADD A,#02H ;若為正數(shù),求X+2 AJMP SAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)

ZER0: MOV A,#64H ;數(shù)據(jù)為零,Y=10028精選ppt AJMP SAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)NEG: DEC A CPL A ;求∣X∣SAVE: MOV @R1,A ;保存數(shù)據(jù)

INC R1 ;地址指針指向下一個(gè)地址

DJNZ R0,START ;數(shù)據(jù)未處理完,繼續(xù)處理

SJMP $ ;暫停29精選ppt【例】排序程序。設(shè)在內(nèi)部RAM中存一無(wú)符號(hào)數(shù)的數(shù)組,其長(zhǎng)度為n,起始地址是30H,要求將它們按從大到小排序,排序后仍存放在原區(qū)域中。

按“冒泡法”對(duì)n個(gè)數(shù)排序時(shí),可能用不到n-1次循環(huán),排序就結(jié)束了。為了提高排序速度,程序中可設(shè)一交換標(biāo)志位,如10H位,每次循環(huán)中,若有交換則執(zhí)行SETB10H,表明排序未完成;若無(wú)交換,則執(zhí)行CLR10H,表明排序已經(jīng)完成。每次循環(huán)結(jié)束時(shí),測(cè)10H位,判斷排序是否結(jié)束。參考程序如下:

ORG0000H LJMPBUBBLE ORG0100HBUBBLE:MOVR0,#30H MOVB,#64H CLR10HDECB ;長(zhǎng)度計(jì)數(shù)30精選pptLOOP:MOVA,@R0 ;內(nèi)循環(huán)的入口

MOV20H,A ;暫存,為交換作準(zhǔn)備

INCR0MOV21H,@R0CJNEA,21H,BUEU ;若(20H)≠(21H)轉(zhuǎn)移BUEU:JNCBUNEXT ;(20H)≥(21H)轉(zhuǎn)移

MOVA,@R0 ;若(20H)<(21H)則交換

MOV@R0,20HDECR0 ;使R0退格指向小地址

MOV@R0,AINCR0 ;恢復(fù)R0指向大地址

SETB10H ;置交換標(biāo)志BUNEXT:DJNZB,LOOP ;內(nèi)循環(huán)是否結(jié)束 的判斷

JB10H,BUBBLE ;判斷標(biāo)志位為1否?外循 環(huán)結(jié)束的判斷

END31精選ppt3.5子程序設(shè)計(jì)在實(shí)際應(yīng)用中,一些特定的運(yùn)算或操作經(jīng)常使用,例如多字節(jié)的加、減、乘、除處理,代碼轉(zhuǎn)換、字符處理等。如果每次遇到這些運(yùn)算或操作,都重復(fù)編寫(xiě)程序,不僅會(huì)使程序煩瑣冗長(zhǎng),而且也會(huì)浪費(fèi)編程者大量時(shí)間。因此經(jīng)常把這些功能模塊按一定結(jié)構(gòu)編寫(xiě)成固定的程序段,存放在內(nèi)存中,當(dāng)需要時(shí),調(diào)用這些程序段。通常將這種能夠完成一定功能、可以被其它程序調(diào)用的程序段稱(chēng)為子程序。調(diào)用子程序的程序稱(chēng)為主程序或調(diào)用程序。調(diào)用子程序的過(guò)程,稱(chēng)為子程序調(diào)用,用ACALLaddr11和LCALLaddr16兩條指令完成。子程序執(zhí)行完后返回主程序的過(guò)程稱(chēng)為子程序返回,用RET指令完成。32精選ppt1.在編寫(xiě)子程序時(shí)要注意以下幾點(diǎn):①要給每個(gè)子程序賦一個(gè)名字。它是子程序入口地址的符號(hào),便于調(diào)用。②明確入口參數(shù)、出口參數(shù)。所謂入口參數(shù),即調(diào)用該子程序時(shí)應(yīng)給哪些變量傳遞數(shù)值,放在哪個(gè)寄存器或哪個(gè)內(nèi)存單元,通常稱(chēng)為參數(shù)傳遞。出口參數(shù)則表明了子程序執(zhí)行的結(jié)果存在何處。例如,調(diào)用開(kāi)平方子程序,計(jì)算。在調(diào)用子程序之前,必須先將x值送到主程序與子程序的某一交接處N(如累加器A),調(diào)用子程序后,子程序從該交接處取得被開(kāi)方數(shù),并進(jìn)行開(kāi)方計(jì)算,求出的值。在返回主程序之前,子程序還必須把計(jì)算結(jié)果送到另一交接處M。這樣在返回主程序之后,主程序才可能從交接處M得到的值。③注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。在執(zhí)行子程序時(shí),可能要使用累加器、PSW或某些工作寄存器,而在調(diào)用子程序之前,這些寄存器中可能存放有主程序的中間結(jié)果,這些中間結(jié)果在主程序中仍然有用,這就要求在子程序使用這些資源之前,要將其中的內(nèi)容保護(hù)起來(lái),即保護(hù)現(xiàn)場(chǎng)。當(dāng)子程序執(zhí)行完畢,即將返回主程序之前,再將這些內(nèi)容取出,恢復(fù)到原來(lái)的寄存器,這一過(guò)程稱(chēng)為恢復(fù)現(xiàn)場(chǎng)。33精選ppt

保護(hù)現(xiàn)場(chǎng)通常用堆棧來(lái)完成。并在子程序的開(kāi)始部分使用壓棧指令PUSH,把需要保護(hù)的寄存器內(nèi)容壓入堆棧。當(dāng)子程序執(zhí)行結(jié)束,在返回指令RET前邊使用彈棧指令POP,把堆棧中保護(hù)的內(nèi)容彈出到原來(lái)的寄存器。要注意,由于堆棧操作是“先入后出”。因此,先壓入堆棧的參數(shù)應(yīng)該后彈出,才能保證恢復(fù)原來(lái)的數(shù)據(jù)。 為了做到子程序有一定的通用性,子程序中的操作對(duì)象,盡量用地址或寄存器形式,而不用立即數(shù)、絕對(duì)地址形式。另外,子程序中如含有轉(zhuǎn)移指令,應(yīng)盡量用相對(duì)轉(zhuǎn)移指令。2.子程序的調(diào)用與返回主程序調(diào)用子程序是通過(guò)子程序調(diào)用指令LCALLadd16和ACALLadd11來(lái)實(shí)現(xiàn)的。前者稱(chēng)為長(zhǎng)調(diào)用指令,指令的操作數(shù)部分給出了子程序的16位入口地址;后者為絕對(duì)調(diào)用指令,它的操作數(shù)提供了子程序的11位入口地位,此地址與程序計(jì)數(shù)器PC的高5位并在一起,構(gòu)成16位的調(diào)用地址(即子程序入口地址)。它們的功能,首先是將PC中的當(dāng)前值(調(diào)用指令下一條指令地址,稱(chēng)斷點(diǎn)地址)壓入堆棧(即保護(hù)斷點(diǎn)),然后將子程序入口地址送入PC,使程序轉(zhuǎn)入子程序運(yùn)行。34精選ppt子程序的返回是通過(guò)返回指令RET實(shí)現(xiàn)的。這條指令的功能是將堆棧中返回地址(即斷點(diǎn))彈出堆棧,送回到PC,使程序返回到主程序斷點(diǎn)處繼續(xù)往下執(zhí)行。子程序調(diào)用過(guò)程如圖3-8所示圖3-8子程序調(diào)用過(guò)程35精選ppt

主程序在調(diào)用子程序時(shí)要注意以下問(wèn)題。在主程序中,要安排相應(yīng)指令來(lái)傳遞子程序的入口參數(shù),即提供子程序的入口數(shù)據(jù)。在主程序中,要安排相應(yīng)的指令,處理子程序提供的出口數(shù)據(jù),即操作結(jié)果。在主程序中,不希望被子程序更改內(nèi)容的寄存器,也可以在調(diào)用前由主程序安排壓棧指令來(lái)保護(hù)現(xiàn)場(chǎng),子程序返回后再安排彈棧指令恢復(fù)現(xiàn)場(chǎng)。在主程序中,要正確地設(shè)置堆棧指針。36精選ppt3.子程序嵌套 子程序嵌套是指在子程序執(zhí)行過(guò)程中,還可以調(diào)用另一個(gè)子程序。子程序嵌套過(guò)程如圖3-9所示。圖3-9子程序嵌套過(guò)程37精選ppt4.子程序的特性編寫(xiě)子程序應(yīng)注意以下問(wèn)題:①通用性。為使子程序能適應(yīng)各種不同程序、不同條件的調(diào)用,子程序應(yīng)具有較好的通用性。②可浮動(dòng)性??筛?dòng)性是指子程序段可設(shè)置在存儲(chǔ)器的任何地址區(qū)域。假如子程序只能設(shè)置在固定的存儲(chǔ)器地址段,這在編制主程序時(shí)要特別注意存儲(chǔ)器地址空間的分配,防止兩者重疊。為了能使子程序段浮動(dòng),必須在子程序中避免選用絕對(duì)轉(zhuǎn)移地址,而應(yīng)選用相對(duì)轉(zhuǎn)移類(lèi)指令,子程序首地址亦應(yīng)采用符號(hào)地址。③可遞歸和可重入性。子程序能自己調(diào)用自己的性質(zhì),稱(chēng)為子程序的可遞歸性,而子程序能同時(shí)被多個(gè)任務(wù)(或多個(gè)用戶(hù)程序)調(diào)用的性質(zhì),稱(chēng)為子程序的可重入性。這在比較復(fù)雜的程序中經(jīng)常用到。④子程序說(shuō)明文件。對(duì)于通用子程序,為便于各種用戶(hù)選用,要求在子程序編制完成后提供一個(gè)說(shuō)明文件,使用戶(hù)不必詳讀源程序,只需閱讀說(shuō)明文件就能了解子程序的功能及應(yīng)用。38精選ppt【例】求平方。用程序?qū)崿F(xiàn)C=a*a+b*b。設(shè)a、b均小于10,a存在31H單元,b存在32H單元,把C存入33H單元。因本題兩次用到平方值,所以在程序中采用把求平方編為子程序的方法。子程序名稱(chēng):SQR。功能:求X2,通過(guò)查平方表來(lái)獲得。入口參數(shù):某數(shù)在A中。出口參數(shù):某數(shù)的平方在A中。參考主程序和子程序如下:主程序:

ORG0000H LJMPMAIN ORG0100HMAIN:MOVSP,#3FH ;設(shè)堆棧指針(調(diào)用和返回指令要用到堆棧) MOVA,31H ;取a值

LCALLSQR ;第一次調(diào)用,求a2 MOVR1,A ;a2值暫存R1中

MOVA,32H ;取b值

LCALLSQR ;第二次調(diào)用,求b2 ADDA,R1 ;完成a2+b2 MOV33H,A ;存結(jié)果到33H SJMP$ ;暫停39精選ppt子程序:

ORG0200HSQR:ADDA,#01H ;查表位置調(diào)整,RET為 一字節(jié)指令

MOVCA,@A+PC ;查表取平方值

RET ;子程序返回TAB:DB0,1,4,9,16,25 DB36,49,64,81 END

求平方的子程序在此采用的是查表法,用偽指令DB將0~9的平方值以表格的形式定義到ROM中。子程序中A之所以要加1,是因?yàn)镽ET指令占了一個(gè)字節(jié)。40精選ppt

實(shí)踐 題目:十字路口交通燈要求:通過(guò)單片機(jī)的P1口控制實(shí)驗(yàn)儀上6個(gè)LED按照交通燈的變化規(guī)律循環(huán)發(fā)光,模擬十字路口交通燈。實(shí)驗(yàn)電路如下,L5、L4、L3模擬東西方向交通燈,L2、L1、L0模擬南北方向交通燈。通過(guò)一條SETB指令,可使某一燈亮,通過(guò)一條CLR指令,可使某一燈滅。 硬件:畫(huà)出硬件電路原理圖。 軟件:畫(huà)出程序流程圖,編寫(xiě)源程序。 調(diào)試:記錄調(diào)試過(guò)程,分析調(diào)試結(jié)果。41精選ppt南北方向綠燈亮:東西方向紅燈亮南北方向綠燈閃:東西方向紅燈亮南北方向黃燈亮:東西方向紅燈亮南北方向紅燈亮:東西方向綠燈亮南北方向紅燈亮:東西方向綠燈閃南北方向紅燈亮:東西方向黃燈亮42精選pptSREQUP1.0;南北紅燈SYEQUP1.1;南北黃燈SGEQUP1.2;南北綠燈ERE

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論