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

下載本文檔

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

文檔簡(jiǎn)介

第4章80C51的匯編語言程序設(shè)計(jì)程序編制的方法和技巧4.1源程序的編輯和匯編4.2基本程序結(jié)構(gòu)4.3子程序及其調(diào)用4.4簡(jiǎn)單I/O設(shè)備的并口直接驅(qū)動(dòng)示例4.52023/2/41

單片機(jī)應(yīng)用系統(tǒng)由硬件系統(tǒng)和應(yīng)用程序構(gòu)成

匯編語言高級(jí)語言

應(yīng)用程序設(shè)計(jì)方法

匯編語言,生成的目標(biāo)程序占內(nèi)存空間少、運(yùn)行速度快,具有效率高、實(shí)時(shí)性強(qiáng)。

高級(jí)語言,對(duì)系統(tǒng)的功能描述與實(shí)現(xiàn)簡(jiǎn)單,程序閱讀、修改和移植方便,適合于編寫復(fù)雜的程序。2023/2/424.1程序編制的方法和技巧4.1.1程序編制的步驟

明確任務(wù):功能要求、技術(shù)指標(biāo)運(yùn)行環(huán)境調(diào)研

任務(wù)分析

將實(shí)際問題轉(zhuǎn)化為計(jì)算機(jī)處理的程序算法算法比較與優(yōu)化(內(nèi)存需求與運(yùn)行速度)

算法設(shè)計(jì)2023/2/43

流程描述

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

[操作數(shù)1,][操作數(shù)2,][操作數(shù)3,][;注釋]指令助記符是指令功能的英文縮寫。2023/2/46數(shù)據(jù):二進(jìn)制(B)十進(jìn)制(D或省略D)十六進(jìn)制(H),注意A~F開頭時(shí)要加“0”ASCII碼,如‘A’,‘1245’符號(hào):符號(hào)名、標(biāo)號(hào)或“$”(PC的當(dāng)前值)表達(dá)式:由運(yùn)算符和數(shù)據(jù)構(gòu)成(見表4.1)操作數(shù)注釋英文分號(hào)“;”開頭2023/2/47優(yōu)先級(jí)運(yùn)算符功能表達(dá)式及其結(jié)果示例高↓↓↓↓↓↓↓低·()括號(hào)4*(5+6)即44NOT、HIGH、LOW取反、取高字節(jié)、取低字節(jié)NOT55H即AAH;HIGH1234H即12H+、-正號(hào)、負(fù)號(hào)+5、-6*、/、MOD乘、除(取商)、取余數(shù)17/5即3;

17MOD5即2+、-加、減5+4即

9;

5-4=即1SHL、SHR左移、右移2SHL2即8;8SHR2即

2AND、OR、XOR與、或、異或45HAND0FH即05H<、>、=、<>、<=、>=比較運(yùn)算符MOVA,X>8;若X>8為真,則為MOVA,01H若X>8為假,則為MOVA,00H表4.12023/2/484.2源程序的編輯和匯編目標(biāo)程序的產(chǎn)生過程如下圖:2023/2/494.2.1源程序的編輯和匯編源程序的編輯

ORG0000HLJMPMAIN

ORG0040HMAIN:MOVR7,#16MOVR0,#60HMOVA,#55HLOOP:MOV@R0,AINCR0DJNZR7,LOOPSJMP$

END依據(jù)匯編語言規(guī)則用好偽指令符號(hào)不用中文SJMP$

用于調(diào)試以.ASM存盤2023/2/410源程序的匯編匯編源程序轉(zhuǎn)為目標(biāo)程序的過程叫匯編匯編通常在Windows下的集成開發(fā)環(huán)境完成用A51.EXE匯編生成.OBJ、.LIB及.LST目標(biāo)程序的連接.OBJ、.LIB經(jīng)BL51.EXE生成無擴(kuò)展名的絕對(duì)地址目標(biāo)文件絕對(duì)地址目標(biāo)文件可以用于仿真器調(diào)試調(diào)試無誤的目標(biāo)文件用OH51.EXE轉(zhuǎn)換為.HEX文件.HEX文件經(jīng)編程器寫入單片機(jī)存儲(chǔ)器2023/2/4114.2.2偽指令偽指令,也叫匯編命令。僅對(duì)匯編過程進(jìn)行指示偽指令無對(duì)應(yīng)的單片機(jī)可執(zhí)行代碼起始地址設(shè)定偽指令ORGORG表達(dá)式表達(dá)式通常為十六進(jìn)制地址,例:

ORG8000HSTART:MOVA,#30H……ORG可多次使用,但地址值的順序要由小到大結(jié)束匯編偽指令ENDEND該偽指令位于源程序的最后一行。2023/2/412定義字節(jié)數(shù)據(jù)表偽指令DB定義字?jǐn)?shù)據(jù)表偽指令DW1000H[標(biāo)號(hào):]DB字節(jié)數(shù)據(jù)表如:ORG1000HDB-2,-4,-6,8,10,18FEHFCHFAH08H0AH12H1001H[標(biāo)號(hào):]DW字?jǐn)?shù)據(jù)表ORG1400HDATA1:DW324AH,3CH……1400H32H4AH00H3CH1401H1402H1403H大端模式2023/2/413定義常值為符號(hào)名偽指令EQU符號(hào)名EQU常值表達(dá)式

LEN

EQU10

SUM

EQU21HBLOCK

EQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,A符號(hào)名為:地址常數(shù)段名字符串寄存器名位名比較:標(biāo)號(hào)只能是地址2023/2/414定義位地址為符號(hào)名偽指令BIT符號(hào)名BIT位地址表達(dá)式如:STBITP1.0;將P1.0的位地址賦給符號(hào)名STCFBIT0D7H;將位地址為D7H的位定義為符號(hào)名用BIT定義的“符號(hào)名”一經(jīng)定義便不能重新定義和改變其它一些偽指令參見教材表4.22023/2/4154.3基本程序結(jié)構(gòu)一般不影響標(biāo)志寄存器PSW的狀態(tài)。傳送類指令有兩大類

一般傳送(MOV)特殊傳送,如:MOVCMOVXPUSH、POPXCH、XCHDSWAP

2023/2/4164.3.1順序程序(無分支、無循環(huán))4.3基本程序結(jié)構(gòu)【例4-1】片內(nèi)RAM的21H單元存放一個(gè)十進(jìn)制數(shù)據(jù)十位的ASCII碼,22H單元存放該數(shù)據(jù)個(gè)位的ASCII碼。編寫程序?qū)⒃摂?shù)據(jù)轉(zhuǎn)換成壓縮BCD碼存放在20H單元。2023/2/417ORG0040HSTART:MOVA,21H;取十位ASCII碼ANLA,#0FH;保留低半字節(jié)SWAPA;移至高半字節(jié)MOV20H,A;存于20H單元MOVA,22H;取個(gè)位ASCII碼ANLA,#0FH;保留低半字節(jié)ORL20H,A;合并到結(jié)果單元SJMP$END2023/2/4184.3.2分支程序(單分支、雙分支、多分支)【例4-2】設(shè)變量x以補(bǔ)碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當(dāng)x大于0時(shí),y=x;當(dāng)x=0時(shí),y=20H;當(dāng)x小于0時(shí),y=x+5。編制程序,根據(jù)x的大小求y并送回原單元。2023/2/419

ORG0040HSTART:MOVA,30H;取x至累加器

JZNEXT;x=0,轉(zhuǎn)NEXTANLA,#80H;否,保留符號(hào)位

JZDONE;x>0,轉(zhuǎn)結(jié)束

MOVA,#05H;x<0處理

ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:MOV30H,#20H;x=0,20H送YDONE:SJMPDONEEND2023/2/420【例4-3】根據(jù)R7的內(nèi)容x(轉(zhuǎn)移序號(hào))轉(zhuǎn)向相應(yīng)的處理程序。設(shè)R7內(nèi)容為0~4,對(duì)應(yīng)的處理程序入口地址分別為PP0~PP4。

2023/2/421START:MOVR7,#3;以轉(zhuǎn)移序號(hào)3為例

ACALLJPNUMAJMPSTARTJPNUM:MOVDPTR,#TAB;置分支入口地址表首址

MOVA,R7

ADDA,R7;乘2,調(diào)整偏移量

MOVR3,AMOVCA,@A+DPTR;取地址高字節(jié),暫存于R3XCHA,R3INCAMOVCA,@A+DPTR;取地址低字節(jié)

MOVDPL,A;處理程序入口地址低8位送DPLMOVDPH,R3;處理程序入口地址高8位送DPHCLRA

JMP@A+DPTR

2023/2/422TAB:DWPP0DWPP1DWPP2

DWPP3DWPP4PP0:MOV30H,#0;轉(zhuǎn)移序號(hào)為0時(shí),置功能號(hào)“0”于30H單元

RETPP1:MOV30H,#1;轉(zhuǎn)移序號(hào)為1時(shí),置功能號(hào)“1”于30H單元

RETPP2:MOV30H,#2;轉(zhuǎn)移序號(hào)為2時(shí),置功能號(hào)“2”于30H單元

RET

PP3:MOV30H,#3;轉(zhuǎn)移序號(hào)為3時(shí),置功能號(hào)“3”于30H單元

RETPP4:MOV30H,#4;轉(zhuǎn)移序號(hào)為4時(shí),置功能號(hào)“4”于30H單元

RET 2023/2/4234.3.3循環(huán)程序(2種:先執(zhí)行,后判斷;先判斷,后執(zhí)行)【例4-4】將內(nèi)部RAM的30H至3FH單元初始化為00H。MAIN:MOVR0,#30H;置初值

MOVA,#00H;MOVR7,#16;LOOP:MOV@R0,A;循環(huán)處理

INCR0;DJNZR7,LOOP;循環(huán)修改,判結(jié)束

SJMP$;結(jié)束處理2023/2/424【例4-5】將內(nèi)部RAM起始地址為60H的數(shù)據(jù)串傳送到外部RAM中起始地址為1000H的存儲(chǔ)區(qū)域,直到發(fā)現(xiàn)‘$’字符停止傳送。MAIN:MOVR0,#60H;置初值

MOVDPTR,#1000HLOOP0:MOVA,@R0;取數(shù)據(jù)CJNEA,#24H,LOOP1;循環(huán)結(jié)束?SJMPDONE;是LOOP1:MOVX@DPTR,A;循環(huán)處理

INCR0;循環(huán)修改

INCDPTRSJMPLOOP0;繼續(xù)循環(huán)DONE:SJMPDONE;結(jié)束處理2023/2/4254.4子程序及其調(diào)用完成通用功能、反復(fù)使用的程序設(shè)計(jì)成子程序。使應(yīng)用程序結(jié)構(gòu)清晰緊湊,便于閱讀和調(diào)試

執(zhí)行要由其它程序來調(diào)用,執(zhí)行完后要返回到調(diào)用程序

結(jié)構(gòu)上仍然采用一般程序的3種結(jié)構(gòu)調(diào)用時(shí)注意:一是現(xiàn)場(chǎng)的保護(hù)和恢復(fù);二是主程序與子程序間的參數(shù)傳遞。2023/2/4264.4.1現(xiàn)場(chǎng)保護(hù)與恢復(fù)在主程序中實(shí)現(xiàn)(結(jié)構(gòu)靈活)PUSHPSW;保護(hù)現(xiàn)場(chǎng)(含當(dāng)前工作寄存器組號(hào))PUSHACC;PUSHB;MOVPSW,#10H;切換當(dāng)前工作寄存器組LCALLaddr16;子程序調(diào)用,POPB;恢復(fù)現(xiàn)場(chǎng)POPACC;POPPSW;含當(dāng)前工作寄存器組切換2023/2/427在子程序中實(shí)現(xiàn)(程序規(guī)范、清晰)SUB1:PUSHPSW;保護(hù)現(xiàn)場(chǎng)(含當(dāng)前工作寄存器組號(hào))

PUSHACC;PUSHB;MOVPSW,#10H;切換當(dāng)前工作寄存器組

……POPB;恢復(fù)現(xiàn)場(chǎng)

POPACC;POPPSW;內(nèi)含當(dāng)前工作寄存器組切換

RET2023/2/4284.4.2參數(shù)傳遞利用累加器或寄存器(簡(jiǎn)單、快速,但參數(shù)個(gè)數(shù)不多)【例4-6】實(shí)現(xiàn)兩個(gè)8位的十六進(jìn)制無符號(hào)數(shù)求和的子程序。SADD:MOVA,R3;取加數(shù)(在R3中)

CLRCADDA,R4;被加數(shù)(在R4中)加AJCPP1MOVR3,#00H;結(jié)果小于255時(shí),高字節(jié)R3內(nèi)容為00HSJMPPP2PP1:MOVR3,#01H;結(jié)果大于255時(shí),高字節(jié)R3內(nèi)容為01HPP2:MOVR4,A;結(jié)果的低字節(jié)在R4中

RET入口:(R3)=加數(shù);(R4)=被加數(shù)。出口:(R3)=和的高字節(jié);(R4)=和的低字節(jié)。2023/2/429利用存儲(chǔ)器(個(gè)數(shù)多,用R0或R1及DPTR為參數(shù)表指針)【例4-7】將內(nèi)部RAM中兩個(gè)4字節(jié)無符號(hào)整數(shù)相加,和的高字節(jié)由R0指向。數(shù)據(jù)采用大端模式存儲(chǔ)。入口:(R0)=加數(shù)低字節(jié)地址;(R1)=被加數(shù)低字節(jié)地址。出口:(R0)=和的高字節(jié)起始地址。NADD:MOVR7,#4;字節(jié)數(shù)4送計(jì)數(shù)器

CLRC;NADD1:MOVA,@R0;利用指針,取加數(shù)低字節(jié)

ADDCA,@R1;利用指針,被加數(shù)低字節(jié)加AMOV@R0,A;DECR0DECR1DJNZR7,NADD1INCR0;調(diào)整指針,指向出口

RET2023/2/430利用堆棧

【例4-8】將內(nèi)部RAM中20H單元中的1個(gè)字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換為2位ASCII碼,存放在R0指示的兩個(gè)單元中。入口:預(yù)轉(zhuǎn)換數(shù)據(jù)(低半字節(jié))在棧頂出口:轉(zhuǎn)換結(jié)果(ASCII碼)在棧頂HEASC:MOVR1,SP;借用R1為堆棧指針

DECR1DECR1;R1指向被轉(zhuǎn)換數(shù)據(jù)

XCHA,@R1;取被轉(zhuǎn)換數(shù)據(jù)

ANLA,#0FH;取一位十六進(jìn)制數(shù)

ADDA,#2;偏移調(diào)整,所加值為MOVC與DB間總字節(jié)數(shù)

MOVCA,@A+PC;查表

XCHA,@R1;1字節(jié)指令,存結(jié)果于堆棧中

RET;1字節(jié)指令A(yù)SCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H2023/2/431驗(yàn)證程序段MAIN:MOVA,20H;SWAPAPUSHACC;預(yù)轉(zhuǎn)換的數(shù)據(jù)(在低半字節(jié))入棧

ACALLHEASCPOPACC;彈出棧頂結(jié)果于ACC中

MOV@R0,A;存轉(zhuǎn)換結(jié)果高字節(jié)

INCR0;修改指針

PUSH20H;預(yù)轉(zhuǎn)換的數(shù)據(jù)(在低半字節(jié))入棧

ACALLHEASCPOPACC;彈出棧頂結(jié)果于ACC中

MOV@R0,A;存轉(zhuǎn)換結(jié)果低字節(jié)

SJMP$2023/2/4324.4.3常用子程序示例(略)2023/2/4334.5簡(jiǎn)單I/O設(shè)備的并口直接驅(qū)動(dòng)示例4.5.1獨(dú)立式鍵盤與LED顯示示例【例4-17】數(shù)據(jù)端與P0口正序連接。編寫程序,分別實(shí)現(xiàn)功能:上電后數(shù)碼管顯示“P”,按下任何鍵后,顯示從“0”開始每隔1秒加1,加至“F”后,數(shù)碼管顯示“P”,進(jìn)入等待按鍵狀態(tài)。2023/2/434TEMPEQU30H ORG0000H JMPSTARTORG0100HSTART:MOVSP,#5FHMOVP0,#8CH;顯示"P" MOVP3,#0FFHNOKEY:MOVA,P3 CPLA JZNOKEY;無鍵按下

MOVTEMP,P3;有鍵按下

CALLD10ms MOVA,P3 CJNEA,TEMP,NOKEY;去抖

MOVR7,#16 MOVR2,#0LOOP:MOVA,R2MOVDPTR,#CODE_P0MOVCA,@A+DPTRMOVP0,AINCR2SETBRS0;切換組CALLD_1SCLRRS0DJNZR7,LOOP JMPSTARTD_1S:(子程序)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論