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

下載本文檔

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

文檔簡介

會計學(xué)1程序設(shè)計概要支持寫入單片機(jī)或仿真調(diào)試的目標(biāo)程序有兩種文件格式:

·BIN文件和·HEX文件

·BIN文件是由編譯器生成的二進(jìn)制文件,是程序的機(jī)器碼,

·HEX文件是由INTER公司定義的一種格式,這種格式包括地址、數(shù)據(jù)和校驗碼,并用ASCII碼來存儲,可供顯示和打印?!EX文件需通過符號轉(zhuǎn)換程序OHS51進(jìn)行轉(zhuǎn)換兩種語言的操作過程見圖3-1。第1頁/共54頁連接/定位器L51匯編語言源程序匯編器A51符號轉(zhuǎn)換程序OHS51絕對地址目標(biāo)程序

.BINC語言程序浮動地址目標(biāo)程序編譯器C51

·HEX圖3-1兩種語言源程序轉(zhuǎn)換成目標(biāo)程序第2頁/共54頁

目前很多公司將編輯器、匯編器、編譯器、連接/定位器、符號轉(zhuǎn)換程序做成集成軟件包,用戶進(jìn)入該集成環(huán)境,編輯好程序后,只需點擊相應(yīng)菜單就可以完成上述的各步,如WAVE、KEIL,WAVE集成軟件的使用見附錄。匯編:將匯編語言源程序轉(zhuǎn)換成機(jī)器語言目標(biāo)程序的過程稱為匯編。匯編程序:能將匯編語言源程序轉(zhuǎn)換成機(jī)器語言目標(biāo)程序的系統(tǒng)軟件稱為匯編程序。第3頁/共54頁匯編的方法:匯編的方法有兩種1.手工匯編:人工查指令表,查出程序中每條指令對應(yīng)的機(jī)器代碼。早期的計算機(jī)使用。2.機(jī)器匯編:用計算機(jī)中的匯編程序?qū)τ脩粼闯绦蜻M(jìn)行匯編。用機(jī)器匯編要提供給匯編一些信息,遵循匯編程序的一些約定。這些由偽指令指定。第4頁/共54頁3)提供錯誤信息 4)提供目標(biāo)執(zhí)行文件(*.OBJ/*.HEX)和列表文件(*.LST)

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

ORG2000H 2000H7830 MAIN: MOVR0,#30H2002HE6 MOVA,@R0

匯編的主要任務(wù)1)確定程序中每條匯編語言指令的指令機(jī)器碼2)確定每條指令在存儲器中的存放地址第5頁/共54頁1.機(jī)器指令:指令系統(tǒng)中的全部指令。每條機(jī)器指令都有對應(yīng)的機(jī)器代碼,可以被CPU執(zhí)行。2.偽指令:匯編控制指令,沒有指令代碼,只用于匯編過程,為匯編程序提供匯編信息。一.匯編語言指令類型3.宏指令

宏匯編功能:將需要反復(fù)多次執(zhí)行的程序段定義成一個宏指令名(宏定義)。編程時,可在程序中使用宏指令名來替代被定義的程序段(宏調(diào)用)。第6頁/共54頁宏定義過程宏調(diào)用過程:

宏指令名實際參數(shù)

宏指令名實際參數(shù)宏指令名

MACRO

形式參數(shù)

;被定義的程序段

ENDM第7頁/共54頁二.偽指令常用偽指令及功能1.起始指令ORGnn功能:定義程序或數(shù)據(jù)塊的起始地址。指示此語句后面的程序或數(shù)據(jù)塊以nn為起始地址,連續(xù)存放在程序存儲器中。指令地址機(jī)器碼 源程序

ORG2000H 2000H7830 MAIN: MOVR0,#30H2002HE6 MOVA,@R0

ORG3000H3000H23 TAB:DB23H,100,‘A’3001H643002H41第8頁/共54頁2.字節(jié)定義標(biāo)號:DB(字節(jié)常數(shù),或字符或表達(dá)式)功能:指示在程序存儲器中以標(biāo)號為起始地址的單元里存放的數(shù)為字節(jié)數(shù)據(jù)(八位二進(jìn)制數(shù))。例如LN:DB32,‘C’,25H,-1LN~LN+3地址單元依次存放20H,43H,25H,F(xiàn)FH地址

數(shù)據(jù)LN20LN+143LN+225LN+3FF3.字定義標(biāo)號:DW(字常數(shù)或表達(dá)式)作用:指示在程序存儲器中以標(biāo)號為起始地址的單元里存放的數(shù)為字?jǐn)?shù)據(jù)(即16位的二進(jìn)制數(shù)),例如:GH:DW1234H,5678H,08GH1234GH+25678GH+40008第9頁/共54頁

5.等值指令標(biāo)號EQU(數(shù)值表達(dá)式)

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

例如:X1EQU2000H

X2EQU0FH

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個存儲單元。第10頁/共54頁6.位定義標(biāo)號BIT[位地址]作用:同EQU指令,不過定義的是位操作地址。例如AICBITP1.1。7.匯編結(jié)束END作用:指示源程序段結(jié)束。

END指令放在程序的最后。A51匯編程序還有一些其它的偽指令,列在教材表3-1中,以備查閱。第11頁/共54頁3-2匯編語言程序設(shè)計步驟一.確定方案和計算方法二.了解應(yīng)用系統(tǒng)的硬件配置、性能指標(biāo)三.建立系統(tǒng)數(shù)學(xué)模型,確定控制算法和操作步驟四.合理分配存儲器單元和了解I/O接口地址五.編制源程序1.按功能設(shè)計程序,明確各程序之間的相互關(guān)系2.用流程圖表示程序結(jié)構(gòu)和功能3.程序中用注釋說明指令在程序中的作用,方便閱讀、調(diào)試和修改第12頁/共54頁順序程序設(shè)計例3-1編程將外部數(shù)據(jù)存儲器的000EH和000FH單元的內(nèi)容相換。常用程序結(jié)構(gòu)

順序程序、分支程序

循環(huán)程序、子程序000EH000FH000EH000FH000EH000FH000EH000FH分析:外部數(shù)據(jù)存儲器的數(shù)據(jù)操作只能用MOVX指令,且只能和A之間傳送,因此必須用一個中間環(huán)節(jié)作暫存,設(shè)用20H單元。用R0、R1指示兩單元的低八位地址,高八位地址由P2指示。編程過程如下:000EH000FH000EH000FH000EH000FH第13頁/共54頁ORG0000HMOVP2,#00H;送地址高八位至P2口

MOVR0,#0EH;R0=0EHMOVR1,#0FH;R1=OFHMOVXA,@R0;A=(000EH)MOV20H,A;(20H)=(000EH)MOVXA,@R1;A=(000FH)XCHA,20H;A=(000EH),(20H)=(000FH)MOVX@R1,AMOVA,20HMOVX@R0,A;交換后的數(shù)送各單元

SJMP$END第14頁/共54頁3-3順序程序順序程序(簡單程序),程序走向只有一條路徑例3-2:將R4R5雙字節(jié)符號數(shù)求補碼程序。ORG0000H

MOVA,R4JBACC.7,CPLL;判符號位

SJMP$;正數(shù)的補碼=原碼CPLL:MOVA,R5;取低字節(jié)

CPLA ADDA,#1;低字節(jié)變補

MOVR5,A MOVA,R4;取高字節(jié)

CPLA ADDCA,#0;高字節(jié)變補

ORLA,#80H;恢復(fù)負(fù)號

MOVR4,ASJMP$第15頁/共54頁地址數(shù)據(jù)TAB0TAB+11TAB+24TAB+39TAB+416TAB+525例3-5設(shè)變量放在片內(nèi)RAM的20H單元,其值為00H-05H之間,要求編查表程序,查出變量的平方值,并放入片內(nèi)RAM的21H單元。ORG0000HMOVDPTR,#TABMOVA,20HMOVCA,@A+DPTR;查表

MOV21H,ASJMP$TAB:DB0,1,4,9,16,25END分析:在程序存儲器安排一張平方表,首地址為TAB,以DPTR指向表首址,A存放變量值,利用查表指令MOVCA,@A+DPTR,即可求得表中數(shù)據(jù)用BCD碼存放合乎人們的習(xí)慣.如果平方值為兩個字節(jié),程序應(yīng)如何編。DPTRA第16頁/共54頁

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

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

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

由條件轉(zhuǎn)移指令構(gòu)成程序判斷框部分,形成分支結(jié)構(gòu)3.4.1單分支程序一個判斷決策框,兩種分支結(jié)構(gòu)圖。條件滿足?N影響條件Y處理1處理2例1求8位有符號數(shù)的絕對值。方法:正數(shù)不變,負(fù)數(shù)變補條件滿足?N影響條件Y處理段第17頁/共54頁

例2用單片機(jī)加重力傳感器作磅秤,稱出重量后算出行李運費價格,其稱出的重量以10kg為1個計價單位G,G已存入40H單元。最終運費存放在41H單元。計價方法

為50kg以內(nèi)按3元/G,50kg以上

計價:總重按3元/G,,超過50kg

部分加收2元。

由此列出算式:G×3+(G-5)×2;當(dāng)G>5M=G×3;當(dāng)G≤53G因重復(fù)使用,先暫存在R2。流程見左,程序如下:第18頁/共54頁ORG0100HFRT:MOVA,40H ;取行李重量計價單位G MOVR3,A MOVB,#03H ;運費M=G×3 MULAB MOVR2,A ;暫存3GMOVA,R3 ;取回G CJNEA,#05H,L1 ;G≠5? SJMPWETC L1:JCWETC ;小于5,轉(zhuǎn)至WETC SUBBA,#05H ;否則M=3G+2(G-5)

RLCA ADDA,R2 MOVR2,AWETC:MOV41H,R2 ;存運費M RET第19頁/共54頁

多分支散轉(zhuǎn)程序的設(shè)計

有一類分支程序,它根據(jù)不同的輸入條件或不同的運算結(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í)行,下面用兩個例子說明。第20頁/共54頁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

PR2EQU0330H第21頁/共54頁ORG0000HMOVA,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)移地址表END01100220..TABTAB+2DPHDPL例如R3=1的操作0220第22頁/共54頁2.利用轉(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)移,第23頁/共54頁AJMPPR0的機(jī)器碼為2110H,PR0入口地址為0110HAJMPPR1的機(jī)器碼為4120H,PR1入口地址為0220H,轉(zhuǎn)移指令表JPT的內(nèi)容如下所示。設(shè)B=65H,鍵值為2:3061JPT+42041JPT+21021JPT+0AJMPPR0AJMPPR1AJMPPR2TAB+03AHTAB+147HTAB+265HTAB+370HTAB+48BH轉(zhuǎn)移指令表JPT鍵碼表TAB65HB2×AA=1A=2A=065H65H第24頁/共54頁ORG0000HMOVDPTR,#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;鍵碼表

END第25頁/共54頁

當(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.5循環(huán)程序設(shè)計第26頁/共54頁例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í)行時間。

第27頁/共54頁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)外第28頁/共54頁例3-10編寫多字節(jié)數(shù)×10程序。

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

分析:用R1作該多字節(jié)的地址指針,部分積的低位仍存放于本單元,部分積的高位存放于R2,以便和下一單元的部分積的低位相加。以R7作字節(jié)數(shù)計數(shù)。

編程如下:第29頁/共54頁ORG0000HCLRC;清進(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$第30頁/共54頁例3-11把片內(nèi)RAM中地址30H-39H中的10個無符號數(shù)逐一比較,并按從小到大的順序排列這片單元中

分析:為了把10個單元中的數(shù)從小到大排列,可從30H單元開始,兩數(shù)逐次比較,保存小數(shù)取出大數(shù),且只要有地址單元內(nèi)容互換就置位標(biāo)志。多次循環(huán)后,若兩數(shù)比較不再出現(xiàn)單元互換的情況,就說明從30H-39H單元中的數(shù)已全部從小到大排列完畢。第31頁/共54頁例如1223650989比較大小不交換(0)12236509191223650919交換(1)1223096519不交換(0)交換(1)12236509191223091965最大交換(1)不交換(0)12230919651209231965交換(1)1209192365不交換(標(biāo)志位不變)交換(1)12230919651209192365最大12091923650912192365091219236509121923650912192365第32頁/共54頁第33頁/共54頁ORG0000HSTART:CLR00HDECR0CLRCXCHA,@R0MOVR7,#09HINCR0MOVR0,#30HNEXT:MOVA,@R0MOVA,@R0DJNZR7,LOOPLOOP:INCR0JB00H,STARTMOVR2,ASJMP$SUBBA,@R0MOVA,R2JCNEXTSETB00HXCHA,@R0第34頁/共54頁例3-12編寫多字節(jié)BCD碼減法程序分析:由于MCS-51指令系統(tǒng)中只有十進(jìn)制加法調(diào)整指令DAA,而無減法調(diào)整指令。為了用十進(jìn)制加法調(diào)整指令對十進(jìn)制減法進(jìn)行調(diào)整,必須用補數(shù)相加的辦法,用9AH減去減數(shù)即可得到以100為模的減數(shù)的補數(shù)。由此得多字節(jié)十進(jìn)制BCD碼減法程序。被減數(shù)的字節(jié)地址用R1表示,減數(shù)地址用R0指示,字節(jié)數(shù)用R2指示。差(補數(shù))的地址仍用R0指示,差的字節(jié)數(shù)放在R3。用07H位作結(jié)果的符號標(biāo)志,“0”為正,“1”為負(fù)。

1)9AH=99H+1(模100)2)減化為加補數(shù)

3)CY求反SUBCD:MOVR3,#00H;差字節(jié)數(shù)置0CLR07H;符號位清0CLRC;借位位清0第35頁/共54頁SUBCD1:MOVA,#9AH;減數(shù)對100求補數(shù)

SUBBA,@R0ADDA,@R1;補數(shù)相加

DAA;十進(jìn)制加調(diào)整

MOV@R0,A;存結(jié)果

INCR0;地址值增1INCR1INCR3;差字節(jié)數(shù)增1CPLC;進(jìn)位求反,以形成正確借位

DJNZR2,SUBCD1

;未減完去SUBCD1,減完向下執(zhí)行

JNCSUBCD2;無借位去SUBCD2返回,否則繼續(xù)

SETB07H;有借位,置“1”符號位SUBCD2:SJMP$第36頁/共54頁

程序中,減數(shù)求補后與被減數(shù)相加,方可利用DAA指令進(jìn)行調(diào)整,若二者相加調(diào)整后結(jié)果無進(jìn)位C=0,實際上表示二者相減有借位;若二者相加調(diào)整后有進(jìn)位C=1,實際上表示二者相減無借位。為正確反映其借位情況,必須對其進(jìn)位標(biāo)志位C進(jìn)行求反操作,舉例說明。例

求BCD碼8943H-7649H=?對低字節(jié)運算:100110109A-)010010014901010001得49對100補數(shù)51+)01000011加43,低字節(jié)和為9410010100進(jìn)位為0,即借位C=10第37頁/共54頁

高位字節(jié)減數(shù)變補與被減數(shù)相加有進(jìn)位,實際上表示兩者相減無借位,為正確反映借位情況應(yīng)對進(jìn)位標(biāo)志求反,使C=0(減法時C=1,表示有借位,C=0,表示無借位)。最后運算結(jié)果差為1294H,且無借位,計算準(zhǔn)確。對高字節(jié)運算:

100110109A-)01110110760010010076對100的補數(shù)為24-)00000001減去借位位C=100100011得減數(shù)減1后的值為23+)10001001加被減數(shù)8910101100+)01100110對結(jié)果加66修正

00010010

高位結(jié)果為12,最后結(jié)果1294,借位C=01第38頁/共54頁例3-13

將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)。在計算機(jī)中,碼制的變換是經(jīng)常要進(jìn)行的,而變換的算法都差不多,在匯編語言中都曾涉及過,在此,我們僅以十進(jìn)制變換為二進(jìn)制為例,說明怎樣用單片機(jī)的指令進(jìn)行編程。一個n位的十進(jìn)制數(shù)Dn、Dn-1、…、D0可表示為

(···((Dn10+Dn-1)10+Dn-2)10+···)+D0

例如9345=[(910+3)10+4]10+5

根據(jù)上述算法,現(xiàn)將一個4位的十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)舉例如下。設(shè)4位BCD碼9345依次存放在內(nèi)部RAM中40H~43H單元的低4位,高4位為0(稱為非壓縮BCD碼)。要求轉(zhuǎn)換后的二進(jìn)制數(shù)存R2R3中。第39頁/共54頁ORG0000HDCB:MOVR0,#40H;R0指向千位地址

MOVR1,#03;計數(shù)值—>R1MOVR2,#0;存放結(jié)果的高位清零

MOVA,@R0;BCD碼千位數(shù)—>AMOVR3,ALOOP:MOVA,R3MOVB,#10MULABMOVR3,A;R3*10低8位—>R3MOVA,BXCHA,R2;R3*10高8位暫存R2MOVB,#10MULABADDA,R2;R2*10+(R3*10)高8位第40頁/共54頁MOVR2,AINCR0;取下一個BCD數(shù)MOVA,R3ADDA,@R0MOVR3,AMOVA,R2ADDCA,#0;加低字節(jié)來的進(jìn)位MOVR2,ADJNZR1,LOOPSJMP$END第41頁/共54頁

MCS-51單片機(jī)有著優(yōu)異的位邏輯功能,可以方便的實現(xiàn)各種復(fù)雜的邏輯運算.這種用軟件替代硬件的方法,可以大大簡化甚至完全不用硬件,但比硬件要多花運算時間。例3-17編寫一程序,以實現(xiàn)圖3-7中的邏輯運算電路.3.6位操作程序設(shè)計第42頁/共54頁

其中P1.1和P2.2分別是端口線上的信息,TF0和IE1分別是定時器定時溢出標(biāo)志和外部中請求標(biāo)志,25H和26H分別是兩個位地址,運算結(jié)果由端口線P1.3輸出。.圖3-4硬件邏輯運算電路第43頁/共54頁程序如下:START:MOVC,P2.2ORLC,TF0ANLC,P1.1MOVF0,CMOVC,IE1ORLC,/25HANLC,F0ANLC,/26HMOVP1.3,CSJMP$第44頁/共54頁例3-18設(shè)累加器A的各位ACC.0~ACC.7分別記為X0~X7,編制程序用軟件實現(xiàn)下式:

Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7X0BITACC.0X1BITACC.1X2BITACC.2X3BITACC.3X4BITACC.4X5BITACC.5X6BITACC.6X7BITACC.7第45頁/共54頁ORG0000HMOVC,X0ANLC,X1ANLC,X2MOV00H,C;X0X1X2MOVC,X0ANLC,/X1MOV01H,C;X0X1ANLC,/X2ORLC,00HMOV00H,CMOVC,X2ANLC,01HANLC,X3;X0X1X2X3ORLC,/00HMOV00H,CMOVC,X7ANLC,/X6ANLC,/X5ANLC,/X4;X4X5X6X7ORLC,00H;最終結(jié)果

Y→CSJMP$第46頁/共54頁

子程序是構(gòu)成單片機(jī)應(yīng)用程序必不可少的部分,通過ACALL和LCALL兩條子程序調(diào)用指令,可以十分方便地用來調(diào)用任何地址處的子程序。子程序節(jié)省占用的存儲單元,使程序簡短清晰,善于靈活的使用子程序,是程序設(shè)計的重要技巧之一。子程序必須以RET指令結(jié)尾.

在調(diào)用子程序時,有以下幾點應(yīng)注意:3.7子程序

當(dāng)一段程序需多次應(yīng)用,或為多人應(yīng)用時,這段程序編為子程序.第47頁/共54頁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ù)。用之前主程序要按子程序的要求設(shè)置好地址單元或存儲器(稱為入口參數(shù)),以便子程序從指定的地址單元或存儲器獲得輸入數(shù)據(jù);子程序經(jīng)運算或處理后的結(jié)果存放到指定的地址單元或寄存器(稱為出口參數(shù)),主程序調(diào)用后從指定的地址單元或寄存器讀取運算或處理后的結(jié)果,只有這樣,才能完成子程序和主程序間的數(shù)據(jù)的正確傳遞。3)子程序中可包括對另外子程序的調(diào)用,稱為子程序嵌套。第48頁/共54頁例3-16

用程序?qū)崿F(xiàn)c=a2+b2,設(shè)a,b均小于10。a存放在31H單元,b存放在32H單元,把c存入34H和33H單元。(和要求為BCD碼)。解:因該算式兩次用到平方值,所以在程序中采用把求平方編為子程序的方法。求平方采用查表法,主程序和子程序編寫如下:第49頁/共54頁主程序:ORG0000HMOVSP,#3FHMOVA,31H;取aLCALLSQR;求a方MOVR1,A

溫馨提示

  • 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

提交評論