第3章 程序設(shè)計_第1頁
第3章 程序設(shè)計_第2頁
第3章 程序設(shè)計_第3頁
第3章 程序設(shè)計_第4頁
第3章 程序設(shè)計_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章MCS-51單片機(jī)匯編語言程序設(shè)計11111111113.1概述一、機(jī)器語言、匯編語言與高級語言1、機(jī)器語言2、匯編語言3、高級語言二、單片機(jī)程序開發(fā)二((一)開發(fā)過程1、編寫程序(用匯編或C語言)→源程序1)分析認(rèn)為,確定算法或解提思路;2)按功能劃分模塊,確定各模塊之間的相互關(guān)系及參數(shù)傳遞;3)根據(jù)確定算法或解題思路畫出程序流程圖;4)合理分配寄存器存儲單元,編寫程序,并進(jìn)行必要的注釋,以方便閱讀。2、源程序的匯編(編譯)和連接→目標(biāo)程序(機(jī)器語言,兩種文件格式:.BIN和.HEX)3、仿真調(diào)試(有軟件仿真、硬件在線調(diào)試)4、調(diào)試好的目標(biāo)程序?qū)懭雴纹瑱C(jī)、運(yùn)行(二)集成開發(fā)環(huán)境目前很多公司將編輯器、匯編器、編譯器、連接/定位器等程序做成集成軟件包,用戶進(jìn)入該集成環(huán)境,編輯好程序后,只需點擊相應(yīng)菜單就可以完成上述的各步,如WAVE、KEIL。

WAVE集成軟件將在試驗中學(xué)習(xí),見第十三章。連接/定位器L51匯編語言源程序匯編器A51符號轉(zhuǎn)換程序OHS51絕對地址目標(biāo)程序.BINC語言程序浮動地址目標(biāo)程序編譯器C51

·HEX圖3-1兩種語言源程序轉(zhuǎn)換成目標(biāo)程序1.機(jī)器指令:指令系統(tǒng)中的全部指令。每條機(jī)器指令都有對應(yīng)的機(jī)器代碼,可以被CPU執(zhí)行。2.偽指令:匯編控制指令,沒有指令代碼,只用于匯編過程,為匯編程序提供匯編信息。三、匯編語言指令類型3.宏指令 宏匯編功能:將需要反復(fù)多次執(zhí)行的程序段定義成一個宏指令名(宏定義)。編程時,可在程序中使用宏指令名來替代被定義的程序段(宏調(diào)用)。宏定義過程:宏調(diào)用過程: … 宏指令名實際參數(shù) … 宏指令名實際參數(shù)宏指令名MACRO形式參數(shù) … ;被定義的程序段

ENDM四、常用程序結(jié)構(gòu)

1、順序程序;2、分支程序;

3、循環(huán)程序、4、子程序3.2偽指令1.起始指令ORGnn作用:定義程序或數(shù)據(jù)塊的起始地址。指示此語句后面的程序或數(shù)據(jù)塊以nn為起始地址,連續(xù)存放在程序存儲器中。

指令地址機(jī)器碼 源程序

ORG 2000H 2000H7830 MAIN: MOVR0,#30H2002HE6 MOVA,@R0 …

ORG3000H3000H23 TAB:DB23H,100,‘A’3001H643002H412.字節(jié)定義標(biāo)號:DB(字節(jié)常數(shù),或字符或表達(dá)式)作用:指示在程序存儲器中以標(biāo)號為起始地址的單元里存放的數(shù)為字節(jié)數(shù)據(jù)(八位二進(jìn)制數(shù))。例如LN:DB32,’C’,25H,-1;LN~LN+2地址單元依次存放20H,43H,25H,F(xiàn)FH3.字定義標(biāo)號:DW(字常數(shù)或表達(dá)式)作用:指示在程序存儲器中以標(biāo)號為起始地址的單元里存放的數(shù)為字?jǐn)?shù)據(jù)(即16位的二進(jìn)制數(shù)),例如:GH:DW1234H,5678H,085.等值指令標(biāo)號EQU(數(shù)值表達(dá)式)

表示EQU兩邊的量等值,用于為標(biāo)號或標(biāo)識符賦值。

例如:X1 EQU2000H

X2 EQU0FH

MAIN: MOVDPTR,#X1;DPTR=2000H ADDA,#X2;A=A+0FH4.保留字節(jié)標(biāo)號:DS(數(shù)值表達(dá)式)作用:

指示在程序存儲器中保留以標(biāo)號為起始地址的若干字節(jié)單元,其單元個數(shù)由數(shù)值表達(dá)式指定。例如L1:DS32;從L1地址開始保留32個存儲單元。6.位定義

標(biāo)號BIT[位地址]作用:

同EQU指令,不過定義的是位操作地址。例如AICBITP1.1。7.匯編結(jié)束END作用:

指示源程序段結(jié)束。

END指令放在程序的最后。A51匯編程序還有一些其它的偽指令,列在教材表3-1中,以備查閱。

3.3順序程序設(shè)計例3-1編程將外部數(shù)據(jù)存儲器的000EH和000FH單元的內(nèi)容相換。000EH000FH000EH000FH000EH000FH000EH000FH分析:外部數(shù)據(jù)存儲器的數(shù)據(jù)操作只能用MOVX指令,且只能和A之間傳送,因此必須用一個中間環(huán)節(jié)作暫存,設(shè)用20H單元。用R0、R1指示兩單元的低八位地址,高八位地址由P2指示。編程過程如下:000EH000FH000EH000FH000EH000FHORG0000HMOVP2,#00H;送地址高八位至P2口MOVR0,#0EH;R0=0EHMOVR1,#0FH;R1=OFHMOVXA,@R0;A=(000EH)MOV20H,A;(20H)=(000EH)MOVXA,@R1;A=(000FH)MOVX@R0,A;(000FH)→000EHXCHA,20H;A=(000EH),(20H)=(000FH)MOVX@R1,A;(000EH)→000FHSJMP$END例3-3設(shè)變量放在片內(nèi)RAM的20H單元,其值為00H~05H之間,要求編查表程序,查出變量的平方值,并放入片內(nèi)RAM的21H單元。ORG0000HMOVDPTR,#TABMOVA,20HMOVCA,@A+DPTR;查表MOV21H,ASJMP$TAB:DB00H,01H,04H,09H,16H,25HEND分析:在程序存儲器安排一張平方表,首地址為TAB,以DPTR指向表首址,A存放變量值,利用查表指令MOVCA,@A+DPTR,即可求得。表中數(shù)據(jù)用BCD碼存放合乎人們的習(xí)慣.如果平方值為兩個字節(jié),程序應(yīng)如何編。DPTRA例3-4:設(shè)內(nèi)部 RAM的ONE地址單元放著一個8位無符號二進(jìn)制數(shù),要求將它轉(zhuǎn)換為壓縮的BCD碼,將百位放在HUND地址單元,十位和個位放在TEN地址單元。分析:8位無符號二進(jìn)制數(shù)范圍在0-255之間,將此數(shù)除以100,商即為百位,將其余數(shù)除以10,商為十位,余數(shù)則為個位。題目中的標(biāo)號地址,在程序中應(yīng)用偽指令定義為具體地址。程序如下:ORG0000HMOVA,ONEMOVA,#64HDIVABMOVHUND,A;存百位MOVA,#0AHXCHAB;余數(shù)送A,#0AH送BDIVAB;SWAPAADDA,BMOVTEN,ASJMP$ONEEQU20HONEEQU22HONEEQU23HEND

ORG0000HMOVA,R2

JNBACC.7,N;為正數(shù)?

CPLA ;負(fù)數(shù)變補(bǔ)

INCA

MOVR2,AN:SJMP$ ;結(jié)束3.4分支程序設(shè)計

由條件轉(zhuǎn)移指令構(gòu)成程序判斷框部分,形成分支結(jié)構(gòu)一、單分支程序一個判斷決策框,兩種分支結(jié)構(gòu)圖。條件滿足?N影響條件Y處理段條件滿足?N影響條件Y處理1處理2例1求8位有符號數(shù)的絕對值。方法:正數(shù)不變,負(fù)數(shù)變補(bǔ)例3-5,在內(nèi)部RAM的40H和41H地址單元中,有兩個無符號數(shù),試編程比較兩個數(shù)的大小,將大數(shù)存于內(nèi)部RAM的GR單元,小數(shù)存于LE單元,如相等,則分別存于GR1和LE單元。分析:利用CJNE指令,即可判斷兩數(shù)是否相等,還可以通過CY標(biāo)志位判斷大小。程序如下:

ORG0000HMOVA,40HCJNEA,41H,NEQ;兩數(shù)不等轉(zhuǎn)NEGMOVGR,A;兩數(shù)相等,GR,LED單元均存此數(shù)MOVLE,ASJMPEDNEQ:JCLESS;A小轉(zhuǎn)LESSMOVGR,A;A大,大數(shù)存于GRMOVLE,41H;小數(shù)存于LESJMPEDLESS:MOVLE,A;A數(shù)小,小數(shù)存于LEMOVGR,41H;大數(shù)存于GRSJMPED

GREQU30HLEEQU31HED:END

例3-6:設(shè)變量X以補(bǔ)碼的形式放在片內(nèi)RAM的30HD單元,函數(shù)Y于X有如下的關(guān)系:XX>0Y=20HX=0X+5X<0試編制程序,根據(jù)X的取值求Y,并放回源單元。分析:取出變量后進(jìn)行取值范圍的判斷,對符號的判斷可用位操作指令,也可以用邏輯運(yùn)算類指令,本例用邏輯運(yùn)算指令。流程圖如下:ORG0000HMOVA,30HJZNEXT;X=0,轉(zhuǎn)NEXTANLA,#80H;判斷符號位JZED;X>0,轉(zhuǎn)EDMOVA,#05H;X<0,完成+50HADDA,30HMOV30H,ASJMPEDNEXT:MOV30H,#20H;X=0,Y=20HED:END二、多分支散轉(zhuǎn)程序的設(shè)計

有一類分支程序,它根據(jù)不同的輸入條件或不同的運(yùn)算結(jié)果,轉(zhuǎn)向不同的處理程序,稱之為散轉(zhuǎn)程序。這類程序通常利用JMP@A+DPTR間接轉(zhuǎn)移指令實現(xiàn)轉(zhuǎn)移。有如下兩種設(shè)計方法:(1).查轉(zhuǎn)移地址表:將轉(zhuǎn)移地址列成表格,將表格的內(nèi)容作轉(zhuǎn)移的目標(biāo)地址。(2).查轉(zhuǎn)移指令表:

將轉(zhuǎn)移到不同程序的轉(zhuǎn)移指令列成表格,判斷條件后查表,轉(zhuǎn)到表中指令執(zhí)行,下面用兩個例子說明。1.利用轉(zhuǎn)移地址表實現(xiàn)轉(zhuǎn)移

例3-7根據(jù)R3的內(nèi)容轉(zhuǎn)向?qū)?yīng)的程序,R3的內(nèi)容為0~n,處理程序的入口符號地址分別為PR0~PRn(n<128)。分析:將PR0—PRn入口地址列在表格中,每一項占兩個單元,PRn在表中的偏移量為2n,因此將R3的內(nèi)容乘2即得PRn在表中的偏移地址,從偏移地址2n和2n+1兩個單元分別取出PRn的高八位地址和低八位地址送DPTR寄存器,用JMP@A+DPTR指令(A先清零)即轉(zhuǎn)移到PRn入口執(zhí)行。這里設(shè)PR0-PRn地址PR0

EQU0110H;用偽指令定義PRn的具體地址PR1EQU0220H

PR2EQU0330HORG0000HMOVA,R3;R3→AADDA,ACC;A*2MOVDPTR,#TABPUSHACCMOVCA,@A+DPTR;取地址表中高字節(jié)MOVB,A;暫存于BINCDPLPOPACCMOVCA,@A+DPTR;取地址表中低字節(jié)MOVDPL,AMOVDPH,B;DPTR為表中地址CLRA;A=0JMP@A+DPTR;轉(zhuǎn)移TAB:DWPR0,PR1,PR2,…..,PRn;轉(zhuǎn)移地址表ENDTABTAB+2DPHDPL例如R3=1的操作02202.利用轉(zhuǎn)移指令表實現(xiàn)轉(zhuǎn)移

例3-8設(shè)有五個按鍵0、1、2、3、4其編碼分別為3AH、47H、65H、70H、8BH,要求根據(jù)按下的鍵轉(zhuǎn)向不同的處理程序,分別為PR0、PR1、PR2、PR3、PR4,設(shè)按鍵的編碼已在B寄存器中,編出程序。分析:將鍵碼排成表,將鍵碼表中的值和B中的鍵編碼比對,記下在鍵碼表中和B中的鍵編碼相等的序號,另安排一個轉(zhuǎn)移表,安排AJMP指令(機(jī)器碼),因每條AJMP指令占二字節(jié),將剛才記下的序號乘2即為轉(zhuǎn)移表的偏移地址,利用JMP@A+DPTR執(zhí)行表內(nèi)的AJMP指令,從而實現(xiàn)多分支轉(zhuǎn)移,設(shè)JPT的地址為001AH、PR0入口地址為0110H、,參考2.4.2節(jié),求AJMPPR0的機(jī)器碼0000000100010000001000010000(2110h)a10a9a8a7a6a5a4a3a2a1a0AJMPPR0的機(jī)器碼為2110H,PR1入口地址為0220HAJMPPR1的機(jī)器碼為4120H,轉(zhuǎn)移指令表JPT的內(nèi)容如下所示。設(shè)B=65H,鍵值為2:3061JPT+42041JPT+21021JPTAJMPPR0AJMPPR1AJMPPR2轉(zhuǎn)移指令表JPT鍵碼表TAB65HA2B2×AA=1A=2A=065H65HORG0000HMOVDPTR,#TAB;置鍵碼表首址MOVA,#0;表的起始位的偏移量為0NEXT:PUSHACCMOVCA,@A+DPTR;A=鍵碼表的編碼CJNEA,B,AGAN;將B中值和鍵碼表的值比較POPACCRLA;如相等,序號乘2得分支表內(nèi)偏移量MOVDPTR,#JPT;置分支表首址JMP@A+DPTRAGAN:POPACC;不相等比較下一個INCA;序號加1CJNEA,#5,NEXTSJMP$;鍵碼查完還沒有B中按鍵編碼程序結(jié)束JPT:AJMPPR0;分支轉(zhuǎn)移表AJMPPR1AJMPPR2AJMPPR3AJMPPR4TAB:DB3AH,47H,65H,70H,8BH;鍵碼表END3.5循環(huán)程序設(shè)計當(dāng)程序中的某些指令需要反復(fù)執(zhí)行多次時,采用循環(huán)程序的方式,這樣會使程序縮短,節(jié)省存儲單元(并不節(jié)省執(zhí)行時間)。循環(huán)次數(shù)的控制,有兩種控制方式:第一種方法先判斷再處理,即先判斷滿不滿足循環(huán)條件,如不滿足,就不循環(huán),多以循環(huán)條件控制。第二種方法先處理再判斷,即循環(huán)執(zhí)行一遍后,下一輪還需不需要進(jìn)行,多以計循環(huán)次數(shù)控制。

循環(huán)可以有單重循環(huán)和多重循環(huán),在多重循環(huán)中,內(nèi)外循環(huán)不能交叉,也不允許外循環(huán)跳入內(nèi)循環(huán)。下面通過幾個實例說明循環(huán)程序的設(shè)計方法。例3-9設(shè)計一個延時10ms的延時子程序,已知單片機(jī)使用的晶振為6MHz。分析延時時間與兩個因素有關(guān):晶振頻率和循環(huán)次數(shù)。由于晶振采用6MHz,一個機(jī)器周期是2μs,用單循環(huán)可以實現(xiàn)1ms延時,外循環(huán)10次即可達(dá)10ms延時。內(nèi)循環(huán)如何實現(xiàn)1ms延時呢,程序中可先以未知數(shù)MT代替,從附錄A查每條指令機(jī)器周期計算程序的執(zhí)行時間。

ORG0020HMOVR0,#0AH;外循環(huán)10次DL2:MOVR1,#MT;內(nèi)循環(huán)MT次DL1:NOPNOP;空操作指令DJNZR1,DL1DJNZR0,DL2

RET111122內(nèi)循環(huán)DL1到指令DJNZR1,DL1的計算:(1+1+2)×2μS×MT=1000μSMT=125=7DH將7DH代入上面程序的MT,計算總的延時時間:{1+[1+(1+1+2)×125+2]×10}×2μS=10062μS=10.062mS若需要延時更長時間,可以采用多重循環(huán)。機(jī)器周期數(shù)內(nèi)外例3-10編寫多字節(jié)數(shù)×10程序。

內(nèi)部RAM以20H為首址的一片單元中存放著一個多字節(jié)符號數(shù),字節(jié)數(shù)存放在R7中,存放方式為低位字節(jié)在低地址,高位字節(jié)在高地址,要求乘10后的積仍存放在這一片單元中。

分析用R1作該多字節(jié)的

地址指針,部分積的低位仍

存放于本單元,部分積的高

位存放于R2,以便和下一

位的部分積的低位相加。

以R7作字節(jié)數(shù)計數(shù)。

編程如下:

345

H0A

H32

H28

H2B2H1E

H20B2HORG0000HCLRC;清進(jìn)位位CMOVR1,#20H;R1指示地址MOVR2,#00H;存積的高八位寄存器R2清0S10:MOVA,@R1;取一字節(jié)送AMOVB,#0AH;10送BPUSHPSWMULAB;字節(jié)乘10POPPSWADDCA,R2;上次積高八位加本次積低八位MOV@R1,A;送原存儲單元MOVR2,B;積的高八位送R2INCR1;指向下一字節(jié)DJNZR7,S10;未乘完去SH10,否則向下執(zhí)行MOV@R1,B;存最高字節(jié)積的高位SJMP$3.6位操作程序設(shè)計MCS-51單片機(jī)有著優(yōu)異的位邏輯功能,可以方便的實現(xiàn)各種復(fù)雜的邏輯運(yùn)算.這種用軟件替代硬件的方法,可以大大簡化甚至完全不用硬件,但比硬件要多花運(yùn)算時間。例3-14編寫一程序,以實現(xiàn)圖3-7中的邏輯運(yùn)算電路.其中P1.1和P2.2分別是端口線上的信息,TF0和IE1分別是定時器定時溢出標(biāo)志和外部中請求標(biāo)志,25H和26H分別是兩個位地址,運(yùn)算結(jié)果由端口線P1.3輸出。.圖3-4硬件邏輯運(yùn)算電路程序如下:START:MOVC,P2.2ORLC,TF0ANLC,P1.1MOVF0,C;C暫存F0(B寄存器0位)MOVC,IE1ORLC,/25HANLC,F0ANLC,/26HMOVP1.3,CSJMP$例3-15設(shè)累加器A的各位ACC.0~ACC.7分別記為X0~X7,編制程序用軟件實現(xiàn)下式:

Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7X0BITACC.0X1BITACC.1X2BITACC.2X3BITACC.3X4BITACC.4X5BITACC.5X6BITACC.6X7BITACC.7ORG0000HMOVC,X0ANLC,X1ANLC,X2MOV00H,C;X0X1X2→00HMOVC,X0ANLC,/X1MOV01H,C;X0X1→01HANLC,/X2ORLC,00HMOV00H,C;X0X1X2+X0X1X2→00H

MOVC,X2ANLC,01H

ANLC,X3;X0X1X2X3ORLC,/00HMOV00H,C;X0X1X2+X0X1X2+X0X1X2X3→00HMOVC,X7ANLC,/X6ANLC,/X5ANLC,/X4;X4X5X6X7ORLC,00H;最終結(jié)果Y→CSJMP$主程序→調(diào)用子程序的程序;子程序調(diào)用→進(jìn)入子程序的操作;子程序返回→子程序運(yùn)行結(jié)束又回到主程序的操作;主程序與子程序是相對的;3.7

子程序

1.子程序→將某些重復(fù)的或經(jīng)常要使用的程序段設(shè)計成可供反復(fù)調(diào)用的獨立程序段。子程序是構(gòu)成單片機(jī)應(yīng)用程序必不可少的部分。程序X程序Y程序Z調(diào)用子程序Y調(diào)用子程序Z調(diào)用調(diào)用返回回返

子程序的調(diào)用與返回,是使用專用的調(diào)用指令A(yù)CALL和LCALL和返回指令RET來實現(xiàn)的2.主程序與子程序間的轉(zhuǎn)返參數(shù)→主﹑子程序互相傳遞的信息(可以是信息本身或信息的地址),分兩類:

入口參數(shù)→主程序提供給子程序以便加工處理的信息→原始數(shù)據(jù).

出口參數(shù)→經(jīng)子程序加工處理后送回給主程序的信息→處理結(jié)果.傳遞方式→為了傳遞參數(shù),約定一種主子雙方都能接受的參數(shù)傳遞方式:3.主程序與子程序間的參數(shù)傳遞在調(diào)用子程序時,有以下幾點應(yīng)注意:1)保護(hù)現(xiàn)場。如果在調(diào)用前主程序已經(jīng)使用了某些存儲單元或寄存器,在調(diào)用時,這些寄存器和存儲單元又有其他用途,就應(yīng)先把這些單元或寄存器中的內(nèi)容壓入堆棧保護(hù),調(diào)用完后再從堆棧中彈出以便加以恢復(fù)。如果有較多的寄存器要保護(hù),應(yīng)使主、子程序使用不同的寄存器組。2)設(shè)置入口參數(shù)和出口參數(shù)。調(diào)用之前主程序要按子程序的要求設(shè)置好地址單元或存儲器(稱為入口參數(shù)),以便子程序從指定的地址單元或存儲器獲得輸入數(shù)據(jù);子程序經(jīng)運(yùn)算或處理后的結(jié)果存放到指定的地址單元或寄存器(稱為出口參數(shù)),主程序調(diào)用后從指定的地址單元或寄存器讀取運(yùn)算或處理后的結(jié)果,只有這樣,才能完成子程序和主程序間的數(shù)據(jù)的正確傳遞。3)子程序中可包括對另外子程序的調(diào)用,稱為子程序嵌套。例3-16用程序?qū)崿F(xiàn)c=a2+b2,設(shè)a,b均小于10。a存放在31H單元,b存放在32H單元,把c存入34H和33H單元。(和要求為BCD碼)。解:因該算式兩次用到平方值,所以在程序中采用把求平方編為子程序的方法。求平方采用查表法,主程序和子程序編寫如下:主程序:

ORG0000HMOVSP,#3FHMOVA,31H;取aLCALLSQR;求a方MOVR1,AMOVA,32H;取bLCALLSQR;求b方ADDA,R1;求和DAA;調(diào)整MOV33H,AMOVA,#0ADDCA,#0MOV34H,ASJMP$子程序:

ORG0030HSQR:INCAMOVCA,@A+PCRETTAB:DB00H,01H,04H

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論