第4章 89C51程序設計.ppt_第1頁
第4章 89C51程序設計.ppt_第2頁
第4章 89C51程序設計.ppt_第3頁
第4章 89C51程序設計.ppt_第4頁
第4章 89C51程序設計.ppt_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、4.1 程序編制的方法和技巧,4.1.1 程序編制的步驟,一、預完成任務的分析,首先,要對單片機應用系統(tǒng)預完成的任務進行深入的分析,明確系統(tǒng)的設計任務、功能要求和技術指標。其次,要對系統(tǒng)的硬件資源和工作環(huán)境進行分析。這是單片機應用系統(tǒng)程序設計的基礎和條件。,二、進行算法的優(yōu)化,算法是解決具體問題的方法。,同一個問題的算法可以有多種,結(jié)果也可能不盡相同,應對各種算法進行分析比較,并進行合理的優(yōu)化。 兼顧速度和內(nèi)存使用,三、程序總體設計及流程圖繪制,經(jīng)過任務分析、算法優(yōu)化后,就可以進行程序的總體構思, 確定程序的結(jié)構和數(shù)據(jù)形式, 考慮資源的分配和參數(shù)的計算。 畫出程序流程圖,清晰正確的流程圖是編制

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

3、和顯示等。,把一個多功能的復雜的程序劃分為若干個簡單的、功能單一的程序模塊,有利于程序的設計和調(diào)試,有利于程序的優(yōu)化和分工,提高了程序的閱讀性和可靠性,使程序的結(jié)構層次一目了然。,二、盡量采用循環(huán)結(jié)構和子程序,采用循環(huán)結(jié)構和子程序可以使程序的長度減少、占用內(nèi)存空間減少。,多重循環(huán),注意各重循環(huán)的初值和循環(huán)結(jié)束條件,避免出現(xiàn) “死循環(huán)”現(xiàn)象;,通用的子程序,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其它寄存器的內(nèi)容應壓入堆棧進行現(xiàn)場保護,并要特別注意堆棧操作的壓入和彈出的平衡;,中斷處理子程序除了要保護程序中用到的寄存器外,還應保護標志寄存器。,4.2 源程序的編輯和匯編,一、源程序的

4、編輯 要依據(jù)89C51匯編語言的基本規(guī)則,特別要用好常用的匯編命令(即偽指令): ORG 0040H MOV A,#7FH MOV R1,#44H END 編輯好的源程序應以“ . ASM”擴展名存盤,以備匯編程序調(diào)用。,4.2.1 源程序的編輯與匯編,二、源程序的匯編,將匯編語言源程序轉(zhuǎn)換為單片機能執(zhí)行的機器碼形式的目標程序的過程叫匯編。常用的方法有兩種:,手工匯編時,把程序用助記符指令寫出后,通過手工方式查指令編碼表,逐個把助記符指令翻譯成機器碼,然后把得到的機器碼程序(以十六進制形式)鍵入到單片機開發(fā)機中,并進行調(diào)試。,機器匯編是在常用的個人計算機PC上,使用交叉匯編程序?qū)R編語言源程序

5、轉(zhuǎn)換為機器碼形式的目標程序。生成的目標程序由PC機傳送到開發(fā)機上,經(jīng)調(diào)試無誤后,再固化到單片機的程序存儲器ROM中。,源程序經(jīng)過機器匯編后,形成的若干文件中含有兩個主要文件,一是列表文件,另一個是目標碼文件。因匯編軟件的不同,文件的格式及信息會有一些不同。但主要信息如下:,列表文件: 地 址 目標碼 匯編程序 ORG 0040H 0040H 747F MOV A,#7FH 0042H 7944 MOV R1,#44H END 目標碼文件: 首地址 末地址 目標碼 0040H 0044H 747F7944,偽指令是匯編程序能夠識別并對匯編過程進行某種控制的匯編命令。它不是單片機執(zhí)行的指令,所以沒

6、有對應的可執(zhí)行目標碼,匯編后產(chǎn)生的目標程序中不會再出現(xiàn)偽指令。,4.2.2 偽指令,一、起始地址設定偽指令 ORG 格式為: ORG 表達式 該指令的功能是向匯編程序說明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。表達式通常為16進制地址,也可以是已定義的標號地址。,ORG 8000H START:MOV A,#30H 此時規(guī)定該段程序的機器碼從地址8000H單元開始存放。,在每一個匯編語言源程序的開始,都要設置一條ORG偽指令來指定該程序在存儲器中存放的起始位置。若省略ORG偽指令,則該程序段從0000H單元開始存放。在一個源程序中,可以多次使用ORG偽指令規(guī)定不同程序段或數(shù)據(jù)段存放的起始地址,

7、但要求地址值由小到大依序排列,不允許空間重疊。,二、匯編結(jié)束偽指令 END 格式為: END 該指令的功能是結(jié)束匯編。 匯編程序遇到END偽指令后即結(jié)束匯編。處于END之后的程序,匯編程序?qū)⒉惶幚怼?三、字節(jié)數(shù)據(jù)定義偽指令 DB 標號: DB 字節(jié)數(shù)據(jù)表 功能是從標號指定的地址開始,在ROM中定義字節(jié)數(shù)據(jù)。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。一個數(shù)據(jù)占一個存儲單元。例如:,DB “how are you?” 把字符串中的字符以ASCII碼的形式存放在連續(xù)的ROM單元中。又如: DB 2,4,6,8,10,18 把6個數(shù)轉(zhuǎn)換為十六進制表示(FEH,F(xiàn)CH,F(xiàn)

8、AH,08H,0AH,12H),并連續(xù)地存放在6個ROM。,該偽指令常用于存放數(shù)據(jù)表格。如要存放顯示用的十六進制的字形碼,可以用多條DB指令完成: DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H DB 0C6H,0A1H,86H,84H,四、字數(shù)據(jù)定義偽指令 DW 標號: DW 字數(shù)據(jù)表 功能是從標號指定的地址單元開始,在程序存儲器中定義字數(shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。應特別注意:16位的二進制數(shù),高8位存放在低地址單元,低8位存放在高地址單元。,五、空間定義偽指令 DS

9、 標號: DS 表達式 功能是從標號指定的地址單元開始,在程序存儲器中保留由表達式所指定的個數(shù)的存儲單元作為備用的空間,并都填以零值。例如:,ORG 3000H BUF:DS 50 匯編后,從地址3000H開始保留50個存儲單元作為備用單元。,六、賦值偽指令 EQU 符號名 EQU 表達式 功能:將表達式的值(一個8位或16位的數(shù))或特定的某個匯編符號定義為一個指定的符號名。 例如: A09 EQU R1,LEN EQU 10 SUM EQU 21H BLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCK LOOP:ADD A,R0 INC R0 DJNZ R7

10、,LOOP MOV SUM,A END 該程序的功能是,把BLOCK單元開始存放的10個無符號數(shù)進行求和,并將結(jié)果存入SUM單元中。,七.數(shù)據(jù)地址賦值偽指令: 字符名 DATA nn DATA 指令與EQU指令功能類似,它是將16位地址賦值所定義的字符名。DATA指令與EQU指令主要的區(qū)別是:EQU定義的名必須先定義后使用,而DATA定義的字符名沒有這種限制,故DATA偽指令通常用在原程序的開頭或末尾 。,八、位地址符號定義偽指令 BIT 格式為: 符號名 BIT 位地址表達式 功能:將位地址賦給指定的符號名。其中,位地址表達式可以是絕對地址,也可以是符號地址。,例如: ST BIT P1.0

11、 將P1.0的位地址賦給符號名ST,在其后的編程中就可以用ST來代替P1.0。,4.3 基本程序結(jié)構,程序的基本算法結(jié)構有 3 種: 順序結(jié)構 分支(選擇)結(jié)構 循環(huán)結(jié)構,4.3.1 順序程序 順序程序是指無分支、無循環(huán)結(jié)構的程序。其執(zhí)行流程是依指令在存儲器中的存放順序進行的。 例: 有一變量存放在片內(nèi)RAM的20H單元,其取值范圍為:00H05H。要求編制一段程序,根據(jù)變量值求其平方值,并存入片內(nèi)RAM的21H單元。,ORG 0000H AJMP MAIN ORG 1000H MAIN : MOV DPTR,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A S

12、JMP $ ORG 2000H TABLE:DB 00,01,04,09,16,25 END。,例 雙字節(jié)無符號數(shù)加法。 設被加數(shù)存放在內(nèi)部RAM的51H、50H單元,加數(shù)存放在內(nèi)部RAM的61H、60H單元,相加的結(jié)果存放在內(nèi)部RAM的51H、50H單元,進位存放在位尋址區(qū)的00H位中。,程序段如下: MOV R0,50H ;被加數(shù)的低字節(jié)地址 MOV R1,60H ;加數(shù)的低字節(jié)地址 MOV A,R0 ;取被加數(shù)低字節(jié) ADD A,R1 ;加上加數(shù)低字節(jié) MOV R0,A ;保存低字節(jié)相加結(jié)果 INC R0 ;指向被加數(shù)高字節(jié) INC R1 ;指向加數(shù)高字節(jié) MOV A,R0 ;取被加數(shù)高

13、字節(jié) ADDC A,R1 ;加上加數(shù)高字節(jié)(帶進位加) MOV R0,A ;存高字節(jié)相加結(jié)果 MOV 00H,C ;保存進位 。,4.3.2 分支程序,分支結(jié)構可以分成單分支、雙分支和多分支幾種情況 :,雙分支程序 例 設變量 x 以補碼的形式存放在片內(nèi)RAM的30H單元,根據(jù) x 的大小求y并送回原單元。程序段如下: START:MOV A,30H JZ NEXT ANL A,#80H ;判斷符號位 JZ LP MOV A,#05H ADD A,30H MOV 30H,A SJMP LP NEXT:MOV 30H,#20H LP:SJMP $,多分支程序 例 根據(jù)R7的內(nèi)容轉(zhuǎn)向相應的處理程序

14、。 設R7的內(nèi)容為07F,對應的處理程序的入口地址分別為PP00PP7F。程序段如下: START:MOV A,R7 ;分支轉(zhuǎn)移序號送A RL A ;分支轉(zhuǎn)移序號乘以2 MOV DPTR,#TAB ;置分支入口地址表首址 JMP A+DPTR TAB:AJMP PP00 AJMP PP01 AJMP PP7F,4.3.3 循環(huán)程序,按某種控制規(guī)律重復執(zhí)行的程序稱為循環(huán)程序。循環(huán)程序有先執(zhí)行后判斷和先判斷后執(zhí)行兩種基本結(jié)構 :,一、先執(zhí)行后判斷 例 50ms延時程序(晶振頻率為12MHz )。 程序段如下: DEL:MOV R7,#200 ;1 s DEL1:MOV R6,#123 ;1 s N

15、OP ;1 s DEL2:DJNZ R6,DEL2 ;2s,計(2123)s DJNZ R7,DEL1 ;2s, RET 共計 (21232 2)200+1 s,即50.001ms,二、先判斷后執(zhí)行 例 將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buffer的存儲區(qū)域內(nèi),直到發(fā)現(xiàn)$ 字符停止傳送。 MOV R0,#data MOV DPTR,#buffer LOOP0:MOV A,R0 CJNE A,#24H,LOOP1 ;判斷是否為 $ 字符 SJMP LOOP2 ;是 $ 字符,轉(zhuǎn)結(jié)束 LOOP1:MOVX DPTR,A ;不是 $ 字符,執(zhí)行傳送 INC R0

16、INC DPTR SJMP LOOP0 ;傳送下一數(shù)據(jù) LOOP2: ,4.3.4 子程序及其調(diào)用,一、子程序的調(diào)用 在實際應用中,經(jīng)常會遇到一些帶有通用性的問題,例如:數(shù)值轉(zhuǎn)換、數(shù)值計算等,在一個程序中可能要使用多次。這時可以將其設計成通用的子程序供隨時調(diào)用。,子程序主要特點是,在執(zhí)行過程中需要由其它程序來調(diào)用,執(zhí)行完后又需要把執(zhí)行流程返回到調(diào)用該子程序的主程序。 子程序調(diào)用時要注意兩點:一是現(xiàn)場的保護和恢復;二是主程序與子程序的參數(shù)傳遞。,二、現(xiàn)場保護與恢復 在子程序執(zhí)行過程中常常要用到單片機的一些通用單元,如工作寄存器R0R7、累加器A、數(shù)據(jù)指針DPTR,以及有關標志和狀態(tài)等。而這些單元

17、中的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,所以需要進行保護,稱為現(xiàn)場保護。,在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復其原內(nèi)容,稱為現(xiàn)場恢復。保護與恢復的方法有以下兩種: 在主程序中實現(xiàn); 在子程序中實現(xiàn)。,1、在主程序中實現(xiàn) 示例如下: PUSH PSW ;保護現(xiàn)場 PUSH ACC ; PUSH B ; MOV PSW,#10H ;換當前工作寄存器組 LCALL addr16 ;子程序調(diào)用 POP B ;恢復現(xiàn)場 POP ACC ; POP PSW ; 其特點是結(jié)構靈活。,2、在子程序中實現(xiàn) 示例如下: SUB1:PUSH PSW ;保護現(xiàn)場 PUSH ACC ; PUSH B ; MOV PS

18、W,#10H ;換當前工作寄存器組 POP B ;恢復現(xiàn)場 POP ACC ; POP PSW ; RET 其特點是程序規(guī)范、清晰。 注意,無論哪種方法保護與恢復的順序要對應。,三、參數(shù)傳遞 由于子程序是主程序的一部分,所以,在程序的執(zhí)行時必然要發(fā)生數(shù)據(jù)上的聯(lián)系。在調(diào)用子程序時,主程序應通過某種方式把有關參數(shù)(即子程序的入口參數(shù))傳給子程序,當子程序執(zhí)行完畢后,又需要通過某種方式把有關參數(shù)(即子程序的出口參數(shù))傳給主程序。在89C51單片機中,傳遞參數(shù)的方法有三種:,1、利用累加器或寄存器 在這種方式中,要把預傳遞的參數(shù)存放在累加器A或工作寄存器R0R7中。即在主程序調(diào)用子程序時,應事先把子程

19、序需要的數(shù)據(jù)送入累加器A或指定的工作寄存器中,當子程序執(zhí)行時,可以從指定的單元中取得數(shù)據(jù),執(zhí)行運算。反之,子程序也可以用同樣的方法把結(jié)果傳送給主程序。,例 編寫程序,實現(xiàn)c=a2+b2 。設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 32H,A ;存結(jié)果 SJMP $ SQR :MOV DPTR,#TAB ;子程序 MOVC A,A+

20、DPTR ; RET TAB :DB 0,1,4,9,16 ,25,36,49,64,81,2、利用存儲器 當傳送的數(shù)據(jù)量比較大時,可以利用存儲器實現(xiàn)參數(shù)的傳遞。在這種方式中,事先要建立一個參數(shù)表,用指針指示參數(shù)表所在的位置。當參數(shù)表建立在內(nèi)部RAM時,用R0或R1作參數(shù)表的指針。當參數(shù)表建立在外部RAM時,用DPTR作參數(shù)表的指針。,例 將R0和R1指向的內(nèi)部RAM 中兩個3字節(jié)無符號整數(shù)相加,結(jié)果送到由R0指向的內(nèi)部RAM中。入口時,R0和R1分別指向加數(shù)和被加數(shù)的低位字節(jié);出口時,R0指向結(jié)果的高位字節(jié)。低字節(jié)在高地址,高字節(jié)在低地址。,實現(xiàn)程序: NADD:MOV R7,#3 ;三字節(jié)

21、加法 CLR C ; NADD1:MOV A,R0 ;取加數(shù)低字節(jié) ADDC A,R1 ;被加數(shù)低字節(jié)加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 RET,3、利用堆棧 利用堆棧傳遞參數(shù)是在子程序嵌套中常采用的一種方法。在調(diào)用子程序前,用PUSH指令將子程序中所需數(shù)據(jù)壓入堆棧,進入執(zhí)行子程序時,再用POP指令從堆棧中彈出數(shù)據(jù)。,一般說來: 當相互傳遞的數(shù)據(jù)較少時,采用寄存器傳遞方式可以獲得較快的傳遞速度; 當相互傳遞的數(shù)據(jù)較多時,宜采用存儲器或堆棧方式傳遞; 如果是子程序嵌套時,最好是采用堆棧方式。,4.4 常用程序舉例,4.4.1 算術運算

22、程序 一、多字節(jié)數(shù)的加、減運算 89C51單片機的指令系統(tǒng)提供的是字節(jié)運算指令,所以在處理多字節(jié)數(shù)的加減運算時,要合理地運用進位(借位)標志。,例 多字節(jié)無符號數(shù)的加法。 設兩個N字節(jié)的無符號數(shù)分別存放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相加后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。,MOV R0,#DATA1 ; MOV R1,#DATA2 ; MOV R7,#N ;置字節(jié)數(shù) CLR C ; LOOP:MOV A,R0 ; ADDC A,R1 ;求和 MOV R1,A ;存結(jié)果 INC R0 ;修改指針 INC R1 ; DJNZ R7, LOOP ;,例 多字節(jié)無符號數(shù)的減法。

23、設兩個N字節(jié)的無符號數(shù)分別存放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相減后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。 MOV R0,#DATA1 ; MOV R1,#DATA2 ; MOV R7,#N ;置字節(jié)數(shù) CLR C ; LOOP:MOV A,R0 ; SUBB A,R1 ;求差 MOV R1,A ;存結(jié)果 INC R0 ;修改指針 INC R1 ; DJNZ R7, LOOP ;,二、多字節(jié)數(shù)乘法運算 例 雙字節(jié)無符號數(shù)的乘法。 設雙字節(jié)的無符號被乘數(shù)存放在R3、R2中,乘數(shù)存放在R5、R4中,R0指向積的高位。,主程序段如下: MULTB:MOV R7,#04 ;結(jié)果單元清0

24、 LOOP:MOV R0,#00H ; DJNZ R7,LOOP ; DEC R0 ACALL BMUL ; SJMP $ 另有2段子程序: BMUL RADD(在BMUL中被調(diào)用),先看子程序段: RADD:ADD A,R0 ; MOV R0,A ; MOV A,B ; INC R0 ; ADDC A,R0 ; MOV R0,A ; INC R0 ; MOV A,R0 ; ADDC A,#00H ;加進位 MOV R0,A ; RET,BMUL:MOV A,R2 ; MOV B,R4 ; MUL AB ;低位乘 ACALL RADD ; MOV A,R2 ; MOV B,R5 ; MUL A

25、B ;交叉乘 DEC R0 ; ACALL RADD ; MOV A,R4 ; MOV B,R3 ; MUL AB ;交叉乘 DEC R0 ; DEC R0 ; ACALL RADD ; MOV A,R5 ; MOV B,R3 ; MUL AB ;高字節(jié)乘 DEC R0 ; ACALL RADD ; DEC R0 RET,一、十六進制數(shù)與ASCII碼間的轉(zhuǎn)換 十六進制數(shù)與ASCII碼的對應關系如表所示。當十六進制數(shù)在09之間時,其對應的ASCII碼值為該十六進制數(shù)加30H;當十六進制數(shù)在AF之間時,其對應的ASCII碼值為該十六進制數(shù)加37H。,4.4.2 碼型轉(zhuǎn)換,例 將1位十六進制數(shù)轉(zhuǎn)換成

26、相應的ASCII碼。 設十六進制數(shù)存放在R0中,轉(zhuǎn)換后的ASCII 碼存放于R2中。實現(xiàn)程序如下: HASC:MOV A,R0 ;取4位二進制數(shù) ANL A,#0FH ;屏蔽掉高4位 PUSH ACC ;4位二進制數(shù)入棧 CLR C ;清進(借)位位 SUBB A,#0AH ;用借位位的狀態(tài)判斷該數(shù)在09還是AF之間 POP ACC ;彈出原4位二進制數(shù) JC LOOP ;借位位為1,跳轉(zhuǎn)至LOOP ADD A,#07H ;借位位為0,該數(shù)在AF之間,加37H LOOP:ADD A,#30H ;該數(shù)在09之間,加30H MOV R2,A ;ASCII碼存于R2 RET,例 將多位十六進制數(shù)轉(zhuǎn)換成ASCII碼。 設地址指針R0指向十六進制數(shù)低位,R2中存放字節(jié)數(shù),轉(zhuǎn)換后地址指針R0指向十六進制數(shù)的高位。R1指向要存放的ASCII碼的高位地址。實現(xiàn)程序如下:,HTASC:MOV A,

溫馨提示

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

評論

0/150

提交評論