第5章 MCS-51語言程序設(shè)計_第1頁
第5章 MCS-51語言程序設(shè)計_第2頁
第5章 MCS-51語言程序設(shè)計_第3頁
第5章 MCS-51語言程序設(shè)計_第4頁
第5章 MCS-51語言程序設(shè)計_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第五章

51單片機匯編語言程序設(shè)計

5.1匯編語言源程序的格式

5.2

偽指令5.3匯編語言源程序的人工匯編5.4MCS-51匯編語言程序的基本結(jié)構(gòu)

與設(shè)計舉例1計算機能夠直接執(zhí)行的是:0和1組成的機器碼指令程序。2引言上一章在講解指令時的程序,其特點是:.1、指令是采用助記符,而不是用機器碼表示;2、地址是采用標號地址(符號地址),而不是真正的實際地址。匯編語言源程序:用助記符和標號地址編寫的程序。匯編語言面向機器,要經(jīng)過匯編。高級語言面向算法、過程、對象,類似自然語言,可移植性好,須經(jīng)解釋或翻譯后才能被執(zhí)行。3匯編匯編機器語言目標程序匯編語言源程序匯編程序匯編:將匯編語言源程序轉(zhuǎn)換成機器語言目標程序的過程稱為匯編。(可人工匯編或機器匯編)

匯編程序:能將匯編語言源程序轉(zhuǎn)換成機器語言目標程序的軟件稱為匯編程序。(機器匯編)MCS-51的匯編語言的四分段格式如下:45.1匯編語言源程序的格式

標號:操作碼操作數(shù);注釋規(guī)則:(1)標號字段和操作字碼段之間要有冒號“:”相隔;(2)操作碼字段和操作數(shù)字段間的分界符是空格;(3)多操作數(shù)之間用逗號相隔;

(4)操作數(shù)字段和注釋字段之間的分界符用分號“;”相隔。操作碼字段為必選項,其余各段為任選項。例如:START:MOVA,#00H;0→A

NOP5基本語法規(guī)則:1.標號

是語句所在地址的標志符號。命名規(guī)范如下:(1)由1~8個字母、數(shù)字與下劃線“-”組成;(2)首字符為字母;(3)同一標號在一個程序中只能定義一次;(4)絕對不允許把指令的保留字、寄存器及偽指令字符作為語句的標號。2.操作碼字段是匯編語言指令中唯一不能空缺的部分。匯編程序就是根據(jù)這一字段來生成機器代碼的。操作碼段也可以是偽指令的助記符,在匯編時起作用。6基本語法規(guī)則23.操作數(shù):表示指令操作的對象,可以是一個具體的數(shù)據(jù),也可以是參加運算的數(shù)據(jù)所在的地址。操作數(shù)一般有以下幾種形式:沒有操作數(shù):操作數(shù)隱含在操作碼中,如RET指令。只有一個操作數(shù),如INCA指令。有兩個操作數(shù):如MOVA,30H指令,操作數(shù)之間以逗號相隔。有三個操作數(shù):如CJNEA,#00H,LOOP指令。可以采用字母或數(shù)字等多種表示形式。7基本語法規(guī)則3操作數(shù)是立即數(shù),可用二進制、十進制和十六進制形式:十六進制,后綴“H”。二進制,后綴“B”。十進制,后綴“D”,也可省略。若十六進制的操作數(shù)以字符A~F中的某個開頭時,則需在它前面加一個“0”,以便在匯編時把它和字符A~F區(qū)別開來。注意數(shù)字前加“#”。帶加、減運算符的表達式:

例如:MOVA,#100-18基本語法規(guī)則3對于直接地址direct,有多種選擇:

(1)直接數(shù)據(jù)地址(各種進制),如MOVA、30H等;

(2)標號地址,如MOVA,SUM等,SUM應(yīng)該在程序中某處加以定義;

(3)帶有加減的表達式,設(shè)SUM為已定義的標號地址, 如MOVA,SUM+13;

(4)特殊功能寄存器名,如MOVA,P2等。9基本語法規(guī)則4美元符號$的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令:

JNBF0,$與如下指令是等價的:

HERE:JNBF0,HERE

4、

注釋段:注釋指令或程序的含義,便于閱讀程序、維護程序。必須用“;”隔開,續(xù)行時,也必須以“;”開頭。105.2

偽指令

只有在匯編前的源程序中才有偽指令。經(jīng)過匯編得到目標程序(機器代碼)后,偽指令已無存在的必要,所以“偽”體現(xiàn)在匯編時,偽指令沒有相應(yīng)的機器代碼產(chǎn)生。

偽指令是告訴匯編程序,如何匯編源程序的指令。不屬于指令系統(tǒng)中的指令。

用來對匯編過程進行某種控制,或者對符號、標號賦值。

不同版本的匯編語言,基本用法類似,但稍有不同。11偽指令(1)起始地址偽指令功能:用于設(shè)定目標程序段或數(shù)據(jù)塊的起始地址。注意:地址從小到大,且不能重疊。它放在一段源程序(主程序、子程序)或數(shù)據(jù)塊的前面,說明緊跟在其后的程序段或數(shù)據(jù)塊的起始地址就是偽指令中的16位絕對地址或用標號、表達式表示的地址。一般默認從0000開始。例如:

ORG

2000H START:MOVA,#7FH…它表明標號為START的目標程序是從2000H單元開始存放的。格式:

[標號:]ORG16位地址12(2)定義字節(jié)偽指令DB格式: [標號:]DB8位數(shù)據(jù)表功能:用于從指定的地址開始,在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。<8位數(shù)表>可以是一字節(jié)常數(shù)或字符,或用逗號分開的字節(jié)串,或用引號括起來的字符串。

例如:

ORG2000HTAB1:DB30H,8AH,7FH,73DB“5”,“a”,‘BCD’30H2008H8AH2007H7FH2006H49H2005H35H2004H61H2003H42H2002H43H2001H44H2000H由于ORG2000H,所以TAB1的地址為2000H,因此以上偽指令經(jīng)匯編以后,將對2000H開始的若干內(nèi)存單元賦值。13(3)定義數(shù)據(jù)字偽指令DW格式:

[標號:]DW16位數(shù)據(jù)表功能:用于從指定地址開始,在程序存儲器的連續(xù)單元中定義16位的數(shù)據(jù)字。存放時,數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。例如, DW

“AA” ;存入41H,41H DW

“A”

;存入00H,41H

DW

“ABC” ;超過兩字節(jié),不合法 DW

100H,

1ACH,

-804 ;按順序存入01H、00H、01H、0ACH、0FCH、0DCH14例如:

ORG1500HTAB2: DW1234H,80H

匯編以后: (1500H)=12H (1501H)=34H (1502H)=00H (1503H)=80H。12H1503H34H1502H00H1501H80H1500H15(4)預(yù)留存儲空間偽指令DS格式:

[標號:]DS表達式功能:用于從指定地址開始,在程序存儲器中保留指定數(shù)目的字節(jié)單元作為預(yù)留存儲區(qū),供程序運行使用。源程序匯編時,對預(yù)留單元不賦值。例如:

ADDRTABL: DS20;從標號ADDRTABL代表的地址開始,預(yù)留20個連續(xù)的地址單元

ORG 8100H DS 08H;從8100H地址開始,保留8個連續(xù)的地址單元16例如:

ORG1000H DS20H DB30H,8FH匯編后:從1000H開始,預(yù)留32(20H)個字節(jié)的內(nèi)存單元,然后從1020H開始,按照下一條DB指令賦值,即(1020H)=30H,(1021H)=8FH。

8FH1021H30H1020H…101FH1001H1000H…1002H17(5)等值偽指令EQU格式:

字符名稱EQU賦值項功能:將一個數(shù)值或寄存器名賦給一個指定的符號名。賦值后,其值在整個程序中有效(不能再改變)。其中<賦值項>可以是地址、標號或表達式,工作寄存器,其值為8位或16位二進制數(shù)。賦值以后的字符名稱既可以作地址使用,也可以作立即數(shù)使用。先定義后使用。例如:

TABEQU1000H TAB1EQUTABMOVDPTR,#TAB

前一條偽指令表示TAB地址的值為1000H,后一條表示符號地址TAB1與TAB等值(可以互換)。18

(6)位地址符號定義偽指令BIT格式:

字符名稱BIT位地址功能:用于給字符名稱賦以位地址。經(jīng)賦值后就可用指令中BIT左面的字符名稱來代替BIT右邊所指出的位。其中<位地址>可以是絕對地址,也可以是符號地址(位符號名稱)。例如:

FLG BITF0FLG2 BIT0F0H AI BITP1.0經(jīng)以上偽指令定義后,在編程中就可以把FLG和AI作為位地址來使用。19

(7)結(jié)束匯編偽指令END格式:

[標號:]END功能:END是匯編語言源程序的結(jié)束標志,表示匯編結(jié)束。在END以后所寫的指令,匯編程序都不予以處理。在一個源程序中只能有1條END命令。在同時包含有主程序和子程序的源程序中,也只能有一個END命令,并放到所有指令的最后;否則,就有一部分指令不能被匯編。

<標號:>也是選擇項,當源程序為主程序時才具有,且其值為主程序第1條指令的符號地址;當源程序不是主程序時,END命令不應(yīng)帶<標號:>項。20格式:

符號DATA直接字節(jié)地址功能:該偽指令用于給片內(nèi)RAM字節(jié)單元地址賦予DATA前面的符號,賦值后可用該符號代替DATA后面的片內(nèi)RAM字節(jié)單元地址。(8)DATA偽指令【例】

RESULT

DATA60H

MOVRESULT,A

匯編后,RESULT就表示片內(nèi)RAM的60H單元,程序后面用片內(nèi)RAM的60H單元的地方就可以用RESULT。21【例】

PORT1XDATA2000HMOVDPTR,#PORT1MOVX@DPTR,A匯編后,符號PORT1就表示片外RAM的2000H單元地址,程序后面可通過符號PORT1表示片外RAM的2000H單元地址。(9)XDATA偽指令格式:符號XDATA直接字節(jié)地址該偽指令與DATA偽指令基本相同,只是它針對的是片外RAM字節(jié)單元。22【例】

$INCLUDE(REG.INC)$INCLUDE(MOD1.ASM);將一個匯編程序插入到源程序中

(10)INCLUDE偽指令格式:$INCLUDE(文件名)將指定的文件內(nèi)容立即插入到源程序中,它通常用來將用戶自定義的8051符號文件包含到程序中去。235.3匯編語言源程序的人工匯編匯編程序的匯編過程

匯編有兩種方法:手工匯編、機器匯編。

手工匯編過程:第一次匯編:確定地址,翻譯成各條機器碼,字符標號原樣寫出;第二次匯編:標號代真,將字符標號用所計算出的具體地址值或偏移量代換。

24源程序

目標程序

地址

ORG1000HSTART:MOVR0,2FHMOVR2,#00HMOVA,@R0MOVR3,AINCR3SJMPNEXTLOOP:INCR0CJNE@R0,#44H,NEXT

INCR2NEXT:DJNZR3,LOOP

MOV2AH,R2SJMP$END

第一次匯編第二次匯編1000A82F10027A001004E61005FB10060B100780NEXT100908100AB644NEXT100D0A100EDBLOOP10108A2A101280FEA82F7A00E6FB0B800508B644010ADBF98A2A80FE主要知識點:順序程序;分支程序;循環(huán)程序;

查表程序;子程序;運算程序;255.4MCS-51匯編語言程序的基本結(jié)構(gòu)

與設(shè)計舉例

用匯編語言與用高級語言進行程序設(shè)計很相似。對于比較復(fù)雜的問題可以先根據(jù)題目的要求作出流程圖,然后再根據(jù)流程圖來編寫程序。對于比較簡單的問題則可以不作流程因而直接編程。兩者的差別還是很大的。一個很重要的差別就在于用匯編語言編程時,對于數(shù)據(jù)的存放位置,以及工作單元的安排等都要由編程者自己安排。而用高級語言編程時,這些問題都是由計算機安排的,編程者則不必過問。26程序框架ORG0000H LJMPMAIN ;跳轉(zhuǎn)至主程序ORG0003H LJMPINT0_INT;跳轉(zhuǎn)至外部中斷0的中斷服務(wù)程序ORG000BH LJMPT0_INT;跳轉(zhuǎn)至定時器0的中斷服務(wù)程序ORG0013H LJMPINT1_INT;跳轉(zhuǎn)至外部中斷1的中斷服務(wù)程序

???ORG0030HMAIN:??? ;開始寫主程序

END中斷入口地址主程序開始27程序設(shè)計的學(xué)習(xí)目標理解程序結(jié)構(gòu)(順序、分支、循環(huán)、子程序);熟練掌握程序設(shè)計的思路方法和技巧;要求掌握典型算法;找到分析問題和解決問題的著眼點;學(xué)會抓住不同問題的規(guī)律性;舉一反三,獨立思考,有創(chuàng)意,有新意,獨到。28匯編語言程序設(shè)計的要點:一、分清指令和偽指令及其功能;二、高級語言程序設(shè)計方法的比較與遷移;三、特別注意匯編語言是面向機器的,要記住

CPU的資源;

存儲器結(jié)構(gòu)與尋址方式;

I/O口、定時/計數(shù)器、中斷系統(tǒng)等關(guān)鍵的參數(shù);

寄存器間接尋址中指針的選擇和使用技巧。四、從宏觀了解MCS-51匯編語言程序的整體結(jié)構(gòu),從微觀上理解微機中各組成部分是如何通過程序聯(lián)系起來。1.分析問題,確定算法2.根據(jù)算法,畫出程序流程圖3.分配內(nèi)存工作區(qū)及有關(guān)端口地址 分配內(nèi)存工作區(qū),尤其是片內(nèi)RAM的分配,把內(nèi)存區(qū)、堆棧區(qū)、各種緩沖區(qū)要合理地分配,并確定每個區(qū)域的首地址,便于編程使用。要確定外部擴展的各種I/O端口的地址、分配I/O接口線。4.編寫程序

5.上機調(diào)試匯編語言程序設(shè)計的步驟30匯編語言程序的基本結(jié)構(gòu)順序結(jié)構(gòu)分支程序結(jié)構(gòu)循環(huán)程序結(jié)構(gòu)順序程序是程序設(shè)計中的基本模塊。順序程序沒有分支,從第一條指令開始依次執(zhí)行每一條指令,直到最后一條,程序就算執(zhí)行完畢。特點:比較簡單,能完成一定的功能,是構(gòu)成復(fù)雜程序的基礎(chǔ)。315.4.1

順序程序設(shè)計看幾個例題。32例1

功能:將單字節(jié)壓縮BCD碼(存于數(shù)據(jù)內(nèi)存30H單元)分離轉(zhuǎn)換成ASCII碼放在31H、32H單元。-30H-31H-32H-33H-34H-35H36H36H38H37H68H38HMOV30H,#68HMOVA,30H;用除法分離MOVB,#10HDIVAB;商6在A,余數(shù)8在B中MOV31H,B;轉(zhuǎn)換成分離的BCDMOV32H,AORL31H,#30H;存結(jié)果ORL32H,#30H33例2

功能:將8位二進制數(shù)(存于數(shù)據(jù)內(nèi)存30H單元)轉(zhuǎn)換成三位分離的BCD碼放在31H、32H、33H單元。-30H-31H-32H-33H-34H02H35H05H36H04H37HFEH38HMOVA,30H;用除法分離MOVB,#10DIVAB;商25在A,余數(shù)4個位在B中MOV31H,BMOVB,#10DIVAB;商2百位在A,余數(shù)5十位在B中MOV32H,B;存結(jié)果MOV33H,A個十百34例3

功能(例2的逆運算):將三位分離的BCD碼放在31H、32H、33H單元轉(zhuǎn)換成8位二進制數(shù)(存于數(shù)據(jù)內(nèi)存30H單元)。-30H-31H-32H-33H-34H02H35H05H36H04H37HFEH38HMOVA,33H;MOVB,#10MULAB;積BA,最大20即33H中存的數(shù)不能超過2ADDA,32H;百位乘以10加十位,在A中MOVB,#10MULAB;再乘以10ADDA,31H;存結(jié)果MOV30H,A個十百35處理過程:將30H單元的內(nèi)容高3位屏蔽;31H單元內(nèi)容的高5位屏蔽,高低四位交換,左移一位;然后與30H單元的內(nèi)容相或,拼裝后放到40H單元。【例4】數(shù)據(jù)的拼拆設(shè)在30H和31H單元中各有一個8位數(shù)據(jù):(30H)=X7X6X5X4X3X2X1X0

(3lH)=Y7Y6Y5Y4Y3Y2Y1Y0現(xiàn)在要從30H單元中取出低5位,并從31H單元中取出低3位完成拼裝,拼裝結(jié)果送40H單元保存,并且規(guī)定:(40H)=Y2Y1Y0X4X3X2X1X036

(30H)=X7X6X5X4X3X2X1X0

(3lH)=Y7Y6Y5Y4Y3Y2Y1Y0(40H)=Y2Y1Y0X4X3X2X1X0程序如下:

ORG0100H MOVA,30H

ANLA,#00011111B MOV30H,A;

MOVA,31H ANLA,#00000111B;

SWAPARLA

;

ORLA,30H;組裝

MOV40H,A END

(30H)=000X4X3X2X1X0A=Y2Y1Y000000A=00000Y2Y1Y037查表

[例5]功能:求變量X(0≤x≤5)的平方入口:X值存放在片內(nèi)RAM的30H單元出口:X2值存放在片內(nèi)RAM的31H

單元 ORG 0000HSTART:MOV DPTR,#TABLE MOVA,30H

MOVCA,@A+DPTR MOV 31H,A;存結(jié)果

SJMP$ ORG 100HTABLE:DB00,01,04,09,16,25 END-TABLE-101H-102H19H103H10H104H09H105H04H106H01H107H00H108H程序存儲器38例6

將內(nèi)部RAM中20H單元和30H單元的無符號數(shù)相加,結(jié)果存入R0(高位)和R1(低位)中。

ORG 0000H LJMP MAIN ORG 0030HMAIN: MOV A,20H CLR C ADD A,30H MOV R1,A CLR A ADDC A,#00 MOV R0,A SJMP $ END395.4.2

分支程序設(shè)計結(jié)構(gòu):根據(jù)不同的條件,進行相應(yīng)的處理。通常用條件轉(zhuǎn)移指令形成簡單分支結(jié)構(gòu)。如:

判(A)=Z或NZ,轉(zhuǎn)移判(CY)=1或0,轉(zhuǎn)移判(bit)=1或0,轉(zhuǎn)移CJNE比較不相等轉(zhuǎn)移

40用條件轉(zhuǎn)移語句實現(xiàn)二分支

根據(jù)不同的條件,執(zhí)行不同的程序段。JZ、JNZ;JC、JNC;JB、JNB、JBC;CJNE;正確合理地運用關(guān)鍵:用條件轉(zhuǎn)移指令實現(xiàn)分支;用無條件轉(zhuǎn)移指令匯合到一點。條件語句組1語句組2YesNo入口出口41例1、設(shè)a存放在累加器A中,b存放在寄存器B中,要求按下式計算Y值,并將結(jié)果Y存于R2中,試編寫程序。

a-b(a≥0)

Y=a+b(a<0)

解:本題關(guān)鍵是判a是正數(shù),還是負數(shù);由ACC.7便知。

ORG0030H

BR:JBACC.7,ADD1

CLRC;計算分支a-bSUBBA,B

SJMPDONEADD1:ADDA,B;計算分支a+b

DONE:

MOVR2,A;存結(jié)果

SJMP$

END

42例2、如果累加器A的D1D0位都為0,則R2加1,否則,R3減

1,試編寫程序。

解:根據(jù)A和00000011B邏輯“與”的結(jié)果來判定。

ORG0030H MOVB,A;保存A ANLA,#00000011B

JNZR3DEC1INCR2

SJMPDONE

R3DEC1

:DECR3;計算分支

DONE:

MOVA,B;恢復(fù)A

SJMP$ END

A=D7D6D5D4D3D2

00D1D0位都為1?CJNEA,#03H,R3DEC1

再進一步思考??A=D71

11D3D2

00分析程序---例343

CJNEA,#0,Next1 LCALLPr0 LJMPToExitNext1:

CJNEA,#1,Next2 LCALLPr1 LJMPToExitNext2:CJNEA,#2,Next3 LCALLPr2 LJMPToExitNext3:

CJNEA,#3,Else1 LCALLPr3 LJMPToExitElse1:LCALLPrElseToExit:SJMP$ 多分支程序的設(shè)計類似高級語言中的case。分析程序—例444

CJNEA,#0,Next1 LCALLPr0

Next1:

CJNER1,#1,Next2 LCALLPr1

Next2:CJNER2,#5DH,Next3 LCALLPr2

Next3:

CJNER3,#3FH,END1 LCALLPr3

END1:LCALLPrENDToExit:SJMP$ 輪詢一遍散轉(zhuǎn)多分支程序設(shè)計-例545

ORG0000

MOVA,R7

RL

A

ADDA,R7

MOVDPTR,#TAB

JMP@A+DPTRTAB:LJMPL0

LJMPL1

LJMPL2

LJMPL3L0:INCR0

JMP

TOENDL1:INCR1

JMPTOENDL2:INCR2

JMPTOENDL3:INCR3TOEND:SJMP$END根據(jù)R7的值,轉(zhuǎn)移到不同的分支中的1個。例中R7=0~3.5.4.3

循環(huán)程序設(shè)計46順序程序

——

每條指令只執(zhí)行一次;分支程序

——

根據(jù)不同條件,會跳過一些指令,而轉(zhuǎn)去執(zhí)行另一些指令共同點:每條指令至多執(zhí)行一次。但是,實際中有時要求某程序段多次重復(fù)執(zhí)行,需要采用循環(huán)結(jié)構(gòu)。

循環(huán)程序包含四部分47循環(huán)結(jié)構(gòu)不但使程序簡練,而且大大節(jié)省存儲空間。循環(huán)程序包含四部分:1、初始化部分(循環(huán)計數(shù)器、變量置初值)2、循環(huán)處理部分(主體功能,需要重復(fù)執(zhí)行的部分)3、循環(huán)控制部分(修改地址指針、修改變量、檢測循環(huán)結(jié)束條件)4、循環(huán)結(jié)束處理部分(對結(jié)果分析、處理,存放結(jié)果)在具體結(jié)構(gòu)上分:先循環(huán)后判斷、先判斷后循環(huán)。

1、先循環(huán)處理后循環(huán)控制,稱為“直到型”循環(huán);

2、先循環(huán)控制后循環(huán)處理,稱為“當型”循環(huán)。48循環(huán)程序框圖計數(shù)型:循環(huán)次數(shù)已知,可用計數(shù)器控制循環(huán)次數(shù);條件型:循環(huán)次數(shù)未知,根據(jù)某種條件判斷是否終止循環(huán)。

49例1:內(nèi)部數(shù)據(jù)區(qū)清零ORG0030HZero:movR0,#30H

movR7,#10movA,#00HLoop:mov@R0,AincR0djnzR7,Loopsjmp$END內(nèi)部RAM30HR023H98H0A8H0FDH…00000010個50例2:n個單字節(jié)數(shù)相加,和為雙字節(jié)。單字節(jié)數(shù)據(jù)存在40H開始的RAM單元中,n放在R2中,和存放在R4R3中。 ORG0030HADD1: MOV R3,#00H MOV R4,#00H MOV R2,#n MOV R0,#40HLOOP: MOV A,R3 ;取和的低位

ADD A,@R0 ;相加

MOV R3,A CLR A ADDC A,R4 ;低位字節(jié)向高位字節(jié)進位

MOV R4,A INC R0 ;地址加1

DJNZ R2,LOOP ;未加完繼續(xù)重復(fù)

SJMP $ END51[例3]把內(nèi)部RAM中起始地址為BLK1的數(shù)據(jù)塊傳送到外部RAM以BLK2為

起始地址的區(qū)域,直到遇到“#”字符的ASCⅡ碼為止。去掉塊長度。

ORG 0030H BLK1 EQU 30H BLK2 EQU 1000H

MOVSP,#6FH MOV R0,#BLK1;BLK1數(shù)據(jù)塊起始地址

MOV DPTR,#BLK2;BLK2數(shù)據(jù)塊起始地址

XH:

MOV A,@R0 ;取數(shù)據(jù)

PUSH ACC CLR C SUBB A,#23H ;判是否為“#”字符

JZ STOP POP ACC MOVX @DPTR,A ;數(shù)據(jù)傳送

INC R0 INC DPTR

AJMPXH ;循環(huán)控制

STOP:

SJMP $ END52多重循環(huán)(循環(huán)嵌套)單重循環(huán)程序和多重循環(huán);多重循環(huán)(循環(huán)嵌套)應(yīng)注意的問題:只允許外重循環(huán)嵌套內(nèi)重循環(huán)不允許循環(huán)相互交叉不允許從外循環(huán)程序跳到內(nèi)循環(huán)程序53例4:50ms延時程序Delay:movR7,#200Del1:movR6,#123nopDel2:djnzR6,Del2djnzR7,Del1sjmp$;(不計入);1us;1us;1us;2us;2usT=[200×(1+1+123×2+2)+1]×1us=50001us=50ms12MHz晶振54例5---統(tǒng)計統(tǒng)計從32H單元開始的14個存儲單元有多少的數(shù)與30h單元的數(shù)相同,統(tǒng)計結(jié)果存31h單元。

ORG0030HMOV31h,#00MOVR2,#14;循環(huán)次數(shù)14MOVR0,#32H;地址指針初值LOOP:MOVA,@R0;取數(shù)

CJNEA,30H,Next;比較是否相等

INC31H;統(tǒng)計單元加1Next:INCR0;指針加1指向下一個

DJNZR2,LOOP;循環(huán)是否結(jié)束的判斷

sjmp$END55例6、設(shè)在8031內(nèi)部RAM中存一無符號數(shù)的數(shù)組,其長度為20,起始地址是30H,要求將它們從大到小排序,排序后仍存放在原區(qū)域中。

解:先舉四個數(shù)排序的例子內(nèi)RAM第一次外循環(huán)第二次外循環(huán)第三次外循環(huán)

30H0003030631H0302060332H0206020233H06000000共4–1=3次外循環(huán)56這就是所謂的“冒泡法”。4個數(shù)排序最多經(jīng)過3次外循環(huán)就可排出,每次外循環(huán)都包含3次內(nèi)循環(huán)。實際上大多情況不用3次外循環(huán)就可排完。對于20個數(shù)排序也是如此,用不到19次循環(huán),排序就結(jié)束。為了提高排序速度,程序中可設(shè)一交換標志位,如10H位,每次循環(huán)中:若有交換則SETB10H

若無交換則CLR10H

每次循環(huán)結(jié)束時,測10H位,判斷排序是否結(jié)束。

57

ORG0030HFirstDATA20HSecendDATA21HMOVB,#20MOVSP,#50HL0:MOVR0,#30HCLRF0

DECB;長度計數(shù)

pushB

LOOP:MOVA,@R0;內(nèi)循環(huán)的入口

MOVFirst,A;暫存,為交換作準備

INCR0MOVSecend,@R0CJNEA,Secend,Next;若first

≠second轉(zhuǎn)移

Next:JNCNEXT1;first≥second轉(zhuǎn)移,否則,交換

MOV@R0,FirstDECR0;使R0退格指向小地址firstMOV@R0,SecondINCR0;恢復(fù)R0指向大地址second

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

POPB

JBF0,L0

;判斷標志位為1否?外循環(huán)

sjmp$;結(jié)束的判斷

END585.4.4

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

當一段程序需多次應(yīng)用,或為多人應(yīng)用時,這段程序編為子程序。59在設(shè)計、調(diào)用子程序時,有以下幾點應(yīng)注意:子程序名;子程序功能;入口參數(shù);出口參數(shù);占用資源;現(xiàn)場的保護與恢復(fù)。子程序名:現(xiàn)場保護

----------

現(xiàn)場恢復(fù)子程序返回retLcall子程序名保護現(xiàn)場:

如果在調(diào)用前,主程序已經(jīng)使用了某些存儲單元或寄存器,在調(diào)用時,這些寄存器和存儲單元又有其他用途,就應(yīng)先把這些單元或寄存器中的內(nèi)容壓入堆棧保護,調(diào)用完后再從堆棧中彈出以便加以恢復(fù)。如果有較多的寄存器要保護,應(yīng)使主、子程序使用不同的寄存器組。60注意:入口參數(shù)和出口參數(shù)。子程序名;子程序功能;入口參數(shù);出口參數(shù);現(xiàn)場的保護與恢復(fù);占用資源。子程序名:現(xiàn)場保護----------現(xiàn)場恢復(fù)子程序返回retLcall子程序名入口參數(shù)和出口參數(shù):

用之前主程序要按子程序的要求設(shè)置好地址單元或存儲器(稱為入口參數(shù)),以便子程序從指定的地址單元或存儲器獲得輸入數(shù)據(jù);子程序經(jīng)運算或處理后的結(jié)果存放到指定的地址單元或寄存器(稱為出口參數(shù)),主程序調(diào)用后從指定的地址單元或寄存器讀取運算或處理后的結(jié)果,只有這樣,才能完成子程序和主程序間的數(shù)據(jù)的正確傳遞。61注意:子程序嵌套子程序名;子程序功能;入口參數(shù);出口參數(shù);現(xiàn)場的保護與恢復(fù);占用資源。子程序嵌套子程序名:現(xiàn)場保護----------現(xiàn)場恢復(fù)子程序返回retLcall子程序名子程序中可包括對另外子程序的調(diào)用,稱為子程序嵌套。正在執(zhí)行主程序CPU正在執(zhí)行子程序SubACPU正在執(zhí)行子程序SubB62子程序-例1例:

ORG0000HMain:movsp,#5FHmovR0,#40HmovR7,#10H

LcallZerosjmp$;子程序名:Zero;功能:對內(nèi)部數(shù)據(jù)區(qū)清零;入口參數(shù):R0內(nèi)部數(shù)據(jù)區(qū);R7內(nèi)部數(shù)據(jù)區(qū)長度;出口參數(shù):無;占用資源:A,R0,R7Zero:clrALoop:mov@R0,AincR0djnz,R7,Loop

ret

END63子程序-例2;

比較有符號數(shù)的大小,30h,31h單元大的存入32hORG0030H

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論