版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、14.1 程序編制的方法和技巧程序編制的方法和技巧.2本章分為四節(jié),主要介紹:本章分為四節(jié),主要介紹:4.3 基本程序結(jié)構(gòu)基本程序結(jié)構(gòu).264.2 源程序的編輯和匯編源程序的編輯和匯編.13 4.4 常用程序舉例常用程序舉例.5524.1 程序編制的方法和技巧程序編制的方法和技巧 4.1.14.1.1程序編制的步驟程序編制的步驟一、任務(wù)分析一、任務(wù)分析 首先,要對單片機應(yīng)用系統(tǒng)要完成的任首先,要對單片機應(yīng)用系統(tǒng)要完成的任務(wù)進(jìn)行深入的分析,明確系統(tǒng)的務(wù)進(jìn)行深入的分析,明確系統(tǒng)的設(shè)計任務(wù)、設(shè)計任務(wù)、功能要求和技術(shù)指標(biāo)。功能要求和技術(shù)指標(biāo)。其次,要對系統(tǒng)的其次,要對系統(tǒng)的硬件資源硬件資源和和工作環(huán)境
2、工作環(huán)境進(jìn)行分析。這是單片進(jìn)行分析。這是單片機應(yīng)用系統(tǒng)程序設(shè)計的基礎(chǔ)和條件。機應(yīng)用系統(tǒng)程序設(shè)計的基礎(chǔ)和條件。3二、進(jìn)行算法的優(yōu)化二、進(jìn)行算法的優(yōu)化 算法是解決具體問題的方法算法是解決具體問題的方法。應(yīng)用系統(tǒng)經(jīng)過分。應(yīng)用系統(tǒng)經(jīng)過分析、研究和明確規(guī)定后,對應(yīng)實現(xiàn)的功能和技術(shù)指析、研究和明確規(guī)定后,對應(yīng)實現(xiàn)的功能和技術(shù)指標(biāo)可以利用嚴(yán)密的數(shù)學(xué)方法或數(shù)學(xué)模型來描述,從標(biāo)可以利用嚴(yán)密的數(shù)學(xué)方法或數(shù)學(xué)模型來描述,從而把實際問題轉(zhuǎn)化成由計算機進(jìn)行處理的問題。而把實際問題轉(zhuǎn)化成由計算機進(jìn)行處理的問題。 同一個問題的算法可以有多種,結(jié)果也可能不同一個問題的算法可以有多種,結(jié)果也可能不盡相同,所以,應(yīng)對各種算法進(jìn)行
3、分析比較,并進(jìn)盡相同,所以,應(yīng)對各種算法進(jìn)行分析比較,并進(jìn)行合理的優(yōu)化。行合理的優(yōu)化。比如,用迭代法解微分方程,需要比如,用迭代法解微分方程,需要考慮收斂速度的快慢(即在一定的時間里能否達(dá)到考慮收斂速度的快慢(即在一定的時間里能否達(dá)到精度要求)。而有的問題則受內(nèi)存容量的限制而對精度要求)。而有的問題則受內(nèi)存容量的限制而對時間要求并不苛刻。對于后一種情況,速度不快但時間要求并不苛刻。對于后一種情況,速度不快但節(jié)省內(nèi)存的算法則應(yīng)是首選。節(jié)省內(nèi)存的算法則應(yīng)是首選。4三、程序總體設(shè)計及流程圖繪制三、程序總體設(shè)計及流程圖繪制 經(jīng)過任務(wù)分析、算法優(yōu)化后,就可以進(jìn)經(jīng)過任務(wù)分析、算法優(yōu)化后,就可以進(jìn)行程序的行
4、程序的總體構(gòu)思總體構(gòu)思,確定,確定程序的結(jié)構(gòu)程序的結(jié)構(gòu)和和數(shù)數(shù)據(jù)形式,據(jù)形式,并考慮并考慮資源的分配資源的分配和和參數(shù)的計算參數(shù)的計算等。然后根據(jù)程序運行的過程,勾畫出等。然后根據(jù)程序運行的過程,勾畫出程程序執(zhí)行的邏輯順序,用圖形符號將總體設(shè)序執(zhí)行的邏輯順序,用圖形符號將總體設(shè)計思路及程序流向繪制在平面圖上計思路及程序流向繪制在平面圖上,從而,從而使程序的結(jié)構(gòu)關(guān)系直觀明了,便于檢查和使程序的結(jié)構(gòu)關(guān)系直觀明了,便于檢查和修改。修改。5清晰正確的流程圖是編制正確無誤的應(yīng)用程清晰正確的流程圖是編制正確無誤的應(yīng)用程序的基礎(chǔ)和條件。所以,繪制一個好的流程序的基礎(chǔ)和條件。所以,繪制一個好的流程圖,是程序設(shè)
5、計的一項重要內(nèi)容。圖,是程序設(shè)計的一項重要內(nèi)容。流程圖可以分為流程圖可以分為總流程圖總流程圖和和局部流程圖局部流程圖??偭鞒虉D側(cè)重反映程序的邏輯結(jié)構(gòu)和各程序總流程圖側(cè)重反映程序的邏輯結(jié)構(gòu)和各程序模塊之間的相互關(guān)系。局部流程圖反映程序模塊之間的相互關(guān)系。局部流程圖反映程序模塊的具體實施細(xì)節(jié)。對于簡單的應(yīng)用程序,模塊的具體實施細(xì)節(jié)。對于簡單的應(yīng)用程序,可以不畫流程圖??梢圆划嬃鞒虉D。但是當(dāng)程序較為復(fù)雜時,但是當(dāng)程序較為復(fù)雜時,繪制流程圖是一個良好的編程習(xí)慣。繪制流程圖是一個良好的編程習(xí)慣。6常用的流程圖符號有:開始和結(jié)束符號、工常用的流程圖符號有:開始和結(jié)束符號、工作任務(wù)符號、判斷分支符號、程序連
6、接符號、作任務(wù)符號、判斷分支符號、程序連接符號、程序流向符號等程序流向符號等 74.1.2 4.1.2 編制程序的方法和技巧編制程序的方法和技巧一、采用模塊化程序設(shè)計方法一、采用模塊化程序設(shè)計方法 應(yīng)用系統(tǒng)的程序由包含多個模塊的主程序和各種應(yīng)用系統(tǒng)的程序由包含多個模塊的主程序和各種子程序組成。子程序組成。各程序模塊都要完成一個明確的任務(wù),各程序模塊都要完成一個明確的任務(wù),實現(xiàn)某個具體的功能,如:數(shù)據(jù)采集、數(shù)據(jù)處理、實現(xiàn)某個具體的功能,如:數(shù)據(jù)采集、數(shù)據(jù)處理、發(fā)送、接收、延時、打印和顯示等。發(fā)送、接收、延時、打印和顯示等。 模塊化的程序設(shè)計方法模塊化的程序設(shè)計方法具有明顯的優(yōu)點。把一個具有明顯的
7、優(yōu)點。把一個多功能的復(fù)雜的程序劃分為若干個簡單的、功能單多功能的復(fù)雜的程序劃分為若干個簡單的、功能單一的程序模塊,有利于程序的設(shè)計和調(diào)試,有利于一的程序模塊,有利于程序的設(shè)計和調(diào)試,有利于程序的優(yōu)化和分工,提高了程序的閱讀性和可靠性,程序的優(yōu)化和分工,提高了程序的閱讀性和可靠性,使程序的結(jié)構(gòu)層次一目了然。使程序的結(jié)構(gòu)層次一目了然。8二、盡量采用循環(huán)結(jié)構(gòu)和子程序二、盡量采用循環(huán)結(jié)構(gòu)和子程序 采用循環(huán)結(jié)構(gòu)和子程序可以使程序的長度采用循環(huán)結(jié)構(gòu)和子程序可以使程序的長度減少、占用內(nèi)存空間減少。減少、占用內(nèi)存空間減少。 多重循環(huán)多重循環(huán),注意各重循環(huán)的初值和循環(huán)結(jié)束條件,注意各重循環(huán)的初值和循環(huán)結(jié)束條件,
8、避免出現(xiàn)避免出現(xiàn) “死循環(huán)死循環(huán)”現(xiàn)象;現(xiàn)象; 通用的子程序通用的子程序,除了用于存放子程序入口參數(shù)的,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其它寄存器的內(nèi)容應(yīng)寄存器外,子程序中用到的其它寄存器的內(nèi)容應(yīng)壓入堆棧進(jìn)行現(xiàn)場保護(hù),并要特別注意堆棧操作壓入堆棧進(jìn)行現(xiàn)場保護(hù),并要特別注意堆棧操作的壓入和彈出的平衡;的壓入和彈出的平衡; 中斷處理子程序中斷處理子程序除了要保護(hù)程序中用到的除了要保護(hù)程序中用到的寄存器外,還應(yīng)保護(hù)標(biāo)志寄存器。寄存器外,還應(yīng)保護(hù)標(biāo)志寄存器。94.1.3 4.1.3 匯編語言的語句格式匯編語言的語句格式語句行由四個字段組成語句行由四個字段組成 : 標(biāo)號:標(biāo)號: 操作
9、碼操作碼 操作數(shù)操作數(shù) ;注釋;注釋 括號內(nèi)的部分可以根據(jù)實際情況取舍。每個括號內(nèi)的部分可以根據(jù)實際情況取舍。每個字段之間要用分隔符分隔,可以用作分隔符的字段之間要用分隔符分隔,可以用作分隔符的符號有空格、冒號、逗號、分號等。符號有空格、冒號、逗號、分號等。如:如:LOOPLOOP:MOV AMOV A,# 7FH # 7FH ;A7FHA7FH10一、標(biāo)號一、標(biāo)號 標(biāo)號標(biāo)號是語句地址的標(biāo)志符號是語句地址的標(biāo)志符號,用于引導(dǎo)對該語句的,用于引導(dǎo)對該語句的非順序訪問。非順序訪問。有關(guān)標(biāo)號的規(guī)定有關(guān)標(biāo)號的規(guī)定為:為:二、操作碼二、操作碼 操作碼用于操作碼用于規(guī)定語句執(zhí)行的操作規(guī)定語句執(zhí)行的操作。它
10、是匯編語句中。它是匯編語句中唯一不能空缺的部分。它由指令助記符表示。唯一不能空缺的部分。它由指令助記符表示。 由由18個個ASCII字符組成。字符組成。第一個字符必須是字母第一個字符必須是字母,其余字符可以是字母、數(shù)字或其他特定字符;其余字符可以是字母、數(shù)字或其他特定字符; 不能使用已經(jīng)定義了的符號作為標(biāo)號。如指令助記不能使用已經(jīng)定義了的符號作為標(biāo)號。如指令助記符、寄存器符號名稱等;符、寄存器符號名稱等;后邊必須跟冒號。后邊必須跟冒號。11三、操作數(shù)三、操作數(shù) 操作數(shù)用于給指令的操作操作數(shù)用于給指令的操作提供數(shù)據(jù)提供數(shù)據(jù)或或地址地址。在一。在一條匯編語句中操作數(shù)可能是空缺的,也可能包括一條匯編
11、語句中操作數(shù)可能是空缺的,也可能包括一項,還可能包括兩項或三項。各操作數(shù)間以逗號分項,還可能包括兩項或三項。各操作數(shù)間以逗號分隔。操作數(shù)字段的內(nèi)容可能包括以下幾種情況:隔。操作數(shù)字段的內(nèi)容可能包括以下幾種情況:(1)工作寄存器名;)工作寄存器名;(2)特殊功能寄存器名;)特殊功能寄存器名;(3)標(biāo)號名;)標(biāo)號名;(4)常數(shù);)常數(shù);(5)符號)符號“$”,表示程序計數(shù)器,表示程序計數(shù)器PC的當(dāng)前值;的當(dāng)前值;(6)表達(dá)式。)表達(dá)式。12四、注釋四、注釋 注釋只是對語句的說明注釋只是對語句的說明。注釋字段可以增加程序的。注釋字段可以增加程序的可讀性,有助于編程人員的閱讀和維護(hù)。注釋字段必可讀性,
12、有助于編程人員的閱讀和維護(hù)。注釋字段必須以分號須以分號“;”開頭,長度不限,當(dāng)一行書寫不下時,開頭,長度不限,當(dāng)一行書寫不下時,可以換行接著書寫,但換行時應(yīng)注意要在開頭使用分可以換行接著書寫,但換行時應(yīng)注意要在開頭使用分號號“;”。五、數(shù)據(jù)的表示形式五、數(shù)據(jù)的表示形式數(shù)據(jù)數(shù)據(jù)可以有以下幾種表示形式:可以有以下幾種表示形式: 二進(jìn)制數(shù),末尾以字母二進(jìn)制數(shù),末尾以字母 B 標(biāo)識。如:標(biāo)識。如:1000 1111B; 十進(jìn)制數(shù),末尾以字母十進(jìn)制數(shù),末尾以字母 D 標(biāo)識或?qū)⒆帜笜?biāo)識或?qū)⒆帜窪省略。如:省略。如:88D,66; 十六進(jìn)制數(shù),末尾以字母十六進(jìn)制數(shù),末尾以字母 H 標(biāo)識。如:標(biāo)識。如:78H
13、,0A8H(但應(yīng)注意的(但應(yīng)注意的是,十六進(jìn)制數(shù)以字母是,十六進(jìn)制數(shù)以字母AF開頭時應(yīng)在其前面加上數(shù)字開頭時應(yīng)在其前面加上數(shù)字“0”。);。);ASCII碼碼,以單引號括起來標(biāo)識。如:,以單引號括起來標(biāo)識。如:AB,1245 134.2 源程序的編輯和匯編源程序的編輯和匯編 一、源程序的編輯一、源程序的編輯 源程序的編寫要依據(jù)源程序的編寫要依據(jù)80C51匯編語言的基本規(guī)則,匯編語言的基本規(guī)則,特別要用好常用的匯編命令(即偽指令),例如下特別要用好常用的匯編命令(即偽指令),例如下面的程序段:面的程序段: ORG 0040H MOV A,#7FH MOV R1,#44H END 這里的這里的OR
14、G和和END是兩條偽指令,其作用是告訴是兩條偽指令,其作用是告訴匯編程序此匯編源程序的起止位置。編輯好的源程匯編程序此匯編源程序的起止位置。編輯好的源程序應(yīng)以序應(yīng)以“ . ASM”擴展名存盤,以備匯編程序調(diào)用。擴展名存盤,以備匯編程序調(diào)用。 4.2.1 4.2.1 源程序的編輯與匯編源程序的編輯與匯編14二、源程序的匯編二、源程序的匯編 將匯編語言源程序轉(zhuǎn)換為單片機能執(zhí)行的機器碼將匯編語言源程序轉(zhuǎn)換為單片機能執(zhí)行的機器碼形式的目標(biāo)程序的過程叫匯編形式的目標(biāo)程序的過程叫匯編。常用的方法有兩種:。常用的方法有兩種:手工匯編手工匯編時,把程序用助記符指令寫出后,通過手時,把程序用助記符指令寫出后,通
15、過手工方式查指令編碼表,逐個把助記符指令翻譯成機器工方式查指令編碼表,逐個把助記符指令翻譯成機器碼,然后把得到的機器碼程序(以十六進(jìn)制形式)鍵碼,然后把得到的機器碼程序(以十六進(jìn)制形式)鍵入到單片機開發(fā)機中,并進(jìn)行調(diào)試。入到單片機開發(fā)機中,并進(jìn)行調(diào)試。機器匯編機器匯編是在常用的個人計算機是在常用的個人計算機PC上,使用交叉匯上,使用交叉匯編程序?qū)R編語言源程序轉(zhuǎn)換為機器碼形式的目標(biāo)程編程序?qū)R編語言源程序轉(zhuǎn)換為機器碼形式的目標(biāo)程序。生成的目標(biāo)程序由序。生成的目標(biāo)程序由PC機傳送到開發(fā)機上,經(jīng)調(diào)機傳送到開發(fā)機上,經(jīng)調(diào)試無誤后,再固化到單片機的程序存儲器試無誤后,再固化到單片機的程序存儲器ROM中
16、。中。15 源程序經(jīng)過機器匯編后,形成的若干文件源程序經(jīng)過機器匯編后,形成的若干文件中含有兩個主要文件,中含有兩個主要文件,一是列表文件一是列表文件,另一個另一個是目標(biāo)碼文件是目標(biāo)碼文件。因匯編軟件的不同,文件的格。因匯編軟件的不同,文件的格式及信息會有一些不同。但主要信息如下:式及信息會有一些不同。但主要信息如下:列表文件:列表文件:地地 址址 目標(biāo)碼目標(biāo)碼 匯編程序匯編程序 ORG 0040H0040H 747F MOV A,#7FH0042H 7944 MOV R1,#44H END目標(biāo)碼文件:目標(biāo)碼文件:首地址首地址 末地址末地址 目標(biāo)碼目標(biāo)碼0040H 0044H 747F79441
17、6 偽指令偽指令是匯編程序能夠識別并對匯編過程進(jìn)行是匯編程序能夠識別并對匯編過程進(jìn)行某種控制的匯編命令。它不是單片機執(zhí)行的指令,某種控制的匯編命令。它不是單片機執(zhí)行的指令,所以沒有對應(yīng)的可執(zhí)行目標(biāo)碼,匯編后產(chǎn)生的目所以沒有對應(yīng)的可執(zhí)行目標(biāo)碼,匯編后產(chǎn)生的目標(biāo)程序中不會再出現(xiàn)偽指令。標(biāo)程序中不會再出現(xiàn)偽指令。4.2.2 4.2.2 偽指令偽指令一、起始地址設(shè)定偽指令一、起始地址設(shè)定偽指令 ORG格式為:格式為: ORG 表達(dá)式表達(dá)式 該指令的該指令的功能功能是向匯編程序說明下面緊接的程是向匯編程序說明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。表達(dá)式通常為序段或數(shù)據(jù)段存放的起始地址。表達(dá)式通常為16
18、進(jìn)制地址,也可以是已定義的標(biāo)號地址。進(jìn)制地址,也可以是已定義的標(biāo)號地址。 17 ORG 8000HSTART:MOV A,#30H 此時規(guī)定該段程序的機器碼從地址此時規(guī)定該段程序的機器碼從地址8000H單元單元開始存放。開始存放。 在每一個匯編語言源程序的開始,在每一個匯編語言源程序的開始,都要設(shè)置一條都要設(shè)置一條ORG偽指令來指定該程序在存儲器中存放的起始位偽指令來指定該程序在存儲器中存放的起始位置。置。若省略若省略O(shè)RG偽指令,則該程序段從偽指令,則該程序段從0000H單元單元開始存放。在一個源程序中,開始存放。在一個源程序中,可以多次使用可以多次使用ORG偽偽指令規(guī)定不同程序段或數(shù)據(jù)段存
19、放的起始地址,但指令規(guī)定不同程序段或數(shù)據(jù)段存放的起始地址,但要求地址值由小到大依序排列要求地址值由小到大依序排列,不允許空間重疊。,不允許空間重疊。18二、匯編結(jié)束偽指令二、匯編結(jié)束偽指令 END格式為:格式為: END 該指令的該指令的功能功能是結(jié)束匯編。是結(jié)束匯編。 匯編程序遇到匯編程序遇到END偽指令后即結(jié)束匯編。偽指令后即結(jié)束匯編。處于處于END之后的程序,匯編程序?qū)⒉惶幚?。之后的程序,匯編程序?qū)⒉惶幚怼?9三、字節(jié)數(shù)據(jù)定義偽指令三、字節(jié)數(shù)據(jù)定義偽指令 DB 標(biāo)號:標(biāo)號: DB 字節(jié)數(shù)據(jù)表字節(jié)數(shù)據(jù)表 功能功能是從標(biāo)號指定的地址開始,在是從標(biāo)號指定的地址開始,在ROM中定義中定義字節(jié)數(shù)據(jù)
20、。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從字節(jié)數(shù)據(jù)。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。一個左到右的順序依次存放在指定的存儲單元中。一個數(shù)據(jù)占一個存儲單元。例如:數(shù)據(jù)占一個存儲單元。例如:DB “how are you?”把字符串中的字符以把字符串中的字符以ASCII碼的形式存放在連續(xù)的碼的形式存放在連續(xù)的ROM單元中。又如:單元中。又如:DB -2,-4,-6,8,10,18把把6個數(shù)轉(zhuǎn)換為十六進(jìn)制表示(個數(shù)轉(zhuǎn)換為十六進(jìn)制表示(FEH,F(xiàn)CH,F(xiàn)AH,08H,0AH,12H),并連續(xù)地存放在),并連續(xù)地存放在6個個ROM。 20 該偽指令常用于存放數(shù)據(jù)表格。如
21、要存放該偽指令常用于存放數(shù)據(jù)表格。如要存放顯示用的十六進(jìn)制的字形碼,可以用多條顯示用的十六進(jìn)制的字形碼,可以用多條DB指令完成:指令完成: DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H DB C6H,A1H,86H,84H21四、字?jǐn)?shù)據(jù)定義偽指令四、字?jǐn)?shù)據(jù)定義偽指令 DW 標(biāo)號:標(biāo)號: DW 字?jǐn)?shù)據(jù)表字?jǐn)?shù)據(jù)表 功能功能是從標(biāo)號指定的地址單元開始,在程序存儲是從標(biāo)號指定的地址單元開始,在程序存儲器中定義字?jǐn)?shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根器中定義字?jǐn)?shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單
22、元中。據(jù)從左到右的順序依次存放在指定的存儲單元中。應(yīng)特別注意:應(yīng)特別注意:16位的二進(jìn)制數(shù),高位的二進(jìn)制數(shù),高8位存放在低地址位存放在低地址單元,低單元,低8位存放在高地址單元。例如:位存放在高地址單元。例如: ORG 1400HDATA:DW 324AH,3CH 匯編后,(匯編后,(1400H)=32H,(,(1401H)= 4AH,(1402H)=00H,(,(1403H)=3CH。22五、空間定義偽指令五、空間定義偽指令 DS 標(biāo)號:標(biāo)號: DS 表達(dá)式表達(dá)式 功能功能是從標(biāo)號指定的地址單元開始,在程序存儲是從標(biāo)號指定的地址單元開始,在程序存儲器中保留由表達(dá)式所指定的個數(shù)的存儲單元作為備
23、器中保留由表達(dá)式所指定的個數(shù)的存儲單元作為備用的空間,并都填以零值。例如:用的空間,并都填以零值。例如: ORG 3000HBUF:DS 50 匯編后,從地址匯編后,從地址3000H開始保留開始保留50個存儲個存儲單元作為備用單元單元作為備用單元。 23六、賦值偽指令六、賦值偽指令 EQU符號名符號名 EQU 表達(dá)式表達(dá)式 功能功能是將表達(dá)式的值或特定的某個匯是將表達(dá)式的值或特定的某個匯編符號定義為一個指定的符號名。例如:編符號定義為一個指定的符號名。例如: 24LEN EQU 10SUM EQU 21HBLOCK EQU 22H CLR A MOV R7,LEN MOV R0,BLOCKLO
24、OP:ADD A,R0 INC R0 DJNZ R7,LOOP MOV SUM,A END 該程序的功能是,把BLOCK單元開始存放的10個無符號數(shù)進(jìn)行求和,并將結(jié)果存入SUM單元中。25七、位地址符號定義偽指令七、位地址符號定義偽指令 BIT格式為:格式為:符號名符號名 BIT 位地址表達(dá)式位地址表達(dá)式 功能功能是將位地址賦給指定的符號名。其中,是將位地址賦給指定的符號名。其中,位地址表達(dá)式可以是絕對地址,也可以是符號位地址表達(dá)式可以是絕對地址,也可以是符號地址。地址。例如:例如: ST BIT P1.0將將P1.0的位地址賦給符號名的位地址賦給符號名ST,在其后的編,在其后的編程中就可以用
25、程中就可以用ST來代替來代替P1.0。264.3 基本程序結(jié)構(gòu)基本程序結(jié)構(gòu) 4.3.1 順序程序順序程序 順序程序是指無分支、無循環(huán)結(jié)構(gòu)的程序。其執(zhí)行流程是順序程序是指無分支、無循環(huán)結(jié)構(gòu)的程序。其執(zhí)行流程是依指令在存儲器中的存放順序進(jìn)行的。依指令在存儲器中的存放順序進(jìn)行的。一、數(shù)據(jù)傳送一、數(shù)據(jù)傳送 例例 內(nèi)部內(nèi)部RAM的的2AH2EH單元中存儲的數(shù)據(jù)如圖所示。單元中存儲的數(shù)據(jù)如圖所示。試編寫程序?qū)崿F(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。試編寫程序?qū)崿F(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。27方法一:方法一:MOV A,2EH ;2字節(jié),字節(jié),1個機器周期個機器周期MOV 2EH,2DH ;3字節(jié),字節(jié),2個機器周期個機器周期MO
26、V 2DH,2CH ;3字節(jié),字節(jié),2個機器周期個機器周期MOV 2CH,2BH ;3字節(jié),字節(jié),2個機器周期個機器周期MOV 2BH,#00H ;3字節(jié),字節(jié),2個機器周期個機器周期28方法二:方法二:CLR A ;1字節(jié),字節(jié),1個機器周期個機器周期XCH A,2BH ;2字節(jié),字節(jié),1個機器周期個機器周期XCH A,2CH ;2字節(jié),字節(jié),1個機器周期個機器周期XCH A,2DH ;2字節(jié),字節(jié),1個機器周期個機器周期XCH A,2EH ;2字節(jié),字節(jié),1個機器周期個機器周期 以上兩種方法均可以實現(xiàn)所要求的傳送任務(wù)。以上兩種方法均可以實現(xiàn)所要求的傳送任務(wù)。方法一使用方法一使用14個字節(jié)的
27、指令代碼,執(zhí)行時間為個字節(jié)的指令代碼,執(zhí)行時間為9個機個機器周期;方法二僅用了器周期;方法二僅用了9個字節(jié)的代碼,執(zhí)行時間也個字節(jié)的代碼,執(zhí)行時間也減少到了減少到了5個機器周期。實際應(yīng)用中應(yīng)盡量采用指令個機器周期。實際應(yīng)用中應(yīng)盡量采用指令代碼字節(jié)數(shù)少、執(zhí)行時間短的高效率程序,即代碼字節(jié)數(shù)少、執(zhí)行時間短的高效率程序,即注意注意程序的優(yōu)化程序的優(yōu)化。29 例例 有一變量存放在片內(nèi)有一變量存放在片內(nèi)RAM的的20H單元,其取值范圍為:單元,其取值范圍為:00H05H。要求編制一段查表程序,根據(jù)。要求編制一段查表程序,根據(jù)變量值求其平方值,并存入片內(nèi)變量值求其平方值,并存入片內(nèi)RAM的的21H單元。程
28、序如下:單元。程序如下: ORG 1000HSTART:MOV DPTR,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A SJMP $ ORG 2000HTABLE:DB 00,01,04,09,16,25 END #2000H DPTR(20H) A(A+DPTR) AA 21H開始結(jié)束30在程序存儲器的一片存儲單元中建立起該變在程序存儲器的一片存儲單元中建立起該變量的平方表。用數(shù)據(jù)指針量的平方表。用數(shù)據(jù)指針DPTR指向平方表的指向平方表的首址,則變量與數(shù)據(jù)指針之和的地址單元中首址,則變量與數(shù)據(jù)指針之和的地址單元中的內(nèi)容就是變量的平方值。的內(nèi)容就是變量的平方
29、值。采用采用MOVC A,A+PC指令也可以實現(xiàn)查指令也可以實現(xiàn)查表功能,且不破壞表功能,且不破壞DPTR的內(nèi)容,從而可以減的內(nèi)容,從而可以減少保護(hù)少保護(hù)DPTR的內(nèi)容所需的開銷。但表格只能的內(nèi)容所需的開銷。但表格只能存放在存放在MOVC A,A+PC指令后的指令后的256字節(jié)字節(jié)內(nèi),即表格存放的地點和空間有一定限制。內(nèi),即表格存放的地點和空間有一定限制。 31 三、簡單運算三、簡單運算 由于由于80C51指令系統(tǒng)中只有單字節(jié)加法指令,因指令系統(tǒng)中只有單字節(jié)加法指令,因此對于多字節(jié)的相加運算必須從低位字節(jié)開始分字此對于多字節(jié)的相加運算必須從低位字節(jié)開始分字節(jié)進(jìn)行。除最低字節(jié)可以使用節(jié)進(jìn)行。除最
30、低字節(jié)可以使用ADD指令外,其他指令外,其他字節(jié)相加時要把低字節(jié)的進(jìn)位考慮進(jìn)去,這時就應(yīng)字節(jié)相加時要把低字節(jié)的進(jìn)位考慮進(jìn)去,這時就應(yīng)該使用該使用ADDC指令。指令。例例 雙字節(jié)無符號數(shù)加法。雙字節(jié)無符號數(shù)加法。 設(shè)被加數(shù)存放在內(nèi)部設(shè)被加數(shù)存放在內(nèi)部RAM的的51H、50H單元,單元,加數(shù)存放在內(nèi)部加數(shù)存放在內(nèi)部RAM的的61H、60H單元,相加的結(jié)單元,相加的結(jié)果存放在內(nèi)部果存放在內(nèi)部RAM的的51H、50H單元,進(jìn)位存放在單元,進(jìn)位存放在位尋址區(qū)的位尋址區(qū)的00H位中。位中。 32 程序段如下:程序段如下:MOV R0,50H ;被加數(shù)的低字節(jié)地址;被加數(shù)的低字節(jié)地址MOV R1,60H ;
31、加數(shù)的低字節(jié)地址;加數(shù)的低字節(jié)地址MOV A,R0 ;取被加數(shù)低字節(jié);取被加數(shù)低字節(jié)ADD A,R1 ;加上加數(shù)低字節(jié);加上加數(shù)低字節(jié)MOV R0,A ;保存低字節(jié)相加結(jié)果;保存低字節(jié)相加結(jié)果INC R0 ;指向被加數(shù)高字節(jié);指向被加數(shù)高字節(jié)INC R1 ;指向加數(shù)高字節(jié);指向加數(shù)高字節(jié)MOV A,R0 ;取被加數(shù)高字節(jié);取被加數(shù)高字節(jié)ADDC A,R1 ;加上加數(shù)高字節(jié)(帶進(jìn)位加);加上加數(shù)高字節(jié)(帶進(jìn)位加)MOV R0,A ;存高字節(jié)相加結(jié)果;存高字節(jié)相加結(jié)果MOV 00H,C ;保存進(jìn)位;保存進(jìn)位SJMP $ 33 4.3.2 4.3.2 分支程序分支程序 分支結(jié)構(gòu)可以分成單分支、雙分支
32、和多分支分支結(jié)構(gòu)可以分成單分支、雙分支和多分支幾種情況幾種情況 :34一、單分支程序一、單分支程序例例 求雙字節(jié)補碼。求雙字節(jié)補碼。設(shè)在內(nèi)部設(shè)在內(nèi)部RAM的的addr1和和addr+1單元存單元存有一個雙字節(jié)數(shù)(高位字節(jié)存于高地址單有一個雙字節(jié)數(shù)(高位字節(jié)存于高地址單元)。編寫程序?qū)⑵渥x出取補后再存入元)。編寫程序?qū)⑵渥x出取補后再存入addr2和和addr2+1單元。單元。方法:方法:首先對低字節(jié)取補,然后判其結(jié)果首先對低字節(jié)取補,然后判其結(jié)果是否為全是否為全“0”。若是,則高字節(jié)取補,否則。若是,則高字節(jié)取補,否則高字節(jié)取反。高字節(jié)取反。 35START: MOV R0,#addr1 ;原碼
33、低字節(jié)地址送;原碼低字節(jié)地址送R0 MOV R1,#addr2 ;補碼低字節(jié)地址送;補碼低字節(jié)地址送R1 MOV A,R0 ;原碼低字節(jié)送;原碼低字節(jié)送A CPL A ;A內(nèi)容取補內(nèi)容取補 INC A MOV R1,A ;存補碼低字節(jié);存補碼低字節(jié) INC R0 ;調(diào)整地址,指向下一單元;調(diào)整地址,指向下一單元 INC R1 JZ ZERO ;(;(A)=0時轉(zhuǎn)時轉(zhuǎn)ZERO MOV A,R0 ;原碼高字節(jié)送;原碼高字節(jié)送A CPL A MOV R1,A ;高字節(jié)反碼存入;高字節(jié)反碼存入addr2+1單元單元 SJMP LOOP1 ZERO: MOV A, R0 ;高字節(jié)取補存入;高字節(jié)取補存入
34、addr2+1單元單元 CPL A INC A MOV R1,A LOOP1: SJMP $36二、雙分支程序二、雙分支程序例例 設(shè)變量設(shè)變量 x 以補碼的形式存放在片內(nèi)以補碼的形式存放在片內(nèi)RAM的的30H單元,變量單元,變量 y 。變量為變量為RAM的的32H單元的內(nèi)容。當(dāng)單元的內(nèi)容。當(dāng) x 大于大于0時,時,y =x;當(dāng);當(dāng) x =0時,時,y =20H;當(dāng);當(dāng) x 小于小于0時,時,y =x+5。編制程序,根據(jù)。編制程序,根據(jù) x 的大小求的大小求y并送回并送回原單元。程序段如下:原單元。程序段如下:START: MOV A,30H JZ NEXT ;等于零:;等于零:y=20H AN
35、L A,#80H ;判斷符號位;判斷符號位 JZ LP ;大于零:;大于零:y=x MOV A,#05H ;小于零:;小于零:y=x+5 ADD A,30H MOV 32H,A SJMP LPNEXT: MOV 32H,#20HLP: SJMP $ 37三、多分支程序三、多分支程序例例 根據(jù)根據(jù)R7的內(nèi)容轉(zhuǎn)向相應(yīng)的處理程序。的內(nèi)容轉(zhuǎn)向相應(yīng)的處理程序。設(shè)設(shè)R7的內(nèi)容為的內(nèi)容為0N,對應(yīng)的處理程序的入口地址分別為,對應(yīng)的處理程序的入口地址分別為PP0PPN。程序段如。程序段如下:下:START: MOV DPTR,#TAB ;置分支入口地址表首址;置分支入口地址表首址 MOV A,R7 ;分支轉(zhuǎn)移
36、序號送;分支轉(zhuǎn)移序號送A ADD A,R7 ;分支轉(zhuǎn)移序號乘以;分支轉(zhuǎn)移序號乘以2 MOV R3,A ;暫存于;暫存于R3 MOVC A,A+DPTR ;取高位地址;取高位地址 XCH A,R3 INC A MOVC A,A+DPTR ;取低位地址;取低位地址 MOV DPL,A ;處理程序入口地址低;處理程序入口地址低8位送位送DPL MOV DPH,R3 ;處理程序入口地址高;處理程序入口地址高8位送位送DPH CLR A JMP A+DPTR TAB: DW PP0 DW PP1 DW PPN 384.3.3 4.3.3 循環(huán)程序循環(huán)程序按某種控制規(guī)律重復(fù)執(zhí)行的程序稱為循環(huán)程序。循環(huán)程序
37、按某種控制規(guī)律重復(fù)執(zhí)行的程序稱為循環(huán)程序。循環(huán)程序有有先執(zhí)行后判斷先執(zhí)行后判斷和和先判斷后執(zhí)行先判斷后執(zhí)行兩種基本結(jié)構(gòu)兩種基本結(jié)構(gòu) :39一、先執(zhí)行后判斷一、先執(zhí)行后判斷例例 50ms延時程序。延時程序。若晶振頻率為若晶振頻率為12MHz,則一個機器周期為,則一個機器周期為1s。執(zhí)行一條。執(zhí)行一條DJNZ指令需要指令需要2個機器周期,即個機器周期,即 2s。采用循環(huán)計數(shù)法實。采用循環(huán)計數(shù)法實現(xiàn)延時,循環(huán)次數(shù)可以通過計算獲得,并選擇現(xiàn)延時,循環(huán)次數(shù)可以通過計算獲得,并選擇先執(zhí)行后判先執(zhí)行后判斷斷的循環(huán)結(jié)構(gòu)。程序段如下:的循環(huán)結(jié)構(gòu)。程序段如下:DEL: MOV R7,#200 ;1 sDEL1:M
38、OV R6,#123 ;1 s NOP ;1 sDEL2:DJNZ R6,DEL2 ;2s,計,計(2123)s DJNZ R7,DEL1 ;2s, RET ;2s共計共計 1+(21232 2)200+2 s,即,即50.003ms40 例例 無符號數(shù)排序程序。在片內(nèi)無符號數(shù)排序程序。在片內(nèi)RAM中,起始地中,起始地址為址為30H的的10個單元中存放的全是個單元中存放的全是8位無符號數(shù)。試位無符號數(shù)。試對這些無符號數(shù)進(jìn)行升序排序。對這些無符號數(shù)進(jìn)行升序排序。數(shù)據(jù)排序數(shù)據(jù)排序常用的方法是冒泡排序法。執(zhí)行時從前向常用的方法是冒泡排序法。執(zhí)行時從前向后進(jìn)行相鄰數(shù)的比較,如數(shù)據(jù)的大小次序與要求的后進(jìn)
39、行相鄰數(shù)的比較,如數(shù)據(jù)的大小次序與要求的順序不符就將這兩個數(shù)互換,否則不互換。對于升順序不符就將這兩個數(shù)互換,否則不互換。對于升序排序,通過這種相鄰數(shù)的互換,使小數(shù)向前移動,序排序,通過這種相鄰數(shù)的互換,使小數(shù)向前移動,大數(shù)向后移動。從前向后進(jìn)行一次冒泡(相鄰數(shù)的大數(shù)向后移動。從前向后進(jìn)行一次冒泡(相鄰數(shù)的互換),就會把最大的數(shù)換到最后。再進(jìn)行一次冒互換),就會把最大的數(shù)換到最后。再進(jìn)行一次冒泡,就會把次大的數(shù)排在倒數(shù)第二的位置。泡,就會把次大的數(shù)排在倒數(shù)第二的位置。設(shè)設(shè)R7為比較次數(shù)計數(shù)器為比較次數(shù)計數(shù)器,初始值為,初始值為09H,位地址,位地址00H為數(shù)據(jù)互換標(biāo)志位。為數(shù)據(jù)互換標(biāo)志位。 4
40、1START:CLR 00H ;互換標(biāo)志清;互換標(biāo)志清0 MOV R7,#09H ;首次冒泡比較次數(shù);首次冒泡比較次數(shù) MOV R0,#30H ;數(shù)據(jù)區(qū)首址;數(shù)據(jù)區(qū)首址LOOP: MOV A,R0 ;取前數(shù);取前數(shù) MOV 2BH,A ;暫存;暫存 INC R0 MOV 2AH,R0 ;取后數(shù);取后數(shù) CLR C SUBB A,R0 ;前數(shù)減后數(shù);前數(shù)減后數(shù) JC NEXT ; 前數(shù)小于后數(shù),不互換前數(shù)小于后數(shù),不互換 MOV R0,2BH DEC R0 MOV R0,2AH ;兩數(shù)交換;兩數(shù)交換 INC R0 ;準(zhǔn)備下一次比較;準(zhǔn)備下一次比較 SETB 00H ;置互換標(biāo)志;置互換標(biāo)志NEX
41、T: DJNZ R7,LOOP ;進(jìn)行下一次比較;進(jìn)行下一次比較 JB 00H,START ;進(jìn)行下一輪冒泡;進(jìn)行下一輪冒泡 SJMP $ 42二、先判斷后執(zhí)行二、先判斷后執(zhí)行 例例 將內(nèi)部將內(nèi)部RAM中起始地址為中起始地址為data的數(shù)據(jù)串傳送到外部的數(shù)據(jù)串傳送到外部RAM中起始中起始地址為地址為buffer的存儲區(qū)域內(nèi),直到發(fā)現(xiàn)的存儲區(qū)域內(nèi),直到發(fā)現(xiàn)$ 字符停止傳送。由于循環(huán)字符停止傳送。由于循環(huán)次數(shù)事先不知道,但循環(huán)條件可以測試到。所以,采用先判斷后執(zhí)行次數(shù)事先不知道,但循環(huán)條件可以測試到。所以,采用先判斷后執(zhí)行的結(jié)構(gòu)比較適宜。程序段如下的結(jié)構(gòu)比較適宜。程序段如下: MOV R0,#da
42、ta MOV DPTR,#bufferLOOP0: MOV A,R0 CJNE A,#24H,LOOP1 ;判斷是否為;判斷是否為 $ 字符字符 SJMP DONE ;是;是 $ 字符,轉(zhuǎn)結(jié)束字符,轉(zhuǎn)結(jié)束LOOP1: MOVX DPTR,A ;不是;不是 $ 字符,執(zhí)行傳送字符,執(zhí)行傳送 INC R0 INC DPTR SJMP LOOP0 ;傳送下一數(shù)據(jù);傳送下一數(shù)據(jù)DONE: SJMP $ 434.3.4 4.3.4 子程序及其調(diào)用子程序及其調(diào)用一、子程序的調(diào)用一、子程序的調(diào)用 在實際應(yīng)用中,經(jīng)常會遇到一些帶有在實際應(yīng)用中,經(jīng)常會遇到一些帶有通用性的問通用性的問題題,例如:數(shù)值轉(zhuǎn)換、數(shù)值計
43、算等,在一個程序中,例如:數(shù)值轉(zhuǎn)換、數(shù)值計算等,在一個程序中可能要使用多次。這時可以將其可能要使用多次。這時可以將其設(shè)計成通用的子程設(shè)計成通用的子程序供隨時調(diào)用序供隨時調(diào)用。 子程序主要特點子程序主要特點是,在執(zhí)行過程中需要由其它程是,在執(zhí)行過程中需要由其它程序來調(diào)用,執(zhí)行完后又需要把執(zhí)行流程返回到調(diào)用序來調(diào)用,執(zhí)行完后又需要把執(zhí)行流程返回到調(diào)用該子程序的主程序。該子程序的主程序。 子程序調(diào)用時要注意兩點:一是現(xiàn)場的保護(hù)和恢子程序調(diào)用時要注意兩點:一是現(xiàn)場的保護(hù)和恢復(fù);二是主程序與子程序的參數(shù)傳遞。復(fù);二是主程序與子程序的參數(shù)傳遞。44二、現(xiàn)場保護(hù)與恢復(fù)二、現(xiàn)場保護(hù)與恢復(fù) 在子程序執(zhí)行過程中常
44、常要用到單片機的一些通在子程序執(zhí)行過程中常常要用到單片機的一些通用單元,如工作寄存器用單元,如工作寄存器R0R7、累加器、累加器A、數(shù)據(jù)指、數(shù)據(jù)指針針DPTR,以及有關(guān)標(biāo)志和狀態(tài)等。而這些單元中,以及有關(guān)標(biāo)志和狀態(tài)等。而這些單元中的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,所以需要的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,所以需要進(jìn)行保護(hù),稱為進(jìn)行保護(hù),稱為現(xiàn)場保護(hù)現(xiàn)場保護(hù)。 在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原內(nèi)容,稱為原內(nèi)容,稱為現(xiàn)場恢復(fù)現(xiàn)場恢復(fù)。保護(hù)與恢復(fù)的方法有以下。保護(hù)與恢復(fù)的方法有以下兩種:兩種:在主程序中實現(xiàn);在主程序中實現(xiàn);在子程序中實現(xiàn)。在
45、子程序中實現(xiàn)。45 1、在主程序中實現(xiàn)、在主程序中實現(xiàn) 示例如下:示例如下: PUSH PSW ;保護(hù)現(xiàn)場;保護(hù)現(xiàn)場 PUSH ACC PUSH B MOV PSW,#10H ;換當(dāng)前工作寄存器組;換當(dāng)前工作寄存器組 LCALL addr16 ;子程序調(diào)用;子程序調(diào)用 POP B ;恢復(fù)現(xiàn)場;恢復(fù)現(xiàn)場 POP ACC POP PSW 其特點是結(jié)構(gòu)靈活。其特點是結(jié)構(gòu)靈活。46 2、在子程序中實現(xiàn)、在子程序中實現(xiàn)示例如下:示例如下:SUB1:PUSH PSW ;保護(hù)現(xiàn)場;保護(hù)現(xiàn)場 PUSH ACC PUSH B MOV PSW,#10H ;換當(dāng)前工作寄存器組;換當(dāng)前工作寄存器組 POP B ;恢復(fù)
46、現(xiàn)場;恢復(fù)現(xiàn)場 POP ACC POP PSW RET其特點是程序規(guī)范、清晰。其特點是程序規(guī)范、清晰。注意,無論哪種方法保護(hù)與恢復(fù)的注意,無論哪種方法保護(hù)與恢復(fù)的順序要對應(yīng)。順序要對應(yīng)。47三、參數(shù)傳遞三、參數(shù)傳遞 由于子程序是主程序的一部分,所以,在程序的執(zhí)行時必由于子程序是主程序的一部分,所以,在程序的執(zhí)行時必然要發(fā)生然要發(fā)生數(shù)據(jù)上的聯(lián)系數(shù)據(jù)上的聯(lián)系。在調(diào)用子程序時,主程序應(yīng)通過某。在調(diào)用子程序時,主程序應(yīng)通過某種方式把有關(guān)參數(shù)(即子程序的入口參數(shù))傳給子程序,當(dāng)種方式把有關(guān)參數(shù)(即子程序的入口參數(shù))傳給子程序,當(dāng)子程序執(zhí)行完畢后,又需要通過某種方式把有關(guān)參數(shù)(即子子程序執(zhí)行完畢后,又需要
47、通過某種方式把有關(guān)參數(shù)(即子程序的出口參數(shù))傳給主程序。在程序的出口參數(shù))傳給主程序。在80C51單片機中,傳遞參單片機中,傳遞參數(shù)的方法有三種:數(shù)的方法有三種: 1、利用累加器或寄存器、利用累加器或寄存器 在這種方式中,要把在這種方式中,要把預(yù)傳遞的參數(shù)存放在累加器預(yù)傳遞的參數(shù)存放在累加器A或工作或工作寄存器寄存器R0R7中中。即在主程序調(diào)用子程序時,應(yīng)事先把子程。即在主程序調(diào)用子程序時,應(yīng)事先把子程序需要的數(shù)據(jù)送入累加器序需要的數(shù)據(jù)送入累加器A或指定的工作寄存器中,當(dāng)子程或指定的工作寄存器中,當(dāng)子程序執(zhí)行時,可以從指定的單元中取得數(shù)據(jù),執(zhí)行運算。反之,序執(zhí)行時,可以從指定的單元中取得數(shù)據(jù),
48、執(zhí)行運算。反之,子程序也可以用同樣的方法把結(jié)果傳送給主程序。子程序也可以用同樣的方法把結(jié)果傳送給主程序。48 例例 編寫程序,實現(xiàn)編寫程序,實現(xiàn)c=a2+b2 。設(shè)。設(shè)a,b,c分別存于內(nèi)部分別存于內(nèi)部RAM的的30H,31H,32H三個單元中。程序段如下:三個單元中。程序段如下:START: MOV A,30H ;?。蝗 ACALL SQR ;調(diào)用查平方表;調(diào)用查平方表 MOV R1,A ;a2 暫存于暫存于R1中中 MOV A,31H ;??;取b ACALL SQR ;調(diào)用查平方表;調(diào)用查平方表 ADD A,R1 ;a2+b2 存于存于A中中 MOV 32H,A ;存結(jié)果;存結(jié)果 SJM
49、P $ SQR: MOV DPTR,#TAB ;子程序;子程序 MOVC A,A+DPTR RET TAB: DB 0,1,4,9,16,25,36,49,64,81 49 2、利用存儲器、利用存儲器 當(dāng)傳送的當(dāng)傳送的數(shù)據(jù)量比較大數(shù)據(jù)量比較大時,可以利用存儲器實現(xiàn)時,可以利用存儲器實現(xiàn)參數(shù)的傳遞。在這種方式中,事先要建立一個參數(shù)表,參數(shù)的傳遞。在這種方式中,事先要建立一個參數(shù)表,用指針指示參數(shù)表所在的位置。當(dāng)參數(shù)表建立在內(nèi)部用指針指示參數(shù)表所在的位置。當(dāng)參數(shù)表建立在內(nèi)部RAM時,用時,用R0或或R1作參數(shù)表的指針。當(dāng)參數(shù)表建立作參數(shù)表的指針。當(dāng)參數(shù)表建立在外部在外部RAM時,用時,用DPTR作
50、參數(shù)表的指針。作參數(shù)表的指針。 例例 將將R0和和R1指向的內(nèi)部指向的內(nèi)部RAM 中兩個中兩個3字節(jié)無字節(jié)無符號整數(shù)相加,結(jié)果送到由符號整數(shù)相加,結(jié)果送到由R0指向的內(nèi)部指向的內(nèi)部RAM中。中。低字節(jié)在高地址低字節(jié)在高地址,高字節(jié)在低地址高字節(jié)在低地址。(入口時,入口時,R0和和R1分別指向加數(shù)和被加數(shù)的低位字節(jié);出口時,分別指向加數(shù)和被加數(shù)的低位字節(jié);出口時,R0指向結(jié)果的高位字節(jié)。指向結(jié)果的高位字節(jié)。) 50 實現(xiàn)程序:實現(xiàn)程序:NADD: MOV R7,#3 ;三字節(jié)加法;三字節(jié)加法 CLR C NADD1: MOV A,R0 ;取加數(shù)低字節(jié);取加數(shù)低字節(jié) ADDC A,R1 ;被加數(shù)低
51、字節(jié)加;被加數(shù)低字節(jié)加A MOV R0,A ;存結(jié)果;存結(jié)果 DEC R0 ;指向高字節(jié);指向高字節(jié) DEC R1 DJNZ R7,NADD1 INC R0 RET 51 3、利用堆棧、利用堆棧 利用堆棧傳遞參數(shù)是在利用堆棧傳遞參數(shù)是在子程序嵌套中子程序嵌套中常采常采用的一種方法。在調(diào)用子程序前,用用的一種方法。在調(diào)用子程序前,用PUSH指令將子程序中所需數(shù)據(jù)壓入堆棧,進(jìn)入執(zhí)指令將子程序中所需數(shù)據(jù)壓入堆棧,進(jìn)入執(zhí)行子程序時,再用行子程序時,再用POP指令從堆棧中彈出數(shù)指令從堆棧中彈出數(shù)據(jù)。據(jù)。 例例 把內(nèi)部把內(nèi)部RAM中中20H單元中的單元中的1個字節(jié)十個字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換為六進(jìn)制數(shù)轉(zhuǎn)換為2位
52、位ASCII碼,存放在碼,存放在R0指指示的兩個單元中。示的兩個單元中。 52 MAIN: MOV A,20H SWAP A PUSH ACC ;參數(shù)入棧;參數(shù)入棧 ACALL HEXASC POP ACC MOV R0,A ;存高位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果;存高位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 INC R0 ;修改指針;修改指針 PUSH 20H ;參數(shù)入棧;參數(shù)入棧 ACALL HEXASC POP ACC MOV R0,A ;存低位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果;存低位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果 SJMP $53 ;轉(zhuǎn)換子程序;轉(zhuǎn)換子程序HEXASC: MOV R1,SP ;借用;借用R1為堆棧指針為堆棧指針 DEC R1
53、DEC R1 ;R1指向被轉(zhuǎn)換數(shù)據(jù)指向被轉(zhuǎn)換數(shù)據(jù) XCH A,R1 ;取被轉(zhuǎn)換數(shù)據(jù);取被轉(zhuǎn)換數(shù)據(jù) ANL A,#0FH ;取一位十六進(jìn)制數(shù);取一位十六進(jìn)制數(shù) ADD A,#2 ; 所加值為所加值為MOVC與與DB間字節(jié)數(shù)間字節(jié)數(shù) MOVC A,A+PC ;查表;查表 XCH A,R1 ;1字節(jié)指令,存結(jié)果于堆棧字節(jié)指令,存結(jié)果于堆棧 RET ;1字節(jié)指令字節(jié)指令A(yù)SCTAB: DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H 54 一般說來:一般說來:當(dāng)相互傳遞的當(dāng)相互傳遞的數(shù)據(jù)較少數(shù)據(jù)較少時,采用寄存器
54、時,采用寄存器傳遞方式可以獲得較快的傳遞速度;傳遞方式可以獲得較快的傳遞速度;當(dāng)相互傳遞的當(dāng)相互傳遞的數(shù)據(jù)較多數(shù)據(jù)較多時,宜采用存儲時,宜采用存儲器或堆棧方式傳遞;器或堆棧方式傳遞;如果是如果是子程序嵌套子程序嵌套時,最好是采用堆棧時,最好是采用堆棧方式。方式。554.4 常用程序舉例常用程序舉例4.4.1 算術(shù)運算程序算術(shù)運算程序 一、多字節(jié)數(shù)的加、減運算一、多字節(jié)數(shù)的加、減運算 80C51單片機的指令系統(tǒng)提供的是字節(jié)運算指單片機的指令系統(tǒng)提供的是字節(jié)運算指令,所以在處理多字節(jié)數(shù)的加減運算時,要合理地令,所以在處理多字節(jié)數(shù)的加減運算時,要合理地運用進(jìn)位(借位)標(biāo)志。運用進(jìn)位(借位)標(biāo)志。 例
55、例 多字節(jié)無符號數(shù)的加法。多字節(jié)無符號數(shù)的加法。設(shè)兩個設(shè)兩個N字節(jié)的無符號數(shù)分別存放在內(nèi)部字節(jié)的無符號數(shù)分別存放在內(nèi)部RAM中以中以DATA1和和DATA2開始的單元中。相加后的結(jié)果要開始的單元中。相加后的結(jié)果要求存放在求存放在DATA2數(shù)據(jù)區(qū)。數(shù)據(jù)區(qū)。56 MOV R0,#DATA1 MOV R1,#DATA2 MOV R7,#N ;置字節(jié)數(shù);置字節(jié)數(shù) CLR C LOOP: MOV A,R0 ADDC A,R1 ;求和;求和 MOV R1,A ;存結(jié)果;存結(jié)果 INC R0 ;修改指針;修改指針 INC R1 DJNZ R7, LOOP HERE: SJMP HERE 57例例 多字節(jié)無符
56、號數(shù)的減法。多字節(jié)無符號數(shù)的減法。 設(shè)兩個設(shè)兩個N字節(jié)的無符號數(shù)分別存放在內(nèi)部字節(jié)的無符號數(shù)分別存放在內(nèi)部RAM中以中以DATA1和和DATA2開始的單元中。相減后的結(jié)果要求存放在開始的單元中。相減后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。數(shù)據(jù)區(qū)。 MOV R0,#DATA1 ; MOV R1,#DATA2 ; MOV R7,#N ;置字節(jié)數(shù);置字節(jié)數(shù) CLR C ;LOOP:MOV A,R0 ; SUBB A,R1 ;求差;求差 MOV R1,A ;存結(jié)果;存結(jié)果 INC R0 ;修改指針;修改指針 INC R1 ; DJNZ R7, LOOP ; SJMP $58二、多字節(jié)數(shù)乘法運算二、多字節(jié)數(shù)
57、乘法運算例例 雙字節(jié)無符號數(shù)的乘法。雙字節(jié)無符號數(shù)的乘法。設(shè)設(shè)雙字節(jié)的無符號雙字節(jié)的無符號被乘數(shù)存放在被乘數(shù)存放在R3、R2中,乘數(shù)存放在中,乘數(shù)存放在R5、R4中,中,R0指向積的高位。指向積的高位。 59主程序段如下:主程序段如下:MULTB: MOV R7,#04 ;結(jié)果清;結(jié)果清0LOOP:MOV R0,#00H DJNZ R7,LOOP DEC R0 ACALL BMUL SJMP $另有另有2段子程序:段子程序: BMUL RADD(在(在BMUL中被調(diào)用)中被調(diào)用)60先看子程序段:先看子程序段: RADD:ADD A,R0 ; MOV R0,A ; MOV A,B ; INC
58、R0 ; ADDC A,R0 ; MOV R0,A ; INC R0 ; MOV A,R0 ; ADDC A,#00H ;加進(jìn)位;加進(jìn)位 MOV R0,A ; RET61BMUL:MOV A,R2 MOV B,R4 MUL AB ;低位乘;低位乘 ACALL RADD MOV A,R2 MOV B,R5 MUL AB ;交叉乘;交叉乘 DEC R0 ACALL RADD MOV A,R4 MOV B,R3 MUL AB ;交叉乘;交叉乘 DEC R0 DEC R0 ACALL RADD MOV A,R5 MOV B,R3 MUL AB ;高字節(jié)乘;高字節(jié)乘 DEC R0 ACALL RADD
59、DEC R0 RET62一、十六進(jìn)制數(shù)與一、十六進(jìn)制數(shù)與ASCII碼間的轉(zhuǎn)換碼間的轉(zhuǎn)換 十六進(jìn)制數(shù)與十六進(jìn)制數(shù)與ASCII碼的對應(yīng)關(guān)系如表所示。當(dāng)十六進(jìn)碼的對應(yīng)關(guān)系如表所示。當(dāng)十六進(jìn)制數(shù)在制數(shù)在09之間時,其對應(yīng)的之間時,其對應(yīng)的ASCII碼值為該十六進(jìn)制數(shù)加碼值為該十六進(jìn)制數(shù)加30H;當(dāng)十六進(jìn)制數(shù)在;當(dāng)十六進(jìn)制數(shù)在AF之間時,其對應(yīng)的之間時,其對應(yīng)的ASCII碼值為該碼值為該十六進(jìn)制數(shù)加十六進(jìn)制數(shù)加37H。4.4.2 碼型轉(zhuǎn)換碼型轉(zhuǎn)換 63例例 將將1位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼。碼。 設(shè)十六進(jìn)制數(shù)存放在設(shè)十六進(jìn)制數(shù)存放在R0中,轉(zhuǎn)換后的中,轉(zhuǎn)換后的ASCII
60、 碼存碼存放于放于R2中。實現(xiàn)程序如下:中。實現(xiàn)程序如下:HASC:MOV A,R0 ;取;取4位二進(jìn)制數(shù)位二進(jìn)制數(shù) ANL A,#0FH ;屏蔽掉高;屏蔽掉高4位位 PUSH ACC ;4位二進(jìn)制數(shù)入棧位二進(jìn)制數(shù)入棧 CLR C ;清進(jìn)(借)位位;清進(jìn)(借)位位 SUBB A,#0AH ;用借位位的狀態(tài)判斷該數(shù)在用借位位的狀態(tài)判斷該數(shù)在09還是還是AF之間之間 POP ACC ;彈出原;彈出原4位二進(jìn)制數(shù)位二進(jìn)制數(shù) JC LOOP ;借位位為;借位位為1,跳轉(zhuǎn)至,跳轉(zhuǎn)至LOOP ADD A,#07H ;借位位為借位位為0,該數(shù)在,該數(shù)在AF之間,加之間,加37HLOOP:ADD A,#30H
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店實習(xí)總結(jié)報告模板(12篇)
- 銷售部門個人工作總結(jié)示例
- 人脈保密協(xié)議書
- 銷售人員實習(xí)工作總結(jié)5篇
- 兒童教育愛心基金管理辦法
- 智能醫(yī)療基站租賃合作協(xié)議
- 科研實驗電源供應(yīng)租用協(xié)議
- 橋梁建設(shè)現(xiàn)場管理準(zhǔn)則
- 城市排水商品混凝土施工協(xié)議
- 員工解雇成本分析
- 小學(xué)數(shù)學(xué)教師家長會ppt
- 君子自強不息課件
- 2022人教版高二英語新教材選擇性必修全四冊課文原文及翻譯(英漢對照)
- WDZANYJY23低壓電力電纜技術(shù)規(guī)格書
- 抗高血壓藥物基因檢測課件
- 醫(yī)院管理醫(yī)院應(yīng)急調(diào)配機制
- (公開課)文言文斷句-完整版課件
- 小學(xué)生性教育調(diào)查問卷
- 醫(yī)院感染管理質(zhì)量持續(xù)改進(jìn)反饋表
- 旅游行政管理第二章旅游行政管理體制課件
- 學(xué)生崗位實習(xí)家長(或法定監(jiān)護(hù)人)知情同意書
評論
0/150
提交評論