清華大學(xué)單片機課件第4章_第1頁
清華大學(xué)單片機課件第4章_第2頁
清華大學(xué)單片機課件第4章_第3頁
清華大學(xué)單片機課件第4章_第4頁
清華大學(xué)單片機課件第4章_第5頁
已閱讀5頁,還剩159頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章匯編語言程序設(shè)計

(課時:12學(xué)時)大家網(wǎng):/第4章匯編語言程序設(shè)計(課時:12學(xué)時)大家網(wǎng):htt教學(xué)目的

了解匯編語言程序設(shè)計的特點。掌握匯編語言程序的基本結(jié)構(gòu)及簡單應(yīng)用的設(shè)計方法。用循環(huán)程序設(shè)計一個控制信號燈的程序。用循環(huán)程序設(shè)計一個控制步進(jìn)電動機的程序。用分支程序設(shè)計一個控制汽車信號燈的程序。用分支程序設(shè)計一個控制水塔水位的程序。

學(xué)習(xí)重點和難點分支程序、循環(huán)程序的設(shè)計特點。子程序的編寫和應(yīng)用。大家網(wǎng):/教學(xué)目的了解匯編語言程序設(shè)計的特點。學(xué)習(xí)重點和難點分支程第4章匯編語言程序設(shè)計4.1程序設(shè)計概述4.2順序程序設(shè)計4.3循環(huán)程序設(shè)計4.4分支程序設(shè)計4.5子程序設(shè)計4.6查表程序設(shè)計本章小結(jié)習(xí)題

大家網(wǎng):/第4章匯編語言程序設(shè)計4.1程序設(shè)計概述大家網(wǎng):h4.1程序設(shè)計概述4.1.1程序設(shè)計語言4.1.2匯編語言源程序的編輯與匯編4.1.3匯編語言程序的基本結(jié)構(gòu)4.1.4程序設(shè)計方法和技巧

大家網(wǎng):/4.1程序設(shè)計概述4.1.1程序設(shè)計語言大家網(wǎng):h4.1.1程序設(shè)計語言1.機器語言(MachineLanguage)

這是一種用二進(jìn)制代碼“0”和“1”表示指令和數(shù)據(jù)的程序設(shè)計語言。計算機只能識別二進(jìn)制代碼,這種語言是能被計算機直接識別和執(zhí)行的機器級語言。特點:機器語言能夠被計算機立即識別并加以執(zhí)行,具有執(zhí)行速度快、占用內(nèi)存少等優(yōu)點。但對于使用者來說,用機器語言編寫程序具有編寫難、識別難、記憶難、查錯難、交流難等缺點。大家網(wǎng):/4.1.1程序設(shè)計語言1.機器語言(MachineL4.1.1程序設(shè)計語言2.匯編語言(AssemblyLanguage)

匯編語言是一種用助記符來表示的面向機器的程序設(shè)計語言。不同的機器所使用的匯編語言一般是不同的。但計算機的CPU不能直接識別匯編語言,所以計算機不能立即執(zhí)行匯編語言程序。用匯編語言編寫的源程序,在由計算機執(zhí)行之前,必須將它翻譯成機器語言程序。特點:這種語言彌補了機器語言的不足,用匯編語言編寫程序比用機器語言方便、直觀、易懂、易用、易記??梢跃帉懗鼋Y(jié)構(gòu)緊湊、運行時間精確的程序。所以,這種語言非常適合于實時控制的需要。大家網(wǎng):/4.1.1程序設(shè)計語言2.匯編語言(Assembly4.1.1程序設(shè)計語言3.高級語言(High-LevelLanguage)

高級語言是面向過程并能獨立于計算機硬件結(jié)構(gòu)的通用程序設(shè)計語言,是一種接近人類語言和數(shù)學(xué)表達(dá)式的計算機語言。比如:BASIC、FORTRAN、COBOL、PASCAL、C語言等。高級語言不能被計算機直接識別和執(zhí)行,需要用編譯程序或解釋程序?qū)⒏呒壵Z言編寫的源程序翻譯為機器語言。特點:它比匯編語言易學(xué)、易懂,具有通用性強、易于移植等優(yōu)點。高級語言的語句功能強,它的一條語句往往相當(dāng)于許多條指令,因而用于翻譯的程序要占用較多的存儲空間,而且執(zhí)行時間長,且不易精確掌握,故在高速實時控制中一般是不適用的。大家網(wǎng):/4.1.1程序設(shè)計語言3.高級語言(High-Leve4.1.2匯編語言源程序的編輯與匯編

基本概念在目前單片機的開發(fā)應(yīng)用中,經(jīng)常采用C語言和匯編語言共同編寫程序。要想很好地掌握和應(yīng)用單片機首先要掌握匯編語言。匯編語言是面向機器的程序設(shè)計語言,對于CPU不同的單片機,其匯編語言一般是不同的。用匯編語言編寫的程序稱為匯編語言源程序。匯編語言源程序是由匯編語言語句構(gòu)成的。匯編語言語句可分為兩大類:指令性語句和指示性語句。指令性語句是由指令組成的由CPU執(zhí)行的語句,指示性語句是由偽指令組成的,它不被CPU執(zhí)行,用來告訴匯編程序如何對程序進(jìn)行匯編的指令;由于它不能生成機器語言,故又被稱為偽指令語句。大家網(wǎng):/4.1.2匯編語言源程序的編輯與匯編基本概念大家網(wǎng)4.1.2匯編語言源程序的編輯與匯編

1.指令性語句格式

[標(biāo)號:]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋]

每條匯編語句一般由若干部分組成,每一部分稱為一個字段。每個字段之間應(yīng)該嚴(yán)格地用分界符加以分隔。分界符包括冒號、空格符、逗號、分號等。標(biāo)號段與操作碼之間要加冒號“:”;操作碼與操作數(shù)之間要用空格相隔;各操作數(shù)之間要用逗號“,”相隔;操作數(shù)與注釋段之間要加分號“;”相隔。大家網(wǎng):/4.1.2匯編語言源程序的編輯與匯編1.指令性語句格4.1.2匯編語言源程序的編輯與匯編

2.偽指令的指示性語句格式

[標(biāo)號:]偽操作操作數(shù)[,操作數(shù),......][;注釋]偽指令不是真正的指令,是在匯編時供匯編程序識別的指令,又稱為匯編指令。它不屬于指令系統(tǒng),也無對應(yīng)的機器碼,只是用來對匯編過程進(jìn)行某種控制。利用偽指令告訴匯編程序如何進(jìn)行匯編,為編程提供方便。大家網(wǎng):/4.1.2匯編語言源程序的編輯與匯編2.偽指令的指示性4.1.2匯編語言源程序的編輯與匯編

3.匯編語言源程序的匯編匯編語言源程序必須要轉(zhuǎn)換為機器碼(即目的程序),計算機才能執(zhí)行,這個轉(zhuǎn)換過程稱為匯編。匯編語言源程序的匯編可分為手工匯編和機器匯編兩類。手工匯編是指用人腦通過查指令編碼表(見附錄中的指令表)把匯編語言源程序翻譯成機器碼的過程,又稱為人工代真。機器匯編是用機器代替人腦并由專門的程序來進(jìn)行的,這種程序稱為匯編程序(不同的指令系統(tǒng)匯編程序不同)。機器匯編由計算機自動完成,匯編程序把用匯編語言編寫的源程序翻譯成由機器語言表示的目的程序。反匯編是在分析程序存儲器已有的程序時,將機器語言翻譯成匯編語言的轉(zhuǎn)換過程。大家網(wǎng):/4.1.2匯編語言源程序的編輯與匯編3.匯編語言源程4.1.2匯編語言源程序的編輯與匯編

源程序、匯編程序和目的程序之間的關(guān)系如下圖所示

4.匯編語言源程序的編輯匯編語言源程序一般在微機上借助編輯軟件進(jìn)行編寫,可供使用的編輯工具有許多,如行編輯軟件、屏幕編輯軟件等。大家網(wǎng):/4.1.2匯編語言源程序的編輯與匯編大家網(wǎng):常用偽指令簡介(一)

1.ORG(Origin)匯編起始指令

ORG是程序匯編起始地址定位偽指令,功能:是規(guī)定對匯編語言源程序進(jìn)行匯編時,目的程序在程序存儲器中存放的起始地址。格式:[標(biāo)號:]ORG16位地址或標(biāo)號注意:在一個源程序中,可多次使用ORG指令,以規(guī)定不同程序段的起始位置,地址應(yīng)從小到大順序排列,不允許重疊。例如:

ORG1000H

MOVA,#12H;該指令的機器碼是74H、12H

ADDA,#34H;該指令的機器碼是24H、34H

在上述源程序中,第一條指令的首字節(jié)74H存放到程序存儲器的1000H地址單元中,其他字節(jié)和后續(xù)指令的數(shù)據(jù)順序存放到后面的存儲單元中。大家網(wǎng):/常用偽指令簡介(一)1.ORG(Origin)匯編起始指常用偽指令簡介(二)

2.END(End)匯編結(jié)束指令

END是匯編語言程序結(jié)束偽指令。功能:是表示程序已結(jié)束,匯編程序?qū)ND后面的指令不再匯編。格式:[標(biāo)號:]END注意:在一個源程序中,只能有一條END指令,而且必須放在整個程序的末尾。大家網(wǎng):/常用偽指令簡介(二)2.END(End)匯編結(jié)束指令大常用偽指令簡介(三)

3.EQU(Equate)賦值指令

EQU是賦值(也稱等值)偽指令。功能:把操作數(shù)段中的數(shù)據(jù)或地址賦值給標(biāo)號字段中的字符名稱。格式:字符名稱EQU數(shù)值或匯編符號

注意:字符名稱必須先賦值后使用,故EQU指令通常放在源程序的開頭。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):/常用偽指令簡介(三)3.EQU(Equate)賦值指令常用偽指令簡介(四)

4.DATA(Data)數(shù)據(jù)地址賦值指令

DATA是數(shù)據(jù)地址賦值偽指令。功能:把操作數(shù)段中的表達(dá)式的值賦給標(biāo)號字段中的字符名稱。

格式:字符名稱DATA表達(dá)式

注意:DATA指令功能與EQU指令類似,它們的主要區(qū)別如下:DATA定義的字符名稱可以先使用后定義,DATA指令可以放在源程序的任何位置。DATA只能用來定義8位的數(shù)據(jù)或地址。EQU可以把匯編符號賦給字符名稱,而DATA只能把數(shù)據(jù)賦給字符名稱。DATA可以把表達(dá)式的值賦給字符名稱,這個表達(dá)式是可以進(jìn)行求值運算的。大家網(wǎng):/常用偽指令簡介(四)4.DATA(Data)數(shù)據(jù)地址賦值常用偽指令簡介(五)

5.XDATA數(shù)據(jù)地址賦值指令

XDATA是數(shù)據(jù)地址賦值偽指令。功能:把操作數(shù)段中的表達(dá)式的值賦給標(biāo)號字段中的字符名稱。格式:字符名稱XDATA表達(dá)式

注意:XDATA指令功能與DATA指令類似,它們的主要區(qū)別是XDATA可定義16位的數(shù)據(jù)或地址。大家網(wǎng):/常用偽指令簡介(五)5.XDATA數(shù)據(jù)地址賦值指令大家常用偽指令簡介(六)

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):/常用偽指令簡介(六)6.BIT(Bit)位地址賦值指令常用偽指令簡介(七)

7.DB(DefineByte)定義字節(jié)指令

DB是定義字節(jié)偽指令。功能:從程序存儲器指定地址單元開始存放若干個字節(jié)的數(shù)值或ASCII碼字符。格式:[標(biāo)號:]DB字節(jié)數(shù)據(jù)或ASCII碼字符

注意:多個字節(jié)數(shù)據(jù)或ASCII碼字符之間要用逗號相隔,DB指令常用于定義8位的數(shù)據(jù)常數(shù)表。

例如:

ORG1000HTAB:DB 50H,60,'A' DB 01010111B,'6'

大家網(wǎng):/常用偽指令簡介(七)7.DB(DefineByte)定常用偽指令簡介(八)

8.DW(DefineWord)定義字指令

DW是定義字偽指令。功能:從程序存儲器指定地址單元開始存放若干個字的數(shù)值。格式:[標(biāo)號:]DW字節(jié)數(shù)據(jù)或ASCII碼字符

注意:多個字?jǐn)?shù)據(jù)之間要用逗號相隔,DW指令常用于定義16位的地址表。

例如:

ORG1000HTAB:DW20H,50H,00H,60H

大家網(wǎng):/常用偽指令簡介(八)8.DW(DefineWord)定常用偽指令簡介(九)

9.DS(DefineSpace)定義存儲空間指令

DS是定義存儲空間偽指令。功能:從程序存儲器指定地址單元開始保留表達(dá)式的值所規(guī)定的存儲單元。格式:[標(biāo)號:]DS表達(dá)式

例如:

ORG1000HTAB:DS06H DB25H,35H

在上述源程序中,程序存儲器從1000H單元開始保留6個單元,1006H單元存放25H,1007H單元存放35H。大家網(wǎng):/常用偽指令簡介(九)9.DS(DefineSpace)4.1.3匯編語言程序的基本結(jié)構(gòu)

匯編語言程序具有四種結(jié)構(gòu)形式,即順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)和子程序結(jié)構(gòu)。1.順序程序順序程序是一種最簡單、最基本的程序結(jié)構(gòu),又稱為簡單程序或直線程序。程序按順序一條一條地執(zhí)行指令,程序流向不變。2.循環(huán)程序循環(huán)程序是把需要多次重復(fù)執(zhí)行的某段程序,利用條件轉(zhuǎn)移指令反復(fù)轉(zhuǎn)向執(zhí)行,可減小整個程序的長度,優(yōu)化程序結(jié)構(gòu)。循環(huán)程序一般由循環(huán)初始化、循環(huán)處理、循環(huán)控制和循環(huán)結(jié)束四部分組成。大家網(wǎng):/4.1.3匯編語言程序的基本結(jié)構(gòu)匯編語言程序4.1.3匯編語言程序的基本結(jié)構(gòu)

3.分支程序分支程序是根據(jù)條件進(jìn)行判斷決定程序的執(zhí)行,滿足條件則進(jìn)行程序轉(zhuǎn)移,不滿足條件就順序執(zhí)行程序。判斷是通過條件轉(zhuǎn)移指令實現(xiàn)的。分支程序又分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。4.子程序子程序是指完成某一確定任務(wù)并能被其他程序反復(fù)調(diào)用的程序段。使用子程序可以減小整個程序的長度,實現(xiàn)模塊化程序結(jié)構(gòu)。大家網(wǎng):/4.1.3匯編語言程序的基本結(jié)構(gòu)3.分支程序大家網(wǎng):4.1.3匯編語言程序的基本結(jié)構(gòu)

順序程序流程圖循環(huán)程序流程圖分支程序流程圖

大家網(wǎng):/4.1.3匯編語言程序的基本結(jié)構(gòu)順序程序流程圖4.1.4程序設(shè)計方法和技巧

1.程序設(shè)計的一般步驟(1)分析工作任務(wù),明確要達(dá)到的工作目的、技術(shù)指標(biāo)等。(2)確定解決問題的算法。算法就是如何將實際問題轉(zhuǎn)化成程序模塊來處理,要對不同的算法進(jìn)行分析、比較,找出最適宜的算法。(3)畫程序流程圖。其圖形的符號規(guī)定均與高級語言流程圖相同,如桶形框表示程序的開始或結(jié)束,矩形框表示需要進(jìn)行的工作,菱形框表示需要判斷的事情,指向線表示程序的流向等。(4)分配內(nèi)存工作單元,確定程序與數(shù)據(jù)的存放地址。(5)編寫源程序。(6)上機調(diào)試、修改源程序。大家網(wǎng):/4.1.4程序設(shè)計方法和技巧1.程序設(shè)計的一般步驟大4.1.4程序設(shè)計方法和技巧

2.程序設(shè)計的一般原則按照盡可能使程序簡短和縮短運行時間兩個原則編寫程序。應(yīng)用程序一般都由一個主程序(包括若干個功能模塊)和多個子程序構(gòu)成,即采用模塊化的程序設(shè)計方法。每一功能模塊或子程序都能完成一個明確的任務(wù),實現(xiàn)某個具體功能,如檢測輸入信號、碼制轉(zhuǎn)換、輸出控制信號、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、延時、顯示、打印等。大家網(wǎng):/4.1.4程序設(shè)計方法和技巧2.程序設(shè)計的一般原則大4.1.4程序設(shè)計方法和技巧

3.模塊化程序設(shè)計方法的特點單個模塊結(jié)構(gòu)的程序功能單一,易于編寫、調(diào)試和修改。對程序的局部修改,可以使無關(guān)的部分保持不變。程序可讀性好,便于功能擴展和版本升級。對于使用頻繁的子程序可以建立子程序庫,便于多個模塊調(diào)用??蓪崿F(xiàn)多人同時進(jìn)行程序的編寫和調(diào)試工作,縮短程序編寫時間。大家網(wǎng):/4.1.4程序設(shè)計方法和技巧3.模塊化程序設(shè)計方法的4.1.4程序設(shè)計方法和技巧

4.劃分模塊應(yīng)遵循的原則高內(nèi)聚性。每個模塊應(yīng)具有獨立的功能,能產(chǎn)生一個明確的結(jié)果。低耦合性。模塊之間的控制耦合應(yīng)盡量簡單,數(shù)據(jù)耦合應(yīng)盡量少??刂岂詈鲜侵改K進(jìn)入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換(傳遞)方式、交換量的多少及交換的頻繁程度。模塊長度適中。模塊語句的長度為20~100條的范圍較合適。模塊太長時,分析和調(diào)試比較困難,失去了模塊化程序結(jié)構(gòu)的優(yōu)越性;過短則模塊的連接太復(fù)雜,信息交換太頻繁。大家網(wǎng):/4.1.4程序設(shè)計方法和技巧4.劃分模塊應(yīng)遵循的原則4.1.4程序設(shè)計方法和技巧

5.程序設(shè)計的一般技巧盡量采用循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。這樣可以使程序的總?cè)萘看蟠鬁p少,提高程序的效率,節(jié)省內(nèi)存。盡量少用無條件轉(zhuǎn)移指令。這樣可以使程序條理更加清楚,從而減少錯誤。對于通用的子程序,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其他寄存器的內(nèi)容應(yīng)壓入堆棧,即保護(hù)現(xiàn)場。一般不必把標(biāo)志寄存器壓入堆棧。在中斷處理程序中,除了要保護(hù)中斷處理程序中用到的寄存器外,還要保護(hù)標(biāo)志寄存器。用累加器傳遞入口參數(shù)或返回參數(shù)比較方便,在子程序中,一般不必把累加器內(nèi)容壓入堆棧。大家網(wǎng):/4.1.4程序設(shè)計方法和技巧5.程序設(shè)計的一般技巧大4.2順序程序設(shè)計

4.2.1順序程序設(shè)計方法4.2.2順序程序設(shè)計實例

大家網(wǎng):/4.2順序程序設(shè)計4.2.1順序程序設(shè)計方法大家4.2.1順序程序設(shè)計方法

順序結(jié)構(gòu)程序是最簡單、最基本的程序。要設(shè)計出高質(zhì)量的程序需要掌握一定的技巧,需要熟悉指令系統(tǒng),正確地選擇指令,掌握程序設(shè)計的基本方法和技巧,以達(dá)到提高程序執(zhí)行效率、減少程序長度、最大限度地優(yōu)化程序的目的。順序程序的特點和設(shè)計方法。結(jié)構(gòu)比較單一和簡單,按程序編寫的順序依次執(zhí)行,中間沒有任何分支,程序流向不變。數(shù)據(jù)傳送指令使用得較多,沒有控制轉(zhuǎn)移類指令。作為復(fù)雜程序的某個組成部分,如循環(huán)結(jié)構(gòu)程序中需多次重復(fù)執(zhí)行的某段程序(稱為循環(huán)處理)。大家網(wǎng):/4.2.1順序程序設(shè)計方法順序結(jié)構(gòu)程序是最簡單、最基本4.2.2順序程序設(shè)計實例

【例1】

有兩個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碼加法運算后,要用DA指令進(jìn)行調(diào)整。

大家網(wǎng):/4.2.2順序程序設(shè)計實例【例1】有兩個6位BCD碼參考程序:地址機器碼程序注釋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):/參考程序:地址機器碼程序注釋ORG0000H04.2.2順序程序設(shè)計實例

【例2】

有一個16位二進(jìn)制負(fù)數(shù)的補碼存放在片內(nèi)RAM30H、31H單元內(nèi),求它的原碼的絕對值并將它存放到片內(nèi)RAM40H、41H單元。解:設(shè)定片內(nèi)RAM30H單元存放高位,片內(nèi)RAM31H單元存放低位,其他單元與之類同。補碼取反后要加1,絕對值要去掉符號位。大家網(wǎng):/4.2.2順序程序設(shè)計實例【例2】有一個16位二進(jìn)制地址機器碼程序注釋 ORG0000H0000H020030 LJMPMAIN ORG0030H0030HE531MAIN: MOVA,31H;低8位補碼送入累加器A0032HF4 CPLA;低8位取反0033H2401 ADDA,#01H;補碼取反后要加10035HF541 MOV41H,A;存放原碼絕對值的低8位0037HE530 MOVA,30H;高8位補碼送入累加器A0039HF4 CPLA;高8位取反003AH3400 ADDCA,#00H;加上低8位的進(jìn)位003CH547F ANLA,#7FH;去掉最高位符號位003EHF540 MOV40H,A;存放原碼絕對值的高7位0040H80FE SJMP$;暫停 END參考程序:大家網(wǎng):/地址機器碼程序注釋 ORG0000H0000H0204.3循環(huán)程序設(shè)計

4.3.1循環(huán)程序設(shè)計方法4.3.2循環(huán)程序設(shè)計實例大家網(wǎng):/4.3循環(huán)程序設(shè)計4.3.1循環(huán)程序設(shè)計方法大家4.3.1循環(huán)程序設(shè)計方法

循環(huán)程序的結(jié)構(gòu)一般包括以下幾部分。循環(huán)初始化——是進(jìn)入循環(huán)處理前必須要有的一個環(huán)節(jié),用于完成循環(huán)前的準(zhǔn)備工作。循環(huán)初始化包括給工作寄存器(或其他存儲單元)設(shè)置計數(shù)初值、地址指針、數(shù)據(jù)塊長度等。循環(huán)處理——是需要多次重復(fù)執(zhí)行的程序段。循環(huán)處理是循環(huán)程序的核心,用于完成主要的計算和操作任務(wù)。循環(huán)控制——是用條件轉(zhuǎn)移指令控制循環(huán)是否繼續(xù)。每循環(huán)一次,根據(jù)循環(huán)結(jié)束條件進(jìn)行一次判斷;當(dāng)滿足條件時,停止循環(huán),繼續(xù)執(zhí)行其他程序;否則,再作循環(huán)。循環(huán)結(jié)束——用于存放循環(huán)程序的執(zhí)行結(jié)果,同時恢復(fù)相關(guān)工作單元的初值。大家網(wǎng):/4.3.1循環(huán)程序設(shè)計方法循環(huán)程序的結(jié)構(gòu)一般包括以下幾4.3.1循環(huán)程序設(shè)計方法

循環(huán)程序一般有兩種編寫方法。先循環(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):/4.3.1循環(huán)程序設(shè)計方法循環(huán)程序一般有兩種編寫方法。

先判斷后處理先處理后判斷兩重循環(huán)循環(huán)程序流程圖循環(huán)程序流程圖程序流程圖

大家網(wǎng):/大家網(wǎng):/4.3.1循環(huán)程序設(shè)計方法

循環(huán)程序的特點和設(shè)計方法。程序結(jié)構(gòu)緊湊,占用存儲單元較少,程序中間有分支,循環(huán)程序本質(zhì)上是分支程序的一種特殊形式。DJNZ指令使用得較多,凡是分支程序中可以使用的控制轉(zhuǎn)移類指令,循環(huán)程序一般都可以使用。循環(huán)控制的形式有多種。計數(shù)循環(huán)是最常用的一種,它先預(yù)置計數(shù)初值,再用DJNZ指令控制循環(huán)次數(shù);條件循環(huán)也是較常用的一種,它先預(yù)置結(jié)束循環(huán)的條件,再用CJNE指令、JZ指令或JB指令控制循環(huán)的結(jié)束。大家網(wǎng):/4.3.1循環(huán)程序設(shè)計方法循環(huán)程序的特點和設(shè)計方法。大4.3.2循環(huán)程序設(shè)計實例【例3】

片內(nèi)RAM中存放有10個數(shù)據(jù),首地址為30H,編程將數(shù)據(jù)塊傳送到片外RAM以1000H為首地址的存儲單元中。解:該程序是單重循環(huán)程序,片內(nèi)RAM首地址30H、片外RAM首地址1000H和數(shù)據(jù)塊長度10都是循環(huán)初始化的內(nèi)容。循環(huán)控制是對數(shù)據(jù)塊長度進(jìn)行判斷,每傳送一個數(shù)據(jù),存放數(shù)據(jù)塊長度的寄存器減1;10個數(shù)據(jù)傳送完,存放數(shù)據(jù)塊長度的寄存器內(nèi)容正好為零,退出循環(huán)。大家網(wǎng):/4.3.2循環(huán)程序設(shè)計實例【例3】片內(nèi)RAM中存放有14.3.2循環(huán)程序設(shè)計實例地址機器碼程序注釋

ORG0000H0000H020100

LJMPMAIN

ORG0100H0100H7930MAIN:

MOVR1,#30H;置片內(nèi)RAM地址指針30H0102H901000

MOVDPTR,#1000H;置片外RAM地址指針1000H0105H7A0A

MOVR2,#10;數(shù)據(jù)塊的長度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è)計實例地址機器碼程序注釋 ORG4.3.2循環(huán)程序設(shè)計實例【例4】

P1口做輸出口,控制8盞燈(P1口輸出低電平時燈被點亮),編程使燈按以下規(guī)律顯示:同一時間只有兩盞燈點亮,從P1.7、P1.6控制的燈開始,每盞燈閃爍5次,再移向下兩盞燈,同樣閃爍5次,循環(huán)往復(fù),延時時間1s。晶振頻率6MHz。解:主程序是雙重循環(huán)程序,循環(huán)移位是外循環(huán),燈閃爍5次是內(nèi)循環(huán),內(nèi)循環(huán)程序不能與外循環(huán)程序交叉。延時1S采用三重循環(huán)程序。晶振頻率為6MHz時,機器周期為2s,延時程序的延時時間計算方法如下:

{1+[1+(1+(1+1+2)×125+2)×200+2]×5+2}×2s=1006036s=1.006036s大家網(wǎng):/4.3.2循環(huán)程序設(shè)計實例【例4】P1口做輸出口,控制4.3.2循環(huán)程序設(shè)計實例地址機器碼程序注釋ORG0000H0000H020030LJMPMAINORG0030H0030H745FMAIN:MOVA,#5FH;燈點亮初始狀態(tài)0032H7905LP1:MOVR1,#5;循環(huán)閃爍次數(shù)0034HF590LP2:MOVP1,A0036H120100LCALLDELAY;延時1s0039H7590FFMOVP1,#0FFH003CH120100LCALLDELAY;延時1s003FHD9F3DJNZR1,LP2;循環(huán)閃爍次數(shù)不夠5次,繼續(xù)0041H03RRA;右移一位0042H03RRA;再右移一位0043H80EDSJMPLP1主程序:大家網(wǎng):/4.3.2循環(huán)程序設(shè)計實例地址機器碼程序注釋地址機器碼程序注釋ORG0100H0100H7B05DELAY:MOVR3,#5;延時1s的循環(huán)次數(shù)0102H7CC8DEL3:MOVR4,#200;延時200ms的循環(huán)次數(shù)0104H7D7DDEL2:MOVR5,#125;延時1ms的循環(huán)次數(shù)0106H00DEL1:NOP0107H00NOP0108HDDFEDJNZR5,DEL1010AHDCF9DJNZR4,DEL2010CHDBF5DJNZR3,DEL3010EH22RET;子程序返回END延時子程序:大家網(wǎng):/地址機器碼程序注釋ORG0100H01004.3.2循環(huán)程序設(shè)計實例【例5】

P1口做為輸出口控制步進(jìn)電動機的四相繞組,編寫程序,控制步進(jìn)電動機每2s正向轉(zhuǎn)動一步。晶振頻率6MHz。解:步距角:θb=360/mZ

(°)

電機轉(zhuǎn)速:n=60f/mZ

(r/min)上式中:f為脈沖頻率,單位:Hz或步/s。

m為拍數(shù),本例中為4。

Z為轉(zhuǎn)子齒數(shù),本例中取5。拍數(shù)m=4,若使用的步進(jìn)電動機轉(zhuǎn)子齒數(shù)Z為5,則步距角θb=18°。題目要求步進(jìn)電動機每2s正向轉(zhuǎn)動一步,即T=2s,則f=0.5Hz,電機轉(zhuǎn)速n=1.5r/min。用三重循環(huán)設(shè)計2s的循環(huán)程序。晶振頻率為6MHz時,機器周期為2s,延時程序的延時時間計算方法如下:

{1+[1+(1+1+2×123+2)×200+2]×20+2}×2s=2000126s=2.000126s大家網(wǎng):/4.3.2循環(huán)程序設(shè)計實例【例5】P1口做為輸出口控制

P1.0~P1.3口作為輸出口分別控制步進(jìn)電動機的四相繞組,步進(jìn)電動機的控制狀態(tài)與P1口的控制碼的對應(yīng)關(guān)系如下表所示??刂茽顟B(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):/P1.0~P1.3口作為輸出口分別控制步進(jìn)電動機的四地址機器碼程序注釋ORG0000H0000H020030LJMPMAIN

ORG0030H0030H759003MAIN:MOVP1,#03H;AB相通電0033H120100LCALLDELAY0036H759006MOVP1,#06H;BC相通電0039H120100LCALLDELAY003CH75900CMOVP1,#0CH;CD相通電003FH120100LCALLDELAY0042H759009MOVP1,#09H;DA相通電0045H120100LCALLDELAY0048H80E6SJMPMAIN;重復(fù)循環(huán)主程序:大家網(wǎng):/地址機器碼程序注釋ORG0000H0000地址機器碼程序注釋ORG0100H0100H7B14DELAY:MOVR3,#20;延時2s的循環(huán)次數(shù)0102H7FC8LP1:MOVR7,#200;延時100ms的循環(huán)次數(shù)0104H7E7BLP2:MOVR6,#123;延時0.5ms的循環(huán)次數(shù)0106H00NOP0107HDEFELP3:DJNZR6,LP30109HDFF9DJNZR7,LP2010BHDBF5DJNZR3,LP1010DH22RETEND;程序結(jié)束延時子程序:大家網(wǎng):/地址機器碼程序注釋ORG0100H01004.3.2循環(huán)程序設(shè)計實例【例6】

片內(nèi)RAM從50H單元開始存放了10個無符號數(shù),編程將它們按由小到大的順序排列。解:數(shù)據(jù)排序的方法有很多,本例采用常用的冒泡排序法,又稱為兩兩比較法。想象把10個數(shù)縱向排列,自上而下將存儲單元相鄰的兩個數(shù)進(jìn)行比較,若前數(shù)大于后數(shù),則存儲單元中的兩個數(shù)互換位置;若前數(shù)小于后數(shù),則存儲單元中的兩個數(shù)保持原來位置。按同樣的原則依次比較后面的數(shù)據(jù),直到該組數(shù)據(jù)全部比較完,經(jīng)過第1輪的比較,最大的數(shù)據(jù)就像冒泡一樣排在了存儲單元最末的位置上。經(jīng)過9輪冒泡,便可完成10個數(shù)據(jù)的排序。

大家網(wǎng):/4.3.2循環(huán)程序設(shè)計實例【例6】片內(nèi)RAM從50H單

在實際排序中,10個數(shù)不一定要經(jīng)過9輪排序冒泡,可能只要幾次就可以了。為了減少不必要的冒泡次數(shù),可以設(shè)計一個交換標(biāo)志,每一輪冒泡的開始將交換標(biāo)志位清0,在該輪數(shù)據(jù)比較中若有數(shù)據(jù)位置互換,則將交換標(biāo)志位置1;每輪冒泡結(jié)束時,若交換標(biāo)志位仍為0,則表明數(shù)據(jù)排序已完成,可以提前結(jié)束排序。

大家網(wǎng):/在實際排序中,10個數(shù)不一定要經(jīng)過94.3.2循環(huán)程序設(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.3.2循環(huán)程序設(shè)計實例 ORG0000H00004.4分支程序設(shè)計

4.4.1分支程序設(shè)計方法4.4.2分支程序設(shè)計實例大家網(wǎng):/4.4分支程序設(shè)計4.4.1分支程序設(shè)計方法大家4.4.1分支程序設(shè)計方法分支程序是根據(jù)程序的要求改變程序的執(zhí)行順序,并根據(jù)條件對程序的流向進(jìn)行判斷的程序結(jié)構(gòu)。分支程序一般有兩個或兩個以上的出口。分支程序又分為單分支和多分支結(jié)構(gòu)。大家網(wǎng):/4.4.1分支程序設(shè)計方法分支程序是根據(jù)程序的要求改變程4.4.1分支程序設(shè)計方法分支程序的特點和設(shè)計方法。程序中有轉(zhuǎn)移指令包括無條件轉(zhuǎn)移、條件轉(zhuǎn)移和散轉(zhuǎn)指令。分支的出口有兩個以上時,形成散轉(zhuǎn)程序,一般用散轉(zhuǎn)指令來實現(xiàn),設(shè)計方法有4種。分別是轉(zhuǎn)移指令表法、地址偏移量表法、轉(zhuǎn)向地址表法和利用RET指令法。單分支程序一般有一個入口、兩個出口,一般用無條件轉(zhuǎn)移和條件轉(zhuǎn)移指令來實現(xiàn),結(jié)構(gòu)形式有兩種。一種是當(dāng)條件滿足時,執(zhí)行處理程序2,否則執(zhí)行處理程序3。分支程序流程圖如下圖(a)所示。另一種是當(dāng)條件滿足時,跳過處理程序2,直接執(zhí)行處理程序3,否則順序執(zhí)行處理程序2和處理程序3。分支程序流程圖如下圖(b)所示。大家網(wǎng):/4.4.1分支程序設(shè)計方法分支程序的特點和設(shè)計方法。大家4.4.1分支程序設(shè)計方法(a)分支程序流程圖(b)分支程序流程圖大家網(wǎng):/4.4.1分支程序設(shè)計方法(a)分支程序流程圖(4.4.1分支程序設(shè)計方法分支程序允許嵌套,即一個分支接一個分支,形成樹狀多分支結(jié)構(gòu)。多分支程序流程圖如右圖所示。多分支程序流程圖大家網(wǎng):/4.4.1分支程序設(shè)計方法多分支程序流程圖大家網(wǎng):htt4.4.2分支程序設(shè)計實例【例7】

設(shè)計一個水塔水位控制系統(tǒng),晶振頻率6MHz。設(shè)計要求如下:(1)在水塔內(nèi)三個不同的高度分別安裝了一根固定不動的金屬棒,正常情況下,塔內(nèi)水位應(yīng)保持在虛線之內(nèi),水位控制原理如下圖所示。(2)A棒處于水位上限,B棒處于水位下限。當(dāng)水位低于水位下限時,自動啟動水泵電機給水塔供水;直到塔內(nèi)水位達(dá)到水位上限,自動停止水泵電機動轉(zhuǎn)。(3)塔內(nèi)水位從水位上限下降到水位下限的過程中,水泵電機不會自動啟動。(4)水塔進(jìn)水時,要有信號燈指示;水位檢測發(fā)生故障時,要有故障燈指示并使水塔水位控制系統(tǒng)停止工作。大家網(wǎng):/4.4.2分支程序設(shè)計實例【例7】設(shè)計一個水塔水位控制4.4.2分支程序設(shè)計實例

由于水的導(dǎo)電作用,當(dāng)塔內(nèi)水位達(dá)到水位下限時,B棒接通+5V;當(dāng)塔內(nèi)水位達(dá)到水位上限時,A棒也接通+5V。

水位上限信號輸入至P1.0,水位下限信號輸入至P1.1,P1.2輸出控制信號以控制水泵電機的啟動(P1.2=0)和停止(P1.2=1),P1.3輸出顯示信號以指示水泵電機的運行狀態(tài)(P1.3=0時點亮),P1.4輸出故障信號以指示水位檢測系統(tǒng)故障狀態(tài)(P1.4=0時點亮)。解:當(dāng)塔內(nèi)水位處于水位下限以下時,A、B棒通過電阻接地。

大家網(wǎng):/4.4.2分支程序設(shè)計實例由于水的導(dǎo)電作用,當(dāng)4.4.2分支程序設(shè)計實例

水位控制信號與水泵電機控制狀態(tài)的對應(yīng)關(guān)系為了防止電機頻繁啟停,在啟動或停止電機后最少要維持這一狀態(tài)20s,這可以采用延時程序來實現(xiàn)。

P1.1P1.0控制狀態(tài)P1.2P1.3P1.400水泵電機啟動00101故障報警11010維持原來狀態(tài)111水泵電機停止111大家網(wǎng):/4.4.2分支程序設(shè)計實例水位4.4.2分支程序設(shè)計實例 ORG0000H0000H020030 LJMPMAIN ORG0030H0030H439003MAIN:ORLP1,#03H;水位信號輸入端做讀入準(zhǔn)備0033HF590MOVA,P1;讀入水位檢測信號0035H30E108JNBACC.1,QDZB;P1.1=0,轉(zhuǎn)移至啟動準(zhǔn)備0038H20E016JBACC.0,TZDJ;P1.0=1,轉(zhuǎn)移至停止電機003BH120100YS:LCALLDELAY;延時20s003EH80F0SJMPMAIN0040H30E008QDZB:JNBACC.0,QDDJ;P1.0=0,轉(zhuǎn)移至啟動電機0043HD292SETBP1.2;停止電機0045HD293SETBP1.3;關(guān)閉電機運行指示0047HC294CLRP1.4;打開水位檢測故障指示0049H80FESJMP$004BHC292QDDJ:CLRP1.2;啟動電機004DHC293CLRP1.3;打開電機運行指示004FH80EASJMPYS0051HD292TZDJ:SETBP1.2;停止電機0053HD293SETBP1.30055H80E4SJMPYS主程序:大家網(wǎng):/4.4.2分支程序設(shè)計實例 ORG0000H地址機器碼程序注釋 ORG0100H0100H7BC8DELAY:MOVR3,#200;延時20s的循環(huán)次數(shù)0102H7FC8LP1:MOVR7,#200;延時100ms的循環(huán)次數(shù)0104H7E7BLP2:MOVR6,#123;延時0.5ms的循環(huán)次數(shù)0106H00NOP0107HDEFELP3:DJNZR6,LP30109HDFF9DJNZR7,LP2010BHDBF5DJNZR3,LP1010DH22RETEND;程序結(jié)束延時子程序:大家網(wǎng):/地址機器碼程序注釋 ORG0100H0100H74.5子程序設(shè)計

4.5.1子程序設(shè)計方法4.5.2子程序設(shè)計實例

大家網(wǎng):/4.5子程序設(shè)計4.5.1子程序設(shè)計方法大家網(wǎng):4.5.1子程序設(shè)計方法子程序是指完成某一專門任務(wù)并能被其他程序反復(fù)調(diào)用的程序段。調(diào)用子程序的程序稱為主程序或調(diào)用程序。使用子程序的過程稱為調(diào)用子程序。子程序執(zhí)行完后返回主程序的過程稱為子程序返回。主程序和子程序是相對的,同一程序既可以作為另一程序的子程序,也可以有自己的子程序。也就是說,子程序是允許嵌套的,嵌套深度和堆棧區(qū)的大小有關(guān)。采用子程序能使整個程序結(jié)構(gòu)簡單,縮短程序設(shè)計時間,減少對存儲空間的占用。大家網(wǎng):/4.5.1子程序設(shè)計方法子程序是指完成某一專門任務(wù)并能被4.5.1子程序設(shè)計方法子程序的特點和設(shè)計方法子程序具有通用性和獨立性,以滿足所有調(diào)用程序?qū)崿F(xiàn)資源共享。子程序的第一條指令的地址稱為子程序的入口地址,該指令前應(yīng)有標(biāo)號。合理地確定子程序的參數(shù)傳遞方式:入口參數(shù)是子程序需要的原始參數(shù),由主程序通過相關(guān)的工作寄存器、特殊功能寄存器、片內(nèi)RAM或堆棧等傳送給子程序;出口參數(shù)是根據(jù)入口參數(shù)執(zhí)行子程序后獲得的結(jié)果,由子程序通過相關(guān)的工作寄存器、特殊功能寄存器、片內(nèi)RAM或堆棧等傳遞給主程序。在主程序中可以用調(diào)用指令調(diào)用子程序,在子程序末尾用RET返回指令從子程序返回主程序。大家網(wǎng):/4.5.1子程序設(shè)計方法子程序的特點和設(shè)計方法大家網(wǎng):h4.5.1子程序設(shè)計方法根據(jù)需要保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。在子程序的開始,使用壓棧指令把需要保護(hù)的內(nèi)容壓入堆棧;在返回主程序前,使用彈出指令把堆棧中保護(hù)的內(nèi)容送回原來的存儲單元中。子程序中有可能要使用累加器A或工作寄存器,在子程序使用它們之前,把它們中可能存有的主程序的中間結(jié)果保存起來,這一過程稱為保護(hù)現(xiàn)場。在子程序執(zhí)行完并將返回主程序之前,再將這些中間結(jié)果取出,送回到累加器A或原來的工作寄存器中,這一過程稱為恢復(fù)現(xiàn)場。子程序中應(yīng)盡量使用相對轉(zhuǎn)移指令而不使用其他轉(zhuǎn)移指令,以便子程序放在內(nèi)存的任何區(qū)域都能被主程序調(diào)用。要正確地設(shè)置堆棧指針,以避免堆棧區(qū)與工作寄存器或其他存儲單元發(fā)生沖突。大家網(wǎng):/4.5.1子程序設(shè)計方法根據(jù)需要保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。在子4.5.1子程序設(shè)計方法傳送子程序參數(shù)的方法。利用寄存器或片內(nèi)RAM傳送參數(shù)??梢园讶肟趨?shù)存放到寄存器或片內(nèi)RAM中傳送給子程序,也可以把出口參數(shù)存放到寄存器或片內(nèi)RAM中傳送給主程序。利用寄存器傳送參數(shù)的地址。把存放入口參數(shù)的地址通過寄存器傳送給子程序,子程序根據(jù)寄存器中存放入口參數(shù)的地址便可找到入口參數(shù)并對它們進(jìn)行相應(yīng)操作;出口參數(shù)的地址也可通過寄存器傳送給主程序。利用堆棧傳送參數(shù)。可以用壓棧指令PUSH把入口參數(shù)壓入堆棧傳送給子程序,也可以使用壓棧指令PUSH把出口參數(shù)壓入堆棧傳送給主程序。大家網(wǎng):/4.5.1子程序設(shè)計方法傳送子程序參數(shù)的方法。大家網(wǎng):h4.5.2子程序設(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è)計實例【例10】將片內(nèi)RAM區(qū)20H4.5.2子程序設(shè)計實例地址機器碼程序注釋ORG0000H0000H020100LJMPMAINORG0100H0100H7C05MAIN:MOVR4,#05H;數(shù)據(jù)塊的長度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è)計實例地址機器碼程序注釋ORG004.5.2子程序設(shè)計實例地址機器碼程序注釋;程序名:HAC;功能:十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼;入口參數(shù):A存放要轉(zhuǎn)換的十六進(jìn)制數(shù);出口參數(shù):A存放轉(zhuǎn)換后的ASCII碼;占用資源:PSWORG0150H;子程序從地址0150H開始存放0150HC0D0HAC:PUSHPSW;保護(hù)現(xiàn)場0152H540FANLA,#0FH;屏蔽掉高4位0154HC0E0PUSHACC;0156HC3CLRC;0157H940ASUBBA,#0AH;比較A中內(nèi)容的大小0159HD0E0POPACC015BH4002JCLP2;(A)<10時,轉(zhuǎn)移015DH2407ADDA,#07H015FH2430LP2:ADDA,#30H0161HD0D0POPPSW;恢復(fù)現(xiàn)場0163H22RET;子程序返回END子程序:大家網(wǎng):/4.5.2子程序設(shè)計實例地址機器碼程序注釋;程序名:HA4.6查表程序設(shè)計

4.6.1查表程序設(shè)計方法4.6.2查表程序設(shè)計實例大家網(wǎng):/4.6查表程序設(shè)計4.6.1查表程序設(shè)計方法大家4.6.1查表程序設(shè)計方法在單片機的實際應(yīng)用中,經(jīng)常要對一些數(shù)據(jù)進(jìn)行函數(shù)運算,例如求平方、正弦函數(shù)等,為了提高單片機執(zhí)行程序的速度,一般將某函數(shù)的全部函數(shù)值按一定的規(guī)律編成表格存放到程序存儲器中。查表程序就是根據(jù)某數(shù)據(jù)的函數(shù)運算要求,按索引號從程序存儲器中查找與之相對應(yīng)的函數(shù)值的程序結(jié)構(gòu)。設(shè)計查表程序時,主要通過兩條查表指令實現(xiàn)查表功能。大家網(wǎng):/4.6.1查表程序設(shè)計方法在單片機的實際應(yīng)用中,經(jīng)常要對4.6.1查表程序設(shè)計方法查表程序的特點和設(shè)計方法。查表指令“MOVCA,@A+DPTR”的查表過程比較簡單。查表時首先需要把數(shù)據(jù)表格起始地址存入DPTR,然后把所查數(shù)據(jù)的索引值送入累加器A中,最后使用查表指令“MOVCA,@A+DPTR”完成查表。查表指令“MOVCA,@A+PC”的查表過程相對復(fù)雜一些。查表時首先使用傳送指令把所查數(shù)據(jù)的索引值送入累加器A,然后用“ADDA,#data”指令對累加器A進(jìn)行修正。data值由該式確定:PC+data=數(shù)據(jù)表格的首地址。其中,PC是“MOVCA,@A+PC”的下一條指令的地址。因此,data值實際等于查表指令和數(shù)據(jù)表格之間的字節(jié)數(shù)。最后使用查表指令“MOVCA,@A+PC”完成查表。大家網(wǎng):/4.6.1查表程序設(shè)計方法查表程序的特點和設(shè)計方法。大家4.6.2查表程序設(shè)計實例【例14】

變量a、b均為小于10的正整數(shù),編程計算c=a2+b2,其中變量a、b分別存放在片內(nèi)RAM的51H和52H單元中,計算結(jié)果c存放到片內(nèi)RAM的53H單元。解法一:首先把平方表格起始地址0150H存入DPTR,然后把要查數(shù)據(jù)a或b的索引值送入累加器A中,最后使用查表指令“MOVCA,@A+DPTR”完成查表。大家網(wǎng):/4.6.2查表程序設(shè)計實例【例14】變量a、b均為小于4.6.2查表程序設(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è)計實例 ORG0000H4.6.2查表程序設(shè)計實例解法二:如果采用查表指令“MOVCA,@A+PC”,首先把要查數(shù)據(jù)a或b的索引值送入累加器A中,然后用“ADDA,#data”指令對累加器A進(jìn)行修正,最后使用查表指令“MOVCA,@A+PC”完成查表。

數(shù)a的索引值的修正值=平方表格首址-下一條指令的PC值

=0150H-0105H=4BH

數(shù)b的索引值的修正值=平方表格首址-下一條指令的PC值

=0150H-010BH=45H大家網(wǎng):/4.6.2查表程序設(shè)計實例解法二:如果采用查表指令“MO4.6.2查表程序設(shè)計實例 ORG0000H0000H020100 LJMPMAIN ORG0100H0100HE551MAIN: MOVA,51H;取數(shù)a送到A中作為索引值0102H244B ADDA,#4BH;對索引值進(jìn)行修正0104H83 MOVCA,@A+PC;查數(shù)a的平方0105HF8MOVR0,A;數(shù)a的平方送到R0中暫存0106HE552 MOVA,52H;取數(shù)b送到A中作為索引值0108H2445 ADDA,#45H;對索引值進(jìn)行修正010AH83 MOVCA,@A+PC;查數(shù)b的平方010BH28 ADDA,R0;求平方和010CHF553 MOV53H,A010EH80FE SJMP$ ORG0150H0150H00010409TABLE:DB0,1,4,9;0~9平方表0154H101924DB16,25,360157H314051DB49,64,81END主程序:大家網(wǎng):/4.6.2查表程序設(shè)計實例 ORG0000H0000本章小結(jié)程序設(shè)計語言按語言結(jié)構(gòu)可分為三大類,即機器語言、匯編語言和高級語言。在目前單片機的開發(fā)應(yīng)用中,經(jīng)常采用C語言和匯編語言共同編寫程序。匯編語言是面向機器的程序設(shè)計語言,對于CPU不同的單片機,其匯編語言一般是不同的。在進(jìn)行匯編語言源程序設(shè)計時,必須嚴(yán)格遵循匯編語言的格式和語法規(guī)則。匯編語言源程序是由匯編語言語句構(gòu)成的。匯編語言語句可分為兩大類:指令性語句和指示性語句。指令性語句一般由標(biāo)號、操作碼、操作數(shù)和注釋四個字段組成,指示性語句也包括標(biāo)號、操作碼、操作數(shù)和注釋四個字段。匯編語言源程序的匯編可分為手工匯編和機器匯編兩類。機器匯編可以使用匯編程序進(jìn)行匯編或反匯編。大家網(wǎng):/本章小結(jié)程序設(shè)計語言按語言結(jié)構(gòu)可分為三大類,即機器語言、匯編本章小結(jié)匯編語言程序具有順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)和子程序結(jié)構(gòu)四種結(jié)構(gòu)形式。實際的應(yīng)用程序一般都由一個主程序和多個子程序構(gòu)成,即采用模塊化的程序設(shè)計方法。程序設(shè)計的原則是盡可能使程序簡短和縮短運行時間,設(shè)計的關(guān)鍵首先是根據(jù)實際問題和所選用的單片機的特點來合理地確定解決問題的算法,然后是將工作任務(wù)細(xì)分成易于理解和實現(xiàn)的小模塊。在程序設(shè)計時,要注意順序程序、循環(huán)程序、分支程序、查表程序和子程序的特點和設(shè)計方法。要設(shè)計出高質(zhì)量的程序還需要掌握一定的技巧,通過多讀、多看一些實用程序可以積累一定的設(shè)計經(jīng)驗。大家網(wǎng):/本章小結(jié)匯編語言程序具有順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)和子程序習(xí)題1.程序設(shè)計語言有哪幾類?各有什么特點?2.匯編語言有哪兩類語句?各有什么特點?3.匯編語言源程序有哪兩類匯編?各采用什么方法來實現(xiàn)?4.匯編語言程序設(shè)計一般分哪幾個步驟?5.有兩個4位十六進(jìn)制數(shù)分別存放在片內(nèi)RAM20H、21H單元和30H、31H單元內(nèi),請編程求它們的和,并將和存放到片內(nèi)RAM40H、41H單元。6.有一個16位二進(jìn)制負(fù)數(shù)的原碼存放在片內(nèi)RAM60H、61H單元內(nèi),請編程求它的補碼,并將它存放到片內(nèi)RAM70H、71H單元。7.片內(nèi)RAM中存放有20個數(shù)據(jù),首地址為40H,請編程將數(shù)據(jù)塊傳送到片外RAM以50H為首地址的存儲單元中。8.片外RAM中存放有20個數(shù)據(jù),首地址為40H,請編程將數(shù)據(jù)塊傳送到片外RAM以5000H為首地址的存儲單元中,同時將片外RAM以40H為首地址的20個存儲單元中的內(nèi)容全部清零。9.片內(nèi)RAM區(qū)30H~34H單元中存放有5個十六進(jìn)制數(shù),請編程計算這5個數(shù)的算術(shù)平均值,結(jié)果存放到片內(nèi)RAM區(qū)35H單元中。10.請分別編寫延時1min、1h的子程序,晶振頻率12MHz。大家網(wǎng):/習(xí)題1.程序設(shè)計語言有哪幾類?各有什么特點?大家習(xí)題11.自變量X為一無符號數(shù),存放在片內(nèi)RAM區(qū)30H單元,函數(shù)Y存放在31H單元。請編寫滿足如下關(guān)系的程序:X≤95時,Y=1;95<X<105時,Y=2;X≥105時,Y=3。12.在片內(nèi)RAM區(qū)從30H單元開始存放了50個數(shù)據(jù),請編程找出某一關(guān)鍵值并將該值在片內(nèi)RAM區(qū)存儲單元的地址存放到片內(nèi)RAM區(qū)70H單元中。13.編寫雙字節(jié)無符號數(shù)加法子程序。14.編寫雙字節(jié)無符號數(shù)減法子程序。大家網(wǎng):/習(xí)題11.自變量X為一無符號數(shù),存放在片內(nèi)RAMQ&A?

Thanks!大家網(wǎng):/Q&A?

Thanks!大家網(wǎng):http://www.第4章匯編語言程序設(shè)計

(課時:12學(xué)時)大家網(wǎng):/第4章匯編語言程序設(shè)計(課時:12學(xué)時)大家網(wǎng):htt教學(xué)目的

了解匯編語言程序設(shè)計的特點。掌握匯編語言程序的基本結(jié)構(gòu)及簡單應(yīng)用的設(shè)計方法。用循環(huán)程序設(shè)計一個控制信號燈的程序。用循環(huán)程序設(shè)計一個控制步進(jìn)電動機的程序。用分支程序設(shè)計一個控制汽車信號燈的程序。用分支程序設(shè)計一個控制水塔水位的程序。

學(xué)習(xí)重點和難點分支程序、循環(huán)程序的設(shè)計特點。子程序的編寫和應(yīng)用。大家網(wǎng):/教學(xué)目的了解匯編語言程序設(shè)計的特點。學(xué)習(xí)重點和難點分支程第4章匯編語言程序設(shè)計4.1程序設(shè)計概述4.2順序程序設(shè)計4.3循環(huán)程序設(shè)計4.4分支程序設(shè)計4.5子程序設(shè)計4.6查表程序設(shè)計本章小結(jié)習(xí)題

大家網(wǎng):/第4章匯編語言程序設(shè)計4.1程序設(shè)計概述大家網(wǎng):h4.1程序設(shè)計概述4.1.1程序設(shè)計語言4.1.2匯編語言源程序的編輯與匯編4.1.3匯編語言程序的基本結(jié)構(gòu)4.1.4程序設(shè)計方法和技巧

大家網(wǎng):/4.1程序設(shè)計概述4.1.1程序設(shè)計語言大家網(wǎng):h4.1.1程序設(shè)計語言1.機器語言(MachineLanguage)

這是一種用二進(jìn)制代碼“0”和“1”表示指令和數(shù)據(jù)的程序設(shè)計語言。計算機只能識別二進(jìn)制代碼,這種語言是能被計算機直接識別和執(zhí)行的機器級語言。特點:機器語言能夠被計算機立即識別并加以執(zhí)行,具有執(zhí)行速度快、占用內(nèi)存少等優(yōu)點。但對于使用者來說,用機器語言編寫程序具有編寫難、識別難、記憶難、查錯難、交流難等缺點。大家網(wǎng):/4.1.1程序設(shè)計語言1.機器語言(MachineL4.1.1程序設(shè)計語言2.匯編語言(AssemblyLanguage)

匯編語言是一種用助記符來表示的面向機器的程序設(shè)計語言。不同的機器所使用的匯編語言一般是不同的。但計算機的CPU不能直接識別匯編語言,所以計算機不能立即執(zhí)行匯編語言程序。用匯編語言編寫的源程序,在由計算機執(zhí)行之前,必須將它翻譯成機器語言程序。特點:這種語言彌補了機器語言的不足,用匯編語言編寫程序比用機器語言方便、直觀、易懂、易用、易記??梢跃帉懗鼋Y(jié)構(gòu)緊湊、運行時間精確的程序。所以,這種語言非常適合于實時控制的需要。大家網(wǎng):/4.1.1程序設(shè)計語言2.匯編語言(Assembly4.1.1程序設(shè)計語言3.高級語言(High-LevelLanguage)

高級語言是面向過程并能獨立于計算機硬件結(jié)構(gòu)的通用程序設(shè)計語言,是一種接近人類語言和數(shù)學(xué)表達(dá)式的計算機語言。比如:BASIC、FORTRAN、COBOL、PASCAL、C語言等。高級語言不能被計算機直接識別和執(zhí)行,需要用編譯程序或解釋程序?qū)⒏呒壵Z言編寫的源程序翻譯為機器語言。特點:它比匯編語言易學(xué)、易懂,具有通用性強、易于移植等優(yōu)點。高級語言的語句功能強,它的一條語句往往相當(dāng)于許多條指令,因而用于翻譯的程序要占用較多的存儲空間,而且執(zhí)行時間長,且不易精確掌握,故在高速實時控制中一般是不適用的。大家網(wǎng):/4.1.1程序設(shè)計語言3.高級語言(High-Leve4.1.2匯編語言源程序的編輯與匯編

基本概念在目前單片機的開發(fā)應(yīng)用中,經(jīng)常采用C語言和匯編語言共同編寫程序。要想很好地掌

溫馨提示

  • 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

提交評論