版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1
1
80C51的程式設(shè)計
2
4.1
程式編制的方法和技巧
4.1.1程式編制的步驟
一、預(yù)完成任務(wù)的分析首先,要對單片機應(yīng)用系統(tǒng)預(yù)完成的任務(wù)進行深入的分析,明確系統(tǒng)的設(shè)計任務(wù)、功能要求和技術(shù)指標(biāo)。其次,要對系統(tǒng)的硬體資源和工作環(huán)境進行分析。這是單片機應(yīng)用系統(tǒng)程式設(shè)計的基礎(chǔ)和條件。
3
二、進行演算法的優(yōu)化
演算法是解決具體問題的方法。一個應(yīng)用系統(tǒng)經(jīng)過分析、研究和明確規(guī)定後,對應(yīng)實現(xiàn)的功能和技術(shù)指標(biāo)可以利用嚴密的數(shù)學(xué)方法或數(shù)學(xué)模型來描述,從而把一個實際問題轉(zhuǎn)化成由電腦進行處理的問題。同一個問題的演算法可以有多種,結(jié)果也可能不盡相同,所以,應(yīng)對各種演算法進行分析比較,並進行合理的優(yōu)化。比如,用迭代法解微分方程,需要考慮收斂速度的快慢(即在一定的時間裏能否達到精度要求)。而有的問題則受記憶體容量的限制而對時間要求並不苛刻。對於後一種情況,速度不快但節(jié)省記憶體的演算法則應(yīng)是首選。4
三、程式總體設(shè)計及流程圖繪製經(jīng)過任務(wù)分析、演算法優(yōu)化後,就可以進行程式的總體構(gòu)思,確定程式的結(jié)構(gòu)和數(shù)據(jù)形式,並考慮資源的分配和參數(shù)的計算等。然後根據(jù)程式運行的過程,勾畫出程式執(zhí)行的邏輯順序,用圖形符號將總體設(shè)計思路及程式流向繪製在平面圖上,從而使程式的結(jié)構(gòu)關(guān)係直觀明瞭,便於檢查和修改。5
清晰正確的流程圖是編制正確無誤的應(yīng)用程式的基礎(chǔ)和條件。所以,繪製一個好的流程圖,是程式設(shè)計的一項重要內(nèi)容。流程圖可以分為總流程圖和局部流程圖??偭鞒虉D側(cè)重反映程式的邏輯結(jié)構(gòu)和各程式模組之間的相互關(guān)係。局部流程圖反映程式模組的具體實施細節(jié)。對於簡單的應(yīng)用程式,可以不畫流程圖。但是當(dāng)程式較為複雜時,繪製流程圖是一個良好的編程習(xí)慣。6
常用的流程圖符號有:開始和結(jié)束符號、工作任務(wù)符號、判斷分支符號、程式連接符號、程式流向符號等
7
4.1.2編制程式的方法和技巧
一、採用模組化程式設(shè)計方法應(yīng)用系統(tǒng)的程式一般由包含多個模組的主程序和各種副程式組成。各程式模組都要完成一個明確的任務(wù),實現(xiàn)某個具體的功能,如:發(fā)送、接收、延時、列印和顯示等。採用模組化的程式設(shè)計方法,就是將這些不同的具體功能程式進行獨立的設(shè)計和分別調(diào)試,最後將這些模組程式裝配成整體程式並進行聯(lián)調(diào)。模組化的程式設(shè)計方法具有明顯的優(yōu)點。把一個多功能的複雜的程式劃分為若干個簡單的、功能單一的程式模組,有利於程式的設(shè)計和調(diào)試,有利於程式的優(yōu)化和分工,提高了程式的閱讀性和可靠性,使程式的結(jié)構(gòu)層次一目了然。
8
二、儘量採用迴圈結(jié)構(gòu)和副程式採用迴圈結(jié)構(gòu)和副程式可以使程式的長度減少、佔用記憶體空間減少。多重迴圈,注意各重迴圈的初值和迴圈結(jié)束條件,避免出現(xiàn)“死迴圈”現(xiàn)象;通用的副程式,除了用於存放副程式入口參數(shù)的寄存器外,副程式中用到的其他寄存器的內(nèi)容應(yīng)壓入堆疊進行現(xiàn)場保護,並要特別注意堆疊操作的壓入和彈出的平衡;中斷處理副程式除了要保護程式中用到的寄存器外,還應(yīng)保護標(biāo)誌寄存器。9
4.1.3組合語言的語句格式
語句行由四個字段組成:
[標(biāo)號:]操作碼[運算元][;注釋]
括弧內(nèi)的部分可以根據(jù)實際情況取捨。每個字段之間要用分隔符號分隔,可以用作分隔符號的符號有空格、冒號、逗號、分號等。如:LOOP:MOVA,#7FH;A←7FH10
一、標(biāo)號標(biāo)號是語句地址的標(biāo)誌符號,用於引導(dǎo)對該語句的非順序訪問。有關(guān)標(biāo)號的規(guī)定為:標(biāo)號由1~8個ASCII字元組成。第一個字元必須是字母,其餘字元可以是字母、數(shù)字或其他特定字元;不能使用該組合語言已經(jīng)定義了的符號作為標(biāo)號。如指令助記符、寄存器符號名稱等;標(biāo)號後邊必須跟冒號。二、操作碼操作碼用於規(guī)定語句執(zhí)行的操作。它是彙編語句中唯一不能空缺的部分。它由指令助記符表示。
11
三、運算元運算元用於給指令的操作提供數(shù)據(jù)或地址。在一條彙編語句中運算元可能是空缺的,也可能包括一項,還可能包括兩項或三項。各運算元間以逗號分隔。運算元字段的內(nèi)容可能包括以下幾種情況:(1)工作寄存器名;(2)特殊功能寄存器名;(3)標(biāo)號名;(4)常數(shù);(5)符號“$”,表示程式計數(shù)器PC的當(dāng)前值;(6)運算式。12
四、注釋注釋不屬於彙編語句的功能部分,它只是對語句的說明。注釋字段可以增加程式的可讀性,有助於編程人員的閱讀和維護。注釋字段必須以分號“;”開頭,長度不限,當(dāng)一行書寫不下時,可以換行接著書寫,但換行時應(yīng)注意在開頭使用分號“;”。五、數(shù)據(jù)的表示形式80C51組合語言的數(shù)據(jù)可以有以下幾種表示形式:二進位數(shù),末尾以字母B標(biāo)識。如:10001111B;十進位數(shù),末尾以字母D標(biāo)識或?qū)⒆帜窪省略。如:88D,66;十六進制數(shù),末尾以字母H標(biāo)識。如:78H,0A8H(但應(yīng)注意的是,十六進制數(shù)以字母A~F開頭時應(yīng)在其前面加上數(shù)字“0”。);ASCII碼,以單引號括起來標(biāo)識。如:‘AB’,‘1245’
13
4.2根源程式的編輯和彙編
一、根源程式的編輯根源程式的編寫要依據(jù)80C51組合語言的基本規(guī)則,特別要用好常用的彙編命令(即偽指令),例如下麵的程式段:
ORG0040HMOVA,#7FHMOVR1,#44HEND
這裏的ORG和END是兩條偽指令,其作用是告訴組合語言程式此彙編根源程式的起止位置。編輯好的根源程式應(yīng)以“.ASM”擴展名存盤,以備組合語言程式調(diào)用。
4.2.1根源程式的編輯與彙編
14
二、根源程式的彙編
將組合語言根源程式轉(zhuǎn)換為單片機能執(zhí)行的機器碼形式的目標(biāo)程式的過程叫彙編。常用的方法有兩種:手工彙編時,把程式用助記符指令寫出後,通過手工方式查指令編碼表,逐個把助記符指令翻譯成機器碼,然後把得到的機器碼程式(以十六進制形式)鍵入到單片機開發(fā)機中,並進行調(diào)試。機器彙編是在常用的個人電腦PC上,使用交叉組合語言程式將組合語言根源程式轉(zhuǎn)換為機器碼形式的目標(biāo)程式。彙編工作由電腦完成,生成的目標(biāo)程式由PC機傳送到開發(fā)機上,經(jīng)調(diào)試無誤後,再固化到單片機的程式記憶體ROM中。15
根源程式經(jīng)過機器彙編後,形成的若干檔中含有兩個主要檔,一是列表檔,另一個是目標(biāo)碼檔。因彙編軟體的不同,檔的格式及資訊會有一些不同。但主要資訊如下:列表檔主要資訊為:地址目標(biāo)碼組合語言程式
ORG0040H0040H747FMOVA,#7FH0042H7944MOVR1,#44HEND目標(biāo)碼檔主要資訊為:首地址末地址目標(biāo)碼0040H0044H747F794416
偽指令是組合語言程式能夠識別並對彙編過程進行某種控制的彙編命令。它不是單片機執(zhí)行的指令,所以沒有對應(yīng)的可執(zhí)行目標(biāo)碼,彙編後產(chǎn)生的目標(biāo)程式中不會再出現(xiàn)偽指令。一、起始地址設(shè)定偽指令ORG格式為:ORG運算式該指令的功能是向組合語言程式說明下麵緊接的程式段或數(shù)據(jù)段存放的起始地址。運算式通常為16進制地址,也可以是已定義的標(biāo)號地址。
4.2.2偽指令
17
ORG8000HSTART:MOVA,#30H……
此時規(guī)定該段程式的機器碼從地址8000H單元開始存放。在每一個組合語言根源程式的開始,都要設(shè)置一條ORG偽指令來指定該程式在記憶體中存放的起始位置。若省略O(shè)RG偽指令,則該程式段從0000H單元開始存放。在一個根源程式中,可以多次使用ORG偽指令規(guī)定不同程式段或數(shù)據(jù)段存放的起始地址,但要求地址值由小到大依序排列,不允許空間重疊。18
二、彙編結(jié)束偽指令END格式為:END該指令的功能是結(jié)束彙編。組合語言程式遇到END偽指令後即結(jié)束彙編。處於END之後的程式,組合語言程式將不處理。19
三、位元組數(shù)據(jù)定義偽指令DB[標(biāo)號:]DB位元組數(shù)據(jù)表功能是從標(biāo)號指定的地址開始,在ROM中定義位元組數(shù)據(jù)。位元組數(shù)據(jù)表可以是一個或多個位元組數(shù)據(jù)、字串或運算式。該偽指令將位元組數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。一個數(shù)據(jù)占一個存儲單元。例如:DB“howareyou?”把字串中的字元以ASCII碼的形式存放在連續(xù)的ROM單元中。又如:DB-2,-4,-6,8,10,18把6個數(shù)轉(zhuǎn)換為十六進製錶示(FEH,F(xiàn)CH,F(xiàn)AH,08H,0AH,12H),並連續(xù)地存放在6個ROM。
20
該偽指令常用於存放數(shù)據(jù)表格。如要存放顯示用的十六進制的字形碼,可以用多條DB指令完成:
DB0C0H,0F9H,0A4H,0B0HDB99H,92H,82H,0F8HDB80H,90H,88H,83HDBC6H,A1H,86H,84H21
四、字數(shù)據(jù)定義偽指令DW[標(biāo)號:]DW字數(shù)據(jù)表功能是從標(biāo)號指定的地址單元開始,在程式記憶體中定義字數(shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。應(yīng)特別注意:16位的二進位數(shù),高8位存放在低地址單元,低8位存放在高地址單元。例如:
ORG1400HDATA:DW324AH,3CH……
彙編後,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。22
五、空間定義偽指令DS[標(biāo)號:]DS運算式功能是從標(biāo)號指定的地址單元開始,在程式記憶體中保留由運算式所指定的個數(shù)的存儲單元作為備用的空間,並都填以零值。例如:
ORG3000HBUF:DS50……彙編後,從地址3000H開始保留50個存儲單元作為備用單元。
23
六、賦值偽指令EQU符號名EQU運算式功能是將運算式的值或特定的某個彙編符號定義為一個指定的符號名。例如:
LENEQU10SUMEQU21HBLOCKEQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,AEND該程式的功能是,把BLOCK單元開始存放的10個無符號數(shù)進行求和,並將結(jié)果存入SUM單元中。24
七、位地址符號定義偽指令BIT格式為:符號名BIT位地址運算式功能是將位地址賦給指定的符號名。其中,位地址運算式可以是絕對地址,也可以是符號地址。例如:
STBITP1.0將P1.0的位地址賦給符號名ST,在其後的編程中就可以用ST來代替P1.0。25
4.3基本程式結(jié)構(gòu)
4.3.1順序程式順序程式是指無分支、無迴圈結(jié)構(gòu)的程式。其執(zhí)行流程是依指令在記憶體中的存放順序進行的。一、數(shù)據(jù)傳送例內(nèi)部RAM的2AH~2EH單元中存儲的數(shù)據(jù)如圖所示。試編寫程式實現(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。
26
方法一:MOVA,2EH;2位元組,1個機器週期MOV2EH,2DH;3位元組,2個機器週期MOV2DH,2CH;3位元組,2個機器週期MOV2CH,2BH;3位元組,2個機器週期MOV2BH,#00H;3位元組,2個機器週期27
方法二:CLRA;1位元組,1個機器週期XCHA,2BH;2位元組,1個機器週期XCHA,2CH;2位元組,1個機器週期XCHA,2DH;2位元組,1個機器週期XCHA,2EH;2位元組,1個機器週期以上兩種方法均可以實現(xiàn)所要求的傳送任務(wù)。方法一使用14個位元組的指令代碼,執(zhí)行時間為9個機器週期;方法二僅用了9個位元組的代碼,執(zhí)行時間也減少到了5個機器週期。實際應(yīng)用中應(yīng)儘量採用指令代碼位元組數(shù)少、執(zhí)行時間短的高效率程式,即注意程式的優(yōu)化。28
例有一變數(shù)存放在片內(nèi)RAM的20H單元,其取值範(fàn)圍為:00H~05H。要求編制一段程式,根據(jù)變數(shù)值求其平方值,並存入片內(nèi)RAM的21H單元。程式如下:
ORG1000HSTART:MOVDPTR,#2000HMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB00,01,04,09,16,25END。
29
在程式記憶體的一片存儲單元中建立起該變數(shù)的平方表。用數(shù)據(jù)指針DPTR指向平方表的首址,則變數(shù)與數(shù)據(jù)指針之和的地址單元中的內(nèi)容就是變數(shù)的平方值。採樣MOVCA,@A+PC指令也可以實現(xiàn)查表功能,且不破壞DPTR的內(nèi)容,從而可以減少保護DPTR的內(nèi)容所需的開銷。但表格只能存放在MOVCA,@A+PC指令後的256位元組內(nèi),即表格存放的地點和空間有一定限制。
30
三、簡單運算由於80C51指令系統(tǒng)中只有單字節(jié)加法指令,因此對於多位元組的相加運算必須從低位位元組開始分位元組進行。除最低位元組可以使用ADD指令外,其他位元組相加時要把低位元組的進位考慮進去,這時就應(yīng)該使用ADDC指令。例雙位元組無符號數(shù)加法。設(shè)被加數(shù)存放在內(nèi)部RAM的51H、50H單元,加數(shù)存放在內(nèi)部RAM的61H、60H單元,相加的結(jié)果存放在內(nèi)部RAM的51H、50H單元,進位存放在位尋址區(qū)的00H位中。
31
程式段如下:MOVR0,#50H;被加數(shù)的低位元組地址 MOVR1,#60H;加數(shù)的低位元組地址 MOVA,@R0;取被加數(shù)低位元組ADDA,@R1;加上加數(shù)低位元組MOV@R0,A;保存低位元組相加結(jié)果INCR0;指向被加數(shù)高位元組INCR1;指向加數(shù)高位元組MOVA,@R0;取被加數(shù)高位元組ADDCA,@R1;加上加數(shù)高位元組(帶進位加)MOV@R0,A;存高位元組相加結(jié)果MOV00H,C;保存進位。
32
4.3.2分支程式
分支結(jié)構(gòu)可以分成單分支、雙分支和多分支幾種情況:33
一、單分支程式例求雙位元組補數(shù)。設(shè)在內(nèi)部RAM的addr1和addr+1單元存有一個雙位元組數(shù)(高位位元組存於高地址單元)。編寫程式將其讀出取補後再存入addr2和addr2+1單元。首先對低位元組取補,然後判其結(jié)果是否為全“0”。若是,則高位元組取補,否則高位元組取反。
34
START:MOVR0,#addr1;原碼低位元組地址送R0 MOVR1,#addr2;補數(shù)低位元組地址送R1 MOVA,@R0;原碼低位元組送A CPLA;A內(nèi)容取補
INCAMOV@R1,A;存補數(shù)低位元組
INCR0;調(diào)整地址,指向下一單元
INCR1JZZERO;(A)=0時轉(zhuǎn)ZEROMOVA,@R0;原碼高位元組送A CPLAMOV@R1,A;高位元組反碼存入addr2+1單元
SJMPLOOP1ZERO:MOVA,@R0;高位元組取補存入addr2+1單元
CPLAINCAMOV@R1,ALOOP1:RET35
二、雙分支程式例設(shè)變數(shù)x以補數(shù)的形式存放在片內(nèi)RAM的30H單元,變數(shù)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並送回原單元。程式段如下:START:MOVA,30HJZNEXTANLA,#80H;判斷符號位
JZLPMOVA,#05HADDA,30HMOV30H,ASJMPLPNEXT:MOV30H,#20HLP:SJMP$
36
三、多分支程式例根據(jù)R7的內(nèi)容轉(zhuǎn)向相應(yīng)的處理程式。設(shè)R7的內(nèi)容為0~N,對應(yīng)的處理程式的入口地址分別為PP0~PPN。程式段如下:START:MOVDPTR,#TAB;置分支入口地址表首址
MOVA,R7;分支轉(zhuǎn)移序號送AADDA,R7;分支轉(zhuǎn)移序號乘以2MOVR3,A;暫存於R3MOVCA,@A+DPTR;取高位地址
XCHA,R3INCAMOVCA,@A+DPTR;取低位地址
MOVDPL,A;處理程式入口地址低8位送DPLMOVDPH,R3;處理程式入口地址高8位送DPLCLRAJMP@A+DPTRTAB:DWPP0DWPP1………DWPPN
37
4.3.3迴圈程式
按某種控制規(guī)律重複執(zhí)行的程式稱為迴圈程式。迴圈程式有先執(zhí)行後判斷和先判斷後執(zhí)行兩種基本結(jié)構(gòu):
38
一、先執(zhí)行後判斷例50ms延時程式。若晶振頻率為12MHz,則一個機器週期為1μs。執(zhí)行一條DJNZ指令需要2個機器週期,即2μs。採用迴圈計數(shù)法實現(xiàn)延時,迴圈次數(shù)可以通過計算獲得,並選擇先執(zhí)行後判斷的迴圈結(jié)構(gòu)。程式段如下:
DEL:MOVR7,#200;1μs
DEL1:MOVR6,#123;1μs
NOP ;1μs
DEL2:DJNZR6,DEL2;2μs,計(2×123)μs
DJNZR7,DEL1;2μs,
RET
共計[(2×123+2+2)×200+1]μs,即50.001ms
39
例無符號數(shù)排序程式。在片內(nèi)RAM中,起始地址為30H的8個單元中存放有8個無符號數(shù)。試對這些無符號數(shù)進行昇冪排序。數(shù)據(jù)排序常用的方法是冒泡排序法。執(zhí)行時從前向後進行相鄰數(shù)的比較,如數(shù)據(jù)的大小次序與要求的順序不符就將這兩個數(shù)互換,否則不互換。對於昇冪排序,通過這種相鄰數(shù)的互換,使小數(shù)向前移動,大數(shù)向後移動。從前向後進行一次冒泡(相鄰數(shù)的互換),就會把最大的數(shù)換到最後。再進行一次冒泡,就會把次大的數(shù)排在倒數(shù)第二的位置。設(shè)R7為比較次數(shù)計數(shù)器,初始值為07H,位地址00H為數(shù)據(jù)互換標(biāo)誌位。
40
START:CLR00H;互換標(biāo)誌清0 MOVR7,#07H;各次冒泡比較次數(shù)
MOVR0,#30H;數(shù)據(jù)區(qū)首址
LOOP:MOVA,@R0;取前數(shù)
MOV2BH,A;暫存
INCR0MOV2AH,@R0;取後數(shù)
CLRCSUBBA,@R0;前數(shù)減後數(shù)
JCNEXT;前數(shù)小於後數(shù),不互換
MOV@R0,2BHDECR0MOV@R0,2AH;兩數(shù)交換
INCR0;準(zhǔn)備下一次比較
SETB00H;置互換標(biāo)誌
NEXT:DJNZR7,LOOP;進行下一次比較
JB00H,START;進行下一輪冒泡
SJMP$41
二、先判斷後執(zhí)行例將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buffer的存儲區(qū)域內(nèi),直到發(fā)現(xiàn)‘$’字元停止傳送。由於迴圈次數(shù)事先不知道,但迴圈條件可以測試到。所以,採用先判斷後執(zhí)行的結(jié)構(gòu)比較適宜。程式段如下:
MOVR0,#dataMOVDPTR,#bufferLOOP0:MOVA,@R0CJNEA,#24H,LOOP1;判斷是否為‘$’字元
SJMPLOOP2;是‘$’字元,轉(zhuǎn)結(jié)束LOOP1:MOVX@DPTR,A;不是‘$’字元,執(zhí)行傳送
INCR0INCDPTRSJMPLOOP0;傳送下一數(shù)據(jù)
LOOP2:……
42
4.3.4副程式及其調(diào)用
一、副程式的調(diào)用在實際應(yīng)用中,經(jīng)常會遇到一些帶有通用性的問題,例如:數(shù)值轉(zhuǎn)換、數(shù)值計算等,在一個程式中可能要使用多次。這時可以將其設(shè)計成通用的副程式供隨時調(diào)用。副程式的結(jié)構(gòu)與一般的程式並無多大區(qū)別,它的主要特點是,在執(zhí)行過程中需要由其他程式來調(diào)用,執(zhí)行完後又需要把執(zhí)行流程返回到調(diào)用該副程式的主程序。副程式調(diào)用時要注意兩點:一是現(xiàn)場的保護和恢復(fù);二是主程序與副程式的參數(shù)傳遞。43
二、現(xiàn)場保護與恢復(fù)在副程式執(zhí)行過程中常常要用到單片機的一些通用單元,如工作寄存器R0~R7、累加器A、數(shù)據(jù)指針DPTR,以及有關(guān)標(biāo)誌和狀態(tài)等。而這些單元中的內(nèi)容在調(diào)用結(jié)束後的主程序中仍有用,所以需要進行保護,稱為現(xiàn)場保護。在執(zhí)行完副程式,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原內(nèi)容,稱為現(xiàn)場恢復(fù)。保護與恢復(fù)的方法有以下兩種:在主程序中實現(xiàn);在副程式中實現(xiàn)。44
1、在主程序中實現(xiàn)示例如下:
PUSHPSW;保護現(xiàn)場
PUSHACC;
PUSHB;
MOVPSW,#10H;換當(dāng)前工作寄存器組
LCALLaddr16;副程式調(diào)用
POPB;恢復(fù)現(xiàn)場
POPACC;
POPPSW;
……
其特點是結(jié)構(gòu)靈活。45
2、在副程式中實現(xiàn)示例如下:SUB1:PUSHPSW;保護現(xiàn)場
PUSHACC;
PUSHB;
……MOVPSW,#10H;換當(dāng)前工作寄存器組
……POPB;恢復(fù)現(xiàn)場
POPACC;
POPPSW;
RET其特點是程式規(guī)範(fàn)、清晰。注意,無論哪種方法保護與恢復(fù)的順序要對應(yīng)。46
三、參數(shù)傳遞
由於副程式是主程序的一部分,所以,在程式的執(zhí)行時必然要發(fā)生數(shù)據(jù)上的聯(lián)繫。在調(diào)用副程式時,主程序應(yīng)通過某種方式把有關(guān)參數(shù)(即副程式的入口參數(shù))傳給副程式,當(dāng)副程式執(zhí)行完畢後,又需要通過某種方式把有關(guān)參數(shù)(即副程式的出口參數(shù))傳給主程序。在80C51單片機中,傳遞參數(shù)的方法有三種:
1、利用累加器或寄存器在這種方式中,要把預(yù)傳遞的參數(shù)存放在累加器A或工作寄存器R0~R7中。即在主程序調(diào)用副程式時,應(yīng)事先把子程式需要的數(shù)據(jù)送入累加器A或指定的工作寄存器中,當(dāng)副程式執(zhí)行時,可以從指定的單元中取得數(shù)據(jù),執(zhí)行運算。反之,副程式也可以用同樣的方法把結(jié)果傳送給主程序。47
例編寫程式,實現(xiàn)c=a2+b2。設(shè)a,b,c分別存於內(nèi)部RAM的30H,31H,32H三個單元中。程式段如下:START:MOVA,30H;取aACALLSQR;調(diào)用查平方表
MOVR1,A;a2暫存於R1中
MOVA,31H;取bACALLSQR;調(diào)用查平方表
ADDA,R1;a2+b2存於A中
MOV32H,A;存結(jié)果
SJMP$SQR:MOVDPTR,#TAB;副程式
MOVCA,@A+DPTR;
RETTAB:DB0,1,4,9,16,25,36,49,64,81
48
2、利用記憶體當(dāng)傳送的數(shù)據(jù)量比較大時,可以利用記憶體實現(xiàn)參數(shù)的傳遞。在這種方式中,事先要建立一個參數(shù)表,用指針指示參數(shù)表所在的位置。當(dāng)參數(shù)表建立在內(nèi)部RAM時,用R0或R1作參數(shù)表的指針。當(dāng)參數(shù)表建立在外部RAM時,用DPTR作參數(shù)表的指針。
例將R0和R1指向的內(nèi)部RAM中兩個3位元組無符號整數(shù)相加,結(jié)果送到由R0指向的內(nèi)部RAM中。入口時,R0和R1分別指向加數(shù)和被加數(shù)的低位位元組;出口時,R0指向結(jié)果的高位位元組。低位元組在高地址,高位元組在低地址。
49
實現(xiàn)程式:NADD:MOVR7,#3;三位元組加法
CLRC;NADD1:MOVA,@R0;取加數(shù)低位元組
ADDCA,@R1;被加數(shù)低位元組加AMOV@R0,A;
DECR0DECR1DJNZR7,NADD1INCR0RET
50
3、利用堆疊利用堆疊傳遞參數(shù)是在副程式嵌套中常採用的一種方法。在調(diào)用副程式前,用PUSH指令將副程式中所需數(shù)據(jù)壓入堆疊,進入執(zhí)行副程式時,再用POP指令從堆疊中彈出數(shù)據(jù)。
例把內(nèi)部RAM中20H單元中的1個位元組十六進制數(shù)轉(zhuǎn)換為2位ASCII碼,存放在R0指示的兩個單元中。
51
MAIN:MOVA,20H;
SWAPAPUSHACC;參數(shù)入棧
ACALLHEASCPOPACCMOV@R0,A;存高位十六進制數(shù)轉(zhuǎn)換結(jié)果
INCR0;修改指針
PUSH20H;參數(shù)入棧
ACALLHEASCPOPACCMOV@R0,A;存低位十六進制數(shù)轉(zhuǎn)換結(jié)果
SJMP$HEASC:MOVR1,SP;借用R1為堆疊指針
DECR1DECR1;R1指向被轉(zhuǎn)換數(shù)據(jù)
XCHA,@R1;取被轉(zhuǎn)換數(shù)據(jù)
ANLA,#0FH;取一位十六進制數(shù)
ADDA,#2;偏移量調(diào)整,所加值為MOVC與DB間位元組數(shù)
MOVCA,@A+PC;查表
XCHA,@R1;1位元組指令,存結(jié)果於堆疊
RET;1位元組指令A(yù)SCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H
52
一般說來:當(dāng)相互傳遞的數(shù)據(jù)較少時,採用寄存器傳遞方式可以獲得較快的傳遞速度;當(dāng)相互傳遞的數(shù)據(jù)較多時,宜採用記憶體或堆疊方式傳遞;如果是副程式嵌套時,最好是採用堆疊方式。53
4.4常用程式舉例4.4.1算術(shù)運算程式一、多位元組數(shù)的加、減運算
80C51單片機的指令系統(tǒng)提供的是位元組運算指令,所以在處理多位元組數(shù)的加減運算時,要合理地運用進位(借位)標(biāo)誌。例多位元組無符號數(shù)的加法。設(shè)兩個N位元組的無符號數(shù)分別存放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相加後的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。54
MOVR0,#DATA1;
MOVR1,#DATA2;
MOVR7,#N; 置位元組數(shù)
CLRC;LOOP:MOVA,@R0;
ADDCA,@R1;求和
MOV@R1,A;存結(jié)果
INCR0;修改指針
INCR1;
DJNZR7,LOOP;55
二、多位元組數(shù)乘法運算例雙位元組無符號數(shù)的乘法。設(shè)雙位元組的無符號被乘數(shù)存放在R3、R2中,乘數(shù)存放在R5、R4中,R0指向積的高位。
56
例多位元組無符號數(shù)的減法。
設(shè)兩個N位元組的無符號數(shù)分別存放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相減後的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。
MOVR0,#DATA1;
MOVR1,#DATA2;
MOVR7,#N;置位元組數(shù)
CLRC;LOOP:MOVA,@R0;
SUBBA,@R1;求差
MOV@R1,A;存結(jié)果
INCR0;修改指針
INCR1;
DJNZR7,LOOP;57
主程序段如下:MULTB:MOVR7,#04;結(jié)果單元清0LOOP:MOV@R0,#00H;
DJNZR7,LOOP;
DECR0ACALLBMUL;
SJMP$另有2段子程式:
BMULRADD(在BMUL中被調(diào)用)58
先看副程式段:
RADD:ADDA,@R0;
MOV@R0,A;
MOVA,B;
INCR0;
ADDCA,@R0;
MOV@R0,A;
INCR0;
MOVA,@R0;
ADDCA,#00H;加進位
MOV@R0,A;
RET59
BMUL:MOVA,R2;
MOVB,R4;
MULAB;低位乘
ACALLRADD;
MOVA,R2;
MOVB,R5;
MULAB;交叉乘
DECR0;
ACALLRADD;
MOVA,R4;
MOVB,R3;
MULAB;交叉乘
DECR0;
DECR0;
ACALLRADD;
MOVA,R5;
MOVB,R3;
MULAB;高位元組乘
DECR0;
ACALLRADD;
DECR0RET60
一、十六進制數(shù)與ASCII碼間的轉(zhuǎn)換
十六進制數(shù)與ASCII碼的對應(yīng)關(guān)係如表所示。當(dāng)十六進制數(shù)在0~9之間時,其對應(yīng)的ASCII碼值為該十六進制數(shù)加30H;當(dāng)十六進制數(shù)在A~F之間時,其對應(yīng)的ASCII碼值為該十六進制數(shù)加37H。4.4.2碼型轉(zhuǎn)換
61
例將1位十六進制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼。設(shè)十六進制數(shù)存放在R0中,轉(zhuǎn)換後的ASCII碼存放於R2中。實現(xiàn)程式如下:HASC:MOVA,R0;取4位二進位數(shù)
ANLA,#0FH;遮罩掉高4位
PUSHACC;4位二進位數(shù)入棧
CLRC;清進(借)位位
SUBBA,#0AH;用借位位的狀態(tài)判斷該數(shù)在0~9還是A~F之間
POPACC;彈出原4位二進位數(shù)
JCLOOP;借位位為1,跳轉(zhuǎn)至LOOPADDA,#07H;借位位為0,該數(shù)在A~F之間,加37HLOOP:ADDA,#30H;該數(shù)在0~9之間,加30HMOVR2,A;ASCII碼存於R2RET
62
例將多位十六進制數(shù)轉(zhuǎn)換成ASCII碼。設(shè)地址指針R0指向十六進制數(shù)低位,R2中存放位元組數(shù),轉(zhuǎn)換後地址指針R0指向十六進制數(shù)的高位。R1指向要存放的ASCII碼的高位地址。實現(xiàn)程式如下:63
HTASC:MOVA,@R0;取低4位二進位數(shù)
ANLA,#0FH;
ADDA,#15;偏移量修正
MOVCA,@A+PC;查表
MOV@R1,A;存ASCII碼
INCR1;
MOVA,@R0;取十六進制高4位
SWAPAANLA,#0FH;
ADDA,#06H;偏移值修正
MOVCA,@A+PC;
MOV@R1,AINCR0;指向下一單元
INCR1
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國美甲行業(yè)資本規(guī)劃與股權(quán)融資戰(zhàn)略制定與實施研究報告
- 2025-2030年中國社區(qū)養(yǎng)老服務(wù)行業(yè)并購重組擴張戰(zhàn)略制定與實施研究報告
- 2025-2030年中國智能公交行業(yè)并購重組擴張戰(zhàn)略制定與實施研究報告
- 2025-2030年中國旅居康養(yǎng)行業(yè)開拓第二增長曲線戰(zhàn)略制定與實施研究報告
- 2025-2030年中國動態(tài)稱重儀器儀表行業(yè)營銷創(chuàng)新戰(zhàn)略制定與實施研究報告
- 新形勢下乘用車變速器行業(yè)快速做大市場規(guī)模戰(zhàn)略制定與實施研究報告
- 市政道路監(jiān)理質(zhì)量評估報告
- 建設(shè)項目從前期立項到竣工備案所有手續(xù)辦理詳細流程
- 者柯哨安全工作總結(jié)報告
- 建設(shè)監(jiān)理對工程質(zhì)量控制的方法和程序
- 山東省煙臺市2025屆高三上學(xué)期期末學(xué)業(yè)水平診斷政治試卷(含答案)
- 2025北京石景山初二(上)期末數(shù)學(xué)真題試卷(含答案解析)
- 北師大版四年級下冊數(shù)學(xué)課件第1課時 買文具
- 青貯產(chǎn)品銷售合同樣本
- 2024年冷庫倉儲服務(wù)協(xié)議3篇
- 中國轎貨車的車保養(yǎng)項目投資可行性研究報告
- 人工智能在體育訓(xùn)練中的應(yīng)用
- 2024-2030年中國液態(tài)金屬行業(yè)市場分析報告
- 住宅樓智能化系統(tǒng)工程施工組織設(shè)計方案
- 高二上學(xué)期數(shù)學(xué)北師大版(2019)期末模擬測試卷A卷(含解析)
- 2024-2025學(xué)年度第一學(xué)期四年級數(shù)學(xué)寒假作業(yè)
評論
0/150
提交評論