《單片機原理及應用系統(tǒng)設計》課件第4章_第1頁
《單片機原理及應用系統(tǒng)設計》課件第4章_第2頁
《單片機原理及應用系統(tǒng)設計》課件第4章_第3頁
《單片機原理及應用系統(tǒng)設計》課件第4章_第4頁
《單片機原理及應用系統(tǒng)設計》課件第4章_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

4.1匯編語言程序設計

4.2C51語言程序設計

習題四第四章單片機程序設計語言4.1.1匯編語言程序設計步驟

根據(jù)要求,采用匯編語言編寫程序的過程稱為匯編語言程序設計。匯編語言程序設計的基本流程如圖4-1所示。4.1匯編語言程序設計圖4-1匯編語言程序設計的基本流程圖4.1.2匯編語言程序結(jié)構(gòu)

單片機匯編程序由主程序、若干子程序和中斷服務程序組成,其總體結(jié)構(gòu)如圖4-2所示。圖4-2匯編程序總體結(jié)構(gòu)

1.主程序

單片機主程序一般由一些順序程序組成。主程序通常有兩種結(jié)構(gòu)形式:中斷方式和循環(huán)方式。中斷方式是指主程序根據(jù)中斷處理的標志執(zhí)行不同的功能模塊,如圖4-3(a)所示。循環(huán)方式則指主程序依次調(diào)用各功能模塊,如圖4-3(b)所示。圖4-3匯編語言主程序結(jié)構(gòu)

2.子程序

一般情況下,單片機的子程序都是具有一定功能的程序模塊。子程序的結(jié)構(gòu)如圖4-4所示,它的子程序名、子程序的具體功能、子程序返回組成。圖4-4程序結(jié)構(gòu)圖

3.中斷服務程序

中斷服務子程序也是具有一定功能的程序模塊,其結(jié)構(gòu)如圖4-5所示。由圖可以看出,在結(jié)構(gòu)上中斷服務程序與子程序基本相同。但中斷服務程序的進入方式與子程序不同,子程序的進入方式是由主程序或其他子程序進行調(diào)用,其進入時間是可控的。圖4-5中斷服務程序結(jié)構(gòu)4.1.3匯編語言程序設計方法

1.順序程序設計

【例4-1】四字節(jié)(雙字)加法。將內(nèi)部RAM30H開始的4個單元中存放的四字節(jié)十六進制數(shù)和內(nèi)部RAM40H單元開始的四個單元中存放的四字節(jié)十六進制數(shù)相加,結(jié)果存放到40H開始的單元中。 ORG0000H

LJMPMAIN ;跳轉(zhuǎn)到主程序中

MAIN: MOVA,30H

ADDA,40H

MOV40H,A ;最低字節(jié)加法并送結(jié)果

MOVA,31H

ADDCA,41H

MOV41H,A ;第二字節(jié)加法并送結(jié)果

MOVA,32H

ADDCA,42H

MOV42H,A ;第三字節(jié)加法并送結(jié)果

MOVA,33H

ADDCA,43H

MOV43H,A ;第四字節(jié)加法并送結(jié)果,進位位在CY中

END

2.分支程序設計

分支程序設計是指根據(jù)指定的條件選擇程序流向的程序設計方法。

1)簡單分支程序

簡單分支程序在設計中應用最廣,擁有的指令也最多。簡單分支程序結(jié)構(gòu)一般為一個入口、兩個出口。簡單分支程序有兩種典型形式,即并列分支和跳轉(zhuǎn)分支,如圖4-6所示。圖4-6簡單分支程序的典型形式

【例4-2】兩個無符號數(shù)比較。內(nèi)部RAM的20H單元和30H單元各存放了一個8位無符號數(shù),請比較這兩個數(shù)的大小,若(20H)>=(30H),則將P1.0置0;若(20H)<(30H),則將P1.1置0。

X DATA20H ;數(shù)據(jù)地址賦值偽指令DATA Y DATA30H

ORG 0000H

LJMP MAIN ;跳轉(zhuǎn)到主程序中

MAIN: MOV A,X ;(X)→A

CLR C ;Cy=0

SUBB A,Y ;帶借位減法,A-(Y)-Cy→A

JC L1 ;Cy=1,轉(zhuǎn)移到L1

CLR P1.0 ;Cy=0,(20H)>=(30H),P1.0置0 SJMP FINISH ;直接跳轉(zhuǎn)到結(jié)束等待

L1: CLR P1.1 ;(20H)<(30H),P1.1置0

FINISH:SJMP$

END

2)多路分支程序

在實際應用中,常常需要從兩個以上的出口中選一個,將這種稱為多分支程序或散轉(zhuǎn)程序。多路分支程序的基本形成如圖4-7所示。圖4-7多路分支程序的典型形式

【例4-3】兩個有符號數(shù)比較。內(nèi)部RAM的20H單元和30H單元各存放了一個8位有符號數(shù),請比較這兩個數(shù)的大小,若(20H)=(30H),則P1.0置0;若(20H)>(30H),則P1.1置0;若(20H)<(30H),則P1.2置0。

X DATA20H

Y DATA30H

ORG 0000H

LJMP MAIN ;跳轉(zhuǎn)到主程序中

MAIN: MOV A,X

XRL A,Y ;(X)與(Y)進行異或操作

JB ACC.7,NEXT1 ;累加器A的第7位為1,兩個數(shù)

;符號不同,轉(zhuǎn)移到NEXT1

MOV A,X

CJNE A,Y,NEQUAL ;(X)≠(Y),轉(zhuǎn)移到NEQUAL

CLR P1.0 ;(X)=(Y),P1.0置0

SJMP PINISH

NEQUAL: JC XXY ;(X)<(Y),轉(zhuǎn)移到XXY

SJMP XDY ;否則,(X)>(Y),轉(zhuǎn)移到XDY

NEXT1: MOV A,X

JNB ACC.7,XDY ;判斷(x)的最高位D7,以確定

;其正負

XXY: CLR P1.2 ;(X)<(Y),P1.2置0

SJMP FINISH

XDY: CLR P1.1 ;(X)>(Y),P1.1置0

FINISH: SJMP $

END

3.循環(huán)程序設計

循環(huán)程序通常有兩種編制方法:一種是先處理后判斷,另一種是先判斷后處理。如圖4-8所示。圖4-8循環(huán)程序的典型形式

【例4-4】冒泡程序。假設有N個數(shù),它們依次存放于LIST地址開始的存儲區(qū)域中,將N個數(shù)比較大小后,使它們按照由小到大的順序排列,且存放在原存儲區(qū)域中。

編寫該程序的方法:依次將相鄰兩個單元的內(nèi)容作比較,即第一個數(shù)和第二個數(shù)比較,第二個數(shù)和第三個數(shù)比較,……,如果符合從小到大的順序則不改變它們在內(nèi)存中的位置,否則交換它們之間的位置。如此反復比較,直到數(shù)列排序完成為止。由于在比較過程中將小數(shù)向上冒,因此這種算法也稱為“冒泡法”或排序法,它是通過一輪一輪的比較,第一輪經(jīng)過N-1次兩兩比較后,得到一個最大數(shù)。第二輪經(jīng)過N-2次兩兩比較后,得到次大數(shù)。以此類推,每輪比較后得到本輪最小數(shù),就再不能參加下一輪的兩兩比較,故進入下一輪時,兩兩比較次數(shù)減1。為了加快數(shù)據(jù)排序速度,程序中設置了一個標志位,只要在比較過程中兩數(shù)之間沒有發(fā)生過交換,就表示數(shù)列已按由大至小的順序排列了,便可以結(jié)束比較。設數(shù)列首地址在R0寄存器中,R2為外循環(huán)次數(shù)計數(shù)器,R3為內(nèi)循環(huán)次數(shù)計數(shù)器,R1為交換標志。程序如下:

ORG 8000H

MOV R2,#CNT-1 ;數(shù)列個數(shù)-1

LOOP1: MOV A,R2 ;外循環(huán)計數(shù)值

MOV R3,A ;內(nèi)循環(huán)計數(shù)值

MOV R1,#01 ;交換標志置-1

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

MOV B,A ;暫存B

INC R0

CLR C

SUBB A,@R0 ;兩數(shù)比較

JC LESS ;Xi<X1+1轉(zhuǎn)LESS

MOVA,B ;取大數(shù)

XCH A,@R0 ;兩數(shù)交換位置

DEC R0

MOV @R0,A

INC R0 ;恢復數(shù)據(jù)指針

MOV R1,#02 ;置交換標志為2

LESS: DJNZ R3,LOOP2;內(nèi)循環(huán)計數(shù)減1,判一遍查完?

DJNZ R2,LOOP3 ;外循環(huán)計數(shù)減1,判排序結(jié)束

STOP: RET

LOOP3: DJNZ R1,LOOP1 ;發(fā)生交換轉(zhuǎn)移

SJMP STOP

ORG 50H ;(內(nèi)部RAM)

LIST: DB 0,13,3,90,27,32,11

ONT: EQU 07H

END

4.子程序參數(shù)傳遞

【例4-5】查表子程序。假設a、b均小于10,計算c=a2+b2。其中a事先存在內(nèi)部RAM的31H單元,b事先存在32H單元,把c存入33H單元。

ORG 0000H ;主程序

MOV SP,#3FH;設置棧底

MOV A,31H;取數(shù)a存放到累加器A中作為入口參數(shù)

LCALL SQR

MOV R1,A;出口參數(shù)——平均值存放在A中

MOV A,32H

LCALL SQR

ADD A,R1

MOV 33H,A

SJMP $ ;子程序:SQR

;功能:通過查表求出平均值y=x2

;入口參數(shù):x存放在累加器A中

;出口參數(shù):求得的平均值y存放在A中

;占用資源:累加器A,數(shù)據(jù)指針DPTR

SQR: PUSH DPH ;保護現(xiàn)場,將主程序中DPTR

;的高八位放入堆棧

PUSH DPL ;保護現(xiàn)場,將主程序中

;DPTR的低八位放入堆棧

MOV DPTR,#TABLE ;在子程序中重新使用DPTR,

;表首地址→DPTR

MOVC A,@A+DPTR ;查表

POP DPL ;恢復現(xiàn)場,將主程序中DPTR

;的低八位從堆棧中彈出

POP DPH ;恢復現(xiàn)場,將主程序中DPTR

;的高八位從堆棧中彈出

RET

TABLE: DB 0,1,4,9,16,25,36,49,64,814.1.4匯編語言編程規(guī)范

1.可讀性

可讀性主要是為了使程序結(jié)構(gòu)清晰,便于閱讀。提高程序可讀性應遵循的編程規(guī)范主要有以下幾點:

(1)程序塊使用縮進方式,函數(shù)和標號使用空格縮進,程序段混合使用TAB和空格縮進;

(2)一行最多寫一條語句;

(3)變量定義時,保持對齊,便于閱讀和檢查內(nèi)存的使用情況。例如:

RegLEDLOSS EQU 30H ;VARIABLE

RegLEDRA EQU 31H ;VARIABLE

RUNLED_Flag EQU 32H ;VARIABLE

2.可理解性

(1)程序在必要的地方必須有注釋。例如,如下注釋的意義就不大:

MOVDXCE1COUNTER,#00H

;將DXCE1COUNTER賦值為0

而如下的注釋則給出了額外有用的信息:

JNZPCComm_Err;假如校驗出錯

(2)注釋應與其描述的代碼相近,對單條語句的注釋應放在其上方或右方相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。

(3)頭文件、源文件的頭部,應進行注釋,注釋應列出文件名、目的、功能等必要的項目。

(4)函數(shù)頭部應進行注釋。注釋應列出函數(shù)的目的、功能、輸入?yún)?shù)、輸出參數(shù)等必要的項目,對一些復雜的函數(shù),在注釋中最好提供典型用法。

(5)對重要代碼段的功能必須注釋。提供有用的、額外的信息。并在該代碼段的結(jié)束處加一行注釋表示該段代碼結(jié)束。

(6)對于所有的常量、變量、數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等),如果其命名不是充分自注釋的,在聲明時都必須加以注釋,以說明其含義。

(7)維護代碼時,要更新相應的注釋,刪除無用的注釋。保持代碼、注釋的一致性,避免產(chǎn)生誤解。

3.可維護性

可維護性是指程序的編寫應便于將來修改維護。

4.可測試性

程序的調(diào)試與測試是軟件生存周期中一個很重要的階段,如何對軟件進行較全面、高效的測試并盡可能地找出軟件中的錯誤就成為很關鍵的問題。為了對C51程序結(jié)構(gòu)有一個直觀上的認識,先看一個簡單的C51程序。

【例】Helloworld程序。

*--------------------------------

文件名:HELLO.C

--------------------------------*/

#include〈REG52.H〉/*頭文件,用于定義單片機的片內(nèi)資源*/

#include〈stdio.h〉/*頭文件,用于定義輸入輸出函數(shù)*/

/*-------------------4.2C51語言程序設計

主函數(shù),程序從此處開始執(zhí)行

-------------------*/

Voidmain(void){

while(1){

p1^=0x01; /*每次打印時將P1.0置1*/

printf(″HelloWorld\n″); /*向串口輸出“HelloWorld”*/

}

}

1.函數(shù)

無論是主函數(shù)還是自定義的其他函數(shù),其格式都是一樣的,為

函數(shù)頭

{

函數(shù)體

溫馨提示

  • 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

提交評論