單片機原理與接口技術(shù)(第二版-李全利)第4章80C51匯編語言程序設(shè)計_第1頁
單片機原理與接口技術(shù)(第二版-李全利)第4章80C51匯編語言程序設(shè)計_第2頁
單片機原理與接口技術(shù)(第二版-李全利)第4章80C51匯編語言程序設(shè)計_第3頁
單片機原理與接口技術(shù)(第二版-李全利)第4章80C51匯編語言程序設(shè)計_第4頁
單片機原理與接口技術(shù)(第二版-李全利)第4章80C51匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、單片機原理與接口技術(shù)(第二版-李全利)第4章80C51匯編語言程序設(shè)計第一頁,共40頁。 單片機應(yīng)用系統(tǒng)由硬件系統(tǒng)和應(yīng)用程序構(gòu)成 匯編語言 高級語言 應(yīng)用程序設(shè)計方法 匯編語言,生成的目標程序占內(nèi)存空間少、運行速度快,具有效率高、實時性強。 高級語言,對系統(tǒng)的功能描述與實現(xiàn)簡單,程序閱讀、修改和移植方便,適合于編寫復(fù)雜的程序。 2022/10/92第二頁,共40頁。4.1 程序編制的方法和技巧4.1.1 程序編制的步驟 明確任務(wù):功能要求、技術(shù)指標 運行環(huán)境調(diào)研 任務(wù)分析 將實際問題轉(zhuǎn)化為計算機處理的程序算法 算法比較與優(yōu)化(內(nèi)存需求與運行速度) 算法設(shè)計2022/10/93第三頁,共40頁。

2、 流程描述 流程圖符號 “超級循環(huán)”框架2022/10/94第四頁,共40頁。 強化模塊觀念使程序占用空間減少、結(jié)構(gòu)清晰循環(huán)初值和結(jié)束條件,避免“死機”現(xiàn)象子程序的現(xiàn)場保護(注意棧平衡、寄存器內(nèi)容)程序模塊(主程序模塊、各種子程序模塊)模塊化優(yōu)點:分塊設(shè)計、便于閱讀、調(diào)試方便4.1.2 程序編制的方法和技巧 采用循環(huán)和子程序?qū)χ袛嘧映绦蜻€有注意保護PSW的內(nèi)容2022/10/95第五頁,共40頁。4.1.3 匯編語言的語句格式非數(shù)字字符開頭,后跟字母、數(shù)字、“-”、“?”等不能用已定義的保留字(指令助記符、偽指令等)后跟英文冒號“:”Keil的匯編器A51可以識別的語句形式為: 標號(即符號地

3、址)標號: 指令助記符 操作數(shù)1, 操作數(shù)2, 操作數(shù)3, ;注釋 指令助記符是指令功能的英文縮寫。2022/10/96第六頁,共40頁。數(shù)據(jù):二進制(B) 十進制(D或省略D) 十六進制(H),注意AF開頭時要加“0” ASCII碼,如 A,1245符號:符號名、標號或“$”(PC的當(dāng)前值)表達式:由運算符和數(shù)據(jù)構(gòu)成(見表4.1) 操作數(shù) 注釋英文分號“;”開頭2022/10/97第七頁,共40頁。優(yōu)先級運 算 符功 能表達式及其結(jié)果示例高低()括號4*(5+6)即44NOT、HIGH、LOW取反、取高字節(jié)、取低字節(jié)NOT 55H 即AAH;HIGH 1234H 即12H、正號、負號5、6*

4、、/、MOD乘、除(取商)、取余數(shù)17 / 5 即3; 17 MOD 5 即2、加、減 54 即 9; 54 =即1SHL、SHR左移、右移2 SHL 2即8;8 SHR 2 即 2AND、OR、XOR與、或、異或45H AND 0FH即05H、=、=比較運算符MOV A,X8;若X8為真,則為MOV A,01H若X8為假,則為MOV A,00H表4.12022/10/98第八頁,共40頁。4.2 源程序的編輯和匯編目標程序的產(chǎn)生過程如下圖:2022/10/99第九頁,共40頁。4.2.1 源程序的編輯和匯編 源程序的編輯 ORG 0000H LJMP MAIN ORG 0040HMAIN:M

5、OV R7,#16 MOV R0,#60H MOV A,#55HLOOP:MOV R0,A INC R0 DJNZ R7,LOOP SJMP $ END依據(jù)匯編語言規(guī)則用好偽指令符號不用中文SJMP $ 用于調(diào)試以 .ASM存盤2022/10/910第十頁,共40頁。 源程序的匯編匯編源程序轉(zhuǎn)為目標程序的過程叫匯編匯編通常在Windows下的集成開發(fā)環(huán)境完成用A51.EXE匯編生成.OBJ、.LIB及.LST 目標程序的連接.OBJ、.LIB經(jīng)BL51.EXE生成無擴展名的絕對地址目標文件絕對地址目標文件可以用于仿真器調(diào)試調(diào)試無誤的目標文件用OH51.EXE轉(zhuǎn)換為.HEX文件.HEX文件經(jīng)編程

6、器寫入單片機存儲器2022/10/911第十一頁,共40頁。4.2.2 偽指令偽指令,也叫匯編命令。僅對匯編過程進行指示偽指令無對應(yīng)的單片機可執(zhí)行代碼 起始地址設(shè)定偽指令ORGORG 表達式表達式通常為十六進制地址,例: ORG 8000HSTART:MOV A,#30H ORG可多次使用,但地址值的順序要由小到大 結(jié)束匯編偽指令ENDEND該偽指令位于源程序的最后一行。2022/10/912第十二頁,共40頁。 定義字節(jié)數(shù)據(jù)表偽指令DB定義字數(shù)據(jù)表偽指令DW1000H標號: DB 字節(jié)數(shù)據(jù)表如:ORG 1000HDB -2,-4,-6,8,10,18FEH FCHFAH08H0AH12H10

7、01H標號: DW 字數(shù)據(jù)表 ORG 1400HDATA1:DW 324AH,3CH 1400H32H 4AH00H3CH1401H1402H1403H大端模式2022/10/913第十三頁,共40頁。 定義常值為符號名偽指令EQU符號名 EQU 常值表達式 LEN EQU 10 SUM EQU 21HBLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCK LOOP:ADD A,R0 INC R0 DJNZ R7,LOOP MOV SUM,A 符號名為:地址常數(shù)段名字符串寄存器名位名比較:標號只能是地址2022/10/914第十四頁,共40頁。 定義位地址為符號

8、名偽指令BIT符號名 BIT 位地址表達式如:ST BIT P1.0 ;將P1.0的位地址賦給符號名STCF BIT 0D7H ;將位地址為D7H的位定義為符號名用BIT定義的“符號名”一經(jīng)定義便不能重新定義和改變其它一些偽指令參見教材表4.2 2022/10/915第十五頁,共40頁。4.3 基本程序結(jié)構(gòu)一般不影響標志寄存器PSW的狀態(tài)。 傳送類指令有兩大類 一般傳送( MOV ) 特殊傳送,如: MOVC MOVX PUSH、POP XCH、XCHD SWAP 2022/10/916第十六頁,共40頁。4.3.1 順序程序(無分支、無循環(huán))4.3 基本程序結(jié)構(gòu)【例4-1】片內(nèi)RAM的21H

9、單元存放一個十進制數(shù)據(jù)十位的ASCII碼,22H單元存放該數(shù)據(jù)個位的ASCII碼。編寫程序?qū)⒃摂?shù)據(jù)轉(zhuǎn)換成壓縮BCD碼存放在20H單元。2022/10/917第十七頁,共40頁。 ORG 0040HSTART:MOV A,21H ;取十位ASCII碼 ANL A,#0FH ;保留低半字節(jié) SWAP A ;移至高半字節(jié) MOV 20H,A ;存于20H單元 MOV A,22H ;取個位ASCII碼 ANL A,#0FH ;保留低半字節(jié) ORL 20H,A ;合并到結(jié)果單元 SJMP $ END2022/10/918第十八頁,共40頁。4.3.2 分支程序(單分支、雙分支、多分支)【例4-2】設(shè)變量

10、x以補碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當(dāng)x大于0時,y=x;當(dāng)x=0時,y=20H;當(dāng)x小于0時,y=x+5。編制程序,根據(jù)x的大小求y并送回原單元。2022/10/919第十九頁,共40頁。 ORG 0040HSTART:MOV A,30H ;取x至累加器 JZ NEXT ;x = 0,轉(zhuǎn)NEXT ANL A,#80H ;否,保留符號位 JZ DONE ;x 0,轉(zhuǎn)結(jié)束 MOV A,#05H ;x 0處理 ADD A,30H MOV 30H,A ;X+05H送Y SJMP DONE NEXT:MOV 30H,#20H ;x = 0,20H送Y DONE:SJMP D

11、ONE END 2022/10/920第二十頁,共40頁?!纠?-3】根據(jù)R7的內(nèi)容x(轉(zhuǎn)移序號)轉(zhuǎn)向相應(yīng)的處理程序。設(shè)R7內(nèi)容為04,對應(yīng)的處理程序入口地址分別為PP0PP4。 2022/10/921第二十一頁,共40頁。 START:MOV R7,#3 ;以轉(zhuǎn)移序號3為例 ACALL JPNUM AJMP START JPNUM:MOV DPTR,#TAB ;置分支入口地址表首址 MOV A,R7 ADD A,R7 ;乘2,調(diào)整偏移量 MOV R3,A MOVC A,A+DPTR ;取地址高字節(jié),暫存于R3 XCH A,R3 INC A MOVC A,A+DPTR ;取地址低字節(jié) MOV

12、DPL,A ;處理程序入口地址低8位送DPL MOV DPH,R3 ;處理程序入口地址高8位送DPH CLR A JMP A+DPTR 2022/10/922第二十二頁,共40頁。 TAB:DW PP0 DW PP1 DW PP2 DW PP3 DW PP4 PP0:MOV 30H,#0 ;轉(zhuǎn)移序號為0時,置功能號“0”于30H單元 RET PP1:MOV 30H,#1 ;轉(zhuǎn)移序號為1時,置功能號“1”于30H單元 RET PP2:MOV 30H,#2 ;轉(zhuǎn)移序號為2時,置功能號“2”于30H單元 RET PP3:MOV 30H,#3 ;轉(zhuǎn)移序號為3時,置功能號“3”于30H單元 RET PP

13、4:MOV 30H,#4 ;轉(zhuǎn)移序號為4時,置功能號“4”于30H單元 RET 2022/10/923第二十三頁,共40頁。4.3.3 循環(huán)程序(2種:先執(zhí)行,后判斷;先判斷,后執(zhí)行)【例4-4】將內(nèi)部RAM的30H至3FH單元初始化為00H。MAIN:MOV R0,#30H ;置初值 MOV A,#00H ; MOV R7,#16 ; LOOP:MOV R0,A ;循環(huán)處理 INC R0 ; DJNZ R7,LOOP ;循環(huán)修改,判結(jié)束 SJMP $ ;結(jié)束處理2022/10/924第二十四頁,共40頁。【例4-5】將內(nèi)部RAM起始地址為60H的數(shù)據(jù)串傳送到外部RAM中起始地址為1000H的

14、存儲區(qū)域,直到發(fā)現(xiàn)$ 字符停止傳送。 MAIN:MOV R0,#60H ;置初值 MOV DPTR,#1000HLOOP0:MOV A,R0 ;取數(shù)據(jù) CJNE A,#24H,LOOP1 ;循環(huán)結(jié)束? SJMP DONE ;是LOOP1:MOVX DPTR,A ;循環(huán)處理 INC R0 ;循環(huán)修改 INC DPTR SJMP LOOP0 ;繼續(xù)循環(huán) DONE:SJMP DONE ;結(jié)束處理2022/10/925第二十五頁,共40頁。4.4 子程序及其調(diào)用 完成通用功能、反復(fù)使用的程序設(shè)計成子程序。使應(yīng)用程序結(jié)構(gòu)清晰緊湊,便于閱讀和調(diào)試 執(zhí)行要由其它程序來調(diào)用,執(zhí)行完后要返回到調(diào)用程序 結(jié)構(gòu)上仍

15、然采用一般程序的3種結(jié)構(gòu) 調(diào)用時注意:一是現(xiàn)場的保護和恢復(fù);二是主程序與子程序間的參數(shù)傳遞。2022/10/926第二十六頁,共40頁。4.4.1 現(xiàn)場保護與恢復(fù)在主程序中實現(xiàn)(結(jié)構(gòu)靈活) PUSH PSW ;保護現(xiàn)場( 含當(dāng)前工作寄存器組號)PUSH ACC ;PUSH B ;MOV PSW,#10H ;切換當(dāng)前工作寄存器組LCALL addr16 ;子程序調(diào)用, POP B ;恢復(fù)現(xiàn)場POP ACC ;POP PSW ;含當(dāng)前工作寄存器組切換2022/10/927第二十七頁,共40頁。在子程序中實現(xiàn)(程序規(guī)范、清晰)SUB1:PUSH PSW ;保護現(xiàn)場( 含當(dāng)前工作寄存器組號) PUSH

16、 ACC ; PUSH B ; MOV PSW,#10H ;切換當(dāng)前工作寄存器組 POP B ;恢復(fù)現(xiàn)場 POP ACC ; POP PSW ;內(nèi)含當(dāng)前工作寄存器組切換 RET2022/10/928第二十八頁,共40頁。4.4.2 參數(shù)傳遞利用累加器或寄存器(簡單、快速,但參數(shù)個數(shù)不多)【例4-6】實現(xiàn)兩個8位的十六進制無符號數(shù)求和的子程序。SADD:MOV A,R3 ;取加數(shù)(在R3中) CLR C ADD A,R4 ;被加數(shù)(在R4中)加A JC PP1 MOV R3,#00H ;結(jié)果小于255時,高字節(jié)R3內(nèi)容為00H SJMP PP2 PP1:MOV R3,#01H ;結(jié)果大于255時

17、,高字節(jié)R3內(nèi)容為01H PP2:MOV R4,A ;結(jié)果的低字節(jié)在R4中 RET入口:(R3)=加數(shù); (R4)=被加數(shù)。出口:(R3)=和的高字節(jié); (R4)=和的低字節(jié)。2022/10/929第二十九頁,共40頁。利用存儲器(個數(shù)多,用R0或R1及DPTR為參數(shù)表指針)【例4-7】將內(nèi)部RAM 中兩個4字節(jié)無符號整數(shù)相加,和的高字節(jié)由R0指向。數(shù)據(jù)采用大端模式存儲。入口:(R0)=加數(shù)低字節(jié)地址; (R1)=被加數(shù)低字節(jié)地址。出口:(R0)=和的高字節(jié)起始地址。 NADD:MOV R7,#4 ;字節(jié)數(shù)4送計數(shù)器 CLR C ;NADD1:MOV A,R0 ;利用指針,取加數(shù)低字節(jié) ADD

18、C A,R1 ;利用指針,被加數(shù)低字節(jié)加A MOV R0,A ; DEC R0 DEC R1 DJNZ R7,NADD1 INC R0 ;調(diào)整指針,指向出口 RET 2022/10/930第三十頁,共40頁。利用堆棧 【例4-8】 將內(nèi)部RAM中20H單元中的1個字節(jié)十六進制數(shù)轉(zhuǎn)換為2位ASCII碼,存放在R0指示的兩個單元中。入口:預(yù)轉(zhuǎn)換數(shù)據(jù)(低半字節(jié))在棧頂 出口:轉(zhuǎn)換結(jié)果(ASCII碼)在棧頂 HEASC:MOV R1,SP ;借用R1為堆棧指針 DEC R1 DEC R1 ;R1指向被轉(zhuǎn)換數(shù)據(jù) XCH A,R1 ;取被轉(zhuǎn)換數(shù)據(jù) ANL A,#0FH ;取一位十六進制數(shù) ADD A,#2

19、 ;偏移調(diào)整,所加值為MOVC與DB間總字節(jié)數(shù) MOVC A,A+PC ;查表 XCH A,R1 ;1字節(jié)指令,存結(jié)果于堆棧中 RET ;1字節(jié)指令A(yù)SCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H2022/10/931第三十一頁,共40頁。驗證程序段 MAIN:MOV A,20H ; SWAP A PUSH ACC ;預(yù)轉(zhuǎn)換的數(shù)據(jù)(在低半字節(jié))入棧 ACALL HEASC POP ACC ;彈出棧頂結(jié)果于ACC中 MOV R0,A ;存轉(zhuǎn)換結(jié)果高字節(jié) INC R0 ;修改指針 PUSH 20

20、H ;預(yù)轉(zhuǎn)換的數(shù)據(jù)(在低半字節(jié))入棧 ACALL HEASC POP ACC ;彈出棧頂結(jié)果于ACC中 MOV R0,A ;存轉(zhuǎn)換結(jié)果低字節(jié) SJMP $2022/10/932第三十二頁,共40頁。4.4.3 常用子程序示例(略)2022/10/933第三十三頁,共40頁。4.5 簡單I/O設(shè)備的并口直接驅(qū)動示例4.5.1 獨立式鍵盤與LED顯示示例【例4-17】數(shù)據(jù)端與P0口正序連接。編寫程序,分別實現(xiàn)功能:上電后數(shù)碼管顯示“P”,按下任何鍵后,顯示從“0”開始每隔1秒加1,加至“F”后,數(shù)碼管顯示“P”,進入等待按鍵狀態(tài)。 2022/10/934第三十四頁,共40頁。 TEMP EQU 3

21、0HORG 0000HJMP START ORG 0100HSTART:MOV SP,#5FH MOV P0,#8CH ;顯示PMOV P3,#0FFHNOKEY:MOV A,P3CPL AJZ NOKEY ;無鍵按下MOV TEMP,P3 ;有鍵按下CALL D10msMOV A,P3CJNE A,TEMP,NOKEY;去抖MOV R7,#16MOV R2,#0LOOP:MOV A,R2 MOV DPTR,#CODE_P0 MOVC A,A+DPTR MOV P0,A INC R2 SETB RS0 ;切換組 CALL D_1S CLR RS0 DJNZ R7,LOOP JMP START D_1S:(子程序)D10ms:(子程序) CODE_P0:DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H, DB 0C6H,0A1H,86H,8EH 2022/10/935第三十五頁,共40頁。有時為方便走線而采用逆序連接,顯示段碼要進行調(diào)整:CODE_P2:DB 03H,9FH

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論