單片機原理及應(yīng)用課件:第4章 單片機應(yīng)用系統(tǒng)編程基礎(chǔ)1_第1頁
單片機原理及應(yīng)用課件:第4章 單片機應(yīng)用系統(tǒng)編程基礎(chǔ)1_第2頁
單片機原理及應(yīng)用課件:第4章 單片機應(yīng)用系統(tǒng)編程基礎(chǔ)1_第3頁
單片機原理及應(yīng)用課件:第4章 單片機應(yīng)用系統(tǒng)編程基礎(chǔ)1_第4頁
單片機原理及應(yīng)用課件:第4章 單片機應(yīng)用系統(tǒng)編程基礎(chǔ)1_第5頁
已閱讀5頁,還剩102頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章單片機應(yīng)用系統(tǒng)編程基礎(chǔ)內(nèi)容:從源程序到可執(zhí)行代碼機器碼-匯編語言-高級語言MCS-51匯編語言指令分析匯編語言程序組成與結(jié)構(gòu)從C語言過渡到C51程序設(shè)計舉例4.1從源程序到可執(zhí)行代碼1.CPU的工作方式計算機工作時,CPU總是周而復(fù)始地做取指——解釋指令——下達命令這一項工作。在每個指令周期中,CPU先取指令代碼,再對指令進行解析,產(chǎn)生決策,由系統(tǒng)完成指令的功能。指令代碼是什么?它是怎樣形成的?又是如何放入單片機系統(tǒng)中的?2.計算機“智慧”的來源 計算機(單片機)系統(tǒng)能完成一項具體的、復(fù)雜的工作,說明它有思維的能力。它的“智慧”是從哪來的呢?答案是人賦予它的。3.計算機的加工原料計算機的加工原料是數(shù)據(jù)且只有數(shù)據(jù)。4.2機器碼-匯編語言-到高級語言

計算機的CPU只能識別的二進制代碼。計算機發(fā)明之初,程序是由編程者直接輸入機器碼使計算機工作的。 機器碼是計算機最底層的可執(zhí)行的代碼。由于難于理解、編程工作量大,而效率極低,直接輸入機器碼的方法只適于專業(yè)計算機軟件人員,不利于計算機的發(fā)展和普及。4.3MCS-51匯編語言指令分析請?zhí)貏e注意:

51機共有111條指令,按其占用空間大小分:單字節(jié)指令(指令碼代碼為1個字節(jié))49條,雙字節(jié)指令45條,三字節(jié)指令17條。 按指令執(zhí)行速度分:單周期指令(指令執(zhí)行的時間為1個機器周期)64條,雙周期指令45條,4周期指令2條(乘、除)。在12M時鐘條件下,指令執(zhí)行時間分別為1、2、4微秒。4.3.1MCS-51匯編語言格式MCS-51系列單片機匯編語言格式如下:[標(biāo)號]:<操作碼助記符>[第一操作數(shù)],[第二操作數(shù)];注釋例如: RET ;無第一操作數(shù)

CLP A ;有第一操作數(shù)

MOV A,75H;有第1及第2操作數(shù)4.3.2MCS-51指令中的符號說明

4.3.3MCS-51的尋址方式所謂尋址方式,就是CPU尋找操作數(shù)的方式。51機有以下幾種尋址方式:1.立即尋址:操作數(shù)直接包含在指令中。符號“#”表示其后的數(shù)據(jù)為立即數(shù)。如:MOV A,#40H ;將8位二進制數(shù)40H賦予AMOV DPTR,#1000 ;將1000賦予數(shù)據(jù)指針DPTR2.直接尋址:可訪問SFR、內(nèi)部RAM、位。如:MOV TH0,A ANL 70H,#48H ;直接尋址,也屬于立即尋址MOV C,bit3.寄存器尋址:對象為R0~R7、A、B、DPTR等。如MOV A,R3MUL AB4.寄存器間接尋址:可訪問片內(nèi)、外RAM。如:MOV @Ri,A ;i=0,1只有R0、R1可作間址寄存器5.變址尋址:由偏移量寄存器A和基址寄存器DPTR或PC的“和”作為地址的尋址方式。如:MOVC A,@A+DPTR ;MOVC專對ROM操作MOVC A,@A+PCJMP @A+DPTR6.相對尋址:以PC的內(nèi)容為加上指令中的偏移量作為轉(zhuǎn)移地址的尋址方式,地址轉(zhuǎn)移范圍為:-128~127如:DJNZ R7,rel7.位尋址:對片內(nèi)20H~2FH及SFR可位尋址單元的操作。如:MOV C,20H ;片內(nèi)位操作指令4.3.4MCS-51指令概述按指令功能,可將MCS-51的指令分為以下5類:數(shù)據(jù)傳送與互換類。算術(shù)運算類。邏輯運算類??刂妻D(zhuǎn)移類。位操作類。1.?dāng)?shù)據(jù)傳送與互換類指令數(shù)據(jù)傳送與互換類指令列于表4-2中。第4章補充作業(yè):(1)描述MOVA,Rn和MOV@Ri,A兩條指令的功能。(2)作圖示意用RLCA指令,將3字節(jié)長度的正整數(shù)左移一位的過程,進而再將這個數(shù)再左移一位,預(yù)測其結(jié)果。由此得到結(jié)論:一個正整數(shù)左移一位數(shù)值變化的規(guī)律及保證正確的條件是什么?(3)寫出實現(xiàn)片將內(nèi)30H中的內(nèi)容求反的程序段。(4)寫出基于CJNE指令實現(xiàn)判斷兩個正整數(shù)數(shù)量關(guān)系(大于、等于、小于)的程序段。(5)說明定位匯編主程序0000H的道理及方法。又為什么主程序的第一條指令通常都是跳轉(zhuǎn)指令?數(shù)據(jù)傳送指令包括:(1)內(nèi)部RAM與SFR之間的數(shù)據(jù)傳送,這類指令用“MOV”作為指令助記符。(2)外部RAM與A之間的數(shù)據(jù)傳送,這類指令用“MOVX”作為指令助記符。(3)程序存儲器單元的內(nèi)容讀入A中的指令,用“MOVC”作為指令的助記符。(4)堆棧操作類指令。(5)數(shù)據(jù)交換類指令。數(shù)據(jù)傳送與交換類指令有如下特點:(1)數(shù)據(jù)傳送類指令的數(shù)據(jù)流是單向的。第2操作數(shù)總是要傳送到第1操作數(shù)的。所以,第1操作數(shù)既是目的數(shù),又是操作數(shù)。指令執(zhí)行后不改變第2操作數(shù)的內(nèi)容。在表5-4第3列中的箭頭方向,表示數(shù)據(jù)流的方向。(2)交換類指令數(shù)據(jù)傳送是雙向的。影響第1、2操作數(shù)。(3)數(shù)據(jù)傳送指令不是在所有寄存器和存儲器單元間都能直接實現(xiàn)的。即某兩個單元間的數(shù)據(jù)傳送,是需要匹配的。(4)數(shù)據(jù)傳送與交換類指令的尋址方式,包括立即直接、間接、寄存器和變址尋址5種方式,因此數(shù)據(jù)交換方式多,使用方便。(5)表4-4第4列為指令執(zhí)行的機器周期數(shù)和代碼的字節(jié)數(shù),對精益求精者來說,使用哪條指令更好還是有推敲余地的。(6)對片內(nèi)RAM的間址寄存器是R0和R1,而R2~R7不可以!外部存儲器間的數(shù)據(jù)交換,可通過R0和R1、DPTR和PC實現(xiàn),而且對它們的操作只有間接尋址一種方式。R0和R1的間址范圍為0~FFH,只有兩種指令形式:MOVX A,@Ri MOVX @Ri,A 從時間、空間效率上講,完全可用以下兩條指令實現(xiàn):MOVX A,@DPTR MOVX @DPTR,A

一般情況下,對外部RAM操作用DPTR作為數(shù)據(jù)指針。R0和R1只有在外部數(shù)據(jù)指針不夠用,且這些數(shù)據(jù)位于第一頁(0~FFH)時,才使用它們。注:DPTR不能作為片內(nèi)RAM的數(shù)據(jù)指針。(7)數(shù)據(jù)傳送指令不影響PSW內(nèi)容,只是當(dāng)數(shù)據(jù)送入A時才影響奇偶標(biāo)志位P?!纠?-1】設(shè)51機片內(nèi)RAM中30H單元的內(nèi)容為40H,而40H單元的內(nèi)容為50H。P1口作為輸入口,數(shù)據(jù)為0CAH,下列指令順序執(zhí)行時,相關(guān)單元的內(nèi)容為何值?

MOV R0,#30H ;(R0)=30H,立即尋址

MOV A,@R0 ;(A)=40H,間接尋址,P=1。

MOV R1,0E0H ;(R1)=40H,E0是A的地址

MOV B,@R1 ;(B)=50H,間接尋址

MOV @R1,P1 ;(40H)=0CAH,間接尋址

MOV P2,P1 ;(P2)=0CAH(P2為輸出)解:答案見注釋。

【例4-3】設(shè)(R0)=20H,(A)=4EH,片內(nèi)RAM(20H)=85H。下列指令順序執(zhí)行,所涉及的單元(寄存器和存儲器)的內(nèi)容如何變化?XCHA,@R0 ;執(zhí)行后(A)=85H,(20H)=4EH,(R0)不變XCHDA,@R0 ;執(zhí)行后(A)=8EH,(20H)=45H,(R0)不變SWAPA ;執(zhí)行后(A)=E8H,(20H)、(R0)不變解:答案見注釋。2.算術(shù)運算類指令算術(shù)運算指令是對寄存器及存儲器單元進行“+”、“-”、“×”、“÷”這四種基本運算的指令。表4-3為MCS-51的算術(shù)運算類指令集。

1.加法指令的特點:

(1)目的操作數(shù)均是累加器A。寄存器、直接、寄存器間接、立即等四種尋址方式,結(jié)果在A中;(2)影響進位標(biāo)志Cy、OV、Ac及P。(3)溢出標(biāo)志OV為1的條件是: 執(zhí)行加法運算后,符號位(b7),出錯或但結(jié)果不正確時,OV=1。④帶進位加法指令(ADDC)中的累加器A除了加源操作數(shù)外,還需要加上進位標(biāo)志Cy。2)減法指令 特點:結(jié)果在A中。尋址方式同加法影響標(biāo)志位:

Cy:為1,表示被減數(shù)小于減數(shù),產(chǎn)生借位;

OV:對帶符號數(shù)OV為1,結(jié)果不正確。

Ac:如果b3位向b4位借位,則為1;反之為0。

P:累加器A中“1”的個數(shù)為奇數(shù)時,P為1。 只有帶借位的減法指令,因此,用減法指令前,往往需通過“CLRC”指令,將進位標(biāo)志Cy清零?!纠?-3】試分析:在下列程序段指令順序執(zhí)行后,PSW中各標(biāo)志位的狀態(tài)。

MOV A,#10101101B ;把ADH送A中,P=1,PSW的其它位均為0ADD A,#10011101B ;(A)=ADH+9DH=4AH,P、OV、AC、CY均為1ADDC A,#00H ;(A)=4BH,P=0SUBB A,#4CH ;(A)=FFH,AC、CY為1ADD A,#01H ;(A)=00H,CY為1

解:第1條指令執(zhí)行后,(A)=ADH中,由于ADH中共有5個“1”,因此,奇偶標(biāo)志位P為“1”,PSW中其它狀態(tài)位不變。ADH=173(無符號數(shù))或-83(有符號數(shù):補碼);9DH=157(無符號數(shù))或-99(有符號數(shù))。第2條指令執(zhí)行的計算式如圖4-2(a)所示。

作為無符號數(shù),兩數(shù)之和為14AH,即330,正確。但結(jié)果超出FFH,進位的“1”自然丟失,寄存器A的內(nèi)容為4AH。進位值在CY中。 作為有符號數(shù),兩數(shù)之和應(yīng)為-182。結(jié)果是4AH或14AH都不對,此時,OV=1,說明“和”超出了值域,結(jié)果不正確。 因此,做有符號數(shù)運算時,用OV作為溢出的判據(jù)是必要的。

第4條是減法指令。執(zhí)行前只有P=1,被減數(shù):4BH=75(有符號數(shù)與無符號數(shù)同值,即正數(shù)的補碼等于原碼);減數(shù):4CH=76。 作為有符號數(shù),結(jié)果為-1,正確。 作為無符號數(shù),只看A的內(nèi)容,結(jié)果是不正確的。但考慮到借位,即256+75-76=255,結(jié)果依然正確。其計算式如圖4-2(b)所示。注:有關(guān)有符號數(shù)的概念本書只做介紹,而運算的重點將放在無符號整數(shù)上。

3)加1、減1指令 助記符為INC、DEC類指令,其功能是使指令中的操數(shù),加1和減1。它們的特點是不影響標(biāo)志位,只有操作數(shù)為A時,才影響奇偶標(biāo)志位P。所以加1、減1指令主要用于循環(huán)程序結(jié)構(gòu)中的數(shù)據(jù)指針的變化方向。例如: INC R0 ;或INC R1

INC DPTR

當(dāng)操作數(shù)為FFH時,再加1,操作數(shù)將回到00H,而當(dāng)操作數(shù)為00H時,再減1,操作數(shù)將回到FFH。這一特點可形成8位循環(huán)控制計數(shù)。注意:DECDPTR非法4)乘法和除法指令 只有MULAB一條。功能如下:

A × B = B A

被乘數(shù)

乘數(shù) 積高8位 低8位 運行時間為4個機器周期。 該指令影響標(biāo)志位:當(dāng)結(jié)果大于255時,OV為1,反之為0。

Cy總為0;AC保持不變;P隨A中“1”的個數(shù)而變化。除法指令只有DIVAB一條。

A ÷ B = A B

被除數(shù)

除數(shù) 商余數(shù)運行時間為4個機器周期。影響標(biāo)志位:除數(shù)為0,執(zhí)行后,結(jié)果將不確定,且OV為1。Cy總為0。AC保持不變;奇偶標(biāo)志P位隨累加器A中“1”的個數(shù)變化而變化。5)十進制加法調(diào)正指令 計算機是以二進制計數(shù)的。但人們早已習(xí)慣十進制計數(shù)方式。典型的例子是計算器。那么計算機系統(tǒng)如何實現(xiàn)十進制運算呢?十進制調(diào)整指令只有助記符為DAA這一條。其用法見例4-16。4.5.4邏輯操作類指令

51提供了豐富的邏輯運算指令,包括邏輯非、與、或、異或以及循環(huán)移位操作等。如表4-4所示。 特點:不影響PSW中的標(biāo)志位。只有在A參與的帶進位Cy循環(huán)移位時,才影響Cy和奇偶標(biāo)志P。1)邏輯運算類指令的特點 (1)不影響程序標(biāo)志位。只有在A參與的帶Cy的循環(huán)移位時,才影響Cy和P。 (2)所有邏輯運算均按位進行,例如當(dāng)A=10100101B,與立即數(shù)01011010B相與,即執(zhí)行指令:ANLA,#01011010B后,指令執(zhí)行后累加器A為0。 (3)“與”、“或”、“異或”指令的尋址方式相同,指令的條數(shù)一樣多。

【例4-4】在程序中將P1口的b4、b2位清零,而其它位的內(nèi)容不變,可用什么指令?解:預(yù)將變量中某些指定位清零,用它與立即數(shù)相與的方法最容易想到,該立即數(shù)除那些“指定位”外,全為1。 本題用指令:ANL P1,#11101011B來實現(xiàn)。【例4-5】在程序中將P1口的b4、b2位置位,而其它位的內(nèi)容不變,可用什么指令? 解:將立即數(shù)中“指定位”設(shè)為1,再與目標(biāo)相或(ORLP1,#00010100B)即可實現(xiàn)。 異或指令的邏輯關(guān)系這樣記憶:相同為“0”,相異為“1”?!纠?-6】在程序中檢測A與SBUF的內(nèi)容是否相等,可采用什么算法? 解:判斷2個寄存器的內(nèi)容是否相等,用“異或”邏輯非常方便,對本例,指令XRLA,SBUF效率極高。 指令執(zhí)行后,若(A)=0,則兩個寄存器內(nèi)容相等,否則就不等。判斷(A)是否為0的指令,后面就會學(xué)到。2)循環(huán)移位類指令循環(huán)移位類指令均以A為操作數(shù),此類指令使用頻繁,可參與數(shù)學(xué)運算、邏輯運算、循環(huán)計數(shù)、I/O操作等多種過程。這類指令又分帶CY循環(huán)移位,即(A)連同CY一起作開放循環(huán);及不帶CY的循環(huán),即(A)內(nèi)封閉循環(huán)。 移位又分左右兩個方向,見表4-4指令功能描述中箭頭方向。

【例4-7】為防止數(shù)據(jù)溢出,先假設(shè)(A)≤3FH,現(xiàn)要對A進行乘4運算,試實現(xiàn)之。解:方法1,用移位指令實現(xiàn),程序段如下:

RL A RL A 循環(huán)左移兩次相當(dāng)于乘4?!癛LA”是不包括Cy的左移需要2×1個機器周期,2×1字節(jié)代碼。而如用乘法指令實現(xiàn),其程序段如下:

MOV B,#04H ;2字節(jié)1個機器周期指令

MUL AB ;1字節(jié)4個機器周期指令

3字節(jié)代碼,5個機器周期,還要占用B。

推論:多字節(jié)數(shù)進行乘以/除以2n的運算,移位要依次按序到每一字節(jié)。乘2要從數(shù)據(jù)低位開始向高位依次作帶Cy循環(huán)左移一次;除2要從數(shù)據(jù)高位開始向低位依次作帶Cy循環(huán)右移一次。4.控制轉(zhuǎn)移指令不包括布爾變量控制程序轉(zhuǎn)移指令,MCS-51控制轉(zhuǎn)移指令共17條,列于表4-7中。1.絕對調(diào)用指令:ACALLaddr11的(PC15~11)不變,說明這條指令只能在(addr10~0)這11位可變地址空間有效,即2K空間內(nèi)絕對調(diào)用。2.解決方法 慎用ACALLaddr11、AJMPaddr11這類指令,而放心使用LCALLaddr16、LJMPaddr16這類指令,它們是長調(diào)用和長跳轉(zhuǎn)指令,可在64K程序空間自由應(yīng)用。間接長轉(zhuǎn)移JMP@A+DPTR也是64K范圍的?!纠?-8】子程序及C語言程序的無參數(shù)傳遞和返回值的函數(shù),名均為H_TO_ASC,在兩種語言中如何調(diào)用它們? 解: 匯編語言:LCALL H_TO_ASC C語言:H_TO_ASC();

調(diào)用指令功能是調(diào)用子程序(相當(dāng)于C程序中的函數(shù))。 為了在子程序調(diào)用完成后,程序能回到調(diào)用點的下一條指令,單片機將返回地址壓入堆棧,當(dāng)子程序執(zhí)行完成,單片機將堆棧的內(nèi)容彈入PC,再次回到主程序中。 子程序還可以調(diào)用子程序,形成程序調(diào)用嵌套,程序的調(diào)用、嵌套、返回過程如圖4-3所示。子程序的嵌套不受級數(shù)的限制只受堆??臻g的大小的影響。 CPU如何知道子程序返回呢?這就是子程序返回指令——RET。當(dāng)程序執(zhí)行到RET指令時,經(jīng)CPU解釋,將產(chǎn)生彈棧值到PC的操作,于是進程返回到上級程序中。因此,調(diào)用類指令必須與RET指令成對應(yīng)用。這一原則對所有計算機都適用。 子程序中的RET可以有多個,這與C語言中的return可以有多個一樣。 這就是說,子程序可以有多個用于選擇的出口,但每次只能用一個。2)相對轉(zhuǎn)移指令表4-5中從SJMPrel到RET前所有指令,均為相對轉(zhuǎn)移指令,其特點是:集邏輯判斷和跳轉(zhuǎn)功能為一體的復(fù)合型指令,轉(zhuǎn)移目的地由偏移量rel指出。偏移量rel的取值范圍為-128~+127,這類指令的轉(zhuǎn)移范圍,不受頁的限制,只受空間長度的限制。每條指令的具體功能如表4-5所示。對相對轉(zhuǎn)移跨度大的程序結(jié)構(gòu),可用搭橋的方法使解決轉(zhuǎn)移問題。具體說就是,將長跳轉(zhuǎn)指令夾在指令和目標(biāo)之間,起跳板的作用。見下面的程序段:JNZ ROAD1 ;(A)≠0則轉(zhuǎn)移,否則順序執(zhí)行LJMP ROAD2ROAD1: …… ;……表示ROAD2分支的程序段LJMP COMOUT ;功能:轉(zhuǎn)移和兩段程序的隔離墻ROAD2:…… ;……表示ROAD1分支的程序段COMOUT:…… ;共同出口,繼續(xù)執(zhí)行

3)中斷返回指令 表4-5中RETI為中斷返回指令。它的功能與RET類似,只是RETI是用于中斷服務(wù)程序中的。關(guān)于RETI將在中斷部分加以應(yīng)用和說明。

空操作指令NOP。與C程序中的單“;”相當(dāng)。執(zhí)行NOP指令時,CPU什么事也沒有做,只消耗CPU的一個機器周期時間。NOP指令常用于延遲或等待程序部分中。5.位操作類指令 單片機在控制系統(tǒng)中常需進行線路通、斷,繼電器的吸合與釋放等位邏輯操作。位操作指令將為這類操作提供更多的靈活性。

51機內(nèi)部RAM128個位SFR128個位尋址,共256個位地址,都是位操作的對象。MCS-51位操作指令列于表4-6中。位操作類指令有如下特點:(1)位單元C相當(dāng)于字節(jié)操作中的累加器。C就是PSW中的CY。位變量中內(nèi)容的傳送,通過:MOV C,bit和MOV bit,C這一對指令實現(xiàn)。(2)位操作中的立即尋址是由CLR bit和SETB bit這一對指令實現(xiàn)的。而立即尋址符“#”被字節(jié)指令占用,不能再為位操作指令使用??聪旅娴睦樱篗OV C,#11H 位空間不能放字節(jié)數(shù)據(jù),正確的是MOVC,11H等SETB A SETB只能對位,不能對字節(jié),應(yīng)是SETBACC.0等【例4-9】地址為20H的位單元,位于哪個字節(jié)單元中?將其內(nèi)容“置位”,應(yīng)用那條指令實現(xiàn)?

解:第一問的答案可以通過查表3-4確定,也可以通過推算而得到。答案是24H字節(jié)單元的D0位。用下列指令將位地址20H單元內(nèi)容“置位”的指令應(yīng)為SETB20H。 位操作的對象是“位單元”或“位變量”中的內(nèi)容。字節(jié)操作的對象是“字節(jié)單元”或“字節(jié)變量”中的內(nèi)容。還有就是可位尋址單元都在51機片內(nèi)。4.4匯編語言程序組成與結(jié)構(gòu)有關(guān)程序的幾個概念1.程序(Programs)是由人編寫的、將指令按某種規(guī)則有機排列而成的、能完成某項有意義工作的特殊文件。2.算法(Algorithms)是程序的動作規(guī)則,它描述了解決問題所采取的方法和步驟。3.?dāng)?shù)據(jù)結(jié)構(gòu)(DataStructure)是程序?qū)ο螅ɑ驍?shù)據(jù))的描述,它描述了問題所涉及的對象以及對象之間的聯(lián)系和組織方式。

1976年計算機科學(xué)家沃思,明確提出算法和數(shù)據(jù)結(jié)構(gòu)是程序的兩個要素:程序=算法+數(shù)據(jù)結(jié)構(gòu)4.4.1匯編語言程序的組成部分一個完整的匯編語言程序由以下幾個部分組成:1.主程序 主程序是單片機完成某項任務(wù)的主流程序。單片機在工作時,總進程總是沿主程序規(guī)定的方向運行,并在某些特定的環(huán)節(jié)上周而復(fù)始的運行。2.子程序匯編體系中的子程序與C語言中的函數(shù)相當(dāng)。子程序是能夠?qū)崿F(xiàn)某個單一的、具有某種共性的、在整個程序中將反復(fù)應(yīng)用的一個程序。使用子程序主要由以下兩個原因:(1)節(jié)省代碼空間(2)模塊化結(jié)構(gòu)設(shè)計的需要。3.中斷服務(wù)程序 中斷服務(wù)程序可以理解為一種特殊子程序。但它們是由“偶然事件”觸發(fā)而被執(zhí)行的,不象子程序那樣,由程序主動調(diào)用。4.程序的定位和說明一個程序,除具有實在意義的指令外,有時還需要通知編譯器工作方式的指令。如文件包含、程序代碼的起始地址、表格數(shù)據(jù)的起始地址等說明性指令,這類工作是用偽指令來實現(xiàn)的。所謂偽指令,就是形如指令,但編譯器并不將其編譯成機器碼的一類指令。表4-7為匯編體系中常用的一些偽指令。

學(xué)習(xí)單片機的編程,需嚴格按照后綴名的規(guī)定分類,文件才能被編譯系統(tǒng)識別。匯編源程序以asm為后綴,C51源程序以c為后綴,頭文件以h為后綴。這是常用的三類源文件。源文件通過編譯連接后,還會生成幾種其它類型的文件,如.hex文件,它是十六進制格式的程序代碼文件。4.4.3匯編語言程序結(jié)構(gòu)與一般格式匯編語言程序由主程序、中斷服務(wù)程序、子程序、數(shù)據(jù)表格及由偽指令集組成的程序包裝部分等組成。事實上,匯編語言程序組成及結(jié)構(gòu)與C語言程序是一樣的,只是匯編程序要求更簡單,更隨意。學(xué)習(xí)時,要注意比較兩者的異、同點。【例4-10】包含主程序、中斷服務(wù)程序、子程序、數(shù)據(jù)表格及偽指令的匯編及C語言程序樣式及對比與分析。以下是匯編語言示范程序,閱讀時請?zhí)貏e注意注釋部分的說明。SCL BIT P1.2 ;偽指令,定義SCL位變量ADDR0 DATA 30H ;定義ADDR0,等價于ADDR0 EQU 30HORG 0000H ;主程序的起始點。相當(dāng)于C中的“{”

LJMP Main ;作一個跳轉(zhuǎn),用Main作主程序標(biāo)號ORG 0003H ;外部中斷0的服務(wù)程序入口地址LJMP INT0int ;INT0int為外部中斷0服務(wù)程序地址標(biāo)號

;------------------------------主程序----------------------------------ORG 0040H ;定位主程序代碼首地址,如0040HMain: MOV SP,#5FH ;初始化堆棧指針SP,51設(shè)在5FH較為合適

SETB EX0 ;允許外部中斷0中斷

SETB EA ;中斷開放AGAIN:MOV A,#02H ;預(yù)取表中第2號數(shù)碼(序號從0開始)

LCALL GETDATA ;子程序調(diào)用

LJMP AGAIN ;周期工作TABLE1: ;數(shù)據(jù)表標(biāo)號DB 5AH,5BH,5CH,5DH ;5CH相對于標(biāo)號的偏移地址為2

;------------------------------------子程序結(jié)構(gòu)-----------------------------------------GETDATA:

MOV DPTR,#TABLE1 ;指向數(shù)據(jù)表首地址TABLE1

MOVC A,@A+DPTR ;比MOVCA,@A+PC指令更常用

MOV ADDR0,A CPL SCL RET ;子程序返回

;----------------中斷服務(wù)程序結(jié)構(gòu)------------------INT0int: ;中斷服務(wù)程序PUSH PSW ;INT0int是程序名必須有PUSH Acc ;保護有關(guān)寄存器…… ;中斷程序?qū)嶓wPOP AccPOP PSW ;恢復(fù)現(xiàn)場RETI ;中斷—返回,必不可少END ;程序結(jié)束偽指令4.5從C語言過渡到C51

1.其實只要抓住以下2點,C51源文件編寫就與標(biāo)準(zhǔn)C沒有什么區(qū)別了:

(1)C51不僅要定義變量類型,還要定義變量所在存儲器類型。

51機采用存儲器獨立編址,各類存儲器地址有重合。因此,C51在定義變量類型時,還要指定變量的存儲空間。

KeilC51編譯器支持的存儲器類型如表4-1所示。【例4-11】定義一個指向程序存儲器、片外RAM、片內(nèi)RAM的字符型指針變量。 解:C51指針變量定義的一般形式為: 數(shù)據(jù)類型[存儲器類型1]*[存儲器類型2]標(biāo)識符。其中存儲器類型都是可選項。例如unsignedcharcode*point_l;//定義一個指向程序存儲(code)指針,point_l被安排在片內(nèi)RAM中unsignedcharcode*xdatapoint_l;//point_l指定安排在片外RAM中unsignedcharxdata*point_x; //定義一個指向片外RAM的指針unsignedchardata*point_r; //定義一個指向片內(nèi)RAM的指針code、xdata、data是存儲類型,unsignedchar是數(shù)據(jù)類型。【例4-12】如何定義程序存儲區(qū)的字符型數(shù)據(jù)表格? 解:單片機應(yīng)用系統(tǒng)中,常將常數(shù)表格放在程序存儲器區(qū),其格式為:

unsignedcharcodeTable_CRC[256]={0,94,188,226,97,63,221,…}

//共256個數(shù)據(jù)

【例4-13】位變量的定義與使用方法。

bitend_of_ADconver=0;

//用end_of_Adconver作為標(biāo)志,初值為0 end_of_Adconver=1; //位變量置1

可預(yù)見,編譯系統(tǒng)一定將位變量安排在可位尋址的位單元(片內(nèi)RAM中20H~2FH或PSW的F0或F1)中。用bdata型,可同時定義一個字節(jié)8個位變量,方法如下:staticbdataucharsclkdata; //bdata在片內(nèi)20H~2FH空間sbitsclkdata0=sclkdata^0; //接著定義字節(jié)中的位變量名sbitstation_AB=sclkdata^1;sbitstation_X=sclkdata^2; //X、Y表示水平和垂直位置sbitstation_Y=sclkdata^3; sbitsclkdata4=sclkdata^4; sbitsclkdata5=sclkdata^5;sbitsclkdata6=sclkdata^6;sbitsclkdata7=sclkdata^7;2C51源程序中一般要包含描述51機資源的頭文件51機資源頭文件用以下格式定義P3口:SfrP3=0xb0; //等價于Sfr(P3,0xb0); P3口是多功能復(fù)用口,也是可位尋址的,每一位的定義如下:sbitP3_0 =0xb0; 對照

sbitRXD =0xB0;sbitP3_1 =0xb1; 對照

sbitTXD =0xB1;sbitP3_2 =0xb2; 對照

sbitINT0 =0xB2;sbitP3_3 =0xb3; 對照

sbitINT1 =0xB3;sbitP3_4 =0xb4; 對照

sbitT0 =0xB4;

值得注意的是:頭文件的后綴名必須為h或H。但頭文件名可以隨意取,內(nèi)容以能表明所適用的51機型為準(zhǔn)。頭文件中重要的部分是內(nèi)容,即SFR的的地址。

SFR的名字,是使用者約定俗成的,無嚴格限制;但它們所在的地址的定義是嚴格的,否則會造成操作對象的混亂。此外,在一個H文件中,對同一個SFR可以有多個名字,但不能與其它SFR重名。 以下是一個頭文件的例子。

/*BYTERegisters*/ sfr AUXR =0x8E; sfr AUXR1 =0xA2; sfr SADDR =0xA9; sfr IPH =0xB7; sfr SADEN =0xB9; sfr T2MOD =0xC9; sfr P0 =0x80; sfr P1 =0x90; sfr P2 =0xA0; sfr P3 =0xB0; sfr PSW =0xD0; sfr ACC =0xE0; sfr B =0xF0; sfr SP =0x81; sfr DPL =0x82; sfr DPH =0x83; sfr PCON =0x87; sfr TCON =0x88; sfr TMOD =0x89; sfr TL0 =0x8A; sfr TL1 =0x8B; sfr TH0 =0x8C; sfr TH1 =0x8D; sfr IE =0xA8; sfr IP =0xB8; sfr SCON =0x98; sfr SBUF =0x99;

/*8052Extensions*/ sfr T2CON =0xC8;第二節(jié)機器碼-匯編語言-到高級語言

sfr RCAP2L =0xCA; sfr RCAP2H =0xCB; sfr TL2 =0xCC; sfr TH2 =0xCD;

/*BITRegisters*/ /*PSW*/ sbit CY =0xD7; sbit AC =0xD6; sbit F0 =0xD5; sbit RS1 =0xD4; sbit RS0 =0xD3; sbit OV =0xD2; sbit P =0xD0;

/*TCON*/ sbit TF1 =0x8F; sbit TR1 =0x8E; sbit TF0 =0x8D; sbit TR0 =0x8C; sbit IE1 =0x8B; sbit IT1 =0x8A; sbit IE0 =0x89; sbit IT0 =0x88;

/*IE*/ sbit EA =0xAF; sbit ES =0xAC; sbit ET1 =0xAB; sbit EX1 =0xAA; sbit ET0=0xA9; sbit EX0 =0xA8;

/*IP*/ sbit PS =0xBC; sbit PT1 =0xBB; sbit PX1 =0xBA; sbit PT0 =0xB9; sbit PX0 =0xB8;

/*P3*/ sbit RD =0xB7; sbit WR =0xB6; sbit T1 =0xB5; sbit T0 =0xB4; sbit INT1 =0xB3; sbit INT0 =0xB2; sbit TXD =0xB1; sbit RXD =0xB0;

/*SCON*/ sbit SM0 =0x9F; sbit SM1 =0x9E; sbit SM2 =0x9D; sbit REN =0x9C; sbit TB8 =0x9B; sbit RB8 =0x9A; sbit TI =0x99; sbit RI =0x98;

/*8052Extensions*/ /*IE*/ sbit ET2 =0xAD;

/*IP*/ sbit PT2 =0xBD;

/*P1*/ sbit T2EX =0x91; sbit T2 =0x90;

/*T2CON*/ sbit TF2 =0xCF; sbit T2IP =0xCE; sbit T2IE =0xCD; sbit T2RSE =0xCC; sbit BGEN =0xCB; sbit TR2 =0xCA; sbit C_T2 =0xC9; sbit CP_RL2 =0xC8;

/*BITRegisters*/ /*P1*/ sbit P1_0 =0x90; sbit P1_1 =0x91; sbit P1_2 =0x92; sbit P1_3 =0x93; sbit P1_4 =0x94; sbit P1_5 =0x95; sbit P1_6 =0x96; sbit P1_7 =0x97;

/*P2*/ sbit P2_0 =0xa0; sbit P2_1 =0xa1; sbit P2_2 =0xa2; sbit P2_3 =0xa3; sbit P2_4 =0xa4; sbit P2_5 =0xa5; sbit P2_6 =0xa6; sbit P2_7 =0xa7;

/*P3*/ sbit P3_0 =0xb0; sbit P3_1 =0xb1; sbit P3_2 =0xb2; sbit P3_3 =0xb3; sbit P3_4 =0xb4; sbit P3_5 =0xb5; sbit P3_6 =0xb6; sbit P3_7 =0xb7

/*P0*/ sbit P0_0 =0x80; sbit P0_1 =0x81; sbit P0_2 =0x82; sbit P0_3 =0x83; sbit P0_4 =0x84; sbit P0_5 =0x85; sbit P0_6 =0x86; sbit P0_7 =0x87;

/*downisSTCadditionalSFR*/ sfr P4 =0xe8; sbit P4_3 =P4^3; sbit P4_2 =P4^2; sbit P4_1 =P4^1; sbit P4_0 =P4^0; s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論