版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章匯編語(yǔ)言程序設(shè)計(jì)
(課時(shí):12學(xué)時(shí))大家網(wǎng):/教學(xué)目的
了解匯編語(yǔ)言程序設(shè)計(jì)的特點(diǎn)。掌握匯編語(yǔ)言程序的基本結(jié)構(gòu)及簡(jiǎn)單應(yīng)用的設(shè)計(jì)方法。用循環(huán)程序設(shè)計(jì)一個(gè)控制信號(hào)燈的程序。用循環(huán)程序設(shè)計(jì)一個(gè)控制步進(jìn)電動(dòng)機(jī)的程序。用分支程序設(shè)計(jì)一個(gè)控制汽車信號(hào)燈的程序。用分支程序設(shè)計(jì)一個(gè)控制水塔水位的程序。
學(xué)習(xí)重點(diǎn)和難點(diǎn)分支程序、循環(huán)程序的設(shè)計(jì)特點(diǎn)。子程序的編寫(xiě)和應(yīng)用。大家網(wǎng):/第4章匯編語(yǔ)言程序設(shè)計(jì)4.1程序設(shè)計(jì)概述4.2順序程序設(shè)計(jì)4.3循環(huán)程序設(shè)計(jì)4.4分支程序設(shè)計(jì)4.5子程序設(shè)計(jì)4.6查表程序設(shè)計(jì)本章小結(jié)習(xí)題
大家網(wǎng):/4.1程序設(shè)計(jì)概述4.1.1程序設(shè)計(jì)語(yǔ)言4.1.2匯編語(yǔ)言源程序的編輯與匯編4.1.3匯編語(yǔ)言程序的基本結(jié)構(gòu)4.1.4程序設(shè)計(jì)方法和技巧
大家網(wǎng):/4.1.1程序設(shè)計(jì)語(yǔ)言1.機(jī)器語(yǔ)言(MachineLanguage)
這是一種用二進(jìn)制代碼“0”和“1”表示指令和數(shù)據(jù)的程序設(shè)計(jì)語(yǔ)言。計(jì)算機(jī)只能識(shí)別二進(jìn)制代碼,這種語(yǔ)言是能被計(jì)算機(jī)直接識(shí)別和執(zhí)行的機(jī)器級(jí)語(yǔ)言。特點(diǎn):機(jī)器語(yǔ)言能夠被計(jì)算機(jī)立即識(shí)別并加以執(zhí)行,具有執(zhí)行速度快、占用內(nèi)存少等優(yōu)點(diǎn)。但對(duì)于使用者來(lái)說(shuō),用機(jī)器語(yǔ)言編寫(xiě)程序具有編寫(xiě)難、識(shí)別難、記憶難、查錯(cuò)難、交流難等缺點(diǎn)。大家網(wǎng):/4.1.1程序設(shè)計(jì)語(yǔ)言2.匯編語(yǔ)言(AssemblyLanguage)
匯編語(yǔ)言是一種用助記符來(lái)表示的面向機(jī)器的程序設(shè)計(jì)語(yǔ)言。不同的機(jī)器所使用的匯編語(yǔ)言一般是不同的。但計(jì)算機(jī)的CPU不能直接識(shí)別匯編語(yǔ)言,所以計(jì)算機(jī)不能立即執(zhí)行匯編語(yǔ)言程序。用匯編語(yǔ)言編寫(xiě)的源程序,在由計(jì)算機(jī)執(zhí)行之前,必須將它翻譯成機(jī)器語(yǔ)言程序。特點(diǎn):這種語(yǔ)言彌補(bǔ)了機(jī)器語(yǔ)言的不足,用匯編語(yǔ)言編寫(xiě)程序比用機(jī)器語(yǔ)言方便、直觀、易懂、易用、易記??梢跃帉?xiě)出結(jié)構(gòu)緊湊、運(yùn)行時(shí)間精確的程序。所以,這種語(yǔ)言非常適合于實(shí)時(shí)控制的需要。大家網(wǎng):/4.1.1程序設(shè)計(jì)語(yǔ)言3.高級(jí)語(yǔ)言(High-LevelLanguage)
高級(jí)語(yǔ)言是面向過(guò)程并能獨(dú)立于計(jì)算機(jī)硬件結(jié)構(gòu)的通用程序設(shè)計(jì)語(yǔ)言,是一種接近人類語(yǔ)言和數(shù)學(xué)表達(dá)式的計(jì)算機(jī)語(yǔ)言。比如:BASIC、FORTRAN、COBOL、PASCAL、C語(yǔ)言等。高級(jí)語(yǔ)言不能被計(jì)算機(jī)直接識(shí)別和執(zhí)行,需要用編譯程序或解釋程序?qū)⒏呒?jí)語(yǔ)言編寫(xiě)的源程序翻譯為機(jī)器語(yǔ)言。特點(diǎn):它比匯編語(yǔ)言易學(xué)、易懂,具有通用性強(qiáng)、易于移植等優(yōu)點(diǎn)。高級(jí)語(yǔ)言的語(yǔ)句功能強(qiáng),它的一條語(yǔ)句往往相當(dāng)于許多條指令,因而用于翻譯的程序要占用較多的存儲(chǔ)空間,而且執(zhí)行時(shí)間長(zhǎng),且不易精確掌握,故在高速實(shí)時(shí)控制中一般是不適用的。大家網(wǎng):/4.1.2匯編語(yǔ)言源程序的編輯與匯編
基本概念在目前單片機(jī)的開(kāi)發(fā)應(yīng)用中,經(jīng)常采用C語(yǔ)言和匯編語(yǔ)言共同編寫(xiě)程序。要想很好地掌握和應(yīng)用單片機(jī)首先要掌握匯編語(yǔ)言。匯編語(yǔ)言是面向機(jī)器的程序設(shè)計(jì)語(yǔ)言,對(duì)于CPU不同的單片機(jī),其匯編語(yǔ)言一般是不同的。用匯編語(yǔ)言編寫(xiě)的程序稱為匯編語(yǔ)言源程序。匯編語(yǔ)言源程序是由匯編語(yǔ)言語(yǔ)句構(gòu)成的。匯編語(yǔ)言語(yǔ)句可分為兩大類:指令性語(yǔ)句和指示性語(yǔ)句。指令性語(yǔ)句是由指令組成的由CPU執(zhí)行的語(yǔ)句,指示性語(yǔ)句是由偽指令組成的,它不被CPU執(zhí)行,用來(lái)告訴匯編程序如何對(duì)程序進(jìn)行匯編的指令;由于它不能生成機(jī)器語(yǔ)言,故又被稱為偽指令語(yǔ)句。大家網(wǎng):/4.1.2匯編語(yǔ)言源程序的編輯與匯編
1.指令性語(yǔ)句格式
[標(biāo)號(hào):]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋]
每條匯編語(yǔ)句一般由若干部分組成,每一部分稱為一個(gè)字段。每個(gè)字段之間應(yīng)該嚴(yán)格地用分界符加以分隔。分界符包括冒號(hào)、空格符、逗號(hào)、分號(hào)等。標(biāo)號(hào)段與操作碼之間要加冒號(hào)“:”;操作碼與操作數(shù)之間要用空格相隔;各操作數(shù)之間要用逗號(hào)“,”相隔;操作數(shù)與注釋段之間要加分號(hào)“;”相隔。大家網(wǎng):/4.1.2匯編語(yǔ)言源程序的編輯與匯編
2.偽指令的指示性語(yǔ)句格式
[標(biāo)號(hào):]偽操作操作數(shù)[,操作數(shù),......][;注釋]偽指令不是真正的指令,是在匯編時(shí)供匯編程序識(shí)別的指令,又稱為匯編指令。它不屬于指令系統(tǒng),也無(wú)對(duì)應(yīng)的機(jī)器碼,只是用來(lái)對(duì)匯編過(guò)程進(jìn)行某種控制。利用偽指令告訴匯編程序如何進(jìn)行匯編,為編程提供方便。大家網(wǎng):/4.1.2匯編語(yǔ)言源程序的編輯與匯編
3.匯編語(yǔ)言源程序的匯編匯編語(yǔ)言源程序必須要轉(zhuǎn)換為機(jī)器碼(即目的程序),計(jì)算機(jī)才能執(zhí)行,這個(gè)轉(zhuǎn)換過(guò)程稱為匯編。匯編語(yǔ)言源程序的匯編可分為手工匯編和機(jī)器匯編兩類。手工匯編是指用人腦通過(guò)查指令編碼表(見(jiàn)附錄中的指令表)把匯編語(yǔ)言源程序翻譯成機(jī)器碼的過(guò)程,又稱為人工代真。機(jī)器匯編是用機(jī)器代替人腦并由專門(mén)的程序來(lái)進(jìn)行的,這種程序稱為匯編程序(不同的指令系統(tǒng)匯編程序不同)。機(jī)器匯編由計(jì)算機(jī)自動(dòng)完成,匯編程序把用匯編語(yǔ)言編寫(xiě)的源程序翻譯成由機(jī)器語(yǔ)言表示的目的程序。反匯編是在分析程序存儲(chǔ)器已有的程序時(shí),將機(jī)器語(yǔ)言翻譯成匯編語(yǔ)言的轉(zhuǎn)換過(guò)程。大家網(wǎng):/4.1.2匯編語(yǔ)言源程序的編輯與匯編
源程序、匯編程序和目的程序之間的關(guān)系如下圖所示
4.匯編語(yǔ)言源程序的編輯匯編語(yǔ)言源程序一般在微機(jī)上借助編輯軟件進(jìn)行編寫(xiě),可供使用的編輯工具有許多,如行編輯軟件、屏幕編輯軟件等。大家網(wǎng):/常用偽指令簡(jiǎn)介(一)
1.ORG(Origin)匯編起始指令
ORG是程序匯編起始地址定位偽指令,功能:是規(guī)定對(duì)匯編語(yǔ)言源程序進(jìn)行匯編時(shí),目的程序在程序存儲(chǔ)器中存放的起始地址。格式:[標(biāo)號(hào):]ORG16位地址或標(biāo)號(hào)注意:在一個(gè)源程序中,可多次使用ORG指令,以規(guī)定不同程序段的起始位置,地址應(yīng)從小到大順序排列,不允許重疊。例如:
ORG1000H
MOVA,#12H;該指令的機(jī)器碼是74H、12H
ADDA,#34H;該指令的機(jī)器碼是24H、34H
在上述源程序中,第一條指令的首字節(jié)74H存放到程序存儲(chǔ)器的1000H地址單元中,其他字節(jié)和后續(xù)指令的數(shù)據(jù)順序存放到后面的存儲(chǔ)單元中。大家網(wǎng):/常用偽指令簡(jiǎn)介(二)
2.END(End)匯編結(jié)束指令
END是匯編語(yǔ)言程序結(jié)束偽指令。功能:是表示程序已結(jié)束,匯編程序?qū)ND后面的指令不再匯編。格式:[標(biāo)號(hào):]END注意:在一個(gè)源程序中,只能有一條END指令,而且必須放在整個(gè)程序的末尾。大家網(wǎng):/常用偽指令簡(jiǎn)介(三)
3.EQU(Equate)賦值指令
EQU是賦值(也稱等值)偽指令。功能:把操作數(shù)段中的數(shù)據(jù)或地址賦值給標(biāo)號(hào)字段中的字符名稱。格式:字符名稱EQU數(shù)值或匯編符號(hào)
注意:字符名稱必須先賦值后使用,故EQU指令通常放在源程序的開(kāi)頭。EQU可定義8位或16位的數(shù)據(jù)或地址,
例如:ABC EQU 30H;AB與30H等值
ACB EQU R3;AC與R3等值
MOVA,ABC ;把片內(nèi)RAM30H單元中的數(shù)據(jù)送入A中
MOVA,ACB ;把R3中的數(shù)據(jù)送入累加器A中
大家網(wǎng):/常用偽指令簡(jiǎn)介(四)
4.DATA(Data)數(shù)據(jù)地址賦值指令
DATA是數(shù)據(jù)地址賦值偽指令。功能:把操作數(shù)段中的表達(dá)式的值賦給標(biāo)號(hào)字段中的字符名稱。
格式:字符名稱DATA表達(dá)式
注意:DATA指令功能與EQU指令類似,它們的主要區(qū)別如下:DATA定義的字符名稱可以先使用后定義,DATA指令可以放在源程序的任何位置。DATA只能用來(lái)定義8位的數(shù)據(jù)或地址。EQU可以把匯編符號(hào)賦給字符名稱,而DATA只能把數(shù)據(jù)賦給字符名稱。DATA可以把表達(dá)式的值賦給字符名稱,這個(gè)表達(dá)式是可以進(jìn)行求值運(yùn)算的。大家網(wǎng):/常用偽指令簡(jiǎn)介(五)
5.XDATA數(shù)據(jù)地址賦值指令
XDATA是數(shù)據(jù)地址賦值偽指令。功能:把操作數(shù)段中的表達(dá)式的值賦給標(biāo)號(hào)字段中的字符名稱。格式:字符名稱XDATA表達(dá)式
注意:XDATA指令功能與DATA指令類似,它們的主要區(qū)別是XDATA可定義16位的數(shù)據(jù)或地址。大家網(wǎng):/常用偽指令簡(jiǎn)介(六)
6.BIT(Bit)位地址賦值指令
BIT是位地址賦值偽指令。功能:把位地址賦給字符名稱。格式:字符名稱BIT位地址例如:
AB BIT 30H ;AB與30H等值
AC BIT P1.0;AC與P1.0等值
MOV C,AB;把位地址區(qū)30H單元中的數(shù)據(jù)送入位累加器C中
CLR AC;把P1.0中的內(nèi)容清零
大家網(wǎng):/常用偽指令簡(jiǎn)介(七)
7.DB(DefineByte)定義字節(jié)指令
DB是定義字節(jié)偽指令。功能:從程序存儲(chǔ)器指定地址單元開(kāi)始存放若干個(gè)字節(jié)的數(shù)值或ASCII碼字符。格式:[標(biāo)號(hào):]DB字節(jié)數(shù)據(jù)或ASCII碼字符
注意:多個(gè)字節(jié)數(shù)據(jù)或ASCII碼字符之間要用逗號(hào)相隔,DB指令常用于定義8位的數(shù)據(jù)常數(shù)表。
例如:
ORG1000HTAB:DB 50H,60,'A' DB 01010111B,'6'
大家網(wǎng):/常用偽指令簡(jiǎn)介(八)
8.DW(DefineWord)定義字指令
DW是定義字偽指令。功能:從程序存儲(chǔ)器指定地址單元開(kāi)始存放若干個(gè)字的數(shù)值。格式:[標(biāo)號(hào):]DW字節(jié)數(shù)據(jù)或ASCII碼字符
注意:多個(gè)字?jǐn)?shù)據(jù)之間要用逗號(hào)相隔,DW指令常用于定義16位的地址表。
例如:
ORG1000HTAB:DW20H,50H,00H,60H
大家網(wǎng):/常用偽指令簡(jiǎn)介(九)
9.DS(DefineSpace)定義存儲(chǔ)空間指令
DS是定義存儲(chǔ)空間偽指令。功能:從程序存儲(chǔ)器指定地址單元開(kāi)始保留表達(dá)式的值所規(guī)定的存儲(chǔ)單元。格式:[標(biāo)號(hào):]DS表達(dá)式
例如:
ORG1000HTAB:DS06H DB25H,35H
在上述源程序中,程序存儲(chǔ)器從1000H單元開(kāi)始保留6個(gè)單元,1006H單元存放25H,1007H單元存放35H。大家網(wǎng):/4.1.3匯編語(yǔ)言程序的基本結(jié)構(gòu)
匯編語(yǔ)言程序具有四種結(jié)構(gòu)形式,即順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)和子程序結(jié)構(gòu)。1.順序程序順序程序是一種最簡(jiǎn)單、最基本的程序結(jié)構(gòu),又稱為簡(jiǎn)單程序或直線程序。程序按順序一條一條地執(zhí)行指令,程序流向不變。2.循環(huán)程序循環(huán)程序是把需要多次重復(fù)執(zhí)行的某段程序,利用條件轉(zhuǎn)移指令反復(fù)轉(zhuǎn)向執(zhí)行,可減小整個(gè)程序的長(zhǎng)度,優(yōu)化程序結(jié)構(gòu)。循環(huán)程序一般由循環(huán)初始化、循環(huán)處理、循環(huán)控制和循環(huán)結(jié)束四部分組成。大家網(wǎng):/4.1.3匯編語(yǔ)言程序的基本結(jié)構(gòu)
3.分支程序分支程序是根據(jù)條件進(jìn)行判斷決定程序的執(zhí)行,滿足條件則進(jìn)行程序轉(zhuǎn)移,不滿足條件就順序執(zhí)行程序。判斷是通過(guò)條件轉(zhuǎn)移指令實(shí)現(xiàn)的。分支程序又分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。4.子程序子程序是指完成某一確定任務(wù)并能被其他程序反復(fù)調(diào)用的程序段。使用子程序可以減小整個(gè)程序的長(zhǎng)度,實(shí)現(xiàn)模塊化程序結(jié)構(gòu)。大家網(wǎng):/4.1.3匯編語(yǔ)言程序的基本結(jié)構(gòu)
順序程序流程圖循環(huán)程序流程圖分支程序流程圖
大家網(wǎng):/4.1.4程序設(shè)計(jì)方法和技巧
1.程序設(shè)計(jì)的一般步驟(1)分析工作任務(wù),明確要達(dá)到的工作目的、技術(shù)指標(biāo)等。(2)確定解決問(wèn)題的算法。算法就是如何將實(shí)際問(wèn)題轉(zhuǎn)化成程序模塊來(lái)處理,要對(duì)不同的算法進(jìn)行分析、比較,找出最適宜的算法。(3)畫(huà)程序流程圖。其圖形的符號(hào)規(guī)定均與高級(jí)語(yǔ)言流程圖相同,如桶形框表示程序的開(kāi)始或結(jié)束,矩形框表示需要進(jìn)行的工作,菱形框表示需要判斷的事情,指向線表示程序的流向等。(4)分配內(nèi)存工作單元,確定程序與數(shù)據(jù)的存放地址。(5)編寫(xiě)源程序。(6)上機(jī)調(diào)試、修改源程序。大家網(wǎng):/4.1.4程序設(shè)計(jì)方法和技巧
2.程序設(shè)計(jì)的一般原則按照盡可能使程序簡(jiǎn)短和縮短運(yùn)行時(shí)間兩個(gè)原則編寫(xiě)程序。應(yīng)用程序一般都由一個(gè)主程序(包括若干個(gè)功能模塊)和多個(gè)子程序構(gòu)成,即采用模塊化的程序設(shè)計(jì)方法。每一功能模塊或子程序都能完成一個(gè)明確的任務(wù),實(shí)現(xiàn)某個(gè)具體功能,如檢測(cè)輸入信號(hào)、碼制轉(zhuǎn)換、輸出控制信號(hào)、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、延時(shí)、顯示、打印等。大家網(wǎng):/4.1.4程序設(shè)計(jì)方法和技巧
3.模塊化程序設(shè)計(jì)方法的特點(diǎn)單個(gè)模塊結(jié)構(gòu)的程序功能單一,易于編寫(xiě)、調(diào)試和修改。對(duì)程序的局部修改,可以使無(wú)關(guān)的部分保持不變。程序可讀性好,便于功能擴(kuò)展和版本升級(jí)。對(duì)于使用頻繁的子程序可以建立子程序庫(kù),便于多個(gè)模塊調(diào)用??蓪?shí)現(xiàn)多人同時(shí)進(jìn)行程序的編寫(xiě)和調(diào)試工作,縮短程序編寫(xiě)時(shí)間。大家網(wǎng):/4.1.4程序設(shè)計(jì)方法和技巧
4.劃分模塊應(yīng)遵循的原則高內(nèi)聚性。每個(gè)模塊應(yīng)具有獨(dú)立的功能,能產(chǎn)生一個(gè)明確的結(jié)果。低耦合性。模塊之間的控制耦合應(yīng)盡量簡(jiǎn)單,數(shù)據(jù)耦合應(yīng)盡量少??刂岂詈鲜侵改K進(jìn)入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換(傳遞)方式、交換量的多少及交換的頻繁程度。模塊長(zhǎng)度適中。模塊語(yǔ)句的長(zhǎng)度為20~100條的范圍較合適。模塊太長(zhǎng)時(shí),分析和調(diào)試比較困難,失去了模塊化程序結(jié)構(gòu)的優(yōu)越性;過(guò)短則模塊的連接太復(fù)雜,信息交換太頻繁。大家網(wǎng):/4.1.4程序設(shè)計(jì)方法和技巧
5.程序設(shè)計(jì)的一般技巧盡量采用循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。這樣可以使程序的總?cè)萘看蟠鬁p少,提高程序的效率,節(jié)省內(nèi)存。盡量少用無(wú)條件轉(zhuǎn)移指令。這樣可以使程序條理更加清楚,從而減少錯(cuò)誤。對(duì)于通用的子程序,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其他寄存器的內(nèi)容應(yīng)壓入堆棧,即保護(hù)現(xiàn)場(chǎng)。一般不必把標(biāo)志寄存器壓入堆棧。在中斷處理程序中,除了要保護(hù)中斷處理程序中用到的寄存器外,還要保護(hù)標(biāo)志寄存器。用累加器傳遞入口參數(shù)或返回參數(shù)比較方便,在子程序中,一般不必把累加器內(nèi)容壓入堆棧。大家網(wǎng):/4.2順序程序設(shè)計(jì)
4.2.1順序程序設(shè)計(jì)方法4.2.2順序程序設(shè)計(jì)實(shí)例
大家網(wǎng):/4.2.1順序程序設(shè)計(jì)方法
順序結(jié)構(gòu)程序是最簡(jiǎn)單、最基本的程序。要設(shè)計(jì)出高質(zhì)量的程序需要掌握一定的技巧,需要熟悉指令系統(tǒng),正確地選擇指令,掌握程序設(shè)計(jì)的基本方法和技巧,以達(dá)到提高程序執(zhí)行效率、減少程序長(zhǎng)度、最大限度地優(yōu)化程序的目的。順序程序的特點(diǎn)和設(shè)計(jì)方法。結(jié)構(gòu)比較單一和簡(jiǎn)單,按程序編寫(xiě)的順序依次執(zhí)行,中間沒(méi)有任何分支,程序流向不變。數(shù)據(jù)傳送指令使用得較多,沒(méi)有控制轉(zhuǎn)移類指令。作為復(fù)雜程序的某個(gè)組成部分,如循環(huán)結(jié)構(gòu)程序中需多次重復(fù)執(zhí)行的某段程序(稱為循環(huán)處理)。大家網(wǎng):/4.2.2順序程序設(shè)計(jì)實(shí)例
【例1】
有兩個(gè)6位BCD碼分別存放在片內(nèi)RAM30H、31H、32H單元和40H、41H、42H單元內(nèi),求它們的和并將和存放到片內(nèi)RAM50H、51H、52H單元中。解:設(shè)定片內(nèi)RAM30H單元存放高位,片內(nèi)RAM32H單元存放低位,其他單元與之類同。BCD碼加法運(yùn)算后,要用DA指令進(jìn)行調(diào)整。
大家網(wǎng):/參考程序:地址機(jī)器碼程序注釋ORG0000H0000H020030LJMPMAINORG0030H0030HE532MAIN:MOVA,32H;低2位被加數(shù)送入累加器A0032H2542ADDA,42H0034HD4DAA;BCD碼調(diào)整0035HF552MOV52H,A;存放和的低2位0037HE531MOVA,31H;中2位被加數(shù)送入累加器A0039H3541ADDCA,41H;加上低位的進(jìn)位003BHD4DAA;BCD碼調(diào)整003CHF551MOV51H,A;存放和的中2位003EHE530MOVA,30H;高2位被加數(shù)送入累加器A0040H3540ADDCA,40H;加上中位的進(jìn)位0042HD4DAA;BCD碼調(diào)整0043HF550MOV50H,A;存放和的高2位0045H80FESJMP$;暫停END大家網(wǎng):/4.2.2順序程序設(shè)計(jì)實(shí)例
【例2】
有一個(gè)16位二進(jìn)制負(fù)數(shù)的補(bǔ)碼存放在片內(nèi)RAM30H、31H單元內(nèi),求它的原碼的絕對(duì)值并將它存放到片內(nèi)RAM40H、41H單元。解:設(shè)定片內(nèi)RAM30H單元存放高位,片內(nèi)RAM31H單元存放低位,其他單元與之類同。補(bǔ)碼取反后要加1,絕對(duì)值要去掉符號(hào)位。大家網(wǎng):/地址機(jī)器碼程序注釋 ORG0000H0000H020030 LJMPMAIN ORG0030H0030HE531MAIN: MOVA,31H;低8位補(bǔ)碼送入累加器A0032HF4 CPLA;低8位取反0033H2401 ADDA,#01H;補(bǔ)碼取反后要加10035HF541 MOV41H,A;存放原碼絕對(duì)值的低8位0037HE530 MOVA,30H;高8位補(bǔ)碼送入累加器A0039HF4 CPLA;高8位取反003AH3400 ADDCA,#00H;加上低8位的進(jìn)位003CH547F ANLA,#7FH;去掉最高位符號(hào)位003EHF540 MOV40H,A;存放原碼絕對(duì)值的高7位0040H80FE SJMP$;暫停 END參考程序:大家網(wǎng):/4.3循環(huán)程序設(shè)計(jì)
4.3.1循環(huán)程序設(shè)計(jì)方法4.3.2循環(huán)程序設(shè)計(jì)實(shí)例大家網(wǎng):/4.3.1循環(huán)程序設(shè)計(jì)方法
循環(huán)程序的結(jié)構(gòu)一般包括以下幾部分。循環(huán)初始化——是進(jìn)入循環(huán)處理前必須要有的一個(gè)環(huán)節(jié),用于完成循環(huán)前的準(zhǔn)備工作。循環(huán)初始化包括給工作寄存器(或其他存儲(chǔ)單元)設(shè)置計(jì)數(shù)初值、地址指針、數(shù)據(jù)塊長(zhǎng)度等。循環(huán)處理——是需要多次重復(fù)執(zhí)行的程序段。循環(huán)處理是循環(huán)程序的核心,用于完成主要的計(jì)算和操作任務(wù)。循環(huán)控制——是用條件轉(zhuǎn)移指令控制循環(huán)是否繼續(xù)。每循環(huán)一次,根據(jù)循環(huán)結(jié)束條件進(jìn)行一次判斷;當(dāng)滿足條件時(shí),停止循環(huán),繼續(xù)執(zhí)行其他程序;否則,再作循環(huán)。循環(huán)結(jié)束——用于存放循環(huán)程序的執(zhí)行結(jié)果,同時(shí)恢復(fù)相關(guān)工作單元的初值。大家網(wǎng):/4.3.1循環(huán)程序設(shè)計(jì)方法
循環(huán)程序一般有兩種編寫(xiě)方法。先循環(huán)處理后循環(huán)控制(即先處理后判斷),其流程如下圖所示。先循環(huán)控制后循環(huán)處理(即先判斷后處理),其流程如下圖所示。循環(huán)處理和循環(huán)控制構(gòu)成循環(huán)體,若循環(huán)程序的循環(huán)體內(nèi)不再包含其他循環(huán)程序,則稱為單重循環(huán)程序。若循環(huán)程序的循環(huán)體內(nèi)包含有其他循環(huán)程序,則稱為多重循環(huán)程序,又稱為循環(huán)嵌套。多重循環(huán)程序中的各重循環(huán)不能有交叉,不能從外循環(huán)跳入內(nèi)循環(huán),只能外循環(huán)內(nèi)嵌套內(nèi)循環(huán)。兩重循環(huán)程序流程如下圖所示。大家網(wǎng):/
先判斷后處理先處理后判斷兩重循環(huán)循環(huán)程序流程圖循環(huán)程序流程圖程序流程圖
大家網(wǎng):/4.3.1循環(huán)程序設(shè)計(jì)方法
循環(huán)程序的特點(diǎn)和設(shè)計(jì)方法。程序結(jié)構(gòu)緊湊,占用存儲(chǔ)單元較少,程序中間有分支,循環(huán)程序本質(zhì)上是分支程序的一種特殊形式。DJNZ指令使用得較多,凡是分支程序中可以使用的控制轉(zhuǎn)移類指令,循環(huán)程序一般都可以使用。循環(huán)控制的形式有多種。計(jì)數(shù)循環(huán)是最常用的一種,它先預(yù)置計(jì)數(shù)初值,再用DJNZ指令控制循環(huán)次數(shù);條件循環(huán)也是較常用的一種,它先預(yù)置結(jié)束循環(huán)的條件,再用CJNE指令、JZ指令或JB指令控制循環(huán)的結(jié)束。大家網(wǎng):/4.3.2循環(huán)程序設(shè)計(jì)實(shí)例【例3】
片內(nèi)RAM中存放有10個(gè)數(shù)據(jù),首地址為30H,編程將數(shù)據(jù)塊傳送到片外RAM以1000H為首地址的存儲(chǔ)單元中。解:該程序是單重循環(huán)程序,片內(nèi)RAM首地址30H、片外RAM首地址1000H和數(shù)據(jù)塊長(zhǎng)度10都是循環(huán)初始化的內(nèi)容。循環(huán)控制是對(duì)數(shù)據(jù)塊長(zhǎng)度進(jìn)行判斷,每傳送一個(gè)數(shù)據(jù),存放數(shù)據(jù)塊長(zhǎng)度的寄存器減1;10個(gè)數(shù)據(jù)傳送完,存放數(shù)據(jù)塊長(zhǎng)度的寄存器內(nèi)容正好為零,退出循環(huán)。大家網(wǎng):/4.3.2循環(huán)程序設(shè)計(jì)實(shí)例地址機(jī)器碼程序注釋
ORG0000H0000H020100
LJMPMAIN
ORG0100H0100H7930MAIN:
MOVR1,#30H;置片內(nèi)RAM地址指針30H0102H901000
MOVDPTR,#1000H;置片外RAM地址指針1000H0105H7A0A
MOVR2,#10;數(shù)據(jù)塊的長(zhǎng)度0107HE7LOOP:
MOVA,@R1;從片內(nèi)RAM取數(shù)據(jù)0108HF0MOVX@DPTR,A;數(shù)據(jù)傳送到片外RAM0109H09
INCR1;修改片內(nèi)RAM地址指針010AHA3
INCDPTR;修改片外RAM地址指針010BHDAFA
DJNZR2,LOOP;循環(huán)次數(shù)未到10次,轉(zhuǎn)移010DH80FE
SJMP$
END參考程序:大家網(wǎng):/4.3.2循環(huán)程序設(shè)計(jì)實(shí)例【例4】
P1口做輸出口,控制8盞燈(P1口輸出低電平時(shí)燈被點(diǎn)亮),編程使燈按以下規(guī)律顯示:同一時(shí)間只有兩盞燈點(diǎn)亮,從P1.7、P1.6控制的燈開(kāi)始,每盞燈閃爍5次,再移向下兩盞燈,同樣閃爍5次,循環(huán)往復(fù),延時(shí)時(shí)間1s。晶振頻率6MHz。解:主程序是雙重循環(huán)程序,循環(huán)移位是外循環(huán),燈閃爍5次是內(nèi)循環(huán),內(nèi)循環(huán)程序不能與外循環(huán)程序交叉。延時(shí)1S采用三重循環(huán)程序。晶振頻率為6MHz時(shí),機(jī)器周期為2s,延時(shí)程序的延時(shí)時(shí)間計(jì)算方法如下:
{1+[1+(1+(1+1+2)×125+2)×200+2]×5+2}×2s=1006036s=1.006036s大家網(wǎng):/4.3.2循環(huán)程序設(shè)計(jì)實(shí)例地址機(jī)器碼程序注釋ORG0000H0000H020030LJMPMAINORG0030H0030H745FMAIN:MOVA,#5FH;燈點(diǎn)亮初始狀態(tài)0032H7905LP1:MOVR1,#5;循環(huán)閃爍次數(shù)0034HF590LP2:MOVP1,A0036H120100LCALLDELAY;延時(shí)1s0039H7590FFMOVP1,#0FFH003CH120100LCALLDELAY;延時(shí)1s003FHD9F3DJNZR1,LP2;循環(huán)閃爍次數(shù)不夠5次,繼續(xù)0041H03RRA;右移一位0042H03RRA;再右移一位0043H80EDSJMPLP1主程序:大家網(wǎng):/地址機(jī)器碼程序注釋ORG0100H0100H7B05DELAY:MOVR3,#5;延時(shí)1s的循環(huán)次數(shù)0102H7CC8DEL3:MOVR4,#200;延時(shí)200ms的循環(huán)次數(shù)0104H7D7DDEL2:MOVR5,#125;延時(shí)1ms的循環(huán)次數(shù)0106H00DEL1:NOP0107H00NOP0108HDDFEDJNZR5,DEL1010AHDCF9DJNZR4,DEL2010CHDBF5DJNZR3,DEL3010EH22RET;子程序返回END延時(shí)子程序:大家網(wǎng):/4.3.2循環(huán)程序設(shè)計(jì)實(shí)例【例5】
P1口做為輸出口控制步進(jìn)電動(dòng)機(jī)的四相繞組,編寫(xiě)程序,控制步進(jìn)電動(dòng)機(jī)每2s正向轉(zhuǎn)動(dòng)一步。晶振頻率6MHz。解:步距角:θb=360/mZ
(°)
電機(jī)轉(zhuǎn)速:n=60f/mZ
(r/min)上式中:f為脈沖頻率,單位:Hz或步/s。
m為拍數(shù),本例中為4。
Z為轉(zhuǎn)子齒數(shù),本例中取5。拍數(shù)m=4,若使用的步進(jìn)電動(dòng)機(jī)轉(zhuǎn)子齒數(shù)Z為5,則步距角θb=18°。題目要求步進(jìn)電動(dòng)機(jī)每2s正向轉(zhuǎn)動(dòng)一步,即T=2s,則f=0.5Hz,電機(jī)轉(zhuǎn)速n=1.5r/min。用三重循環(huán)設(shè)計(jì)2s的循環(huán)程序。晶振頻率為6MHz時(shí),機(jī)器周期為2s,延時(shí)程序的延時(shí)時(shí)間計(jì)算方法如下:
{1+[1+(1+1+2×123+2)×200+2]×20+2}×2s=2000126s=2.000126s大家網(wǎng):/
P1.0~P1.3口作為輸出口分別控制步進(jìn)電動(dòng)機(jī)的四相繞組,步進(jìn)電動(dòng)機(jī)的控制狀態(tài)與P1口的控制碼的對(duì)應(yīng)關(guān)系如下表所示。控制狀態(tài)P1口控制碼P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0D相C相B相A相A相、B相繞組通電03H00000011B相、C相繞組通電06H00000110C相、D相繞組通電0CH00001100D相、A相繞組通電09H00001001大家網(wǎng):/地址機(jī)器碼程序注釋ORG0000H0000H020030LJMPMAIN
ORG0030H0030H759003MAIN:MOVP1,#03H;AB相通電0033H120100LCALLDELAY0036H759006MOVP1,#06H;BC相通電0039H120100LCALLDELAY003CH75900CMOVP1,#0CH;CD相通電003FH120100LCALLDELAY0042H759009MOVP1,#09H;DA相通電0045H120100LCALLDELAY0048H80E6SJMPMAIN;重復(fù)循環(huán)主程序:大家網(wǎng):/地址機(jī)器碼程序注釋ORG0100H0100H7B14DELAY:MOVR3,#20;延時(shí)2s的循環(huán)次數(shù)0102H7FC8LP1:MOVR7,#200;延時(shí)100ms的循環(huán)次數(shù)0104H7E7BLP2:MOVR6,#123;延時(shí)0.5ms的循環(huán)次數(shù)0106H00NOP0107HDEFELP3:DJNZR6,LP30109HDFF9DJNZR7,LP2010BHDBF5DJNZR3,LP1010DH22RETEND;程序結(jié)束延時(shí)子程序:大家網(wǎng):/4.3.2循環(huán)程序設(shè)計(jì)實(shí)例【例6】
片內(nèi)RAM從50H單元開(kāi)始存放了10個(gè)無(wú)符號(hào)數(shù),編程將它們按由小到大的順序排列。解:數(shù)據(jù)排序的方法有很多,本例采用常用的冒泡排序法,又稱為兩兩比較法。想象把10個(gè)數(shù)縱向排列,自上而下將存儲(chǔ)單元相鄰的兩個(gè)數(shù)進(jìn)行比較,若前數(shù)大于后數(shù),則存儲(chǔ)單元中的兩個(gè)數(shù)互換位置;若前數(shù)小于后數(shù),則存儲(chǔ)單元中的兩個(gè)數(shù)保持原來(lái)位置。按同樣的原則依次比較后面的數(shù)據(jù),直到該組數(shù)據(jù)全部比較完,經(jīng)過(guò)第1輪的比較,最大的數(shù)據(jù)就像冒泡一樣排在了存儲(chǔ)單元最末的位置上。經(jīng)過(guò)9輪冒泡,便可完成10個(gè)數(shù)據(jù)的排序。
大家網(wǎng):/
在實(shí)際排序中,10個(gè)數(shù)不一定要經(jīng)過(guò)9輪排序冒泡,可能只要幾次就可以了。為了減少不必要的冒泡次數(shù),可以設(shè)計(jì)一個(gè)交換標(biāo)志,每一輪冒泡的開(kāi)始將交換標(biāo)志位清0,在該輪數(shù)據(jù)比較中若有數(shù)據(jù)位置互換,則將交換標(biāo)志位置1;每輪冒泡結(jié)束時(shí),若交換標(biāo)志位仍為0,則表明數(shù)據(jù)排序已完成,可以提前結(jié)束排序。
大家網(wǎng):/4.3.2循環(huán)程序設(shè)計(jì)實(shí)例 ORG0000H0000H020100 LJMPMAIN ORG0100H0100H7950MAIN: MOVR1,#50H;置數(shù)據(jù)塊首地址0102H7A09 MOVR2,#09H;置每次冒泡比較次數(shù)0104HC240 CLR40H;交換標(biāo)志位清00106HE7LOOP1: MOVA,@R1;取前數(shù)0107H09INCR10108H8730MOV30H,@R1;取后數(shù)010AHB53000CJNEA,30H,LOOP2;比較前數(shù)與后數(shù)的大小010DH4007LOOP2: JCLOOP3;若前數(shù)<后數(shù)則轉(zhuǎn)移,不互換010FHF7MOV@R1,A;大數(shù)存放到后數(shù)的位置0110H19DECR10111HA730MOV@R1,30H;小數(shù)存放到前數(shù)的位置0113H09INCR1;恢復(fù)數(shù)據(jù)指針,準(zhǔn)備下一次比較0114HD240SETB40H;有互換,標(biāo)志位置10116HDAEELOOP3: DJNZR2,LOOP1;若一次冒泡未完,繼續(xù)進(jìn)行比較0118H2040E5JB40H,MAIN;若有交換,繼續(xù)進(jìn)行下一輪冒泡011BH80FESJMP$END大家網(wǎng):/4.4分支程序設(shè)計(jì)
4.4.1分支程序設(shè)計(jì)方法4.4.2分支程序設(shè)計(jì)實(shí)例大家網(wǎng):/4.4.1分支程序設(shè)計(jì)方法分支程序是根據(jù)程序的要求改變程序的執(zhí)行順序,并根據(jù)條件對(duì)程序的流向進(jìn)行判斷的程序結(jié)構(gòu)。分支程序一般有兩個(gè)或兩個(gè)以上的出口。分支程序又分為單分支和多分支結(jié)構(gòu)。大家網(wǎng):/4.4.1分支程序設(shè)計(jì)方法分支程序的特點(diǎn)和設(shè)計(jì)方法。程序中有轉(zhuǎn)移指令包括無(wú)條件轉(zhuǎn)移、條件轉(zhuǎn)移和散轉(zhuǎn)指令。分支的出口有兩個(gè)以上時(shí),形成散轉(zhuǎn)程序,一般用散轉(zhuǎn)指令來(lái)實(shí)現(xiàn),設(shè)計(jì)方法有4種。分別是轉(zhuǎn)移指令表法、地址偏移量表法、轉(zhuǎn)向地址表法和利用RET指令法。單分支程序一般有一個(gè)入口、兩個(gè)出口,一般用無(wú)條件轉(zhuǎn)移和條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn),結(jié)構(gòu)形式有兩種。一種是當(dāng)條件滿足時(shí),執(zhí)行處理程序2,否則執(zhí)行處理程序3。分支程序流程圖如下圖(a)所示。另一種是當(dāng)條件滿足時(shí),跳過(guò)處理程序2,直接執(zhí)行處理程序3,否則順序執(zhí)行處理程序2和處理程序3。分支程序流程圖如下圖(b)所示。大家網(wǎng):/4.4.1分支程序設(shè)計(jì)方法(a)分支程序流程圖(b)分支程序流程圖大家網(wǎng):/4.4.1分支程序設(shè)計(jì)方法分支程序允許嵌套,即一個(gè)分支接一個(gè)分支,形成樹(shù)狀多分支結(jié)構(gòu)。多分支程序流程圖如右圖所示。多分支程序流程圖大家網(wǎng):/4.4.2分支程序設(shè)計(jì)實(shí)例【例7】
設(shè)計(jì)一個(gè)水塔水位控制系統(tǒng),晶振頻率6MHz。設(shè)計(jì)要求如下:(1)在水塔內(nèi)三個(gè)不同的高度分別安裝了一根固定不動(dòng)的金屬棒,正常情況下,塔內(nèi)水位應(yīng)保持在虛線之內(nèi),水位控制原理如下圖所示。(2)A棒處于水位上限,B棒處于水位下限。當(dāng)水位低于水位下限時(shí),自動(dòng)啟動(dòng)水泵電機(jī)給水塔供水;直到塔內(nèi)水位達(dá)到水位上限,自動(dòng)停止水泵電機(jī)動(dòng)轉(zhuǎn)。(3)塔內(nèi)水位從水位上限下降到水位下限的過(guò)程中,水泵電機(jī)不會(huì)自動(dòng)啟動(dòng)。(4)水塔進(jìn)水時(shí),要有信號(hào)燈指示;水位檢測(cè)發(fā)生故障時(shí),要有故障燈指示并使水塔水位控制系統(tǒng)停止工作。大家網(wǎng):/4.4.2分支程序設(shè)計(jì)實(shí)例
由于水的導(dǎo)電作用,當(dāng)塔內(nèi)水位達(dá)到水位下限時(shí),B棒接通+5V;當(dāng)塔內(nèi)水位達(dá)到水位上限時(shí),A棒也接通+5V。
水位上限信號(hào)輸入至P1.0,水位下限信號(hào)輸入至P1.1,P1.2輸出控制信號(hào)以控制水泵電機(jī)的啟動(dòng)(P1.2=0)和停止(P1.2=1),P1.3輸出顯示信號(hào)以指示水泵電機(jī)的運(yùn)行狀態(tài)(P1.3=0時(shí)點(diǎn)亮),P1.4輸出故障信號(hào)以指示水位檢測(cè)系統(tǒng)故障狀態(tài)(P1.4=0時(shí)點(diǎn)亮)。解:當(dāng)塔內(nèi)水位處于水位下限以下時(shí),A、B棒通過(guò)電阻接地。
大家網(wǎng):/4.4.2分支程序設(shè)計(jì)實(shí)例
水位控制信號(hào)與水泵電機(jī)控制狀態(tài)的對(duì)應(yīng)關(guān)系為了防止電機(jī)頻繁啟停,在啟動(dòng)或停止電機(jī)后最少要維持這一狀態(tài)20s,這可以采用延時(shí)程序來(lái)實(shí)現(xiàn)。
P1.1P1.0控制狀態(tài)P1.2P1.3P1.400水泵電機(jī)啟動(dòng)00101故障報(bào)警11010維持原來(lái)狀態(tài)111水泵電機(jī)停止111大家網(wǎng):/4.4.2分支程序設(shè)計(jì)實(shí)例 ORG0000H0000H020030 LJMPMAIN ORG0030H0030H439003MAIN:ORLP1,#03H;水位信號(hào)輸入端做讀入準(zhǔn)備0033HF590MOVA,P1;讀入水位檢測(cè)信號(hào)0035H30E108JNBACC.1,QDZB;P1.1=0,轉(zhuǎn)移至啟動(dòng)準(zhǔn)備0038H20E016JBACC.0,TZDJ;P1.0=1,轉(zhuǎn)移至停止電機(jī)003BH120100YS:LCALLDELAY;延時(shí)20s003EH80F0SJMPMAIN0040H30E008QDZB:JNBACC.0,QDDJ;P1.0=0,轉(zhuǎn)移至啟動(dòng)電機(jī)0043HD292SETBP1.2;停止電機(jī)0045HD293SETBP1.3;關(guān)閉電機(jī)運(yùn)行指示0047HC294CLRP1.4;打開(kāi)水位檢測(cè)故障指示0049H80FESJMP$004BHC292QDDJ:CLRP1.2;啟動(dòng)電機(jī)004DHC293CLRP1.3;打開(kāi)電機(jī)運(yùn)行指示004FH80EASJMPYS0051HD292TZDJ:SETBP1.2;停止電機(jī)0053HD293SETBP1.30055H80E4SJMPYS主程序:大家網(wǎng):/地址機(jī)器碼程序注釋 ORG0100H0100H7BC8DELAY:MOVR3,#200;延時(shí)20s的循環(huán)次數(shù)0102H7FC8LP1:MOVR7,#200;延時(shí)100ms的循環(huán)次數(shù)0104H7E7BLP2:MOVR6,#123;延時(shí)0.5ms的循環(huán)次數(shù)0106H00NOP0107HDEFELP3:DJNZR6,LP30109HDFF9DJNZR7,LP2010BHDBF5DJNZR3,LP1010DH22RETEND;程序結(jié)束延時(shí)子程序:大家網(wǎng):/4.5子程序設(shè)計(jì)
4.5.1子程序設(shè)計(jì)方法4.5.2子程序設(shè)計(jì)實(shí)例
大家網(wǎng):/4.5.1子程序設(shè)計(jì)方法子程序是指完成某一專門(mén)任務(wù)并能被其他程序反復(fù)調(diào)用的程序段。調(diào)用子程序的程序稱為主程序或調(diào)用程序。使用子程序的過(guò)程稱為調(diào)用子程序。子程序執(zhí)行完后返回主程序的過(guò)程稱為子程序返回。主程序和子程序是相對(duì)的,同一程序既可以作為另一程序的子程序,也可以有自己的子程序。也就是說(shuō),子程序是允許嵌套的,嵌套深度和堆棧區(qū)的大小有關(guān)。采用子程序能使整個(gè)程序結(jié)構(gòu)簡(jiǎn)單,縮短程序設(shè)計(jì)時(shí)間,減少對(duì)存儲(chǔ)空間的占用。大家網(wǎng):/4.5.1子程序設(shè)計(jì)方法子程序的特點(diǎn)和設(shè)計(jì)方法子程序具有通用性和獨(dú)立性,以滿足所有調(diào)用程序?qū)崿F(xiàn)資源共享。子程序的第一條指令的地址稱為子程序的入口地址,該指令前應(yīng)有標(biāo)號(hào)。合理地確定子程序的參數(shù)傳遞方式:入口參數(shù)是子程序需要的原始參數(shù),由主程序通過(guò)相關(guān)的工作寄存器、特殊功能寄存器、片內(nèi)RAM或堆棧等傳送給子程序;出口參數(shù)是根據(jù)入口參數(shù)執(zhí)行子程序后獲得的結(jié)果,由子程序通過(guò)相關(guān)的工作寄存器、特殊功能寄存器、片內(nèi)RAM或堆棧等傳遞給主程序。在主程序中可以用調(diào)用指令調(diào)用子程序,在子程序末尾用RET返回指令從子程序返回主程序。大家網(wǎng):/4.5.1子程序設(shè)計(jì)方法根據(jù)需要保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。在子程序的開(kāi)始,使用壓棧指令把需要保護(hù)的內(nèi)容壓入堆棧;在返回主程序前,使用彈出指令把堆棧中保護(hù)的內(nèi)容送回原來(lái)的存儲(chǔ)單元中。子程序中有可能要使用累加器A或工作寄存器,在子程序使用它們之前,把它們中可能存有的主程序的中間結(jié)果保存起來(lái),這一過(guò)程稱為保護(hù)現(xiàn)場(chǎng)。在子程序執(zhí)行完并將返回主程序之前,再將這些中間結(jié)果取出,送回到累加器A或原來(lái)的工作寄存器中,這一過(guò)程稱為恢復(fù)現(xiàn)場(chǎng)。子程序中應(yīng)盡量使用相對(duì)轉(zhuǎn)移指令而不使用其他轉(zhuǎn)移指令,以便子程序放在內(nèi)存的任何區(qū)域都能被主程序調(diào)用。要正確地設(shè)置堆棧指針,以避免堆棧區(qū)與工作寄存器或其他存儲(chǔ)單元發(fā)生沖突。大家網(wǎng):/4.5.1子程序設(shè)計(jì)方法傳送子程序參數(shù)的方法。利用寄存器或片內(nèi)RAM傳送參數(shù)??梢园讶肟趨?shù)存放到寄存器或片內(nèi)RAM中傳送給子程序,也可以把出口參數(shù)存放到寄存器或片內(nèi)RAM中傳送給主程序。利用寄存器傳送參數(shù)的地址。把存放入口參數(shù)的地址通過(guò)寄存器傳送給子程序,子程序根據(jù)寄存器中存放入口參數(shù)的地址便可找到入口參數(shù)并對(duì)它們進(jìn)行相應(yīng)操作;出口參數(shù)的地址也可通過(guò)寄存器傳送給主程序。利用堆棧傳送參數(shù)。可以用壓棧指令PUSH把入口參數(shù)壓入堆棧傳送給子程序,也可以使用壓棧指令PUSH把出口參數(shù)壓入堆棧傳送給主程序。大家網(wǎng):/4.5.2子程序設(shè)計(jì)實(shí)例【例10】
將片內(nèi)RAM區(qū)20H~24H單元中的一位十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼,并分別存放到片內(nèi)RAM區(qū)30H~34H單元中。解:ASCII碼是有一定規(guī)律的編碼,如十六進(jìn)制數(shù)的0~9的ASCII碼為該數(shù)值加上30H,分別為30H~39H;十六進(jìn)制數(shù)的A~F的ASCII碼為該數(shù)值加上37H,分別為41H~46H。大家網(wǎng):/4.5.2子程序設(shè)計(jì)實(shí)例地址機(jī)器碼程序注釋ORG0000H0000H020100LJMPMAINORG0100H0100H7C05MAIN:MOVR4,#05H;數(shù)據(jù)塊的長(zhǎng)度0102H7820MOVR0,#20H;存放十六進(jìn)制數(shù)首地址0104H7930MOVR1,#30H;存放ASCII碼首地址0106HE6LP1:MOVA,@R0;取十六進(jìn)制數(shù)0107H120150LCALLHAC;調(diào)用代碼轉(zhuǎn)換程序010AHF7MOV@R1,A;存放ASCII碼010BH08INCR0010CH09INCR1010DHDCF7DJNZR4,LP1010FH80FESJMP$主程序:大家網(wǎng):/4.5.2子程序設(shè)計(jì)實(shí)例地址機(jī)器碼程序注釋;程序名:HAC;功能:十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼;入口參數(shù):A存放要轉(zhuǎn)換的十六進(jìn)制數(shù);出口參數(shù):A存放轉(zhuǎn)換后的ASCII碼;占用資源:PSWORG0150H;子程序從地址0150H開(kāi)始存放0150HC0D0HAC:PUSHPSW;保護(hù)現(xiàn)場(chǎng)0152H540FANLA,#0FH;屏蔽掉高4位0154HC0E0PUSHACC;0156HC3CLRC;0157H940ASUBBA,#0AH;比較A中內(nèi)容的大小0159HD0E0POPACC015BH4002JCLP2;(A)<10時(shí),轉(zhuǎn)移015DH2407ADDA,#07H015FH2430LP2:ADDA,#30H0161HD0D0POPPSW;恢復(fù)現(xiàn)場(chǎng)0163H22RET;子程序返回END子程序:大家網(wǎng):/4.6查表程序設(shè)計(jì)
4.6.1查表程序設(shè)計(jì)方法4.6.2查表程序設(shè)計(jì)實(shí)例大家網(wǎng):/4.6.1查表程序設(shè)計(jì)方法在單片機(jī)的實(shí)際應(yīng)用中,經(jīng)常要對(duì)一些數(shù)據(jù)進(jìn)行函數(shù)運(yùn)算,例如求平方、正弦函數(shù)等,為了提高單片機(jī)執(zhí)行程序的速度,一般將某函數(shù)的全部函數(shù)值按一定的規(guī)律編成表格存放到程序存儲(chǔ)器中。查表程序就是根據(jù)某數(shù)據(jù)的函數(shù)運(yùn)算要求,按索引號(hào)從程序存儲(chǔ)器中查找與之相對(duì)應(yīng)的函數(shù)值的程序結(jié)構(gòu)。設(shè)計(jì)查表程序時(shí),主要通過(guò)兩條查表指令實(shí)現(xiàn)查表功能。大家網(wǎng):/4.6.1查表程序設(shè)計(jì)方法查表程序的特點(diǎn)和設(shè)計(jì)方法。查表指令“MOVCA,@A+DPTR”的查表過(guò)程比較簡(jiǎn)單。查表時(shí)首先需要把數(shù)據(jù)表格起始地址存入DPTR,然后把所查數(shù)據(jù)的索引值送入累加器A中,最后使用查表指令“MOVCA,@A+DPTR”完成查表。查表指令“MOVCA,@A+PC”的查表過(guò)程相對(duì)復(fù)雜一些。查表時(shí)首先使用傳送指令把所查數(shù)據(jù)的索引值送入累加器A,然后用“ADDA,#data”指令對(duì)累加器A進(jìn)行修正。data值由該式確定:PC+data=數(shù)據(jù)表格的首地址。其中,PC是“MOVCA,@A+PC”的下一條指令的地址。因此,data值實(shí)際等于查表指令和數(shù)據(jù)表格之間的字節(jié)數(shù)。最后使用查表指令“MOVCA,@A+PC”完成查表。大家網(wǎng):/4.6.2查表程序設(shè)計(jì)實(shí)例【例14】
變量a、b均為小于10的正整數(shù),編程計(jì)算c=a2+b2,其中變量a、b分別存放在片內(nèi)RAM的51H和52H單元中,計(jì)算結(jié)果c存放到片內(nèi)RAM的53H單元。解法一:首先把平方表格起始地址0150H存入DPTR,然后把要查數(shù)據(jù)a或b的索引值送入累加器A中,最后使用查表指令“MOVCA,@A+DPTR”完成查表。大家網(wǎng):/4.6.2查表程序設(shè)計(jì)實(shí)例 ORG0000H0000H020100 LJMPMAIN
ORG0100H0100H900150MAIN:MOVDPTR,#0150H;平方表格首地址0103HE551MOVA,51H;取數(shù)a送到A中作為索引值0105H93 MOVCA,@A+DPTR;查數(shù)a的平方0106HF8 MOVR0,A;數(shù)a的平方送到R0中暫存0107HE552 MOVA,52H;取數(shù)b送到A中作索引值0109H93 MOVCA,@A+DPTR;查數(shù)b的平方010AH28 ADDA,R0;求平方和010BHF553MOV53H,A010DH80FESJMP$ ORG0150H0150H00010409TABLE:DB0,1,4,9;0~9平方表0154H101924DB16,25,360157H314051DB49,64,81END主程序:大家網(wǎng):/4.6.2查表程序設(shè)計(jì)實(shí)例解法二:如果采用查表指令“MOVCA,@A+PC”,首先把要查數(shù)據(jù)a或b的索引值送入累加器A中,然后用“ADDA,#data”指
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度住宅小區(qū)車位維修保養(yǎng)合同范本3篇
- 2024物流轉(zhuǎn)包商服務(wù)質(zhì)量評(píng)價(jià)體系合同
- 2024牛肉產(chǎn)業(yè)技術(shù)創(chuàng)新與研發(fā)合作合同
- 2025年度大理石石材工程環(huán)保評(píng)估與施工合同3篇
- 2025年度新能源項(xiàng)目打樁工程合作合同4篇
- 2025年度智能窗簾控制系統(tǒng)研發(fā)與集成承包合同4篇
- 2024年電商平臺(tái)運(yùn)營(yíng)服務(wù)外包合同
- 2024版項(xiàng)目股權(quán)出售合同:公司權(quán)益轉(zhuǎn)讓協(xié)議
- 2025年度新能源電池產(chǎn)品進(jìn)出口合同4篇
- 2025年度房地產(chǎn)租賃權(quán)轉(zhuǎn)讓合同3篇
- 服裝板房管理制度
- 2024年縣鄉(xiāng)教師選調(diào)進(jìn)城考試《教育學(xué)》題庫(kù)及完整答案(考點(diǎn)梳理)
- 車借給別人免責(zé)協(xié)議書(shū)
- 河北省興隆縣盛嘉恒信礦業(yè)有限公司李杖子硅石礦礦山地質(zhì)環(huán)境保護(hù)與治理恢復(fù)方案
- 第七章力與運(yùn)動(dòng)第八章壓強(qiáng)第九章浮力綜合檢測(cè)題(一)-2023-2024學(xué)年滬科版物理八年級(jí)下學(xué)期
- 醫(yī)療機(jī)構(gòu)診療科目名錄(2022含注釋)
- 微視頻基地策劃方案
- 光伏項(xiàng)目質(zhì)量評(píng)估報(bào)告
- 八年級(jí)一本·現(xiàn)代文閱讀訓(xùn)練100篇
- 2023年電池系統(tǒng)測(cè)試工程師年度總結(jié)及下一年計(jì)劃
- 應(yīng)急預(yù)案評(píng)分標(biāo)準(zhǔn)表
評(píng)論
0/150
提交評(píng)論