匯編語言程序設(shè)計22882_第1頁
匯編語言程序設(shè)計22882_第2頁
匯編語言程序設(shè)計22882_第3頁
匯編語言程序設(shè)計22882_第4頁
匯編語言程序設(shè)計22882_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 匯編語言程序設(shè)計 匯編語言是面向機器硬件的語言,要求程序設(shè)計者對MCS-51單片機具有很好的“軟、硬結(jié)合”的功底。 本章介紹程序設(shè)計的基本知識及如何使用匯編語言來進行基本的程序設(shè)計。 用于程序設(shè)計的語言基本上分為3種:機器語言、匯編語言和高級語言 。1.機器語言 二進制代碼表示的指令、數(shù)字和符號簡稱為機器語言 不易懂,難記憶,易出錯。 2匯編語言 英文助記符表示的指令稱為符號語言或匯編語言。3高級語言不受具體機器的限制,使用了許多數(shù)學公式和數(shù)學計算上的習慣用語,非常擅長于科學計算。將匯編語言程序轉(zhuǎn)換成為二進制代碼表示的機器語言程序稱為匯編程序 經(jīng)匯編程序“匯編(翻譯)”得到的機器語言程序稱為

2、目標程序,原來的匯編語言程序稱為源程序。 對于程序的空間和時間要求很高的場合,匯編語言仍是必不可缺的。 C語言和匯編語言混合編程 在很多需要直接控制硬件的應用場合,則更是非用匯編語言不可 使用匯編語言編程,是單片機程序設(shè)計的基本功之一4.1.1 匯編語言程序設(shè)計步驟(1)分析問題,確定算法(2)根據(jù)算法,畫出程序框圖(3)分配內(nèi)存工作區(qū)及有關(guān)端口地址(4)編寫程序,養(yǎng)成在程序的適當位置上加上注釋的好習慣。(5)上機調(diào)試 編寫完畢的程序,必須“匯編”成機器代碼,才能調(diào)試和運行,調(diào)試與硬件有關(guān)程序還要借助于仿真開發(fā)工具并與硬件連接。1、 預完成任務的分析 首先,要對單片機應用系統(tǒng)預完成的任務進行深

3、入的分析,明確系統(tǒng)的設(shè)計任務的功能要求和技術(shù)指標。其次,要對系統(tǒng)的硬件資源和工作環(huán)境進行分析。這是單片機應用系統(tǒng)程序設(shè)計的基礎(chǔ)和條件。二、進行算法的優(yōu)化算法是解決具體問題的方法。應用系統(tǒng)經(jīng)過分析、研究和明確規(guī)定后,對應實現(xiàn)的功能和技術(shù)指標可以利用嚴密的數(shù)學方法或數(shù)學模型來描述,從而把實際問題轉(zhuǎn)化成由計算機進行處理的問題。三、程序總體設(shè)計及流程圖繪制 經(jīng)過任務分析、算法優(yōu)化后,就可以進行程序的總體構(gòu)思,確定程序的結(jié)構(gòu)和數(shù)據(jù)形式,并考慮資源的分配和參數(shù)的計算等。然后根據(jù)程序運行的過程,勾畫出程序執(zhí)行的邏輯順序,用圖形符號將總體設(shè)計思路及程序流向繪制在平面圖上,從而使程序的結(jié)構(gòu)關(guān)系直觀明了,便于檢查

4、和修改。清晰正確的流程圖是編制正確無誤的應用程序的基礎(chǔ)和條件。所以,繪制一個好的流程圖,是程序設(shè)計的一項重要內(nèi)容。流程圖可以分為總流程圖和局部流程圖。總流程圖側(cè)重反映程序的邏輯結(jié)構(gòu)和各程序模塊之間的相互關(guān)系。局部流程圖反映程序模塊的具體實施細節(jié)。對于簡單的應用程序,可以不畫流程圖。但是當程序較為復雜時,繪制流程圖是一個良好的編程習慣。常用的流程圖符號有:開始和結(jié)束符號、工作任務符號、判斷分支符號、程序連接符號、程序流向符號等 4.1.2 編制程序的方法和技巧一、采用模塊化程序設(shè)計方法應用系統(tǒng)的程序由包含多個模塊的主程序和各種子程序組成。各程序模塊都要完成一個明確的任務,實現(xiàn)某個具體的功能,如:

5、發(fā)送、接收、延時、打印和顯示等。模塊化的程序設(shè)計方法具有明顯的優(yōu)點。把一個多功能的復雜的程序劃分為若干個簡單的、功能單一的程序模塊,有利于程序的設(shè)計和調(diào)試,有利于程序的優(yōu)化和分工,提高了程序的可讀性和可靠性,使程序的結(jié)構(gòu)層次一目了然。二、盡量采用循環(huán)結(jié)構(gòu)和子程序采用循環(huán)結(jié)構(gòu)和子程序可以使程序的長度減少、占用內(nèi)存空間減少。 通用的子程序,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其它寄存器的內(nèi)容應壓入堆棧進行現(xiàn)場保護,并要特別注意堆棧操作的壓入和彈出的平衡;4.1.3 匯編語言語句的種類和格式兩種基本類型:指令語句和偽指令語句(1)指令語句 已在第3章介紹 每一條指令語句在匯編時都產(chǎn)生

6、一個指令代碼機器代碼(2)偽指令語句 是為匯編服務的。在匯編時沒有機器代碼與之對應。指令語句:MCS-51的匯編語言的四分段格式如下: 標號字段 操作碼字段 操作數(shù)字段 注釋字段規(guī)則:(1)標號字段和操作字碼段之間要有冒號“:”相隔;(2)操作碼字段和操作數(shù)字段間的分界符是空格;(3)雙操作數(shù)之間用逗號相隔; (4)操作數(shù)字段和注釋字段之間的分界符用分號“;”相隔。操作碼字段為必選項,其余各段為任選項。 舉例:下面是一段匯編語言程序的四分段書寫格式 標號字段 操作碼字段 操作數(shù)字段 ;注釋字段 START: MOV A,#00H ;0A MOV R1,#10 ;10R1 MOV R2,#000

7、00011B ;3R2 LOOP: ADD A,R2 ;(A)+(R2)A DJNZ R1,LOOP ;R1內(nèi)容減1不為零,則循環(huán) NOP HERE: SJMP HERE基本語法規(guī)則:1標號字段 是語句所在地址的標志符號 (1)標號后邊必須跟以冒號“:” (2)由18個ASCII字符組成(3)同一標號在一個程序中只能定義一次 (4)不能使用匯編語言已經(jīng)定義的符號作為標號 2操作碼字段 是匯編語言指令中唯一不能空缺的部分。匯編程序就是根據(jù)這一字段來生成機器代碼的。3操作數(shù)字段 通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號隔開。(1)十六進制、二進制和十進制形

8、式的操作數(shù)表示(2)工作寄存器和特殊功能寄存器的表示(3)美元符號$的使用4注釋MCS-51單片機的應用程序的完成,應經(jīng)過三個步驟:(1)在微計算機上,運行編輯程序進行源程序的輸入和編輯 ,以.ASM 或.C的形式存盤。(2)對源程序進行匯編、連接,得到.EXE格式的可執(zhí)行文件及.HEX格式的可燒錄文件;(3)通過微計算機的串行口(或并行口)把機器代碼傳送到用戶樣機(或在線仿真器)進行程序的調(diào)試和運行,并最終傳送至燒錄器進行燒錄。4.2.1源程序匯編手工匯編:人工查表翻譯指令。但遇到的相對轉(zhuǎn)移指令的偏移量的計算,要根據(jù)轉(zhuǎn)移的目標地址計算偏移量,不但麻煩,且容易出錯。機器匯編:用編輯軟件進行源程

9、序的編輯。編輯完成后,生成一個ASCII碼文件,擴展名為“.ASM”。然后在微計算機上運行匯編程序,把匯編語言源程序翻譯成機器代碼。4.2.2 偽指令在MCS-51 匯編語言源程序中應有向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過使用偽指令來實現(xiàn)的。也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令。經(jīng)過匯編得到目標程序(機器代碼)后,偽指令已無存在的必要,所以“偽”體現(xiàn)在匯編時,偽指令沒有相應的機器代碼產(chǎn)生。常用的偽指令:1. ORG(ORiGin)匯編起始地址命令 2. END(END of assembly)匯編終止命令3DB(Define Byte)定義字節(jié)命令4D

10、W(Define Word)定義數(shù)據(jù)字命令5EQU(EQUate)賦值命令6. BIT 定義位地址為符號名解釋:1. ORG(ORiGin)匯編起始地址命令 在匯編語言源程序的開始,通常都用一條ORG偽指令來實現(xiàn)規(guī)定程序的起始地址。例如 ORG 2000HSTART:MOV A,#00H規(guī)定標號START代表地址為2000H開始。 2. END(END of assembly)匯編終止命令匯編語言源程序的結(jié)束標志,用于終止源程序的匯編工作。在整個源程序中只能有一條END命令,且位于程序的最后。3DB(Define Byte)定義字節(jié)命令DB功能是從指定的程序存儲器中的單元開始定義(存儲)若干個

11、字節(jié)。DB后的各項以逗號分隔,每項為一個字節(jié)。各項的形式可以是十進制數(shù)、二進制數(shù)、十六進制數(shù)或字母,字母按ASCII碼存儲,其余按十六進制數(shù)存儲。4DW(Define Word)定義數(shù)據(jù)字命令 從指定的地址開始,在程序存儲器的連續(xù)單元中定義若干個16位的數(shù)據(jù)。 DW后的各項以逗號分隔,每項為一個字。低地址,高字節(jié)。舉例:如:ORG 2000HDB 30H,40H,24DB C,B匯編后:(2000H)=30H(2001H)=40H(2002H)=18H(2003H)=43H(2004H)=42H ORG 2000H DW 1246H,7BH,10匯編后:(2000H)=12H;第1個字(200

12、1H)=46H (2002H)=00H;第2個字(2003H)=7BH(2004H)=00H;第3個字(2005H)=0AH5EQU(EQUate)賦值命令格式:字符名稱 EQU項(數(shù)或匯編符號,字節(jié)或字) 例如:TEST EQU 2000HKEY EQU P1DELY EQU 30H 定義后使用。6BIT定義位地址為符號名與EQU類似的,BIT賦值命令,格式相同,只是項是位。例如: FLAG BIT 30HKEY1 BIT P1.1舉例:LEN EQU 10 SUM EQU 21HBLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCK LOOP:ADD A,R

13、0 INC R0 DJNZ R7,LOOP MOV SUM,A 舉例: 源程序 注釋 ORG 0000H ; 整個程序起始地址 LJMP MAIN ; 跳向主程序 ORG 0030H ; 主程序起始地址MAIN: CLR C ; MAIN為程序標號LOOP: MOV A , R0 ADDC A, R1 INC R0 DJNZ R1, LOOP ;相對轉(zhuǎn)移 SJMP NEXT MOV R0, #03HNEXT: DEC R0 SJMP $ ;HERE: SJMP HERE END ; 結(jié)束標記地址 機器碼 源程序 注釋 ORG 0000H ; 整個程序起始地址0000 02 00 30 LJMP

14、 MAIN ; 跳向主程序 ORG 0030H ; 主程序起始地址0030 C3 MAIN: CLR C ; MAIN為程序標號0031 E6 LOOP: MOV A , R00032 37 ADDC A, R10033 08 INC R00034 DA FB DJNZ R1, LOOP ;相對轉(zhuǎn)移0036 80 02 SJMP NEXT0038 78 03 MOV R0, #03H003A 18 NEXT: DEC R0003B 80 FE SJMP $ ;HERE: SJMP HERE END ; 結(jié)束標記4.4子程序及其調(diào)用(部分)1、 子程序設(shè)計原則和應注意的問題一種能完成某一特定任務

15、的程序段。其資源要為所有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應具有獨立性和通用性,在編寫子程序時應注意以下問題: 1形式:子程序的第一條指令的地址稱為子程序的入口地址,該指令前必須有標號;最后一條一定是RET 。 2主程序調(diào)用子程序 兩條子程序調(diào)用指令: (1)絕對調(diào)用指令:ACALL addr11 (2)長調(diào)用指令: LCALL addr16舉例:MAIN: ;MAIN為主程序或調(diào)用程序標號 LCALL ABC;調(diào)用子程序ABC ABC :PUSH PSW;現(xiàn)場保護PUSH ACC; 子程序處理程序段POP ACC;現(xiàn)場恢復POP PSW; RET;最后一條指令必須為RET指令執(zhí)行過程下一條指

16、令的高8位地址入棧下一條指令的低8位地址入棧程序轉(zhuǎn)至子程序標號位置執(zhí)行指令執(zhí)行過程下一條指令的高8位地址入棧下一條指令的低8位地址入棧程序轉(zhuǎn)至子程序標號位置執(zhí)行指令執(zhí)行過程下一條指令的高8位地址入棧下一條指令的低8位地址入棧程序轉(zhuǎn)至子程序標號位置執(zhí)行3. 子程序調(diào)用、返回指令 -調(diào)用 指令格式: LCALL 指令標號 指令功能: 指令標號對應子程序開始位置。指令執(zhí)行時,先將下一條指令的地址放入堆棧保護起來,然后轉(zhuǎn)至子程序執(zhí)行。指令格式:RET 指令功能: 放置在子程序末尾。將堆棧中被保護 的指令地址取出給PC,程序返回繼續(xù)執(zhí)行。子程序設(shè)計步驟和注意事項1、確定子程序名稱 ,設(shè)定子程序開始標號

17、注意:標號的唯一性2、分析子程序功能,確定初始參數(shù)和結(jié)果參數(shù) 注意:初始參數(shù)和結(jié)果的存儲位置3、確定所使用的寄存器和存儲單元 注意:數(shù)據(jù)沖突、數(shù)據(jù)丟失4、確定子程序結(jié)構(gòu),編寫程序。 注意:子程序的通用性舉例,關(guān)注調(diào)用過程及參數(shù)傳遞方法:例 ABC:MOV R3, #30HMOV R1, #40HCLR AL1: MOV R1,AINC R1DJNZ R3, L1RET問:子程序的功能?若清除50H單元后20個單元,如何調(diào)用?ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV 30H, #20MOV 40H, #50HLCALL ABCSJMP $ ABC: MOV R

18、3, #30H;?30HMOV R1, #40H;?40HCLR AL1: MOV R1,AINC R1DJNZ R3, L1RETEND 一個完整的源程序必備的四個要素:有ORG 0000H,即源程序的機器碼從ROM的0000H單元開始存放。通常源程序的存放要跳過中斷向量區(qū)。實現(xiàn)方法:在0000H單元存放一條轉(zhuǎn)移指令,轉(zhuǎn)向中斷向量區(qū)后的主程序的真實的入口地址,如START、MAIN等。有END,告知匯編程序,你的源程序結(jié)束了。源程序的主程序框架一定是一個順序執(zhí)行的無限循環(huán)的程序,運行過程必須構(gòu)成一個圈;子程序與主程序相對獨立。4.3 基本的程序結(jié)構(gòu)及常用子程序?qū)嵗?.3.1 順序結(jié)構(gòu) 源程序

19、 注釋 ORG 0000H ; 整個程序起始地址 LJMP START ; 跳向主程序 ORG 0040H ; 主程序起始地址START: MOVA,21H 圖示功能 ANL A,#0FH SWAP A MOV 20H,A MOV A,22H ANLA,#0FH ORL20H,A SJMP$ ;HERE: SJMP HERE END ; 結(jié)束標記復習EQULENG EQU 10 功能? SUM EQU 21H BLOCK EQU 22HORG 0000LJMP STARTORG 0030H有錯嗎?START: CLR A MOV R7, #LENG MOV R0, #BLOCKLOOP: AD

20、D A, R0 INC R0包裝成子程序? DJNZ R7, LOOP MOV SUM, A END E NDLENG EQU 10 SUM EQU 21H BLOCK EQU 22HORG 0000LJMP STARTORG 0030HSTART: CLR A MOV R7, # LENG MOV R0, #BLOCK LCALL LOOPSJMP $ LOOP: ADD A, R0 INC R0 DJNZ R7, LOOP MOV SUM, ARET END舉例:兩個無符號數(shù)比較內(nèi)部RAM的40H單元和41H單元各存放了一個8位無符號數(shù),請比較這兩個數(shù)的大小,比較結(jié)果通過單片機對LED的控

21、制顯示出來。即:若(40H)(41H),則P1.0管腳連接的LED發(fā)光;若(40H)(41H),則P1.1管腳連接的LED發(fā)光。N開始 (40H)-(41H) CY0?(40H)(41H)P1.0燈亮(40H)(41H)P1.1燈亮結(jié)束Y 圖 兩個無符號數(shù)比較流程圖 方法1:使用SUBB指令,依據(jù)借位CY狀態(tài)判斷兩個數(shù)的大小!ORG 1000H CLR C ;清CY為零 MOV A,40H ;取第一個數(shù)送A SUBB A,41H ;兩數(shù)比較 JNC LED0 ;CY=0,轉(zhuǎn)至LED0 CLR P1.1 ;CY=1,(40H)(41H),點亮P1.1 LEDLED0: CLR P1.0 ;CY=

22、0,40H(41H),點亮P1.0 LEDFINISH: RET方法2:使用CJNE指令比較,借位CY來判斷兩個數(shù)的大??! ORG 0000H MOV A,40H ;取40H單元數(shù)據(jù)送A CJNE A,41H,COMP ;兩數(shù)比較COPM: JNC LED0 ;相等后的判別 CLR P1.1 ;CY=1,(40)(41H) ;點亮P1.1;連接的LED SJMP FINISH ;跳轉(zhuǎn)到結(jié)束LED0: CLR P1.0 ;CY=0,40H(41H), ;點亮P1.0連接的LEDFINISH: SJMP $ END舉例4-2設(shè)變量 x 以補碼的形式存放在片內(nèi)RAM的30H單元,變量 y 與 x 的

23、關(guān)系是:當 x 大于0時,y =x;當 x =0時,y =20H;當 x 小于0時,y =x+5。編制程序,根據(jù) x 的大小求y并送回原單元。見P102舉例 求符號函數(shù)的值數(shù)據(jù)規(guī)劃:X放40H Y放41H用CJNE指令,借助于CY,可以判別X的符號。常用子程序?qū)嵗?)查表子程序查表程序設(shè)計數(shù)據(jù)補償、修正、計算、轉(zhuǎn)換等各種功能,具有程序簡單、執(zhí)行速度快等優(yōu)點。查表就是根據(jù)自變量x,在表格中尋找y,使y=f(x)。首先是用DB、DW偽指令建表,把握表格中的數(shù)據(jù)的位置與x的關(guān)系。由x來表達y在程序存儲器中的地址,然后用MOVC指令實現(xiàn)查表。例如:求x平方時的表格結(jié)構(gòu)。 DB 00H,01H,04H

24、,09H,10H DB 19H,24H,31H,40H,51H 指令系統(tǒng)中給用戶提供了兩條極為有用的查表指令: MOVC A,A+DPTR MOVC A,A+PC指令“MOVC A,A+DPTR”完成把A中的內(nèi)容作為一個無符號數(shù)與DPTR中的內(nèi)容相加,所得結(jié)果為某一程序存儲單元的地址,然后把該地址單元中的內(nèi)容送到累加器A中。 指令“MOVC A,A+PC”以PC作為基址寄存器,PC的內(nèi)容和A的內(nèi)容作為無符號數(shù),相加后所得的數(shù)作為某一程序存儲單元的地址,然后把該地址單元中的內(nèi)容送到累加器A中。舉例 求x的平方(1):根據(jù)累加器A中的數(shù)x(09之間)查x的平方表y,根據(jù)x的值查出相應的平方y(tǒng)。x和

25、y均為單字節(jié)數(shù)。地 址 子程序 Y ADD A,#01H Y+2 MOVC A,A+PC Y+3 RET Y+4 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H 第1條指令 ADD A,#01H 的作用是加上偏移量,可以根據(jù)A的內(nèi)容查出X對應的平方。 舉例 求x的平方(2):特點:x、y均為一字節(jié), y=f(x)在ROM中的地址是TAB1+xABC: MOV DPTR,#TAB1MOVC A,A+DPTRRETTAB1: DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51HABC: MOV A , R0 RL A

26、MOV B, AMOVDPTR, #TABMOVCA, A+DPTRMOV R2, AMOV A, BINC AMOVCA, A+DPTRMOV R1, ARETTAB: DW 0, 1, 8, 27, 64 DW 125, 216, 343, 512, 729舉例4-11:編寫程序,實現(xiàn) 。設(shè)a,b,c分別存于內(nèi)部RAM的30H,31H,32H三個單元中。程序段如下:START:MOV A,30H ;取a ACALL SQR ;調(diào)用查平方表 MOV R1,A ;a2 暫存于R1中 MOV A,31H ;取b ACALL SQR ;調(diào)用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV

27、 32H,A ;存結(jié)果 SJMP $ SQR :MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR ; RET TAB :DB 0,1,4,9,16 ,25,36,49,64,81 思考題:求 x平方,x在R0中,取值范圍在515ABC: MOV A, R0CLR CSUBB A, #5MOV DPTR,#TAB1MOVC A,A+DPTRRETTAB1: DB 25, 36, 49, 64,81 DB 100,121,169,196,225常用子程序?qū)嵗?)散轉(zhuǎn)程序 舉例4-3:典型的例子 當單片機系統(tǒng)中的鍵盤按下時,就會得到一個鍵值,根據(jù)不同的鍵值,跳向不同的鍵處理程序入口

28、。根據(jù)某一單元(如R7)的內(nèi)容是0,1,n,來分別轉(zhuǎn)向處理程序0,處理程序1,處理程序n。 下列兩種轉(zhuǎn)移指令可以完成多分支轉(zhuǎn)移間接轉(zhuǎn)移指令: JMP A+DPTR;比較轉(zhuǎn)移指令: CJNE A,direct,rel; CJNE A,#data,rel; CJNE Rn,#data,rel;CJNE Ri,#data,rel;00?開始屏蔽高6位讀鍵只L5亮只L6亮只L4亮只L7亮01?02?是是是否否否用CJNE指令的流程圖ORG 00Hljmp startorg 0030hSTART:SETB P1.0 SETB P1.1MOV A,P1ANL A,#03HCJNE A,#00,L1MOV

29、P1, #11101111BSJMP STARTL1:CJNE A,#01,L2MOV P1, #11011111BSJMP STARTL2:CJNE A,#02,L3MOV P1, #10111111BSJMP STARTL3:MOV P1, #01111111BSJMP START開始整理鍵值讀鍵散轉(zhuǎn)只L5亮只L6亮只L4亮只L7亮去CS0去CS1去CS2去CS3地址轉(zhuǎn)移表用散轉(zhuǎn)指令的流程圖END例: 根據(jù)寄存器R2的內(nèi)容,轉(zhuǎn)向各個處理程序PRGx (x=0n)(R2)=0,轉(zhuǎn)PRG0(R2)=1,轉(zhuǎn)PRG1 (R2)=n, 轉(zhuǎn)PRGnJMP6:MOV DPTR, #TAB6MOV A,

30、R2MOV B, #03;MUL ABJMP A+DPTRTAB6: LJMP PRG0 LJMP PRG1 ORG 00Hljmp startorg 0030hSTART:SETB P1.0SETB P1.1MOV A,P1ANL A,#03H RL AMOV DPTR,#TABLJMP A+DPTRTABL:AJMP CS0AJMP CS1AJMP CS2AJMP CS3CS0:MOV P1, #11101111BSJMP STARTCS1:MOV P1, #11011111BSJMP STARTCS2:MOV P1, #10111111BSJMP START讀P103例4-3CS3:MO

31、V P1, #01111111BSJMP STARTEND4.3 基本的程序結(jié)構(gòu)-循環(huán)結(jié)構(gòu)相同或相似的事件被執(zhí)行若干次,用循環(huán)結(jié)構(gòu)優(yōu)點:(1)可大大縮短程序長度 (2)使程序所占的內(nèi)存單元數(shù)量少 (3)使程序結(jié)構(gòu)緊湊和可讀性變好。循環(huán)程序的結(jié)構(gòu)循環(huán)結(jié)構(gòu)程序主要由以下四部分組成。1循環(huán)初始化2循環(huán)處理3循環(huán)控制4循環(huán)結(jié)束1循環(huán)初始化循環(huán)初始化程序段用于完成循環(huán)前的的準備工作。例如,循環(huán)控制計數(shù)初值的設(shè)置、地址指針的起始地址的設(shè)置、為變量預置初值等。 2循環(huán)處理循環(huán)程序結(jié)構(gòu)的核心部分,完成實際的處理工作,是需反復循環(huán)執(zhí)行的部分,故又稱循環(huán)體。這部分程序的內(nèi)容,取決于實際處理問題的本身 3循環(huán)控制在

32、重復執(zhí)行循環(huán)體的過程中,不斷修改循環(huán)控制變量,直到符合結(jié)束條件,就結(jié)束循環(huán)程序的執(zhí)行。循環(huán)結(jié)束控制方法分為循環(huán)計數(shù)控制法和條件控制法 4循環(huán)結(jié)束這部分是對循環(huán)程序執(zhí)行的結(jié)果進行分析、處理和存放。2、 循環(huán)結(jié)構(gòu)的控制當性圖4-8是計數(shù)循環(huán)控制結(jié)構(gòu),圖4-9是條件控制結(jié)構(gòu)。 直到型先處理例4-41 計數(shù)循環(huán)結(jié)構(gòu)計數(shù)控制方法只有在循環(huán)次數(shù)已知的情況下才適用。 計數(shù)循環(huán)控制結(jié)構(gòu)是依據(jù)計數(shù)器的值來決定循環(huán)次數(shù),一般為減“1” 計數(shù)器,計數(shù)器減到“0”時,結(jié)束循環(huán)。計數(shù)器的初值是在初始化時設(shè)定。MCS-51的指令系統(tǒng)提供了功能極強的循環(huán)控制指令: DJNZ Rn, rel;工作寄存器作控制計數(shù)器 DJNZ

33、 direct,rel;以直接尋址單元作控制計數(shù)器初始化例:求50H單元后30個數(shù)的累加和,放入BABC:MOV R7,#30循環(huán)體MOV R0,#50HCLR ALOOP: ADD A,R0INC R0循環(huán)結(jié)束DJNZ R7,LOOPMOV B,A如果結(jié)果有進位,怎么辦?RET先處理例4-52條件控制結(jié)構(gòu)例 將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buffer的存儲區(qū)域內(nèi),直到發(fā)現(xiàn)$ 字符停止傳送。由于循環(huán)次數(shù)事先不知道,但循環(huán)條件可以測試到。所以,采用先判斷后執(zhí)行的結(jié)構(gòu)比較適宜。程序段如下: MOV R0,#data MOV DPTR,#bufferLOOP0:

34、MOV A,R0 CJNE A,#24H,LOOP1 ;判斷是否為 $ 字符 SJMP LOOP2 ;是 $ 字符,轉(zhuǎn)結(jié)束LOOP1:MOVX DPTR,A ;不是 $ 字符,執(zhí)行傳送 INC R0 INC DPTR SJMP LOOP0 ;傳送下一數(shù)據(jù) LOOP2: 設(shè)有一串字符,依次存放在內(nèi)部RAM從30H單元開始的連續(xù)單元中,該字符串以0AH為結(jié)束標志,編寫測試字符串長度的程序。本例采用逐個字符依次與“0AH”比較的方法。為此設(shè)置一個長度計數(shù)器和一個字符串指針。長度計數(shù)器用來累計字符串的長度,字符串指針用于指定字符。如果指定字符與“0AH”不相等,則長度計數(shù)器和字符串指針都加1,以便繼續(xù)

35、往下比較;如果比較相等,則表示該字符為“0AH”,字符串結(jié)束,長度計數(shù)器的值就是字符串的長度。3. 多重循環(huán) 常用子程序?qū)嵗?)延時子程序50ms延時程序。延時程序與MCS-51指令執(zhí)行時間有很大的關(guān)系。在使用12MHz晶振時,一個機器周期為1s,執(zhí)行一條DJNZ指令的時間為2s。這時,可用雙重循環(huán)方法寫出下面如下的延時50ms的程序:DEL: MOV R7,#200;t1DEL1: MOV R6,#125;t2DEL2: DJNZ R6,DEL2 ;125*2=250s DJNZ R7,DEL1 ;0.25ms*200=50msRET如果要求比較精確的延時,可按如下修改:DEL: MOV

36、R7,#200DEL1: MOV R6,#123 NOPDEL2: DJNZ R6,DEL2 ;2*123+2=248s DJNZ R7,DEL1 ;(248+2)*200+1=50.001ms RETt= 1+200(1+1+2*123+2)+2*T = 50003*T = 50.003mS注意: 軟件延時程序,不允許有中斷,否則將嚴重影響定時的準確性。練習:寫一個延時10ms的子程序。(近似值,鐘頻12MHz )寫一個延時1s的子程序。DEL10: MOV R7,#200DEL1: MOV R6,#25DEL2: DJNZ R6,DEL2 ;25*2=50s DJNZ R7,DEL1 ;0

37、.05ms*200=10ms RETDEL1S: MOV R5, #100LLL: ACALL DEL10 DJNZ R5, LLL RET常用子程序?qū)嵗?)計算子程序BCDADD:MOV R0,#30H MOV R1,#40H CLR C LOOP0: MOV A,R0 ;取被加數(shù) ADDC A,R1 ;兩數(shù)相加 DA A ;十進制調(diào)整 MOV R0,A INC R0 ;指針加1 INC R1 DJNZ R,LOOP0 ;作完加法否 RETABC: MOV R0,#DATA1 ; MOV R1,#DATA2 ; MOV R7,#N ;置字節(jié)數(shù) CLR C ;LOOP: MOV A,R0 ;

38、 SUBB A,R1 ;求差 MOV R1,A ;存結(jié)果 INC R0 ;修改指針 INC R1 ; DJNZ R7, LOOP ;RET常用子程序?qū)嵗?)數(shù)制與碼的轉(zhuǎn)換子程序 在單片機應用程序的設(shè)計中,經(jīng)常涉及到各種碼制的轉(zhuǎn)換問題。在單片機系統(tǒng)內(nèi)部進行數(shù)據(jù)計算和存儲時,經(jīng)常采用二進制碼,具有運算方便、存儲量小的特點。在輸入/輸出中,按照人的習慣均采用代表十進制數(shù)的BCD碼(用4位二進制數(shù)表示的十進制數(shù))表示。此外,打印機要打印某數(shù)字字符,則需要將該數(shù)字的二進制碼轉(zhuǎn)換為該字符的ASCII碼,才能送到打印機去打印。 1、 二(十六)進制碼與ASCII碼之間的轉(zhuǎn)換 例4-12、132、 二進制碼

39、到BCD碼的轉(zhuǎn)換 例4-143、 BCD碼到二進制碼的轉(zhuǎn)換 1、 二進制數(shù)與ASCII碼之間的轉(zhuǎn)換例4-21 16進制數(shù)(00H0FH)轉(zhuǎn)ASCII碼子程序。分析: “字符0”“字符9”的ASCII碼值為“30H”“39H”,它們與30H之差恰好為“00H”“09H”,結(jié)果均0AH。 “字符A”“字符F”的ASCII碼值為“41H”“46H”,它們各自減去37H后恰好為“0AH”“0FH”,結(jié)果均0AH。 算法:凡10的十六進制數(shù)加37H;凡10的十六進制數(shù)加30H。ie. 09 30H39H, AF 41H46H ORG 2000HBTOASC: MOV A,R2 ;取待轉(zhuǎn)換的數(shù)據(jù)(入口) ADD A,#0F6H ;判此數(shù)是否10 ? 若10,則C=1;10,則C=0 MOV A,R2 ;重取待轉(zhuǎn)換的數(shù)據(jù) JNC LOOP0 ;小于10就跳去加30H ADD A,#07H ;10就先加7 再去加30H LOOP0 : ADD A,#30H MOV R2,A ;存結(jié)果(出口) RET例4-12、編程實現(xiàn)十六進制數(shù)表示的ASC1I代碼轉(zhuǎn)換成4位二進制數(shù)(1位十六進制數(shù))。ASCHIN: M

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論