版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章80C51單片機(jī)匯編語言程序設(shè)計(jì)本講重點(diǎn):
匯編語言程序設(shè)計(jì)。4.1單片機(jī)程序設(shè)計(jì)語言概述4.1.1機(jī)器語言和匯編語言機(jī)器語言——用二進(jìn)制表示的指令。匯編語言——用助記符表示的指令。4.1.2單片機(jī)使用的高級語言C語言、BASIC、PL/M等4.1.380C51單片機(jī)匯編語言的語句格式√標(biāo)號由1~8個ASCII碼組成,但第一個字符必須是字母;
√同一標(biāo)號,在同一段程序中只允許定義一次;
[標(biāo)號:]操作碼
[目的操作數(shù)][,源操作數(shù)][;注釋]√標(biāo)號后邊必須跟冒號。
4.2匯編語言程序的基本結(jié)構(gòu)形式一般把程序結(jié)構(gòu)分為3種形式:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
順序程序是最簡單的程序結(jié)構(gòu),程序執(zhí)行時,按指令的先后順序,一條條地執(zhí)行。4.2.1順序結(jié)構(gòu)例:三字節(jié)無符號數(shù)相加,其中被加數(shù)在內(nèi)部RAM的50H、51H和52H單元中;加數(shù)在內(nèi)部RAM的53H、54H和55H單元中;要求把相加之和存放在50H、51H和52H單元中,進(jìn)位存放在位尋址區(qū)的00H位中。MOVR0,#52H;被加數(shù)的低字節(jié)地址
MOVR1,#55H;加數(shù)的低字節(jié)地址
MOVA,@R0ADDA,@R1;低字節(jié)相加
MOV@R0,A;存低字節(jié)相加結(jié)果DECR0DECR1MOVA,@R0ADDCA,@R1;中間字節(jié)帶進(jìn)位相加
MOV@R0,A;存中間字節(jié)相加結(jié)果
DECR0DECR1MOVA,@R0ADDCA,@R1;高字節(jié)帶進(jìn)位相加
MOV@R0,A;存高字節(jié)相加結(jié)果CLRAADDCA,#00HMOVR0,#00H;存放進(jìn)位的單元地址
MOV@R0,A;進(jìn)位送00H位保存4.2.2分支結(jié)構(gòu)
例:假定在外部RAM中有ST1、ST2和ST3共3個連續(xù)單元,其中ST1和ST2單元中分別存放著兩個8位無符號二進(jìn)制數(shù),要求找出其中的大數(shù)并存入ST3單元中。START:CLRC;進(jìn)位位清“0”MOVDPTR,#ST1;設(shè)置數(shù)據(jù)指針
MOVXA,@DPTR;取第一個數(shù)分支結(jié)構(gòu)是通過轉(zhuǎn)移指令實(shí)現(xiàn)的,又分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。1.單分支結(jié)構(gòu)MOVR2,A;第一個數(shù)存R2INCDPTR;數(shù)據(jù)指針加1MOVXA,@DPTR;取第二個數(shù)
SUBBA,R2;兩數(shù)比較
JNCBIG1;第二個數(shù)大則轉(zhuǎn)BUG1XCHA,R2;第一個數(shù)大則整字節(jié)交換,然后繼續(xù)執(zhí)行程序BIG0:INCDPTRMOVX@DPTR,A;存大數(shù)RETBIG1:MOVXA,@DPTRSJMPBIG02.多分支結(jié)構(gòu)
根據(jù)不同的條件,執(zhí)行不同的程序段。
JZ、JNZ、JC、JNC、JB、JNB、CJNE、DJNZ正確合理地運(yùn)用條件語句組1語句組2YesNo入口出口用條件轉(zhuǎn)移語句實(shí)現(xiàn)二分支≠?Cy=0?語句組1語句組2語句組3入口YesYesNoNoCJNE出口或CY=1?用CJNE實(shí)現(xiàn)三分支例:某溫度控制系統(tǒng),采集的溫度值(Ta)放在累加器A中。此外,在內(nèi)部RAM54H單元存放控制溫度下限值(T54),在55H單元存放控制溫度上限值(T55)。若Ta>T55,程序轉(zhuǎn)向JW(降溫處理程序);若Ta<T54,則程序轉(zhuǎn)向SW(升溫處理程序);若T55≥Ta≥T54,則程序轉(zhuǎn)向FH(返回主程序)。有關(guān)程序段如下:√1)用多條CJNE指令,經(jīng)連續(xù)比較,實(shí)現(xiàn)多重單分支結(jié)構(gòu)。CJNEA,55H,LOOP1;Ta≠T55則轉(zhuǎn)向LOOP1AJMPFH;Ta=T55則返回主程序LOOP1:JNCJW;若(CY)=0則表明Ta>55
轉(zhuǎn)降溫處理程序
CJNEA,54H,LOOP2;Ta≠T54則轉(zhuǎn)向LOOP2AJMPFH;Ta=T54則返回主程序LOOP2:JCSW;若(CY)=1則表明
Ta<T54,轉(zhuǎn)升溫處理程序。FH:RETORG1000HONEDATA30HTWODATA31HMAXDATA32HCLRCMOVA,ONESUBBA,TWO
JZXMAX
JBACC.7,NEG
JBOV,YMAXSJMPXMAX
NEG:JBOV,XMAXYMAX:MOVA,TWO
SJMPRMAX
XMAX:MOVA,ONERMAX:MOVMAX,ASJMP$END[例]ONE和TWO單元中的兩個帶符號數(shù)比較大小,將較大者存入MAX單元中。兩數(shù)相等則任一個存入MAX即可。若X-Y為負(fù),則OV=0,X<YOV=1,X>Y若X-Y為正,則OV=0,X>YOV=1,X<Y√2)用查地址表方法實(shí)現(xiàn)多分支程序轉(zhuǎn)移關(guān)鍵是建立一個差值表,并將各分支入口地址與該表首地址的差值按順序排列其中,差值表首地址送入DPTR,分支序號值送入A中,然后就可通過轉(zhuǎn)移指令JMP@A+DPTR進(jìn)行分支。(A)=?語句組1語句組2語句組3語句組40AH0BH0CH0DH入口AAABBBCCCDDD√3)其他方法實(shí)現(xiàn)多分支程序轉(zhuǎn)移(自學(xué))地址表、堆棧等……4.2.3循環(huán)程序結(jié)構(gòu)循環(huán)是為了重復(fù)執(zhí)行一個程序段。與高級語言不同,匯編語言中沒有專用的循環(huán)指令,但可以使用條件轉(zhuǎn)移指令通過條件判斷來控制循環(huán)。在程序運(yùn)行時,有時需要連續(xù)重復(fù)執(zhí)行某段程序,可以使用循環(huán)程序。其結(jié)構(gòu)包括四部分:
1、置循環(huán)初值
2、循環(huán)體(循環(huán)工作部分)
3、修改控制變量
4、循環(huán)控制部分其組織方式如下圖所示。置初值循環(huán)體循環(huán)修改循環(huán)控制退出循環(huán)未完完(a)置初值循環(huán)體循環(huán)修改循環(huán)控制退出循環(huán)未完完(b)循環(huán)組織方式流程圖1、置循環(huán)初值對于循環(huán)程序中所使用的工作單元,在循環(huán)開始時應(yīng)置初值。例如,工作寄存器設(shè)置計(jì)數(shù)初值,累加器A清0,以及設(shè)置地址指針、長度等。2、循環(huán)體(循環(huán)工作部分)重復(fù)執(zhí)行的程序段部分,分為循環(huán)工作部分和循環(huán)控制部分。循環(huán)控制部分每循環(huán)一次,檢查結(jié)束條件,當(dāng)滿足條件時,就停止循環(huán),往下繼續(xù)執(zhí)行其他程序3、修改控制變量在循環(huán)程序中,不許給出循環(huán)結(jié)束條件。常見的是計(jì)數(shù)循環(huán),當(dāng)循環(huán)了一定的次數(shù)后,就停止循環(huán)。在單片機(jī)中,一般用一個工作寄存器Rn作為計(jì)數(shù)器,對該計(jì)數(shù)器賦初值作為循環(huán)次數(shù)。每循環(huán)一次,計(jì)數(shù)器的值減1,即修改循環(huán)控制變量,當(dāng)計(jì)數(shù)器的置件為0時,就停止循環(huán)。4、循環(huán)控制部分根據(jù)循環(huán)結(jié)束條件,判斷是否結(jié)束循環(huán)。89C51可采用DJNZ指令來自動修改控制變量并能結(jié)束循環(huán)。例:設(shè)有一字符串以回車符為結(jié)束標(biāo)志,并存放在內(nèi)部RAM從40H單元開始的連續(xù)存儲單元中,編寫測試字符串長度的程序。思路:1.逐個字符與回車符(0DH)比較;
2.設(shè)置一個字符串指針;
3.設(shè)置一個長度計(jì)數(shù)器。
MOVR2,#0FFH;設(shè)置長度計(jì)數(shù)器初值
MOVR0,#3FH;設(shè)置字符串指針初值LOOP:INCR2INCR0CJNE@R0,#0DH,LOOPRET程序設(shè)計(jì)的方法和步驟結(jié)構(gòu)化設(shè)計(jì)模塊化設(shè)計(jì)開發(fā)方法自底向上開發(fā)先底層開發(fā)自頂向下開發(fā)先頂層開發(fā)混合方法底頂程序設(shè)計(jì)的步驟分析課題,確定算法和思路;根據(jù)算法和思路畫出流程圖;根據(jù)流程圖編寫程序;上機(jī)調(diào)試,排除錯誤。一、分析問題對需要解決的問題進(jìn)行分析,以求對問題由正確的理解。如,解決問題的任務(wù)是什么?工作過程?現(xiàn)有的條件,已知數(shù)據(jù),對運(yùn)算的精度和速度方面的要求?設(shè)計(jì)的硬件結(jié)構(gòu)是否方便編程?二、確定算法算法就是如何將實(shí)際問題轉(zhuǎn)化成程序模塊來處理。在編程以前,先要對幾種不同的算法進(jìn)行分析、比較,找出最適宜的算法三、畫程序流程圖程序流程圖是用各種圖形、符號、有向線段等來說明程序設(shè)計(jì)過程的一種直觀的表示。流程圖劃分得越細(xì)致,編寫程序是也越方便。畫流程圖是程序結(jié)構(gòu)設(shè)計(jì)的一種重要手段。一個系統(tǒng)軟件包括總流程圖和局部流程圖。流程圖常采用的圖形和符號:橢圓框或桶形框:表示程序的開始或結(jié)束。矩形框:表示要進(jìn)行的工作。開始結(jié)束稱為:起止框稱為:處理框XX+1YY-1流程圖常采用的圖形和符號:菱形框:表示要判斷的事情,菱形框內(nèi)的表達(dá)式表示要判斷的內(nèi)容。圓圈:表示連接點(diǎn)指向線:表示程序的流向稱為:判斷框F>5?YN四、編寫程序用89C51匯編語言編寫的源程序。程序設(shè)計(jì)步驟流程圖編程的方法和技巧一、模塊化的程序設(shè)計(jì)方法二、編程技巧一、模塊化的程序設(shè)計(jì)方法1、程序功能模塊化的優(yōu)點(diǎn)2、劃分模塊的原則1、程序功能模塊化的優(yōu)點(diǎn)單個模塊結(jié)構(gòu)的程序功能單一,易于編寫、調(diào)試和修改。便于分工,從而可使多個程序員同時進(jìn)行程序的編寫和調(diào)試工作,加快軟件研制進(jìn)度。程序可讀性好,便于功能擴(kuò)充和版本升級。對程序的修改可局部進(jìn)行,其它部分可以保持不變。對使用頻繁的子程序建立子程序庫,便于多模塊調(diào)用。2、劃分模塊的原則每個模塊應(yīng)具有獨(dú)立的功能,能產(chǎn)生一個明確的結(jié)果,即單模塊的功能高內(nèi)聚性。模塊之間的控制耦合應(yīng)盡量簡單,數(shù)據(jù)耦合應(yīng)盡量少,即模塊間的低耦合性??刂岂詈鲜侵改K進(jìn)入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換方式、交換量的多少及交換頻繁程度。模塊長度適中。20條~100條的范圍較合適。二、編程技巧1、盡量采用循環(huán)結(jié)構(gòu)和子程序。2、盡量少用無條件轉(zhuǎn)移指令。3、對于通用的子程序,考慮到其通用性,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其他寄存器的內(nèi)容應(yīng)壓入堆棧(返回前再彈出),即保護(hù)現(xiàn)場。4、在中斷處理程序中,除了要保護(hù)處理程序中用到的寄存器外,還要保護(hù)標(biāo)志寄存器。5、用累加器傳遞入口參數(shù)或返回參數(shù)比較方便,子程序中,一般不必把累加器內(nèi)容壓入堆棧。4.380C51單片機(jī)匯編語言程序設(shè)計(jì)舉例本節(jié)課本上的例題以自學(xué)為主。大部分程序沒用,重點(diǎn)看查表程序。ORG1000HONEDATA30HTWODATA31HMAXDATA32HCLRCMOVA,ONESUBBA,TWO
JZXMAX
JBACC.7,NEG
JBOV,YMAXSJMPXMAX
NEG:JBOV,XMAXYMAX:MOVA,TWO
SJMPRMAX
XMAX:MOVA,ONERMAX:MOVMAX,ASJMP$END[例]ONE和TWO單元中的兩個帶符號數(shù)比較大小,將較大者存入MAX單元中。兩數(shù)相等則任一個存入MAX即可。若X-Y為負(fù),則OV=0,X<Y
OV=1,X>Y若X-Y為正,則OV=0,X>Y
OV=1,X<Y例:內(nèi)部數(shù)據(jù)區(qū)清零ORG0000HZero:movR0,#30HmovR7,#10movA,#00HLoop:mov@R0,AincR0djnzR7,Loopsjmp$END內(nèi)部RAM30HR023H98H0A8H0FDH…00000010個例
將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù)。設(shè)內(nèi)部RAM40H#,41H單元中分別存放著8位二進(jìn)制數(shù),要求取出兩個單元中的低半字節(jié),并成一個字節(jié)后,存入50H單元中。程序如下:START:MOVR1,#40H;設(shè)置R1為數(shù)據(jù)指針MOVA,@R1;取出第一個單元中的內(nèi)容ANLA,#0FH;取第一個數(shù)的低半字節(jié)SWAPA ;移至高半字節(jié)INCR1 ;修改數(shù)據(jù)指針XCHA,@R1 ;取第二個單元中的內(nèi)容ANLA,#0FH;取第二個數(shù)的低半字節(jié)ORLA,@R1;拼字MOV50H,A ;存放結(jié)果RETASCII碼二進(jìn)制ORG0000HAtoH:MOVA,#’A’CLRCSUBBA,#30HCJNEA,#0AH,NEQSJMPBIGNEQ:JCAENDBIG:SUBBA,#07HAEND:SJMP$END
ORG0000HHtoA:MOVA,#0BHADDA,#90HDAAADDCA,#40HDAASJMP$END0BH+90H9BH+66H101H40H+142H
匯編可分成兩種:人工匯編機(jī)器匯編
機(jī)器匯編是用機(jī)器自動把匯編語言源程序翻譯成可以運(yùn)行的目標(biāo)代碼程序,即二進(jìn)制程序的過程,它是一種用機(jī)器來代替人腦的匯編,完成這一匯編過程的軟件稱為“匯編程序”。4.4單片機(jī)匯編語言源程序的編輯和匯編(自學(xué))匯編機(jī)器語言目標(biāo)程序匯編語言源程序匯編程序匯編機(jī)器語言目標(biāo)程序匯編語言源程序人工查指令機(jī)器碼表4.580C51單片機(jī)匯編語言偽指令匯編程序→
軟件→
工具→工具軟件:
將程序員用匯編語言編寫的程序翻譯成機(jī)器碼
(真)指令:告訴計(jì)算機(jī)如何操作以及做何種操作用匯編語言編寫的程序在此被稱為應(yīng)用程序偽指令:告訴匯編程序在翻譯應(yīng)用程序時有何具體約定。偽指令不進(jìn)行具體的操作,那是真指令的事。
比如:從何處開始,何處結(jié)束,某些編程者自己規(guī)定的表述代表什么意思……ORG
addr16——ASM51程序中一定要寫!規(guī)定編譯后的機(jī)器代碼存放的起始位置。END
——ASM51程序中一定要寫!表示翻譯到此結(jié)束,其后的任何內(nèi)容不予理睬。符號名稱EQU
表達(dá)式將表達(dá)式的值賦予符號名稱。程序中凡出現(xiàn)該符號名稱就等同于該表達(dá)式。$
——“當(dāng)前PC值”也叫位置計(jì)數(shù)器
代表正在執(zhí)行的指令所在位置。符號名稱BIT
位地址將位地址的值賦予符號名稱。程序中凡出現(xiàn)該符號名稱就代表該位地址。DW
雙字節(jié)數(shù)據(jù)[或雙字節(jié)數(shù)據(jù)組]將雙字節(jié)數(shù)據(jù)[或雙字節(jié)數(shù)據(jù)組]順序存放在此后的存儲單元中。占據(jù)相應(yīng)存儲空間。DB
8位數(shù)據(jù)[或8位數(shù)據(jù)組]將8位數(shù)據(jù)[或8位數(shù)據(jù)組]順序存放在此后的存儲單元中。占相應(yīng)數(shù)量的存儲空間。匯編起始偽指令格式:ORG<起始地址>功能:指定匯編源程序編譯成機(jī)器語言程序 的起始地址例如:ORG0000HLJMP0100H
ORG0100HStart:MOVA,#5AHSJMP$END程序中可以有多條ORG語句,但定義的起始地址既不要交叉,也不要重疊。必須從小地址向大地址分配程序所占空間。匯編結(jié)束偽指令格式:END[起始地址]功能:停止匯編仍用上例:ORG0000HLJMP0100HORG0100HStart:MOVA,#5AhSJMP$
END
定義字節(jié)偽指令格式:<標(biāo)號:>DB<項(xiàng)或項(xiàng)表>功能:把項(xiàng)或項(xiàng)表的數(shù)值存入從標(biāo)號開始的連續(xù)單元,其中項(xiàng)或項(xiàng)表可以是一個字節(jié)、數(shù)或以引號括起來的字符串。
ORG1000HDat:DB11h,-1,’A’,’BCD’END
該指令只能為程序存儲器賦初值,不能為其他存儲器賦初值,尤其不能為內(nèi)部數(shù)據(jù)存儲器賦初值。注意:1000H11HFFH41H42H程序存儲器43H44H補(bǔ)碼ASCII碼‘’定義字偽指令格式:<標(biāo)號:>DW<項(xiàng)或項(xiàng)表>功能:把項(xiàng)或項(xiàng)表的數(shù)值存入從標(biāo)號開始的連續(xù)單元,其中項(xiàng)或項(xiàng)表是一個字(兩字節(jié))。
ORG1000HDat:DW1122h,3344h,-1END1000H
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025農(nóng)村信用合作社聘用合同樣本
- 二零二五年度國際貨物出口合同范文:非洲新興市場合作項(xiàng)目
- 2025年度公廁工程承包合同書(含社區(qū)共建)3篇
- 二零二五年度公司施工隊(duì)鋼結(jié)構(gòu)工程施工合作協(xié)議3篇
- 二零二五年度全新高空橋梁施工意外事故免責(zé)責(zé)任書3篇
- 二零二五年度智能倉儲物流系統(tǒng)采購合同模板2篇
- 二零二五年度消防隊(duì)伍后勤保障服務(wù)合同3篇
- 2025年度農(nóng)村出租房租賃與農(nóng)村電子商務(wù)運(yùn)營服務(wù)合同
- 2025年度智慧城市建設(shè)項(xiàng)目合同2篇
- 二零二五年度農(nóng)村集體土地房屋產(chǎn)權(quán)轉(zhuǎn)讓合同下載
- 《皮膚病中成藥導(dǎo)引》課件
- 2024-2030年中國除顫儀行業(yè)市場分析報(bào)告
- 廣東省廣州市天河區(qū)2023-2024學(xué)年八年級上學(xué)期期末考試物理試題(含答案)
- 2024年高一上學(xué)期期末數(shù)學(xué)考點(diǎn)《壓軸題》含答案解析
- 成都中醫(yī)藥大學(xué)博士申請
- 太空軍事法律問題-洞察分析
- 招標(biāo)代理崗位職責(zé)規(guī)章制度
- 家校攜手育桃李 齊心合力創(chuàng)輝煌 課件高二上學(xué)期期末家長會
- 二零二四年風(fēng)力發(fā)電項(xiàng)目EPC總承包合同
- 文化傳媒企業(yè)資質(zhì)掛靠合作協(xié)議書
- 眼鏡學(xué)智慧樹知到答案2024年溫州醫(yī)科大學(xué)
評論
0/150
提交評論