第3章 微機(jī)系統(tǒng)應(yīng)用程序設(shè)計_第1頁
第3章 微機(jī)系統(tǒng)應(yīng)用程序設(shè)計_第2頁
第3章 微機(jī)系統(tǒng)應(yīng)用程序設(shè)計_第3頁
第3章 微機(jī)系統(tǒng)應(yīng)用程序設(shè)計_第4頁
第3章 微機(jī)系統(tǒng)應(yīng)用程序設(shè)計_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計微機(jī)系統(tǒng)的應(yīng)用程序設(shè)計,可以采用匯編語言完成,也可以采用C語言實現(xiàn)。由于匯編語言是面向機(jī)器的語言,對單片機(jī)的硬件資源操作直接方便、概念清晰,盡管對編程人員的硬件知識要求較高,但對于學(xué)習(xí)和掌握單片機(jī)的硬件結(jié)構(gòu)極為有利。所以,本章首先對匯編語言進(jìn)行介紹。當(dāng)系統(tǒng)的規(guī)模較大時,設(shè)計人員便趨于采用C語言進(jìn)行程序設(shè)計,這是由于C語言具有良好的可讀性、可移植性和基本的硬件操作能力。所以本章還介紹了單片機(jī)高級語言C51的語法、數(shù)據(jù)結(jié)構(gòu)、語句函數(shù)的分類以及簡單的C51程序設(shè)計。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.1匯編語言程序設(shè)計

3.1.1匯編語言語句格式及偽指令以助記符書寫的指令系統(tǒng),就是計算機(jī)的匯編語言。每一條指令就是匯編語言的一條語句。1.匯編語言的特點匯編語言有如下特點:①助記符指令和機(jī)器指令一一對應(yīng)。所以用匯編語言編寫的程序效率高,占用存儲空間小,運行速度快,而且能反映計算機(jī)的實際運行情況。因此匯編語言能編寫出最優(yōu)化的程序。②匯編語言編程比高級語言困難。因為匯編語言是面向計算機(jī)的,程序設(shè)計人員必須對計算機(jī)硬件有相當(dāng)深入的了解,才能使用匯編語言編寫程序。③匯編語言能直接和存儲及接口電路打交道,也能申請中斷。因此匯編語言程序能直接管理和控制硬件設(shè)備。④匯編語言缺乏通用性,程序不易移值。各種計算機(jī)都有自己的匯編語言,不同計算機(jī)的匯編語言之間不能通用。但是掌握了一種計算機(jī)的匯編語言,卻有助于學(xué)習(xí)其它計算機(jī)的匯編語言。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計2.匯編語言的語句格式各種匯編語言的語法規(guī)則是基本相同的,且具有相同的語句格式,現(xiàn)結(jié)合MCS-51匯編語言作具體說明。MCS-51匯編語言的語句格式表示如下:[<標(biāo)號>]:<操作碼>[<操作數(shù)>];[<注釋>]即一條匯編語句是由標(biāo)號、操作碼、操作數(shù)和注釋四個部分所組成。其中方括號括起來的是可選擇部分,可有可無,視需要而定。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.偽指令用匯編語言編寫的程序通常需經(jīng)過機(jī)器匯編變成機(jī)器碼才能被執(zhí)行。為了對源程序匯編,在源程序中應(yīng)有向匯編程序發(fā)出的指示信息,告訴它應(yīng)該如何完成匯編工作。這一任務(wù)是通過偽指令來實現(xiàn)的。偽指令是程序員發(fā)給匯編程序的命令,也稱匯編命令或匯編程序控制指令。只有在匯編前的源程序中才有偽指令。匯編得到目標(biāo)程序后,偽指令已無存在的必要,所以偽指令沒有相應(yīng)的機(jī)器代碼,在目標(biāo)程序中見不到與偽指令相對應(yīng)的機(jī)器碼。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計下面介紹MCS-51匯編語言程序中常用的偽指令。(1)ORG(OriGin)匯編起始地址命令(2)END(ENDofassembly)匯編終止命令(3)EQU(EQUate)賦命令(4)DB(DefineByte)定義數(shù)據(jù)字節(jié)命令(5)DW(DefineWord)定義數(shù)據(jù)字命令(6)DS(DefineStonage)定義存儲區(qū)命令(7)位定義命令第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.1.2匯編語言程序設(shè)計步驟微型機(jī)應(yīng)用離不開應(yīng)用程序的設(shè)計,設(shè)計程序可以使用高級語言也可以使用匯編語言或機(jī)器語言。高級語言是一種面向過程(或問題)的、獨立于計算機(jī)的通用語言。用它來編程,編程的速度快而且編程者不必熟悉具體機(jī)器的硬件結(jié)構(gòu)及指令系統(tǒng)等;但程序執(zhí)行的速度慢且占據(jù)存儲空間較大。從上章指令系統(tǒng)介紹可知,用匯編語言編程時,編程者可以直接操作到機(jī)器內(nèi)部的寄存器及存儲單元,能把處理過程刻畫得非常具體。因而通過優(yōu)化編制出高效率的程序,既可節(jié)省存儲空間又可提高程序執(zhí)行的速度。在空間和時間上都充分發(fā)揮了微型機(jī)的潛力。因此,在實時控制的場合下通常采用匯編語言進(jìn)行程序設(shè)計。微型機(jī)的監(jiān)控程序多采用匯編語言編寫。對于單片機(jī)應(yīng)用系統(tǒng),通常都用匯編語言編寫程序。用匯編語言編制程序的過程,稱為匯編語言程序設(shè)計。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計1.建立數(shù)學(xué)模型2.選擇適當(dāng)?shù)乃惴?.程序結(jié)構(gòu)的設(shè)計4.編制匯編語言程序5.匯編語言程序的調(diào)試第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.1.3程序設(shè)計結(jié)構(gòu)用匯編語言進(jìn)行程序設(shè)計的過程和用高級語言進(jìn)行程序設(shè)計相類似。對于比較復(fù)雜的問題,首先要掌握解決它的方法和步驟——算法,有了合適的算法常??梢云鸬绞掳牍Ρ兜男Ч?;其次,就是用操作框、帶箭頭流程線、框內(nèi)外必要的文字說明所組成的流程圖來描述算法;最后是根據(jù)流程圖用程序設(shè)計語言來編制程序。程序的基本算法結(jié)構(gòu)有3種:順序結(jié)構(gòu)、分支(選擇)結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)如圖3-1所示,虛框內(nèi)A框和B框分別代表不同的操作,而且是A、B順序執(zhí)行。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計分支結(jié)構(gòu)如圖3-2所示,它又稱為選擇結(jié)構(gòu)。該結(jié)構(gòu)中包含一個判斷框,根據(jù)給定條件P是否成立而選擇執(zhí)行A框操作或B框操作。條件P可以是累加器是否為零、兩數(shù)是否相等,以及測試狀態(tài)標(biāo)志或位狀態(tài)等等。這里需指出的是:無論條件P是否成立,只能執(zhí)行A框或者B框,不可能既執(zhí)行A框又執(zhí)行B框。無論走哪一條路徑執(zhí)行,都經(jīng)過b點脫離本分支結(jié)構(gòu)。A或B兩個框中可以有一個是空的,即不進(jìn)行任何操作。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計下面將介紹基本結(jié)構(gòu)匯編語言程序設(shè)計的一些實例。1.順序結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)是最簡單的一種基本結(jié)構(gòu)。如果某一個需要解決的問題可以分解成若干個簡單的操作步驟,并且可以由這些操作按一定的順序構(gòu)成一種解決問題的算法,則可用簡單的順序結(jié)構(gòu)進(jìn)行程序設(shè)計。例1:單字節(jié)壓縮BCD碼轉(zhuǎn)換成二進(jìn)制碼子程序。解:設(shè)兩個BCD碼d1d0表示的兩位十進(jìn)制數(shù)壓縮存于R2,其中R2高4位存十位,低4位存?zhèn)€位,要把其轉(zhuǎn)換成純二進(jìn)制碼的算法為:(d1d0)BCD=d1×10+d0。實現(xiàn)該算法所編制的參考子程序如下:第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計入口:待轉(zhuǎn)換的BCD碼存于R2。出口:轉(zhuǎn)換結(jié)果(8位無符號二進(jìn)制整數(shù))仍存R2。BCD2B:ORG 2000H MOV A,R2 ;A(A)←(d1d0)BCD ANL A,#0F0H ;取高位BCD碼d1 SWAP A ;(A)=0d1H MOV B,#0AH ;(B)←10 MUL AB ;d1×10 MOV R3,A ;R3暫存乘積結(jié)構(gòu)

MOV A,R2 ;A(A)←(d1d0)BCD ANL A,#0FH ;取低位BCD碼d0 ADD A,R3 ;d1×10+d0 MOV R2,A ;保存轉(zhuǎn)換后果

RET ;子程序返回第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計2.分支(選擇)結(jié)構(gòu)程序設(shè)計順序結(jié)構(gòu)程序設(shè)計是最基本的程序設(shè)計技術(shù)。在實際程序設(shè)計中,有很多情況往往還需要程序按照給定的條件進(jìn)行分支。這時就必須對某一個變量所處的狀態(tài)進(jìn)行判斷,根據(jù)判斷結(jié)果來決定程序的流向。這就是分支(選擇)結(jié)構(gòu)程序設(shè)計。在編寫分支程序時,關(guān)鍵是如何判斷分支的條件。在MCS—51單片機(jī)指令系統(tǒng)中,有JZ(JNZ)、CJNE、JC(JNC)及JB(JNB)等豐富的控制轉(zhuǎn)移指令,它們是分支結(jié)構(gòu)程序設(shè)計的基本,可以完成各種各樣的條件判斷、分支。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計例2:設(shè)變量X存放在VAR單元中,函數(shù)Y存在FUNC單元。編寫按照下式要求給Y賦值的程序。

1 X>0 Y= 0 X=0 -1 X<0解:由于X為有符號數(shù),因此可以根據(jù)它的符號位來決定其正負(fù)。判別符號位是0還是1,可利用JB或JNB指令;而判別X是否為0,則可直接用累加器判零指令JZ。完成本例題任務(wù)的程序流程框圖是由順序結(jié)構(gòu)加分支結(jié)構(gòu)組成的,并且在分支結(jié)構(gòu)中又嵌套了另一個分支結(jié)構(gòu),從而形成了三分支而歸一的流程,如圖3-4所示。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計程序清單:BR1: ORG 2000H MOV A,VAR ;取出X送A JZ COMP ;若X=0則轉(zhuǎn)移到COMP JNB ACC.7,POSI ;若X>0則轉(zhuǎn)移到POSI MOV A,#0FFH ;若X<0則A=-1 SJMP COMP ;轉(zhuǎn)分支結(jié)構(gòu)出口POSI: MOV A,#01H ;X>0時A=1COMP: MOV FUNC,A ;存函數(shù)Y值HERE: AJMP HERE ;結(jié)束程序第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.循環(huán)結(jié)構(gòu)程序設(shè)計在解決實際問題時,往往會遇到同樣的一組需要重復(fù)多次的情況,這時應(yīng)采用循環(huán)結(jié)構(gòu),以簡化程序、縮短程序的長度及節(jié)省存儲空間。例如,要做1到100的加法,沒有必要寫100條加法指令,而只需寫一條加法指令,使其執(zhí)行100次,每次執(zhí)行時操作數(shù)亦作相應(yīng)的變化,同樣能完成原來規(guī)定的操作。循環(huán)結(jié)構(gòu)在圖3-3中表示有兩種形式,可依據(jù)題目的具體要求來選用當(dāng)型或直到型循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)程序也有單重循環(huán)和多重循環(huán)的形式。循環(huán)程序一般由3部分組成:第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計(1)置循環(huán)初值:即設(shè)置循環(huán)開始時的狀態(tài)。如使工作單元清零,置循環(huán)次數(shù)等等。(2)循環(huán)體:即要求重復(fù)執(zhí)行的部分。這部分程序應(yīng)該特別注意,應(yīng)盡量簡化指令,因為它要重復(fù)執(zhí)行許多次。(3)循環(huán)控制部分:它包括循環(huán)參數(shù)修改和依據(jù)循環(huán)結(jié)束條件判斷循環(huán)是否結(jié)束兩部分。如循環(huán)次數(shù)減1,判循環(huán)次數(shù)是否為0,若為0則停止循環(huán)等等。當(dāng)然,判斷循環(huán)結(jié)束的條件,可以是設(shè)置循環(huán)次數(shù)計數(shù)器,也可以是其它條件,如依據(jù)某位狀態(tài)結(jié)束循環(huán)等。例3:從BLOCK單元開始有一個無符號數(shù)數(shù)據(jù)塊,其長度存于LEN單元,試求出數(shù)據(jù)塊中最大的數(shù)并存入MAX單元。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計程序清單:LOOP: ORG 2000H MOV R0,#BLOCK ;數(shù)據(jù)塊首址R0 MOV R1,LEN ;數(shù)據(jù)塊長度送R1 MOV MAX,#00H ;存最大數(shù)單元清零LOOP1:MOV A,MAX ;(A)←(MAX)

CLR C ;清C SUBB A,@R0 ;(MAX)—((R0))

JNC NEXT ;若(MAX)>((R0)),則轉(zhuǎn)移

MOV MAX,@R0 ;若(MAX)<((R0)),則(MAX)←((R0))NEXT: INC R0 ;修改地址指針

DJNZ R1,LOOP1 ;若(R1)≠0則循環(huán)搜索

RET第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計例4:設(shè)計100ms延時程序。解:計算機(jī)執(zhí)行一條指令需要一定的時間,由一些指令組成一段程序,并反復(fù)循環(huán)執(zhí)行,利用計算機(jī)執(zhí)行程序所用的時間來實現(xiàn)延時,這種程序稱為延時程序。如當(dāng)系統(tǒng)使用12MHz晶振時,一個機(jī)器周期為1,執(zhí)行一條雙字節(jié)雙周期DJNZ指令的時間為2,因此,執(zhí)行該指令50000次,就可以達(dá)到延時100ms的目的。對于50000次循環(huán)可采用外循環(huán)、內(nèi)循環(huán)嵌套的多重循環(huán)結(jié)構(gòu)。本例題的程序流程如圖3-6所示。程序清單:START:ORG 1000H MOV R6,#0C8H ;外循環(huán)200次LOOP1:MOV R7,#0F8H ;內(nèi)循環(huán)248次

NOP ;時間補償LOOP1:DJNZ R7,LOOP2 ;延時2×248=496 DJNZ R6,LOOP1 ;延時500×200=100ms RET第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計以上程序執(zhí)行MOVRn,#data指令的時間為1,DJNZ指令2,NOP指令1,所以,內(nèi)循環(huán)延遲時間:1+1+2×248=498,外循環(huán)延遲時間:1+(內(nèi)環(huán)延時+2)×200=100.001ms。對于需要更長時間的延時,可采用更多重的嵌套循環(huán)來實現(xiàn),這種軟件延時方法不需要增加硬件,且變化靈活,故常被采用。它的缺點是延時過程中CPU被占用,而且系統(tǒng)中的中斷服務(wù)會影響定時的精度,所以不宜設(shè)計太長的延時程序。以上分別論述了3種基本結(jié)構(gòu)程序設(shè)計的方法。在解決復(fù)雜的實際問題時,往往存在著相互的嵌套,無論程序如何復(fù)雜,都能分解成3種基本結(jié)構(gòu)的組合,所以只要掌握了3種基本結(jié)構(gòu)的設(shè)計方法,任何復(fù)雜的程序都可以順利編制成功。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計4.子程序結(jié)構(gòu)程序設(shè)計在一個程序中,將反復(fù)出現(xiàn)的程序段編制成一個個獨立的程序段,存放在內(nèi)存中,這些完成某一特定任務(wù)可被重復(fù)調(diào)用的獨立程序段被稱為子程序。在前面所舉的例子中,已有一些程序段是以帶有RET指令的子程序形式出現(xiàn)的。在匯編語言編程時,恰當(dāng)?shù)厥褂米映绦?,可使整個程序的結(jié)構(gòu)清楚,閱讀和理解方便,而且還可以減少源程序和目標(biāo)程序的長度,不必多次重復(fù)書寫和翻譯同樣的指令。在匯編語言源程序中使用子程序,需要強(qiáng)調(diào)注意兩個問題,即子程序中參數(shù)傳遞和現(xiàn)場保護(hù)的問題。在調(diào)用高級語言子程序時參數(shù)的傳遞是很方便的,通過調(diào)用語句的實參數(shù)以及子程序中的虛參數(shù)之間的對應(yīng),很容易完成參數(shù)的往返傳遞。但在調(diào)用匯編語言子程序時則會遇到一個參數(shù)如何傳遞的問題。如用指令(ACALL、LCALL)調(diào)用匯編語言子程序時并不附帶任何參數(shù),參數(shù)的互相傳遞要靠編程者自己安排。其實質(zhì)就是如何安排數(shù)據(jù)的存放以及工作單元的選擇問題。參數(shù)傳遞的方法很多,同一個問題可以采用不同的方法傳遞參數(shù),相應(yīng)的程序也會略有差別。一般在匯編語言中采用的參數(shù)傳遞方法有以下3種。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計(1)用累加器或工作寄存器來傳遞參數(shù)。即在調(diào)用子程序之前把數(shù)據(jù)送入寄存器R0~R7或者累加器A。調(diào)用返回運算結(jié)果仍由寄存器或累加器送回。這種方法的優(yōu)點是編程簡單,也易讀懂;缺點是工作寄存器容量有限,不能傳遞太多的參數(shù)。(2)用指針寄存器傳遞參數(shù)。由于數(shù)據(jù)一般都存放在存儲器中,故可用指針來指示數(shù)據(jù)的位置,這樣可大大節(jié)省傳遞數(shù)據(jù)的工作量,并可實現(xiàn)可變長度傳遞。若參數(shù)存放在內(nèi)部RAM中,通??捎肦0或R1作指針寄存器;若參數(shù)存放在外部RAM或程序存儲器中,可用DPTR作指針。當(dāng)進(jìn)行可變長度傳遞時,可用一個寄存器來指出數(shù)據(jù)長度,也可使用結(jié)束標(biāo)記指出其長度。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計(3)用堆棧來傳遞參數(shù)。在調(diào)用子程序前,主程序可用PUSH指令把參數(shù)壓入堆棧中,進(jìn)入子程序后,再將壓入堆棧的參數(shù)彈出到指定的工作寄存或者其它內(nèi)存單元。子程序運行結(jié)束前,也可把結(jié)果送入堆棧中。子程序返回主程序后,再由主程序用POP指令得到結(jié)果參數(shù)。但要注意,調(diào)用子程序時,斷點處的地址也要壓入堆棧,占用兩個單元,故在彈出參數(shù)時,注意不要把斷點地址送出去。另外在返回主程序時,要把堆棧指針向斷點地址,以便能正確地返回。在進(jìn)入?yún)R編語言子程序,特別是進(jìn)入中斷服務(wù)子程序時,還應(yīng)注意的另一個問題是現(xiàn)場保護(hù)問題,即對于那些不需要進(jìn)行傳遞的參數(shù),包括內(nèi)存單元內(nèi)容、工作寄存器的內(nèi)容以及各標(biāo)志的狀態(tài)等,都不應(yīng)因調(diào)用子程序而改變。這就需要將要保護(hù)的參數(shù),在進(jìn)入子程序時壓入堆棧,即保護(hù)起來,而空出這些數(shù)據(jù)所占用的工作單元,供子程序使用。在返回調(diào)用程序之前,則將壓入堆棧的數(shù)據(jù)彈出到原有的工作單元,恢復(fù)其原來的狀態(tài),使調(diào)用程序可以繼續(xù)往下執(zhí)行。這種現(xiàn)場保護(hù)的措施在中斷時尤為必要,更加不能忽視。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計由于堆棧操作是“先入后出”,因此,先壓入堆棧的參數(shù)應(yīng)后彈出,才能保證恢復(fù)原來的狀態(tài)。例如:SUBROU: PUSH A PUSH PSW PUSH DPL PUSH DPH … POP DPH POP DPL POP PSW POP A第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.1.4匯編語言開發(fā)環(huán)境及匯編過程1.匯編語言開發(fā)環(huán)境單片機(jī)應(yīng)用系統(tǒng)不具備自開發(fā)功能。匯編語言程序的開發(fā)必須借助一定的開發(fā)工具,因此,匯編語言程序設(shè)計、調(diào)試過程及難易程序與開發(fā)環(huán)境密切相關(guān)。(1)滿足最低要求的匯編語言程序開發(fā)環(huán)境在滿足匯編語言程序開發(fā)最低要求時,開發(fā)裝置的配置應(yīng)具有以下基本功能:①硬件系統(tǒng)能實現(xiàn)程序指令及相關(guān)數(shù)據(jù)輸入(如目的程序指令碼、數(shù)據(jù)表格、常數(shù)等)。實現(xiàn)程序調(diào)試的單步、連續(xù)、設(shè)斷點運行。能修改程序指令及查詢程序運行狀態(tài)。②有仿真頭,實現(xiàn)用戶應(yīng)用系統(tǒng)的仿真調(diào)試及用戶環(huán)境運行。③具有EPROM的程序固化功能。④具有反匯編及匯編程序文本打印功能。⑤能對輸入的匯編語言程序指令實現(xiàn)保存、轉(zhuǎn)儲。這樣,就可將已調(diào)好的程序段,或鍵入而未調(diào)試完的程序指令保存起來,不需要再次鍵入。⑥與以上功能相配合的操作軟件。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計(2)較完善的匯編語言程序開發(fā)環(huán)境目前,一個較完善的匯編語言程序開發(fā)環(huán)境除以上基本要求外,應(yīng)該是:①有匯編語言編譯環(huán)境。用匯編語言編輯應(yīng)用程序,能顯示編輯錯誤,并能自動生成目的程序指令碼。②具有通用系統(tǒng)微機(jī)的外設(shè),如屏幕編輯、磁盤存儲、文本打印。③有豐富的子程序庫及功能很強(qiáng)的操作軟件。要構(gòu)成這樣的開發(fā)環(huán)境,除了一些專門研制的開發(fā)系統(tǒng)外,大多采取在通用系統(tǒng)微機(jī)上配備交叉匯編,組合軟件構(gòu)成匯編程序的編譯環(huán)境,然后半自動生成的目的程序通過通信接口送到開發(fā)裝置上去進(jìn)行調(diào)試運行。系統(tǒng)機(jī)所有的外設(shè)資源可以滿足程序的磁盤存儲、文本打印等。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計(3)模擬的開發(fā)手段最理想的開發(fā)是具有通用系統(tǒng)微機(jī)配置水平的專用開發(fā)系統(tǒng)。這些系統(tǒng)一般都是單片機(jī)生產(chǎn)廠家推出的開發(fā)系統(tǒng),它具有最完善的匯編語言程序開發(fā)環(huán)境及軟件包,但售價昂貴,一般用戶無法配置。用戶可按下述方法構(gòu)成一個較為理想的開發(fā)環(huán)境。①在通用系統(tǒng)微機(jī)上實現(xiàn)應(yīng)用程序的模擬開發(fā)在通用系統(tǒng)微機(jī)上利用模擬調(diào)試軟件實現(xiàn)單片機(jī)結(jié)構(gòu)功能模擬、指令模擬、實現(xiàn)程序的模擬運行調(diào)試。這樣,在通用系統(tǒng)微機(jī)中可以完成程序編制、糾錯、運行調(diào)試的一個完整過程。在微機(jī)中配置有方便的EPROM讀/寫裝置時可以完成一個應(yīng)用程序完整的開發(fā)過程。目前國內(nèi)已推出在微機(jī)上使用的模擬開發(fā)軟件。這種開發(fā)環(huán)境在已有通用微機(jī)配置的用戶單位,只要配置模擬開發(fā)軟件即可。目前廣泛使用的開發(fā)軟件μVision3IDE是Keilsoftware公司的產(chǎn)品,它集項目管理、編譯工具、代碼編寫工具、代碼調(diào)試以及完全仿真于一體,適合個人開發(fā)或人數(shù)少、對開發(fā)過程的管理還不成熟的開發(fā)團(tuán)體。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計②用戶應(yīng)用系統(tǒng)運行調(diào)試模擬開發(fā)環(huán)境不是實時仿真,不能完全模擬用戶的應(yīng)用系統(tǒng)環(huán)境。一般還需要少量的應(yīng)用系統(tǒng)運行調(diào)試工作。因為在模擬調(diào)試時已完成了主要的調(diào)試工作。將經(jīng)過模擬調(diào)試好的應(yīng)用程序固化到EPROM芯片上,然后放在應(yīng)用系統(tǒng)中試運行,如果不能執(zhí)行,則返回修改,直到成功。這種調(diào)試方法無法了解應(yīng)用系統(tǒng)的運行狀態(tài),修改程序帶有一定的盲目性。但是不需要硬件開發(fā)裝置,成本最低。一般的方法是除了在通用機(jī)上配置模擬軟件外,還配備有滿足實時仿真要求的開發(fā)模板或開發(fā)裝置,它與通用機(jī)可以實現(xiàn)通信。通用機(jī)將模擬調(diào)試過的應(yīng)用程序輸入開發(fā)裝置,開發(fā)裝置通過仿真頭與應(yīng)用系統(tǒng)相連。這樣,應(yīng)用程序可以在應(yīng)用系統(tǒng)的真實環(huán)境下運行,以檢查應(yīng)用程序,彌補模擬調(diào)試不足。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計2.匯編語言源程序的匯編。匯編語言源程序必須轉(zhuǎn)換為機(jī)器碼表示的目標(biāo)程序,計算機(jī)才能執(zhí)行。把這種轉(zhuǎn)換過程稱這為匯編。對單片機(jī)來說,有手工匯編和機(jī)器匯編兩種匯編方法。(1)手工匯編所謂手工匯編,即把程序用助記符指令寫出后,再以手工方式查指令編碼表,逐個把助記符指令“翻譯”成機(jī)器碼,然后再把機(jī)器碼的程序鍵入單片機(jī),進(jìn)行調(diào)試和運行。由于手工匯編方法麻煩、工作量大、還容易出錯,這種方法現(xiàn)在幾乎不再應(yīng)用。(2)機(jī)器匯編所謂機(jī)器匯編,就是在計算機(jī)上通過匯編程序進(jìn)行源程序的匯編。匯編工作由機(jī)器自動完成,直到最后得到機(jī)器碼的目標(biāo)程序。在微型機(jī)上使用匯編語言都是采用機(jī)器匯編。然而在單片機(jī)上,由于軟硬件資源的限制無法直接進(jìn)行機(jī)器匯編。為此,只好借助于微型計算機(jī),以交叉匯編的方法實現(xiàn)。使用一種計算機(jī)的匯編程序去匯編另一種計算機(jī)的匯編語言源程序,即為另一種計算機(jī)產(chǎn)生目標(biāo)程序,這種匯編方式稱之為交叉匯編。單片機(jī)的源程序通常就是通過這種交叉匯編方法而生成目標(biāo)程序的。鑒于現(xiàn)在PC機(jī)的使用非常廣泛,所以通常這種交叉匯編都是在PC機(jī)上進(jìn)行的。匯編完成后,再由PC機(jī)把生成的目標(biāo)程序通過串行傳送加載到單片機(jī)上。交叉匯編的整個過程可用圖3-7來說明。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.1.5匯編語言設(shè)計規(guī)范

軟件設(shè)計更多地是一種工程,而不是一種個人藝術(shù)。如果不統(tǒng)一編程規(guī)范,最終寫出的程序,其可讀性將較差,這不僅給代碼的理解帶來障礙,增加維護(hù)階段的工作量,同時不規(guī)范的代碼隱含錯誤的可能性也比較大。分析表明,編碼階段產(chǎn)生的錯誤當(dāng)中,語法錯誤大概占20%左右,而由于未嚴(yán)格檢查軟件邏輯導(dǎo)致的錯誤、函數(shù)(模塊)之間接口錯誤及由于代碼可理解度低導(dǎo)致優(yōu)化維護(hù)階段對代碼的錯誤修改引起的錯誤則占了一半以上??梢姡岣哕浖|(zhì)量必須降低編碼階段的錯誤率。為了有效降低編碼階段的錯誤,需要制定詳細(xì)的軟件編程規(guī)范。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計1.排版

程序塊使用縮進(jìn)方式,函數(shù)和標(biāo)號使用空格縮進(jìn),程序段混合使用TAB和空格縮進(jìn)??s進(jìn)的目的是使程序結(jié)構(gòu)清晰,便于閱讀和理解。

2.注釋

注釋的原則是有助于對程序的閱讀理解,注釋不宜太多也不能太少,太少不利于代碼理解,太多則會對閱讀產(chǎn)生干擾,因此只在必要的地方才加注釋,而且注釋要準(zhǔn)確、易懂、盡可能簡潔。注釋量一般控制在30%到50%之間。程序在必要的地方必須有注釋,注釋要準(zhǔn)確、易懂、簡潔。

3.命名第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計4.可維護(hù)性5.程序正確性、效率6.接口7.代碼可測性8.代碼編譯

第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.1.6程序設(shè)計舉例1.代碼轉(zhuǎn)換程序設(shè)計下面的例子完成十六進(jìn)制數(shù)與ASCII碼之間的相互轉(zhuǎn)換,BCD碼與ASCII碼之間轉(zhuǎn)換的基本程序設(shè)計方法與之類似。例5:十六進(jìn)制數(shù)到ASCII碼的轉(zhuǎn)換子程序設(shè)計。例6:ASCII碼到十六進(jìn)制數(shù)的轉(zhuǎn)換子程序設(shè)計。2.運算子程序設(shè)計例7:雙字節(jié)無符號數(shù)乘法子程序設(shè)計。例8:雙字節(jié)無符號數(shù)除法子程序設(shè)計。3.查表程序設(shè)計例9:設(shè)有一巡檢報警裝置,需要對16路值進(jìn)行比較,當(dāng)每一路輸入值超過該路的報警值時,實現(xiàn)報警。要求編制一個查表子程序,依據(jù)路數(shù)xi,查表得yi的報警值。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計4.散轉(zhuǎn)(多分支)程序設(shè)計例10:按R2的內(nèi)容轉(zhuǎn)向4個分支處理程序。4個分支處理程序總長度小于256個字節(jié)。解:入口:(R2)=入口條件(0,1,2,3)。例11:設(shè)計可多達(dá)128路分支出口的轉(zhuǎn)移程序。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.2C語言程序設(shè)計

單片機(jī)應(yīng)用系統(tǒng)的程序設(shè)計,可以采用匯編語言完成,也可以采用C語言實現(xiàn)。匯編語言對單片機(jī)內(nèi)部資源的操作直接、簡潔、代碼緊湊。但是當(dāng)系統(tǒng)的規(guī)模較大時,設(shè)計人員更趨于采用C語言進(jìn)行程序設(shè)計。這是由于C語言具有良好的可讀性、可移植性和基本的硬件操作能力。3.2.1C51語言概述1.C51程序開發(fā)過程(1)采用C51的優(yōu)點采用C51進(jìn)行單片機(jī)應(yīng)用程序設(shè)計,編譯器能自動完成量的存儲單元的分配,編程者可以專注于應(yīng)用程序的邏輯思想;對常用功能模塊和算法編制相應(yīng)的函數(shù),可以方便地進(jìn)行算法和應(yīng)用程序的移植。因此,用C51進(jìn)行程序設(shè)計可以大大提高實際工程的開發(fā)效率。目前,C51的代碼長度做到了匯編程序水平的1.2~1.5倍。當(dāng)代碼長度超過4KB以上時,C51比匯編語言更具有明顯的優(yōu)勢。我們還可以借助仿真器,對應(yīng)用程序的關(guān)鍵代碼進(jìn)行優(yōu)化,以減少代碼長度,提高運行速度。由于單片機(jī)生產(chǎn)工藝的改善,單片機(jī)的運行速度和內(nèi)部存儲器容量有了較大的提高,這些都為C51語言的使用創(chuàng)造了有利的條件。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計(2)C51程序開發(fā)過程首先要編寫C51源程序,可以采用μVison集成開發(fā)環(huán)境的源程序編輯功能完成(為了避免μVison編輯器的兼容性問題,可以采用其他文本編輯軟件,如UltraEdit完成源程序的編輯);然后建立工程文件,加入C51源程序;這時就可以利用μVison集成的編譯器和連接器生成目標(biāo)文件(﹒EXE);進(jìn)而進(jìn)行軟件或硬件仿真調(diào)試;最后利用編程器將調(diào)試無誤的代碼寫到單片機(jī)的程序存儲器中。2.C51程序結(jié)構(gòu)C51程序由一個或多個函數(shù)構(gòu)成,其中至少應(yīng)包含一個主函數(shù)main。程序從主函數(shù)開始執(zhí)行,調(diào)用其他函數(shù)后又返回主函數(shù),被調(diào)用函數(shù)如果位于主調(diào)函數(shù)前面,可以直接調(diào)用,否則應(yīng)先說明調(diào)用。被調(diào)用函數(shù)可以是用戶自編的函數(shù),或是C51編譯提供的庫函數(shù)。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.2.2C51關(guān)鍵字和標(biāo)識符關(guān)鍵字是一類具有固定名稱和特定含義的特殊標(biāo)識符,有時又稱為保留字。在編寫C語言源程序時一般不允許將關(guān)鍵字另作它用,換句話說,就是對于標(biāo)識符的命名不要與關(guān)鍵字相同。與其他計算機(jī)語言相比,C語言的關(guān)鍵字是比較少的,ANSIC標(biāo)準(zhǔn)一共規(guī)定了32個關(guān)鍵字,表3-2按用途列出了ANSIC標(biāo)準(zhǔn)的關(guān)鍵字。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.2.3C51語言的數(shù)據(jù)類型1.C51的數(shù)據(jù)類型編寫程序的目的是對數(shù)據(jù)進(jìn)行操作,并得到所期望的結(jié)果。數(shù)據(jù)是操作的對象,實際問題中存在著不同的數(shù)據(jù)類型。數(shù)據(jù)類型決定其取值范圍、占用存儲器的大小及可參與哪種運算。程序中使用到的數(shù)據(jù)要存放在存儲單元中,在匯編語言中用DB或DW偽指令對存入數(shù)據(jù)的存儲單進(jìn)行定義;在C51語言中,編譯系統(tǒng)要根據(jù)定義的數(shù)據(jù)類型來預(yù)留存儲單元,這就是定義數(shù)據(jù)類型的意義第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計2.C51數(shù)據(jù)的存儲器類型C51是面向8051單片機(jī)的程序語言,應(yīng)用程序中使用的任何數(shù)據(jù)(變量和常量)必須以一定的存儲器類型定位于單片機(jī)的相應(yīng)的存儲區(qū)域中。3.80C51硬件結(jié)構(gòu)的C51定義C51是對標(biāo)準(zhǔn)C語言(ANSIC)進(jìn)行了擴(kuò)展,從而具有對80C51單片機(jī)硬件結(jié)構(gòu)的支持與操作能力。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.2.4常量、變量和指針1.常量和變量C51語言的數(shù)據(jù)可以分為常量和變量,常量的值在程序執(zhí)行過程中不能發(fā)生變化,變量值在程序執(zhí)行過程中可以改變。(1)常量常量是在程序執(zhí)行過程中不能改變的值。按照數(shù)據(jù)類型,常量可以分為整型常量、字符型常量等。使用預(yù)定義對常量進(jìn)行定義,使用一個標(biāo)識符代替一個常量,如例3-6。例3-6:常量定義。#defineCONST10/*在以后的程序中CONST可以使用為常量,數(shù)據(jù)為10*/說明:為了區(qū)別變量,常量一般使用大寫,而且常量一旦預(yù)定義之后就不能再修改。(2)變量變量是在程序執(zhí)行過程中可以發(fā)生改變的值,變量有3個相關(guān)參數(shù),即變量名、變量值和變量地址。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計2.指針指針為變量的訪問提供了一種特殊的方式。如果有一個變量a,則可以利用&a表示變量a的地址。這時可以執(zhí)行語句:p=&a;該語句把a的地址賦給了指針變量p,這時可以說“p指向了變量a”。變量的指針就是該變量的地址。為了獲得指針?biāo)赶驅(qū)ο蟮膬?nèi)容,可以利用指針運算符“*”來實現(xiàn),如:*p表示變量a的內(nèi)容。應(yīng)該注意的是,指針變量中只能存放指針型數(shù)據(jù)(即地址),不要將一個非指針型的數(shù)據(jù)賦給個指針變量。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計(2)基本存儲量的指針基于存儲器的指針在定義時就指定了所指向?qū)ο蟮拇鎯︻愋?。此類可以高效訪問對象,類型由C51源代碼中存儲器類型決定,且在編譯時確定。由于不必為指針選擇存儲器,指針的長度可以為1個字節(jié)(idata*,data*,pdata*)或2個字節(jié)(eode*,xdata*)。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.2.5C51的基本運算1.C51的算術(shù)和賦值運算算術(shù)運算和賦值運算是C51語言的基本運算操作之一,下面詳細(xì)介紹算術(shù)和賦值運算。(1)算術(shù)運算符和算術(shù)表達(dá)式(2)賦值運算符和賦值表達(dá)式賦值運算符包括普通賦值運算符和復(fù)合賦值運算符兩種,普通的賦值運算符使用“=”,復(fù)合賦值運算符是在普通賦值運算符之前加上其他運算符所構(gòu)成的賦值符。使用賦值運算符連接的變量和表達(dá)式構(gòu)成賦值表達(dá)式.2.邏輯運算C51語言有3種邏輯運算符。①邏輯與:&&。②邏輯或:‖。③邏輯非:!。使用邏輯運算符將表達(dá)式或變量連接起來的表達(dá)式稱為邏輯表達(dá)式,邏輯運算內(nèi)部運算次序是先邏輯非后邏輯與和邏輯或,相同等級時從左到右,邏輯表達(dá)式的值為“真”或“假”,在C51系統(tǒng)中使用“0”代表“假”,使用“非0”代表邏輯“真”,但是邏輯運算表達(dá)式結(jié)果只能使用“1”來表示“真”.第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.關(guān)系運算C51語言有6種關(guān)系運算,如下所示。①小于:<。②大于:>。③小于等于:≤。④大于等于:≥。⑤如果等于:==。⑥如果不等于:!=。使用關(guān)系運算符連接的表達(dá)式或變量稱為關(guān)系表達(dá)式,關(guān)系運算符中前兩種優(yōu)先級別高于后兩種,同等優(yōu)先級下遵守從左到右的順序,關(guān)系運算式的運算結(jié)果是邏輯真“1”或者是邏輯假“0”.第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計4.位操作MCS-51系列單片機(jī)有位尋址空間,支持位變量操作,恰當(dāng)?shù)奈徊僮鲿蟠筇岣邌纹瑱C(jī)程序的運行速度,還能極大地方便用戶編程,位操作包括位邏輯運算和移位運算兩種類型。(1)位邏輯運算位邏輯運算包括位與、位或、位異或位取反。①位與:關(guān)鍵字“&”,如果兩位都為“1”,則結(jié)果為“1”,否則為“0”。②位或:關(guān)鍵字“∣”,如果兩位其中有一個為“1”,則結(jié)果為“1”,否則為“0”。③位異或:關(guān)鍵字“^”,如果兩位相等則為“1”,否則為“0”。④位取反:關(guān)鍵字“~”,如果該位為“1”,則取反后為“0”,如果該位為“0”,則該位取反后為“1”。第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計5.自增減運算、復(fù)合運算、逗號運算6.運算符的優(yōu)先級第3章微機(jī)系統(tǒng)應(yīng)用程序設(shè)計3.2.6函數(shù)與普通的C語言程序類似,C51程序是由若干模塊化的函數(shù)構(gòu)成。函數(shù)是C51程序的基本模塊,常說的子程序就是由函數(shù)來實現(xiàn)的。用戶可以根據(jù)需要定義

溫馨提示

  • 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

提交評論