新編-【大學(xué)課件】單片機(jī)原理與接口技術(shù)-80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)P74_第1頁(yè)
新編-【大學(xué)課件】單片機(jī)原理與接口技術(shù)-80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)P74_第2頁(yè)
新編-【大學(xué)課件】單片機(jī)原理與接口技術(shù)-80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)P74_第3頁(yè)
新編-【大學(xué)課件】單片機(jī)原理與接口技術(shù)-80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)P74_第4頁(yè)
新編-【大學(xué)課件】單片機(jī)原理與接口技術(shù)-80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)P74_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第4章 80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)4.1 單片機(jī)程序設(shè)計(jì)語(yǔ)言概述4.2 匯編語(yǔ)言程序的基本結(jié)構(gòu)形式4.3 80C51 單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)舉例4.4 單片機(jī)匯編語(yǔ)言源程序的編輯和匯編4.5 80C51 單片機(jī)匯編語(yǔ)言偽指令docin/sundae_meng4.1 單片機(jī)程序設(shè)計(jì)語(yǔ)言概述4.1.1 機(jī)器語(yǔ)言和匯編語(yǔ)言1、機(jī)器語(yǔ)言 用二進(jìn)制代碼“0”和“1”表示指令和數(shù)據(jù)的程序設(shè)計(jì)語(yǔ)言,是計(jì)算機(jī)能直接識(shí)別并執(zhí)行的指令。 優(yōu)點(diǎn):執(zhí)行速度快、占用內(nèi)存少。 缺點(diǎn):識(shí)別難、記憶難。2、匯編語(yǔ)言 用助記符和專門的語(yǔ)言規(guī)則表示指令的功能和特征。優(yōu)點(diǎn):助記符與機(jī)器指令一一對(duì)應(yīng)。比機(jī)器語(yǔ)言直觀、 易懂、易

2、記。非常適合于實(shí)時(shí)控制的需要。 缺點(diǎn):難以記憶和使用,程序設(shè)計(jì)的技巧性較高,編程 難度較大。要求使用者必須精通單片機(jī)的硬件系 統(tǒng)和指令系統(tǒng)。缺乏通用性,程序不易移植。docin/sundae_meng4.1.2 單片機(jī)使用的高級(jí)語(yǔ)言對(duì)于8051單片機(jī),現(xiàn)有4種語(yǔ)言支持,即匯編、PL/M、C和BASIC。C語(yǔ)言最終得到廣泛應(yīng)用。可以大大提高單片機(jī)應(yīng)用系統(tǒng)研制的開(kāi)發(fā)效率。移植性好。 高級(jí)語(yǔ)言的不足:生成的目標(biāo)代碼較長(zhǎng),導(dǎo)致應(yīng)用程序運(yùn)行速度較慢。docin/sundae_meng4.1.3 80C51 單片機(jī)匯編語(yǔ)言的語(yǔ)句格式80C51匯編語(yǔ)言的語(yǔ)句格式如下: : ; 1. 標(biāo)號(hào)是語(yǔ)句地址的標(biāo)志符號(hào)

3、,標(biāo)號(hào)的幾點(diǎn)規(guī)定:18個(gè)ASCII字符組成,第一個(gè)字符必須是字母。不能使用本匯編語(yǔ)言已經(jīng)定義的符號(hào)作為標(biāo)號(hào)。標(biāo)號(hào)后面必須跟以冒號(hào)“:”。同一標(biāo)號(hào)在一個(gè)程序中只能定義一次。標(biāo)號(hào)可有可無(wú)。錯(cuò)誤的標(biāo)號(hào) 正確的標(biāo)號(hào)1BT : BT1BEGIN BEGIN : TA+TB: TATB:ADD: ADD1:docin/sundae_meng2. 操作碼用于規(guī)定語(yǔ)句執(zhí)行的操作內(nèi)容,用指令助記符表示。不能空缺。3. 操作數(shù)操作數(shù)用于為指令操作提供數(shù)據(jù)。可以是空白,也可能有13個(gè)操作數(shù),各操作數(shù)之間以逗號(hào)分隔。4. 注釋不屬于語(yǔ)句的功能部分,只是對(duì)語(yǔ)句的解釋說(shuō)明,以“;”開(kāi)頭。5. 分界符(分隔符)用于把語(yǔ)句中

4、的各部分隔開(kāi),以便于區(qū)分。分界符包括空格、冒號(hào)、分號(hào)或逗號(hào)等符號(hào)。docin/sundae_meng4.2 匯編語(yǔ)言程序的基本結(jié)構(gòu)形式 三種基本結(jié)構(gòu)形式:順序程序結(jié)構(gòu),分支程序結(jié)構(gòu),循環(huán)程序結(jié)構(gòu)。4.2.1 順序程序結(jié)構(gòu)順序結(jié)構(gòu)程序是最簡(jiǎn)單的程序結(jié)構(gòu)。程序既無(wú)分支、循環(huán),也不調(diào)用子程序,程序執(zhí)行時(shí)一條接一條地按順序執(zhí)行指令。docin/sundae_meng(1)分析任務(wù)(2)確定算法(3)畫流程圖(4)編寫程序(5)上機(jī)調(diào)試 2、程序設(shè)計(jì)的一般步驟 當(dāng)接到程序設(shè)計(jì)的任務(wù)后,首先對(duì)任務(wù)進(jìn)行詳盡的分析,搞清楚已知的數(shù)據(jù)和想要得到的結(jié)果,程序應(yīng)該完成何種的功能。明確在程序設(shè)計(jì)時(shí)應(yīng)該 “做什么” 。

5、根據(jù)實(shí)際問(wèn)題的要求和指令系統(tǒng)的特點(diǎn),確定解決問(wèn)題的具體步驟。根據(jù)任務(wù)要求,對(duì)不同的計(jì)算方法進(jìn)行比較,選擇最適宜的算法。解決“怎樣做”的問(wèn)題。將解決問(wèn)題的具體步驟用一種約定的幾何圖形、指向線和必要的文字說(shuō)明描述出來(lái),用圖形的方法描繪解決問(wèn)題的思路。用指令的形式將程序流程圖實(shí)現(xiàn)出來(lái)。查錯(cuò)、改錯(cuò),對(duì)程序進(jìn)行優(yōu)化。docin/sundae_meng 50H 51H 52H53H54H55HN1高字節(jié)N1中字節(jié)N1低字節(jié)N2高字節(jié)N2中字節(jié)N2低字節(jié)(1)分析任務(wù)(2)確定算法(3)畫流程圖(4)編寫程序(5)上機(jī)調(diào)試?yán)?字節(jié)無(wú)符號(hào)數(shù)相加:其中被加數(shù)在內(nèi)部RAM的50H、51H和52H單元中;加數(shù)在內(nèi)

6、部RAM的53H、54H和55H單元中;要求把相加之和存放在50H、51H和52H單元中,進(jìn)位存放在位尋址區(qū)的20H位中。docin/sundae_mengMOV R0, #52H;被加數(shù)的低字節(jié)地址MOV R1, #55H;加數(shù)的低字節(jié)地址MOV A, R0ADD A, R1 ;低字節(jié)相加MOV R0, A ;存低字節(jié)相加結(jié)果DEC R0DEC R1MOV A, R0ADDC A, R1;中間字節(jié)帶進(jìn)位相加MOV R0, A ;存中間字節(jié)相加結(jié)果DEC R0DEC R1MOV A, R0ADDC A, R1;高字節(jié)帶進(jìn)位相加MOV R0, A ;存高字節(jié)相加結(jié)果CLR AADDC A, #0

7、0H;進(jìn)位送00H位保存MOV R0, #20H;存放進(jìn)位的單元地址MOV R0, Adocin/sundae_meng 分支結(jié)構(gòu)也稱為選擇結(jié)構(gòu)。為分支需要,程序設(shè)計(jì)時(shí)應(yīng)給程序段的起始地址賦予一個(gè)地址標(biāo)號(hào),以供選擇分支使用。分支結(jié)構(gòu)又可分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。 1. 單分支程序結(jié)構(gòu) 單分支程序結(jié)構(gòu)即二中選一,是通過(guò)條件判斷實(shí)現(xiàn)的。一般都使用條件轉(zhuǎn)移指令對(duì)程序的執(zhí)行結(jié)果進(jìn)行判斷。 可實(shí)現(xiàn)單分支轉(zhuǎn)移的指令有:JZ、JNZ、CJNE和DJNZ。位狀態(tài)轉(zhuǎn)移指令:JC、JNC、JB、JNB和JBC等。4.2.2 分支程序結(jié)構(gòu)docin/sundae_meng(1)單分支結(jié)構(gòu)舉例 假定在外部RAM中有

8、ST1、ST2和ST3共3個(gè)連續(xù)單元,其中ST1和ST2單元中存放著兩個(gè)無(wú)符號(hào)二進(jìn)制數(shù),要求找出其中的大數(shù)并存入ST3單元中。解:(1)分析任務(wù):比較兩個(gè)數(shù)的大小 (2)算法:算術(shù)運(yùn)算、控制轉(zhuǎn)移 (3)程序結(jié)構(gòu):?jiǎn)畏种?(4)數(shù)據(jù)類型:?jiǎn)巫止?jié)、二進(jìn)制、無(wú)符號(hào)數(shù) (5)數(shù)據(jù)結(jié)構(gòu):?jiǎn)卧刂飞蚺帕?(6)RAM單元安排:外部RAM單元 (7)采用寄存器間接尋址方式(R0、R1或DPTR) (8)程序設(shè)計(jì)流程框圖; (9)程序清單;docin/sundae_mengdocin/sundae_mengSTART: CLR C;進(jìn)位位清0 MOV DPTR,#ST1;設(shè)置數(shù)據(jù)指針 MOVX A,DPTR

9、;取第1個(gè)數(shù) MOV R2, A;第1個(gè)數(shù)存于R2 INC DPTR;數(shù)據(jù)指針加1 MOVX A, DPTR;取第2個(gè)數(shù) SUBB A, R2;兩數(shù)比較 JNC BIG1;若第2個(gè)數(shù)大,則轉(zhuǎn)向BIG1 XCH A, R2;若第1個(gè)數(shù)大,則整字節(jié)交換BIG0: INC DPTR MOVX DPTR, A;存大數(shù) RETBIG1: MOVX A, DPTR SJMP BIG0上例中,如果采用CJNE A, direct,rel指令,應(yīng)如何修改程序?docin/sundae_meng(2)多重單分支結(jié)構(gòu)舉例 多重單分支結(jié)構(gòu)中,通過(guò)一系列條件判斷,進(jìn)行逐級(jí)分支。為此可使用比較轉(zhuǎn)移指令CJNE實(shí)現(xiàn)。do

10、cin/sundae_mengCJNE A, 55H, LOOP1;若TaT55,則轉(zhuǎn)向LOOP1AJMP FH ;若TaT55,則返回LOOP1:JNC JW ;若(CY)0,表明TaT55,轉(zhuǎn)降溫處理程序CJNE A, 54H, LOOP2 ;若TaT54,則轉(zhuǎn)向LOOP2AJMP FH ;若TaT54,則返回LOOP2:JC SW;若(CY)1,表明TaT54,轉(zhuǎn)升溫處理程序 FH:RET;若T55TaT54,則返回主程序例:假定采集的溫度值Ta放在累加器A中。此外,在內(nèi)部RAM 54H單元存放溫度下限值T54,在55H單元存放溫度上限值T55。若TaT55,程序轉(zhuǎn)向JW(降溫處理程序)

11、;若TaT54,則程序轉(zhuǎn)向SW(升溫處理程序);若T55TaT54,則程序轉(zhuǎn)向FH(返回主程序)。docin/sundae_meng解:(1)分析任務(wù):解方程 (2)算法:控制轉(zhuǎn)移 (3)程序結(jié)構(gòu):多分支 (4)數(shù)據(jù)類型:?jiǎn)巫止?jié)、二進(jìn)制、有符號(hào)數(shù) (5)RAM單元安排:外部RAM單元 (6)采用寄存器間接尋址方式(R0、R1或DPTR) (7)程序設(shè)計(jì)流程框圖 (8)程序清單; 例:已知:127X-128,求Y。設(shè)X,Y分別存放在外部RAM 1000H和2000H單元中。docin/sundae_meng返回docin/sundae_meng XAD EQU 1000H; BUF EQU 20

12、00H; ORG 1000HSTART:MOV DPTR, #XAD ;數(shù)據(jù)X的地址送數(shù)據(jù)指針DPTR MOVX A, DPTR; A取數(shù)據(jù)X JZ SAV; X0轉(zhuǎn)SAV JB ACC.7, NEG; X0轉(zhuǎn)NEG,否則,X0 MOV A, #01H; SJMP SAV; NEG: MOV A, #0FFH; (0FFH為-1補(bǔ)碼) SAV: MOV DPTR, #BUF; 數(shù)據(jù)Y的地址送數(shù)據(jù)指針DPTR MOVX DPTR, A; 保存Y值 END上例中,如果采用CJNE指令,應(yīng)如何修改程序?docin/sundae_meng XAD EQU 1000H; BUF EQU 2000H; O

13、RG 1000HSTART:MOV DPTR, #XAD ;數(shù)據(jù)X的地址送數(shù)據(jù)指針DPTR MOVX A, DPTR; A取數(shù)據(jù)X CJNE A, #0, ANZ ; X0轉(zhuǎn)ANZ SJMP SAV; ANZ: JC NEG ;X0 MOV A, #01H; SJMP SAV; NEG: MOV A, #0FFH; (0FFH為-1補(bǔ)碼) SAV: MOV DPTR, #BUF; 數(shù)據(jù)Y的地址送數(shù)據(jù)指針DPTR MOVX DPTR, A; 保存Y值 ENDdocin/sundae_meng2. 多分支程序結(jié)構(gòu)多分支程序結(jié)構(gòu)流程中具有兩個(gè)以上條件可供選擇??晒┦褂玫氖亲冎穼ぶ忿D(zhuǎn)移指令“JMP A

14、+DPTR”,但使用該指令實(shí)現(xiàn)多分支轉(zhuǎn)移時(shí),需要有數(shù)據(jù)表格配合。多分支程序結(jié)構(gòu)docin/sundae_meng(1)通過(guò)數(shù)據(jù)表實(shí)現(xiàn)程序多分支 MOV A, n;分支序號(hào)送A MOV DPTR, #BRTAB;地址表首址 MOVC A, A+DPTR;查表 JMP A+DPTR;轉(zhuǎn)移BRTAB:DB BR0-BRTAB;地址表 DB BR1-BRTAB DB BRn-BRTABBR0:分支程序BR1:BRn:docin/sundae_meng(2)通過(guò)轉(zhuǎn)移指令表實(shí)現(xiàn)程序多分支MOV A, nRL A ;分支序號(hào)值乘以2MOV DPTR, #BRTAB;轉(zhuǎn)移指令表首址JMP A+DPTRBRTA

15、B:AJMP BR0 ;轉(zhuǎn)分支程序0AJMP BR1 ;轉(zhuǎn)分支程序1 AJMP BR127 ;轉(zhuǎn)分支程序127BR0: ;分支程序BR1:BRn:docin/sundae_meng(3)其他實(shí)現(xiàn)程序多分支的方法MOV DPTR, #BRTAB;分支入口地址表首址MOV A, R0RL A;分支轉(zhuǎn)移值乘以2MOV R1, A;暫存A值INC AMOVC A, A+DPTR;取低位地址PUSH ACC;低位地址入棧MOV A, R1;恢復(fù)A值MOVC A, A+DPTR;取高位地址PUSH ACC;高位地址入棧RET;分支入口地址裝入PCBRTAB:DW BR0;分支程序入口地址表 DW BR1

16、DW BR127docin/sundae_meng例:假設(shè)鍵盤上有4個(gè)按鍵,功能說(shuō)明如下表: 分析任務(wù) 確定算法 程序流程框圖鍵功能鍵值(分支程序序號(hào))鍵處理程序(分支程序)刪除00HER讀數(shù)據(jù)01HDS寫數(shù)據(jù)02HXS插入03HCRdocin/sundae_mengdocin/sundae_meng 假設(shè)轉(zhuǎn)移指令表名稱為BRTAB,分支程序序號(hào)已在A 中。 MOV DPTR, #BRTAB CLR C RLC A JMP A+DPTR; ORG 3000H3000H BRTAB:AJMP ER; 轉(zhuǎn)刪除分支程序3001H 3002H AJMP DS; 轉(zhuǎn)讀數(shù)據(jù)分支程序3003H3004H A

17、JMP XS; 轉(zhuǎn)寫數(shù)據(jù)分支程序3005H3006H AJMP CR; 轉(zhuǎn)插入分支程序 ORG 3100H3100H ER:; 刪除分支程序 ORG 3200H3200H DS:; 讀數(shù)據(jù)分支程序 ORG 3300H3300H XS:; 寫數(shù)據(jù)分支程序 ORG 3400H3400H CR:; 插入分支程序 ENDdocin/sundae_meng(4)使用比較轉(zhuǎn)移指令CJNE實(shí)現(xiàn)。docin/sundae_meng4.2.3 循環(huán)程序結(jié)構(gòu)循環(huán)結(jié)構(gòu)是重復(fù)執(zhí)行某個(gè)程序段。使用條件轉(zhuǎn)移指令通過(guò)條件判斷來(lái)實(shí)現(xiàn)和控制循環(huán)。循環(huán)程序一般由四個(gè)主要部分組成: (1)初始化部分:為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次

18、數(shù)、給各變量和地址指針預(yù)置初值。 (2)處理部分: 為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實(shí)體, 也是循環(huán)程序的主體。 (3)循環(huán)控制部分: 其作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時(shí),跳出循環(huán)為止。 (4)結(jié)束部分: 這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、處理和存放。docin/sundae_mengMOV R2, #0FFH;設(shè)置長(zhǎng)度計(jì)數(shù)器初值 MOV R0, #3FH;設(shè)置字符串指針初值LOOP:INC R2INC R0CJNE R0, #0DH, LOOPRET舉例:通過(guò)查找結(jié)束標(biāo)志(回車符)以統(tǒng)計(jì)字符串長(zhǎng)度的循環(huán) 程序。 假定字符串存放在內(nèi)部RAM從40H單元開(kāi)

19、始的連續(xù)存儲(chǔ)單元中。為找到結(jié)束標(biāo)志,應(yīng)采用逐個(gè)字符依次與回車符(ASCII碼0DH)比較的方法。同時(shí)在程序中還應(yīng)設(shè)置一個(gè)字符串指針以順序定位字符,設(shè)置一個(gè)字符長(zhǎng)度計(jì)數(shù)器以累計(jì)字符個(gè)數(shù)。docin/sundae_meng 單循環(huán)程序一般有以下兩種典型結(jié)構(gòu):docin/sundae_meng 雙重循環(huán)程序的結(jié)構(gòu):docin/sundae_meng解:(1)分析任務(wù):數(shù)據(jù)傳送;(2)算法:比較、控制轉(zhuǎn)移 (3)程序結(jié)構(gòu):分支、循環(huán)(4)數(shù)據(jù)類型:多字節(jié)字符串 (5)RAM單元安排:內(nèi)部RAM單元、外部RAM單元 (6)采用寄存器間接尋址方式(R0、R1或DPTR)例:把內(nèi)部RAM中起始地址為DATA

20、的數(shù)據(jù)串傳送到外部 RAM以BUFFER為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字符 的ASC碼為止,同時(shí)規(guī)定數(shù)據(jù)串最大長(zhǎng)度為32個(gè)字節(jié)。docin/sundae_meng (7)程序流程框圖;docin/sundae_meng ORG 0030H DATACS:MOV R0, #DATA; DATA數(shù)據(jù)區(qū)首地址 MOV DPTR, #BUFFER;BUFFER數(shù)據(jù)區(qū)首地址 MOV R1, #20H; 最大數(shù)據(jù)串長(zhǎng) LOOP:MOV A, R0; 取數(shù)據(jù) SUBB A, #24H; 判是否為“$”字符 JZ LOOP1; 是“$”字符,轉(zhuǎn)結(jié)束 MOVX A , R0 ; MOVX DPTR,A; 數(shù)據(jù)傳

21、送 INC R0; INC DPTR; DJNZ R1, LOOP; 循環(huán)控制 LOOP1:RET; 結(jié)束 ENDdocin/sundae_meng【補(bǔ)充程序】存儲(chǔ)器清零程序。假設(shè)在內(nèi)部RAM區(qū),開(kāi)辟96個(gè)工作單元,工作單元首地址為20H,則工作單元清零程序子程序如下:思考題:如采用CJNE指令,應(yīng)如何修改程序?解: ORG 1000H CLR0:MOV R0, #20H;循環(huán)初始化部分 MOV R7, #96; CLR A LOOP:MOV R0, A; 循環(huán)體部分 INC R0; 修改變量 DJNZ R7, LOOP;循環(huán)控制部分 RET ENDDEC R7CJNE R7,#00H,LOO

22、P;docin/sundae_meng 例:兩個(gè)三字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)相加,被加數(shù)放在內(nèi)部RAM 50H52H單元(低字節(jié)存放在高地址單元,高字節(jié)存放在低地址單元,即低位在前,高位在后),加數(shù)放在53H55H單元,和放在50H52H單元,最高位如有進(jìn)位,則放在23H單元中。被加數(shù)(N1)加數(shù)(N2)和(N3)50H單元高字節(jié)53H單元高字節(jié)50H單元高字節(jié)51H單元中字節(jié)54H單元中字節(jié)51H單元中字節(jié)52H單元低字節(jié)55H單元低字節(jié)52H單元低字節(jié)23H單元進(jìn)位位 被加數(shù) N1 高字節(jié)(8位) 中字節(jié)(8位) 低字節(jié)(8位) 加數(shù) N2 高字節(jié)(8位) 中字節(jié)(8位) 低字節(jié)(8位) +)進(jìn)位

23、位(CY) 進(jìn)位位(CY) 進(jìn)位位(CY) 和 N3 進(jìn)位 高字節(jié)(8位) 中字節(jié)(8位) 低字節(jié)(8位)docin/sundae_meng返回程序流程框圖docin/sundae_meng ORG 0030H ADDUDO:MOV R0, #52H; 循環(huán)初始化部分 MOV R1, #55H; MOV R7, #03H; 循環(huán)次數(shù) CLR C; LOOP:MOV A, R0; 循環(huán)體部分 ADDC A, R1; MOV R0, A; DEC R0; 修改指針變量 DEC R1; DJNZ R7, LOOP; 循環(huán)控制部分 CLR A; 循環(huán)結(jié)束處理部分 ADDC A, #00H; MOV R

24、0, #23H; MOV R0, A; RET; END 程序清單docin/sundae_meng4.3 80C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)舉例4.3.2 定時(shí)程序 在單片機(jī)的控制應(yīng)用中,常有定時(shí)的需要,如定時(shí)中斷、定時(shí)檢測(cè)和定時(shí)掃描等。定時(shí)功能除可以使用純硬件電路、可編程定時(shí)/計(jì)數(shù)器實(shí)現(xiàn)外,還可以使用軟件程序(定時(shí)程序)完成。 定時(shí)程序是典型的循環(huán)程序,它是通過(guò)執(zhí)行一個(gè)具有固定延遲時(shí)間的循環(huán)體來(lái)實(shí)現(xiàn)定時(shí)的。docin/sundae_meng(1)單循環(huán)定時(shí)程序 MOV R5, #TIME;LOOP: NOP; NOP; DJNZ R5, LOOP; 假設(shè)單片機(jī)晶振頻率fosc=6MHz,則一

25、個(gè)機(jī)器周期為2s,NOP、DJNZ指令分別是單、雙機(jī)器周期指令。定時(shí)程序的總延遲時(shí)間是循環(huán)程序段延時(shí)時(shí)間的整數(shù)倍,由于R5是8位寄存器,因此,這個(gè)定時(shí)程序的最長(zhǎng)定時(shí)時(shí)間為: 256(28)8=2048(s)docin/sundae_meng(2)較長(zhǎng)時(shí)間的定時(shí)程序 (多重循環(huán)定時(shí)子程序) TIME:MOV R5, #TTME1; LOOP2:MOV R4, #TEME2; LOOP1:NOP; NOP; DJNZ R4, LOOP1; DJNZ R5, LOOP2; RET; 這個(gè)定時(shí)子程序的最長(zhǎng)定時(shí)時(shí)間為: 256(28)4+2+1256(28)2+4=525828(s)docin/sund

26、ae_meng(3)調(diào)整定時(shí)時(shí)間 在定時(shí)程序中可通過(guò)在循環(huán)程序段中增減指令的方法對(duì)定時(shí)時(shí)間進(jìn)行微調(diào)。 例: MOV R0, #TTME; LOOP:ADD A, R1; INC DPTR; DJNZ R0, LOOP; 由于ADD、INC、DJNZ指令的機(jī)器周期分別為1、2、2,所以,該程序定時(shí)時(shí)間為=(1+2+2)2sTime(s)。docin/sundae_meng假定要求定時(shí)時(shí)間為24us。對(duì)于這個(gè)定時(shí)程序,只須增加一條NOP指令即可實(shí)現(xiàn)。 MOV R0, #TIME; LOOP: ADD A, R1; INC DPTR; NOP; DJNZ R0, LOOP; 只須TIME取2,即可得

27、到精確的24s定時(shí)。docin/sundae_meng(4)以一個(gè)基本的延時(shí)程序滿足不同的定時(shí)要求 如果一個(gè)系統(tǒng)有多個(gè)定時(shí)需要,我們就可以設(shè)計(jì)一個(gè)基本延時(shí)程序,使其延時(shí)時(shí)間為各定時(shí)時(shí)間的最大公約數(shù),然后可以以此基本程序作為子程序,通過(guò)調(diào)用的方法實(shí)現(xiàn)所需不同定時(shí)。 docin/sundae_meng MOV R0, #05H; 5S定時(shí)LOOP: LCALL DELAY; DJNZ R0, LOOP1; MOV R0, #0AH; 10S定時(shí)LOOP2: LCALL DELAY; DJNZ R0, LOOP2; MOV R0, #14H; 20S定時(shí)LOOP3: LCALL DELAY; DJN

28、Z R0, LOOP3; 例:在單片機(jī)應(yīng)用系統(tǒng)中,假設(shè)需要的定時(shí)時(shí)間分別為5S、10S、20S,可設(shè)計(jì)一個(gè)1S延時(shí)子程序DELAY,則5S、10S、20S的定時(shí)時(shí)間可通過(guò)調(diào)用DELAY實(shí)現(xiàn)。docin/sundae_meng 4.3.3 查表程序 所謂查表程序,就是指預(yù)先把數(shù)據(jù)以表格形式存放在程序存儲(chǔ)器中,然后使用程序讀出,這種能讀出表格數(shù)據(jù)的程序就稱之為查表程序。 查表操作對(duì)單片機(jī)的控制應(yīng)用十分重要,查表程序常用于實(shí)現(xiàn)非線性修正,非線性函數(shù)轉(zhuǎn)換以及代碼轉(zhuǎn)換等場(chǎng)合。 docin/sundae_mengMCS-51單片機(jī)指令系統(tǒng)中有兩條專用查表指令:(1)MOVC A, A+DPTR;A(A)+

29、(DPTR) (2)MOVC A, A+PC; A(A)+(PC) 這兩條查表指令的功能是完全相同的,其共同優(yōu)點(diǎn)是:能在不改變PC和DPTR的狀態(tài)下,只根據(jù)A的內(nèi)容就可以取出表格中的數(shù)據(jù)。注意:A的內(nèi)容均為8位無(wú)符號(hào)數(shù)。適用于64KB ROM范圍內(nèi)查表,一個(gè)數(shù)據(jù)表格可以被多個(gè)程序塊使用。編寫查表程序時(shí),首先把表的首地址送入DPTR中,再將要查表的數(shù)據(jù)序號(hào)(或下標(biāo)值)送入A中,然后就可以使用該指令進(jìn)行查表操作,并把結(jié)果送A中。常用于“本地”范圍查表(數(shù)據(jù)表格只能放在該指令后面256個(gè)地址單元之內(nèi),而且表格只能被本程序使用)。編寫查表程序時(shí),首先把查表數(shù)據(jù)的序號(hào)送入A中,再把從查表指令的下一條指令

30、的首地址到表的首地址間的偏移量與A值相加,然后再使用該指令進(jìn)行查表操作,并把結(jié)果送入A中。docin/sundae_meng ORG 1000H1000H SQR:MOV A, 30H; Ax1002H PUSH DPH; 現(xiàn)場(chǎng)保護(hù)1004H PUSH DPL; 1006H MOV DPTR,#TAB1; DPTR表首地址TAB1 1009H MOVC A, A+DPTR;查表得y100AH MOV 40H, A; 40Hy100CH POP DPL; 現(xiàn)場(chǎng)恢復(fù)100EH POP DPH; 1010H RET1011H TAB1: DB 00H,01H,04H,09H,10H,19H DB 2

31、4H,31H,40H,51H例:設(shè)計(jì)一個(gè)子程序,其功能為根據(jù)x的內(nèi)容(09之間)查平方表,求出相應(yīng)的結(jié)果y(y=x2)。假設(shè)x的內(nèi)容已存放在內(nèi)部RAM 30H單元中,求出y的內(nèi)容存放在內(nèi)部RAM 40H單元中。docin/sundae_meng上例中,如果使用MOVC A,A+PC指令,則編程如下: ORG 1000H1000H SQR: MOV A, 30H; Ax1002H PUSH DPH; 現(xiàn)場(chǎng)保護(hù)1004H PUSH DPL;1006H ADD A, #07H; 加偏移量1008H MOVC A, A+PC; 查表得y1009H MOV 40H, A; 40Hy100BH POP D

32、PL; 現(xiàn)場(chǎng)恢復(fù)100DH POP DPH; 100FH RET1010H TAB1: DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H此題中,偏移量=1010H-1009H=07Hdocin/sundae_meng編輯:編寫程序的過(guò)程。匯編語(yǔ)言源程序:用匯編語(yǔ)言編寫的程序稱為匯編語(yǔ)言源程序。匯編:匯編語(yǔ)言源程序不能在單片機(jī)中直接執(zhí)行,必須將其“翻譯”為用二進(jìn)制代碼(機(jī)器語(yǔ)言)表示的目標(biāo)程序才能執(zhí)行。這個(gè)“翻譯”過(guò)程稱為匯編。 4.4 單片機(jī)匯編語(yǔ)言源程序的編輯和匯編docin/sundae_meng4.4.1 手工編程與匯編手工匯編:先把程序用助記符

33、指令寫出,然后通過(guò)查指令代碼表,逐個(gè)把助記符指令“翻譯”成機(jī)器碼,最后再把機(jī)器碼的程序輸入單片機(jī),進(jìn)行調(diào)試和運(yùn)行。通常把這種查表翻譯指令的方法稱為手工匯編。 由于手工編程是按絕對(duì)地址進(jìn)行定位的,所以手工匯編時(shí)要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算轉(zhuǎn)移指令的偏移量,不但麻煩而且容易出錯(cuò)。docin/sundae_meng4.4.2 機(jī)器編輯與交叉匯編機(jī)器編輯:是指借助于微型機(jī)或開(kāi)發(fā)系統(tǒng)進(jìn)行單片機(jī)的程序設(shè)計(jì),通常都是使用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)由匯編指令和偽指令構(gòu)成的擴(kuò)展名為“.ASM”的ASCII碼文件。機(jī)器匯編:由計(jì)算機(jī)完成從匯編語(yǔ)言源程序到機(jī)器語(yǔ)言目標(biāo)程序的“翻譯”工作。交叉匯編:是

34、指使用一種計(jì)算機(jī)的匯編程序?yàn)榱硪环N計(jì)算機(jī)的源程序進(jìn)行匯編,即運(yùn)行匯編程序進(jìn)行匯編的是一種計(jì)算機(jī),而匯編得到的目標(biāo)程序是另一種計(jì)算機(jī)的。 單片機(jī)只能采用機(jī)器交叉匯編的方法對(duì)匯編語(yǔ)言程序進(jìn)行匯編docin/sundae_meng 在微型機(jī)或開(kāi)發(fā)系統(tǒng)上采用交叉匯編方法對(duì)源程序進(jìn)行匯編。交叉匯編后,再使用串行通信,把匯編得到的目標(biāo)程序傳送到單片機(jī),進(jìn)行程序調(diào)試和運(yùn)行。可見(jiàn),“機(jī)器編輯交叉匯編串行傳送”的過(guò)程構(gòu)成了單片機(jī)軟件設(shè)計(jì)的“三步曲”,全過(guò)程如圖所示。單片機(jī)匯編語(yǔ)言程序生成過(guò)程 對(duì)匯編語(yǔ)言程序進(jìn)行機(jī)器交叉匯編時(shí),必須告訴計(jì)算機(jī)的匯編程序應(yīng)該如何完成匯編工作,這一任務(wù)就是通過(guò)使用偽指令來(lái)實(shí)現(xiàn)的。do

35、cin/sundae_meng偽指令是程序設(shè)計(jì)人員發(fā)給匯編程序的指令,也稱匯編命令或匯編程序控制指令。它具有控制匯編程序的輸入輸出、定義數(shù)據(jù)和符號(hào)、條件匯編、分配存儲(chǔ)空間等功能。偽指令沒(méi)有與之相對(duì)應(yīng)的二進(jìn)制機(jī)器代碼,不同匯編語(yǔ)言的偽指令也有所不同。手工匯編不需要偽指令,但機(jī)器交叉匯編必須使用偽指令。在對(duì)匯編語(yǔ)言程序進(jìn)行機(jī)器交叉匯編前,偽指令存在于匯編語(yǔ)言程序中,但匯編后得到的機(jī)器代碼程序中不存在偽指令相對(duì)應(yīng)的二進(jìn)制機(jī)器代碼,這一點(diǎn)請(qǐng)?zhí)貏e注意。4.5 80C51單片機(jī)匯編語(yǔ)言偽指令docin/sundae_meng1.匯編起始地址命令ORG(ORiGin) 本命令總出現(xiàn)在匯編語(yǔ)言源程序的開(kāi)頭位置

36、,用于規(guī)定目標(biāo)程序的起始地址,即此命令后面的程序或數(shù)據(jù)塊的起始地址。 命令格式:標(biāo)號(hào): ORG 地址 在匯編語(yǔ)言程序的開(kāi)始,通常都用一條ORG偽指令來(lái)規(guī)定程序的起始地址,如果不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開(kāi)始。 選擇項(xiàng)通常為16位絕對(duì)地址,但也可以使用標(biāo)號(hào)或表達(dá)式表示例: ORG 8000H START:MOV A, #00H; 即規(guī)定標(biāo)號(hào)START代表地址8000H,目標(biāo)程序的第一條指令從8000H開(kāi)始。docin/sundae_meng2. 匯編終止命令END(END of assembly) 該命令用于終止源程序的匯編工作。 END是匯編語(yǔ)言源程序的結(jié)束標(biāo)志,因此,在

37、整個(gè)匯編語(yǔ)言源程序中只能有一個(gè)END指令,且位于程序的最后。如果END命令出現(xiàn)在程序中間,則在END之后的指令,匯編程序?qū)⒉挥杼幚怼?命令格式為: END 是選擇項(xiàng),只有主程序模塊才有; 也是選擇項(xiàng),當(dāng)源程序?yàn)橹鞒绦驎r(shí)才具有,其值為主程序第一條指令的符號(hào)地址docin/sundae_meng3. 賦值命令EQU(EQUate) 該命令用于給字符名稱賦值。賦值后,其值在整個(gè)程序中有效。命令格式為:EQU 其中可以是常數(shù)、地址、標(biāo)號(hào)或表達(dá)式。其值為8位或16位二進(jìn)制數(shù)。賦值以后的字符名稱既可以作地址使用,也可以作立即數(shù)使用。例: HOUR EQU 30H ORG 1000H START:MOV H

38、OUR, #40H; 等同于 START:MOV 30H, #40H;docin/sundae_meng4.DB(Define Byte)定義數(shù)據(jù)字節(jié)命令 本命令用于從指定的地址單元開(kāi)始,在程序存儲(chǔ)器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。常使用本命令存放數(shù)據(jù)表格。 命令格式:標(biāo)號(hào):DB8位數(shù)表 例如: DB“how are you?” DB-2,-4,-6,10,11,17 例:存放7段數(shù)碼管(共陽(yáng)極)顯示的十六進(jìn)制基數(shù)(0F)的十六進(jìn)制數(shù)的字形代碼,可使用多條DB命令定義。 DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3 DB 99H, 92H, 82H, 0F8H; 4,5,6,7 D

39、B 80H, 90H, 88H, 83H; 8,9,A,B DB 0C6H,0A1H,86H, 84H; C,D,E,F(xiàn)docin/sundae_meng查表時(shí),為確定數(shù)據(jù)區(qū)的起始地址,可采用兩種方法: a)根據(jù)DB命令前一條指令的地址確定。把該地址加上它的字節(jié)數(shù)就是DB的定義的數(shù)據(jù)字節(jié)的起始地址。 例:8100: MOV A, #49H;一字節(jié)指令 TAB: DB 0COH,0F9H,0A4H,0B0H; 定義的7段數(shù)碼管(共陽(yáng)極)顯示的十六進(jìn)制基數(shù)(0F)的十六進(jìn)制數(shù)的字形代碼從8101H地址單元開(kāi)始存放。docin/sundae_meng b)使用0RG命令專門規(guī)定。 例: ORG 81

40、00H TAB: DB 0COH,0F9H,0A4H,0B0H; 定義的7段數(shù)碼管(共陽(yáng)極)顯示的十六進(jìn)制基數(shù)(0F)的十六進(jìn)制數(shù)的字形代碼從8101H地址單元開(kāi)始存放。docin/sundae_meng5.定義數(shù)據(jù)字命令DW(Define Word) 本命令用于從指定地址開(kāi)始,在程序存儲(chǔ)器單元中定義16位的數(shù)據(jù)字。 命令格式:標(biāo)號(hào):DW16位數(shù)表 存放時(shí),數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。 例如,DW“AA”;存入41H,41HDW“A”;存入00H,41HDW“ABC”;不合法,因超過(guò)兩字節(jié)DW 100H,1ACH,-804;按順序存入01H、00H、01H、 0ACH、

41、0FCH、0DCH DB和DW定義的數(shù)表,數(shù)的個(gè)數(shù)不得超過(guò)80個(gè)。如數(shù)據(jù)的數(shù)目較多時(shí),可使用多個(gè)定義命令。 在MCS-51程序設(shè)計(jì)應(yīng)用中,常以DB來(lái)定義數(shù)據(jù),以DW來(lái)定義地址。 docin/sundae_meng6. 定義存儲(chǔ)區(qū)命令DS(Define Stonage)該命令用于從指定地址開(kāi)始,在程序存儲(chǔ)器中保留指定數(shù)目的單元作為預(yù)留存儲(chǔ)區(qū),供程序運(yùn)行使用。源程序匯編時(shí),對(duì)預(yù)留單元不賦值。命令格式為:標(biāo)號(hào):DS16位數(shù)表例如:ADDRTABL:DS 20;從標(biāo)號(hào)ADDRTABL代表的地址開(kāi)始,預(yù)留20個(gè)連續(xù)的地址單元ORG 8100HDS08H;從8100H地址開(kāi)始,保留8個(gè)連續(xù)的地址單元doc

42、in/sundae_meng7. 位定義命令BIT該命令用于給字符名稱賦以位地址。命令格式為:字符名稱 BIT位地址其中:位地址可以是絕對(duì)地址,也可以是符號(hào)地址(即位符號(hào)名稱)。例: AQ BIT P1.0功能是把P1.0的位地址賦給變量AQ,在其后的編程中AQ就可以作為位地址使用docin/sundae_meng補(bǔ)充內(nèi)容:子程序結(jié)構(gòu) 子程序結(jié)構(gòu)是一種非常重要的程序結(jié)構(gòu)。 在一個(gè)程序中經(jīng)常遇到反復(fù)多次使用某程序段的情況,如果重復(fù)書寫這個(gè)程序段,會(huì)使程序變得冗長(zhǎng)而雜亂。對(duì)此,可采用子程序結(jié)構(gòu),即把重復(fù)的程序段編寫為一個(gè)子程序,通過(guò)主程序調(diào)用而使用它。這樣不但減少了編程工作量,而且也縮短了程序的長(zhǎng)

43、度。 調(diào)用和返回構(gòu)成了子程序調(diào)用的完整過(guò)程。為了實(shí)現(xiàn)這一過(guò)程,必須有子程序調(diào)用指令和返回指令。調(diào)用指令在主程序中使用,而返回指令則應(yīng)該是子程序的最后一條指令。執(zhí)行完這條指令后,程序返回主程序斷點(diǎn)處繼續(xù)執(zhí)行。docin/sundae_meng (1)子程序的編程原則 在實(shí)際的單片機(jī)應(yīng)用系統(tǒng)軟件設(shè)計(jì)中,為了程序結(jié)構(gòu)更加清晰,易于設(shè)計(jì),易于修改,增強(qiáng)程序可讀性,基本上都要使用子程序結(jié)構(gòu)。子程序作為一個(gè)具有獨(dú)立功能的程序段,編程時(shí)需遵循以下原則: a)子程序的第一條指令必須有標(biāo)號(hào),明確子程序入口地址; b)以返回指令RET結(jié)束子程序; c)子程序說(shuō)明部分; 子程序名稱:提供給主程序調(diào)用的名字,通常用符

44、號(hào)或子程序第一條語(yǔ)句的標(biāo)號(hào)來(lái)表示。 子程序功能:簡(jiǎn)要說(shuō)明子程序能完成的主要功能。 子程序入口參數(shù):主程序需要向子程序提供的參數(shù)。docin/sundae_meng 子程序出口參數(shù):子程序執(zhí)行完之后向主程序返回的參數(shù)。 子程序占用資源:子程序中使用了哪些存儲(chǔ)單元、寄存器等 子程序堆棧深度:子程序占用堆棧區(qū)的最大字節(jié)數(shù)。 子程序嵌套情況:子程序中繼續(xù)調(diào)用子程序的情況。 子程序的字節(jié)數(shù):子程序中所有指令字節(jié)數(shù)的總和。 子程序執(zhí)行時(shí)間:子程序中所有指令的機(jī)器周期數(shù)總和。 這些說(shuō)明是寫給程序員看的,供以后使用子程序時(shí)參考。 d)較強(qiáng)的通用性和可浮動(dòng)性,盡可能避免使用具體的內(nèi)存單元和絕對(duì)轉(zhuǎn)移地址等。 docin/sundae_menge)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。 子程序在編制過(guò)程中經(jīng)常會(huì)用到一些通用單元,如工作寄存器、累加器、數(shù)據(jù)指針DPTR以及PSW等。而這些工作單元在調(diào)用它的主程序中也會(huì)用到,為此,需要將子程序用到的這些通用編程資源加以保護(hù),稱為保護(hù)現(xiàn)場(chǎng)。在子程序執(zhí)行完后需恢復(fù)這些單元的內(nèi)容,稱為恢復(fù)現(xiàn)場(chǎng)。通常保護(hù)和恢復(fù)現(xiàn)場(chǎng)是在子程序中利用堆棧操作實(shí)現(xiàn)的,在子程序的開(kāi)始部分把子程序中要用到的編程資源都保護(hù)起來(lái),在執(zhí)行返回指令之前恢復(fù)現(xiàn)場(chǎng),這是一種比較規(guī)范的方法。 另外,保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)也可以在主程序中實(shí)現(xiàn)。在調(diào)用子程序前

溫馨提示

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

評(píng)論

0/150

提交評(píng)論