【大學(xué)】MCS-51單片機指令系統(tǒng)與匯編語言程序設(shè)計_第1頁
【大學(xué)】MCS-51單片機指令系統(tǒng)與匯編語言程序設(shè)計_第2頁
【大學(xué)】MCS-51單片機指令系統(tǒng)與匯編語言程序設(shè)計_第3頁
【大學(xué)】MCS-51單片機指令系統(tǒng)與匯編語言程序設(shè)計_第4頁
【大學(xué)】MCS-51單片機指令系統(tǒng)與匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2.3.5位操作指令

位操作(布爾變量操作):操作數(shù)不是字節(jié),而是字節(jié)中的某個位。每位的取值只能取0或1。

指令的尋址范圍:片內(nèi)RAM位尋址區(qū)20H~2FH,SFR中的11個可位尋址特殊寄存器中的83個可尋址位。

特點:以進位標(biāo)志Cy作為位累加器,可以實現(xiàn)布爾變量的傳送、運算和控制轉(zhuǎn)移等功能。

指令中的位地址的表達方式:直接地址方式(如0AFH)、特殊功能寄存器名.位序號(如PSW.3)、字節(jié)地址.位序號(如0D0H.0)、位名稱方式(如F0)和用戶定義名稱等幾種方式。

編輯ppt1.位數(shù)據(jù)傳送指令(2條)特點:在可尋址位與位累加器Cy之間進行的。不能在兩個可尋址位間直接進行傳送。指令格式:MOVC,bit;(Cy)←(bit)

MOVbit,C;(bit)←(Cy)例:

比較MOVA,20H;片內(nèi)RAM20H單元內(nèi)容送A,傳送8位二進制數(shù)MOVC,20H;位地址為20H的位送C,傳送1位二進制數(shù)P71例2.55編輯ppt2.位邏輯操作指令(6條)指令格式:操作碼C,<SRC>

其中:操作碼包括ANL、ORL;<SRC>包括bit、bit。

CPL<dest>;<dest>←dest<dest>包括Cy、bit。功能:位邏輯操作指令用于位邏輯操作,還可用于對組合邏輯電路的模擬。采用位操作指令進行組合邏輯電路的設(shè)計比采用字節(jié)型邏輯指令節(jié)約存儲空間,運算操作十分方便。P71例2.56編輯ppt3.位狀態(tài)(置位、清0)控制指令(4條)指令格式:CLR<dest>;<dest>←0SETB<dest>;<dest>←1

其中:<dest>包括Cy、bit。4.位條件(控制)轉(zhuǎn)移指令(5條)特點:以位的狀態(tài)作為實現(xiàn)程序轉(zhuǎn)移的判斷條件。指令格式:(1)以進位標(biāo)志位Cy內(nèi)容為條件的轉(zhuǎn)移指令

JCrel;若(Cy)=1,則轉(zhuǎn)移(PC)←(PC)+2+rel,否則順序執(zhí)行JNCrel;若(Cy)=0,則轉(zhuǎn)移(PC)←(PC)+2+rel,否則順序執(zhí)行編輯ppt(2)以位地址bit內(nèi)容為條件的轉(zhuǎn)移指令指令格式:JBbit,rel;若(bit)=1,則轉(zhuǎn)移(PC)←(PC)+3+rel,否則順序執(zhí)行JNBbit,rel;若(bit)=0,則轉(zhuǎn)移(PC)←(PC)+3+rel,否則順序執(zhí)行JBCbit,rel;若(bit)=1,則轉(zhuǎn)移(PC)←(PC)+3+rel,且(bit)←0,否則順序執(zhí)行編輯pptP73例2.58

ORG0100HMOVDPTR,#DATAMOVR0,#30HMOVR1,#40HLOOP:MOVXA,@DPTRCJNEA,#0DH,LOOP1SJMP$LOOP1:JBACC.7,LOOP2MOV@R0,AINCR0INCDPTRAJMPLOOPLOOP2:MOV@R1,AINCR1INCDPTRAJMPLOOPEND編輯ppt2.4匯編語言及程序設(shè)計

程序設(shè)計:就是編制計算機的程序,即應(yīng)用計算機所能識別的、接受的語言把要解決的問題的步驟有序地描述出來。程序設(shè)計語言的種類:(1)機器語言:機器語言是用二進制代碼表示的計算機惟一能識別和執(zhí)行的最原始的程序設(shè)計語言。

(2)匯編語言:利用指令助記符來描述的程序設(shè)計語言。(3)高級語言:高級語言接近于人的自然語言,是面向過程而獨立于機器的通用語言。匯編語言的指令類型:

MCS-51單片機匯編語言,包含兩類不同性質(zhì)的指令。(1)指令:即指令系統(tǒng)中的指令。它們都是機器能夠執(zhí)行的指令,每一條指令都有對應(yīng)的機器碼。(2)偽指令:匯編時用于控制匯編的指令。它們都是機器不執(zhí)行的指令,無機器碼。編輯ppt匯編語言的語句格式:匯編語言源程序是由匯編語句(即指令)組成的。典型的匯編語句格式如下:

[標(biāo)號:]操作碼[操作數(shù)][,操作數(shù)][;注釋]數(shù)據(jù)的表示方法:(1)二進制數(shù):由0、1組成,“逢2進1”的數(shù)制。如:01011110B(0~1后綴:B/b)(2)十六進制數(shù):便于讀寫記憶的二進制數(shù)的簡寫形式。(0~9,A~F后綴:H/h)(3)十進制數(shù):可用二進制數(shù)表示(也稱為BCD碼,0~9表示為:0000~1001B),也可用十進制數(shù)表示(后綴:D/d或無后綴)。編輯ppt2.4.1匯編語言程序設(shè)計的步驟

匯編語言程序設(shè)計:根據(jù)任務(wù)要求,采用匯編語言編制程序的過程稱為匯編語言程序設(shè)計。匯編語言程序設(shè)計的步驟:(1)擬訂設(shè)計任務(wù)書(2)建立數(shù)學(xué)模型(3)確定算法(4)分配內(nèi)存單元,編制程序流程圖(5)編制源程序進一步合理分配存儲器單元和了解I/O接口地址;按功能設(shè)計程序,明確各程序之間的相互關(guān)系;用注釋行說明程序,便于閱讀和修改調(diào)試和修改。(6)上機調(diào)試(7)程序優(yōu)化編輯ppt編制程序流程圖:是指用各種圖形、符號、指向線等來說明程序設(shè)計的過程。國際通用的圖形和符號說明如下:橢圓框:開始和結(jié)束框,在程序的開始和結(jié)束時使用。矩形框:處理框,表示要進行的各種操作。菱形框:判斷框,表示條件判斷,以決定程序的流向。流向線:流程線,表示程序執(zhí)行的流向。圓圈:連接符,表示不同頁之間的流程連接。 各種幾何圖形符號如下圖所示。編輯ppt2.4.2順序程序設(shè)計

特點:順序結(jié)構(gòu)程序是最簡單、最基本的程序。程序按編寫的順序依次往下執(zhí)行每一條指令,直到最后一條。它能夠解決某些實際問題,或成為復(fù)雜程序的子程序。[例題2]

將片內(nèi)RAM30H單元中的兩位壓縮BCD碼轉(zhuǎn)換成二進制數(shù)送到片內(nèi)RAM40H單元中。解:兩位壓縮BCD碼轉(zhuǎn)換成二進制數(shù)的算法為:(a1a0)BCD=10×a1+a0

程序流程圖如右圖所示。如:25=2×10+5用BCD碼:(00100101)BCD=0010×1010+0101=11001編輯ppt程序如下:

ORG1000H START:MOVA,30H ;取兩位BCD壓縮碼a1a0送A ANLA,#0F0H ;取高4位BCD碼a1 SWAPA ;高4位與低4位換位

MOVB,#0AH ;將二進制數(shù)10送入B MULAB ;將10×a1送入A中

MOVR0,A ;結(jié)果送入R0中保存

MOVA,30H ;再取兩位BCD壓縮碼a1a0送A ANLA,#0FH ;取低4位BCD碼a0 ADDA,R0 ;求和10×a1+a0 MOV40H,A ;結(jié)果送入40H保存

SJMP$ ;程序執(zhí)行完,“原地踏步”

END 編輯ppt[例題3]利用查表指令將內(nèi)部RAM中20H單元的壓縮BCD碼拆開,轉(zhuǎn)換成相應(yīng)的ASCII碼,存入21H、22H中,高位存在22H。解:BCD碼的0~9對應(yīng)的ASCII碼為30H~39H,將30H~39H按大小順序排列放入表TABLE中,先將BCD碼拆分,將拆分后的BCD碼送入A,表首址送入DPTR,然后領(lǐng)用查表指令MOVCA,@A+DPTR,查表即得結(jié)果,然后存入21H、22H中。程序如下:

ORG1000H START: MOV DPTR,#TABLE MOV A,20H ANL A,#0FH MOVC A,@A+DPTR MOV 21H,A編輯ppt

MOV A,20H ANL A,#0F0H SWAP A MOVC A,@A+DPTR MOV 22H, A SJMP $

TABLE: DB30H,31H,32H,33H,34H DB35H,36H,37H,38H,39HEND編輯ppt2.4.3分支程序設(shè)計特點:根據(jù)不同的條件,確定程序的走向。它主要靠條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和位轉(zhuǎn)移指令來實現(xiàn)。分支程序的結(jié)構(gòu)如右圖所示。

分支程序的設(shè)計要點如下:(1)先建立可供條件轉(zhuǎn)移指令測試的條件。(2)選用合適的條件轉(zhuǎn)移指令。(3)在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號。編輯ppt

解:此題有三個條件,所以有三個分支程序。這是一個三分支歸一的條件轉(zhuǎn)移問題。

X是有符號數(shù),判斷符號位是0還是1可利用JB或JNB指令。判斷X是否等于0則直接可以使用累加器A的判0指令。程序流程圖如右圖所示。[例題4]

求符號函數(shù)的值。已知片內(nèi)RAM的40H單元內(nèi)有一自變量X,編制程序按如下條件求函數(shù)Y的值,并將其存入片內(nèi)RAM的41H單元中。

1 X>0 Y= 0 X=0 -1 X<0編輯ppt

ORG1000H START:MOVA,40H ;將X送入A中

JZCOMP ;若A為0,轉(zhuǎn)至COMP處

JNBACC.7,POST;若A第7位不為1(X為正數(shù)),則程序轉(zhuǎn)到

POST處,否則(X為負數(shù))程序往下執(zhí)行

MOVA,#0FFH;將1(補碼)送入A中

SJMPCOMP ;程序轉(zhuǎn)到COMP處POST:MOVA,#01H ;將+1送入A中COMP:MOV41H,A ;結(jié)果存入Y SJMP$ ;程序執(zhí)行完,“原地踏步”

END 編輯pptP76例2.61已知片內(nèi)RAM的30H單元中存的有符號二進制數(shù),求其補碼,將補碼存回30H單元。

ORG0000HLJMPCMPTORG0030HCMPT:MOVA,30HJNBACC.7,NCH;若A中為正數(shù),不求補CPLA;若A中為負數(shù),求補碼ADDA,#01;A中數(shù)求反加1ORLA,#80H;在符號位拼1MOV30H,ANCH:SJMP$END編輯ppt2.4.4循環(huán)程序設(shè)計特點:程序中含有可以重復(fù)執(zhí)行的程序段(循環(huán)體),采用循環(huán)程序可以有效地縮短程序,減少程序占用的內(nèi)存空間,使程序的結(jié)構(gòu)緊湊、可讀性好。組成:循環(huán)程序一般由下面四部分組成。(1)循環(huán)初始化。位于循環(huán)程序開頭,用于完成循環(huán)前的準(zhǔn)備工作,如設(shè)置各工作單元的初始值以及循環(huán)次數(shù)。(2)循環(huán)體。循環(huán)程序的主體,位于循環(huán)體內(nèi),是循環(huán)程序的工作程序,在執(zhí)行中會被多次重復(fù)使用。要求編寫得盡可能簡練,以提高程序的執(zhí)行速度。(3)循環(huán)控制。位于循環(huán)體內(nèi),一般由循環(huán)次數(shù)修改、循環(huán)修改和條件語句等組成,用于控制循環(huán)次數(shù)和修改每次循環(huán)時的參數(shù)。(4)循環(huán)結(jié)束。用于存放執(zhí)行循環(huán)程序所得的結(jié)果,以及恢復(fù)各工作單元的初值。編輯ppt

循環(huán)程序的結(jié)構(gòu):(1)先循環(huán)處理,后循環(huán)控制(即先處理后控制)。如左下圖所示。

(2)先循環(huán)控制,后循環(huán)處理(即先控制后處理)。如右下圖所示。

編輯ppt

循環(huán)程序按結(jié)構(gòu)形式,有單重循環(huán)與多重循環(huán)。1.單重循環(huán)程序定義:循環(huán)體內(nèi)部不包括其他循環(huán)的程序稱為單重循環(huán)程序。[例題5]

已知片內(nèi)RAM30H~3FH單元中存放了16個二進制無符號數(shù),編制程序求它們的累加和,并將其和數(shù)存放在R4,R5中。解:每次求和的過程相同,可以用循環(huán)程序?qū)崿F(xiàn)。16個二進制無符號數(shù)求和,循環(huán)程序的循環(huán)次數(shù)應(yīng)為16次(存放在R2中),它們的和放在R4,R5中(R4存高8位,R5存低8位)。程序流程圖如右圖所示。編輯ppt程序如下:

ORG1000H START:MOVR0,#30H MOVR2,#10H ;設(shè)置循環(huán)次數(shù)(16)

MOVR4,#00H ;和高位單元R4清0 MOVR5,#00H ;和低位單元R5清0LOOP:MOVA,R5 ;和低8位的內(nèi)容送A ADDA,@R0 ;將@R0與R5的內(nèi)容相加并產(chǎn)生進位Cy MOVR5,A ;低8位的結(jié)果送R5 CLRA ;A清0 ADDCA,R4 ;將R4的內(nèi)容和Cy相加

MOVR4,A ;高8位的結(jié)果送R4 INCR0 ;地址遞增(加1)

DJNZR2,LOOP ;若循環(huán)次數(shù)減1不為0,則轉(zhuǎn)到LOOP處循環(huán);否則,循環(huán)結(jié)束

SJMP$ END 編輯ppt[例題6]

編制程序?qū)⑵瑑?nèi)RAM的30H~4FH單元中的內(nèi)容傳送至片外RAM的2000H開始的單元中。解:每次傳送數(shù)據(jù)的的過程相同,可以用循環(huán)程序?qū)崿F(xiàn)。30H~4FH共32個單元,循環(huán)次數(shù)應(yīng)為32次(保存在R2中),為了方便每次傳送數(shù)據(jù)時地址的修改,送片內(nèi)RAM數(shù)據(jù)區(qū)首地址送R0,片外RAM數(shù)據(jù)區(qū)首地址送DPTR。程序流程圖如右圖所示。編輯ppt程序如下:

ORG1000H START:MOVR0,#30H MOVDPTR,#2000H MOVR2,#20H ;設(shè)置循環(huán)次數(shù)

LOOP:MOVA,@R0 ;將片內(nèi)RAM數(shù)據(jù)區(qū)內(nèi)容送A MOVX@DPTR,A ;將A的內(nèi)容送片外RAM數(shù)據(jù)區(qū)

INCR0 ;源地址遞增

INCDPTR ;目的地址遞增

DJNZR2,LOOP ;若R2的不為0,則轉(zhuǎn)到LOOP處繼續(xù)循環(huán);否則循環(huán)結(jié)束

SJMP$ END 編輯ppt2.多重循環(huán)程序定義:若循環(huán)中還包括有循環(huán),稱為多重循環(huán)(或循環(huán)嵌套)。

[例題7]編制程序設(shè)計50ms延時程序。解:延時程序與MCS-51指令執(zhí)行時間(機器周期數(shù))和晶振頻率fOSC有直接的關(guān)系。當(dāng)fOSC=12MHz時,機器周期為1s,執(zhí)行一條DJNZ指令需要2個機器周期,時間為2s。50ms÷2s>255,因此單重循環(huán)程序無法實現(xiàn),可采用雙重循環(huán)的方法編寫50ms延時程序。編輯ppt程序如下:

ORG1000H DELAY:MOVR7,#200;設(shè)置外循環(huán)次數(shù)(此條指令需要1個機器周期)

DLY1:MOVR6,#123;設(shè)置內(nèi)循環(huán)次數(shù)

DLY2:DJNZR6,DLY2;(R6)-1=0,則順序執(zhí)行,否則轉(zhuǎn)回

DLY2繼續(xù)循環(huán),延時時間為2s×123=246s NOP ;延時時間為1s DJNZR7,DLY1;(R7)-1=0,則順序執(zhí)行,否則轉(zhuǎn)回DLY1繼續(xù)循環(huán),延時時間為(246+2+1+1)×200+2+1=50.003ms RET ;子程序結(jié)束

END 編輯ppt3.設(shè)計循環(huán)程序時應(yīng)注意的問題(1)循環(huán)程序是一個有始有終的整體,它的執(zhí)行是有條件的,所以要避免從循環(huán)體外直接轉(zhuǎn)到循環(huán)體內(nèi)部。(2)多重循環(huán)程序是從外層向內(nèi)層一層一層進入,循環(huán)結(jié)束時是由內(nèi)層到外層一層一層退出的。在多重循環(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)。不允許循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。(3)編寫循環(huán)程序時,首先要確定程序結(jié)構(gòu),處理好邏輯關(guān)系。一般情況下,一個循環(huán)體的設(shè)計可以從第一次執(zhí)行情況入手,先畫出重復(fù)執(zhí)行的程序框圖,然后再加上循環(huán)控制和置循環(huán)初值部分,使其成為一個完整的循環(huán)程序。(4)循環(huán)體是循環(huán)程序中重復(fù)執(zhí)行的部分,應(yīng)仔細推敲,合理安排,應(yīng)從改進算法、選擇合適的指令入手對其進行優(yōu)化,以達到縮短程序執(zhí)行時間的目的。編輯ppt4.排序程序設(shè)計(冒泡法)

[例題7]設(shè)MCS-51單片機內(nèi)部RAM起始地址為30H的數(shù)據(jù)塊中共存有64個無符號數(shù),編制程序使它們按從小到大的順序排列。解:設(shè)64個無符號數(shù)在數(shù)據(jù)塊中的順序為:e64,e63,…,e2,e1,使他們從小到大順序排列的方法很多,現(xiàn)以冒泡法為例進行介紹。冒泡法又稱兩兩比較法。它先使e64和e63比較,若e64>e63,則兩個存儲單元中的內(nèi)容交換,否則就不交換。然后使e63和e62比較,按同樣的原則決定是否交換。一直比較下去,最后完成e2和e1的比較及交換,經(jīng)過N1=63次比較(常用內(nèi)循環(huán)63次來實現(xiàn))后,e1的位置上必然得到數(shù)組中的最大值,猶如一個氣泡從水低冒出來一樣,如下頁圖所示(圖中只畫出了6個數(shù)的比較過程)。編輯ppt編輯ppt

第二次冒泡過程和第一次完全相同,比較次數(shù)也可以是63次(其實只需要62次,因為e1的位置上是數(shù)據(jù)塊中的最大數(shù),不需要再比較),冒泡后在e2的位置上得到數(shù)組中的次大數(shù),如上頁圖所示。如此冒泡(即大循環(huán))共63次(內(nèi)循環(huán)63×63次)便可完成64個數(shù)的排序。實際編程時,可通過設(shè)置“交換標(biāo)志”用來控制是否再需要冒泡,若剛剛進行完的冒泡中發(fā)生過數(shù)據(jù)交換(即排序尚未完成),應(yīng)繼續(xù)進行冒泡;若進行完的冒泡中未發(fā)生過數(shù)據(jù)交換(即排序已經(jīng)完成),冒泡應(yīng)該停止。例如:對于一個已經(jīng)排好序的數(shù)組:1,2,3,…,63,64,排序程序只要進行一次循環(huán)便可根據(jù)“交換標(biāo)志”的狀態(tài)而結(jié)束排序程序的再執(zhí)行,這自然可以減少631=62次的冒泡時間。冒泡法程序流程圖如下頁圖所示。編輯ppt編輯ppt程序如下:

ORG1000H MOVR0,#30H ;數(shù)據(jù)區(qū)首地址送R0 MOVR3,#63H ;設(shè)置外循環(huán)次數(shù)在R3中LP0: CLR7FH ;交換標(biāo)志位2FH.7清0 MOVA,R3 ;取外循環(huán)次數(shù)

MOVR2,A ;設(shè)置內(nèi)循環(huán)次數(shù)LP1: MOV20H,@R0 ;數(shù)據(jù)區(qū)數(shù)據(jù)送20H單元中

MOVA,@R0 ;20H內(nèi)容送A INCR0 ;修改地址指針(R0+1)

MOV21H,@R0;下一個地址的內(nèi)容送21H CLRC ;Cy清0 SUBBA,21H ;前一個單元的內(nèi)容與下一個單元的內(nèi)容比較

JCLP2 ;若有借位(Cy=1),前者小,程序轉(zhuǎn)移到LP2處執(zhí)行,若無借位(Cy=0),前者大,不轉(zhuǎn)移,程序往下執(zhí)行編輯ppt

MOV@R0,20H;前、后內(nèi)容交換

DECR0 MOV@R0,21H INCR0 ;修改地址指針(R0+1)

SETB7FH ;置位交換標(biāo)志位2FH.7為1LP2: DJNZR2,LP1 ;修改內(nèi)循環(huán)次數(shù)R2(減少),若R2≠0,則程序轉(zhuǎn)到LP1處仍執(zhí)行循環(huán),若R2=0,程序結(jié)束循環(huán),程序往下執(zhí)行

JNB7FH,LP3 ;交換標(biāo)志位2FH.7若為0,則程序轉(zhuǎn)到LP3處結(jié)束循環(huán)

DJNZR3,LP0 ;修改外循環(huán)次數(shù)R3(減少),若R3≠0,程序轉(zhuǎn)到LP0處,執(zhí)行仍循環(huán),若R3=0,程序結(jié)束循環(huán),往下執(zhí)行LP3: SJMP$ ;程序執(zhí)行完,“原地踏步”

END 編輯ppt2.4.5查表程序設(shè)計

查表:根據(jù)存放在ROM中數(shù)據(jù)表格的項數(shù)來查找與它對應(yīng)的表中值。適用場合:主要應(yīng)用于數(shù)碼顯示、打印字符的轉(zhuǎn)換、數(shù)據(jù)轉(zhuǎn)換等場合。

1.采用MOVCA,@A+DPTR指令查表程序的設(shè)計方法(1)在程序存儲器中建立相應(yīng)的函數(shù)表(設(shè)自變量為X)。(2)計算出這個表中所有的函數(shù)值Y。將這群函數(shù)值按順序存放在起始(基)地址為TABLE的程序存儲器中。(3)將表格首地址TABLE送入DPTR,X送入A,采用查表指令MOVCA,@A+DPTR完成查表,就可以得到與X相對應(yīng)的Y值于累加器A中。編輯ppt2.采用MOVCA,@A+PC指令查表程序的設(shè)計方法

當(dāng)使用PC作為基址寄存器時,由于PC本身是一個程序計數(shù)器,與指令的存放地址有關(guān),查表時其操作有所不同。(1)在程序存儲器中建立相應(yīng)的函數(shù)表(設(shè)自變量為X)。(2)計算出這個表中所有的函數(shù)值Y。將這群函數(shù)值按順序存放在起始(基)地址為TABLE的程序存儲器中。(3)X送入A,使用ADDA,#data指令對累加器A的內(nèi)容進行修正,偏移量data由公式data=函數(shù)數(shù)據(jù)表首地址PC1確定,即data值等于查表指令和函數(shù)表之間的字節(jié)數(shù)。(4)采用查表指令MOVCA,@A+PC完成查表,就可以得到與X相對應(yīng)的Y值于累加器A中。編輯ppt[例題8]利用查表的方法編寫Y=X2(X=0,1,2,…,9)的程序。解:設(shè)變量X的值存放在內(nèi)存30H單元中,求得的Y的值存放在內(nèi)存31H單元中。平方表存放在首地址為TABLE的程序存儲器中。方法一:采用MOVCA,@A+DPTR指令實現(xiàn),查表過程如下圖2.所示。

編輯ppt程序如下:

ORG1000H START:MOVA,30H ;將查表的變量X送入A MOVDPTR,#TABLE;將查表的16位基地址TABLE送DPTR MOVCA,@A+DPTR;將查表結(jié)果Y送A MOV31H,A ;Y值最后放入31H中

SJMP$

TABLE:DB0,1,4,9,16 DB25,36,49,64,81 END 方法二:采用MOVCA,@A+PC指令實現(xiàn),查表過程如下頁圖所示。程序如下:編輯ppt

ORG1000H START:MOVA,30H;將查表的變量X送入A ADDA,#04H;定位修正

MOVCA,@A+PC;將查表結(jié)果Y送A MOV31H,A ;Y值最后放入31H中

SJMP$

TABLE:DB0,1,4,9,16 DB25,36,49,64,81 END

編輯pptP84例2.67將存放在片內(nèi)RAM40H單元的1位16進制數(shù)轉(zhuǎn)換為ASCII碼,分別用查表和計算法完成。方法1:用查表求解。(略)方法2:計算求解:ORG0000HLP1:ADDA,#0AHLJMPSTARTADDA,30HORG0030HLP2:MOV40H,ASTART:MOVA,40HSJMP$ANLA,#0FHENDCLRCSUBBA,#0AHJCLP1ADDA,#0AHADDA,37HSJMPLP2編輯ppt2.4.6子程序設(shè)計子程序:能夠完成確定任務(wù),并能為其他程序反復(fù)調(diào)用的程序段稱為子程序。特點:子程序可以多次重復(fù)使用,避免重復(fù)性工作,縮短整個程序,節(jié)省程序存儲空間,有效地簡化程序的邏輯結(jié)構(gòu),便于程序調(diào)試。

主程序:調(diào)用子程序的程序叫做主程序或稱調(diào)用程序。主程序子程序….AD1:PUSHPSWMOVA,20HPUSH06HLCALLAD1RLA●MOV30H,ARLA….POP06HPOPPSWRET編輯ppt1.子程序的調(diào)用與返回主程序調(diào)用子程序的過程:在主程序中需要執(zhí)行這種操作的地方執(zhí)行一條調(diào)用指令(LCALL或ACALL),轉(zhuǎn)到子程序,而完成規(guī)定的操作后,再在子程序最后應(yīng)用RET返回指令返回到主程序斷點處,繼續(xù)執(zhí)行下去。編輯ppt

(1)子程序的調(diào)用子程序的入口地址:子程序的第一條指令地址稱為子程序的入口地址,常用標(biāo)號表示。子程序的調(diào)用過程:單片機執(zhí)行ACALL或LCALL指令時,首先將當(dāng)前的PC值(調(diào)用指令的下一條指令的首地址)壓入堆棧保存(低8位先進棧,高8位后進棧),然后將子程序的入口地址送入PC,轉(zhuǎn)去執(zhí)行子程序。(2)子程序的返回主程序的斷點地址:子程序執(zhí)行完畢后,返回主程序的地址稱為主程序的斷點地址,它在堆棧中保存。子程序的返回過程:子程序執(zhí)行RET指令時,將棧頂?shù)膬?nèi)容(返回地址)彈回給PC(先彈回PC的高8位,后彈回PC的低8位),使程序回到原先被中斷的主程序地址(斷點地址)去繼續(xù)執(zhí)行。編輯ppt注意:中斷服務(wù)程序是一種特殊的子程序,它是在計算機響應(yīng)中斷時,由硬件完成調(diào)用而進入相應(yīng)的中斷服務(wù)程序。RETI指令與RET指令相似,區(qū)別在于RET是從子程序返回,RETI是從中斷服務(wù)程序返回。

2.保存與恢復(fù)寄存器內(nèi)容(1)保護現(xiàn)場

主程序轉(zhuǎn)入子程序后,保護主程序的信息不會在運行子程序時丟失的過程稱為保護現(xiàn)場。保護現(xiàn)場通常在進入子程序的開始時,由堆棧完成。如:

PUSHPSWPUSHACC…編輯ppt(2)恢復(fù)現(xiàn)場

從子程序返回時,將保存在堆棧中的主程序的信息還原的過程稱為恢復(fù)現(xiàn)場。恢復(fù)現(xiàn)場通常在從子程序返回之前將堆棧中保存的內(nèi)容彈回各自的寄存器。如:

…POPACCPOPPSW3.子程序的參數(shù)傳遞主程序在調(diào)用子程序時傳送給子程序的參數(shù)和子程序結(jié)束后送回主程序的參數(shù)統(tǒng)稱為參數(shù)傳遞。入口參數(shù):子程序需要的原始參數(shù)。主程序在調(diào)用子程序前將入口參數(shù)送到約定的存儲器單元(或寄存器)中,然后子程序從約定的存儲器單元(或寄存器)中獲得這些入口參數(shù)。出口參數(shù):子程序根據(jù)入口參數(shù)執(zhí)行程序后獲得的結(jié)果參數(shù)。子程序在結(jié)束前將出口參數(shù)送到約定的存儲器單元(或寄存器)中,然后主程序從約定的存儲器單元(或寄存器)中獲得這些出口參數(shù)。編輯ppt(3)傳送子程序參數(shù)的方法

①應(yīng)用工作寄存器或累加器傳遞參數(shù)。優(yōu)點是程序簡單、運算速度較快,缺點是工作寄存器有限。②應(yīng)用指針寄存器傳遞參數(shù)。優(yōu)點是能有效節(jié)省傳遞數(shù)據(jù)的工作量,并可實現(xiàn)可變長度運算。③應(yīng)用堆棧傳遞參數(shù)。優(yōu)點是簡單,能傳遞的數(shù)據(jù)量較大,不必為特定的參數(shù)分配存儲單元。④利用位地址傳送子程序參數(shù)。4.子程序的嵌套

在子程序中若再調(diào)用子程序,稱為子程序的嵌套。MCS-51單片機允許多重嵌套。如下頁圖所示。編輯ppt5.編寫子程序時應(yīng)注意的問題

①子程序的入口地址一般用標(biāo)號表示,標(biāo)號習(xí)慣上以子程序的任務(wù)命名。例如,延時子程序常以DELAY作為標(biāo)號。

②主程序通過調(diào)用指令調(diào)用子程序,子程序返回主程序之前,必須執(zhí)行子程序末尾的一條返回指令RET。

單片機能自動保護和恢復(fù)主程序的斷點地址。但對于各工作寄存器、特殊功能寄存器和內(nèi)存單元的內(nèi)容,則必須通過保護現(xiàn)場和恢復(fù)現(xiàn)場實現(xiàn)保護。

④子程序內(nèi)部必須使用相對轉(zhuǎn)移指令,以便子程序可以放在程序存儲器64KB存儲空間的任何子域并能為主程序調(diào)用,匯編時生成浮動代碼。

⑤子程序的參數(shù)傳遞方法同樣適用于中斷服務(wù)程序。

編輯ppt[例題9]

編制程序?qū)崿F(xiàn)c=a2+b2,(a,b均為1位十進制數(shù))。解:計算某數(shù)的平方可采用查表的方法實現(xiàn),并編寫成子程序。只要兩次調(diào)用子程序,并求和就可得運算結(jié)果。設(shè)a,b分別存放于片內(nèi)RAM的30H,31H兩個單元中,結(jié)果c存放于片內(nèi)RAM的40H單元。程序流程圖如右圖所示。編輯ppt主程序如下:

ORG1000H SR:MOVA,30H ;將30H中的內(nèi)容a送入A ACALLSQR ;轉(zhuǎn)求平方子程序SQR處執(zhí)行

MOVR1,A ;將a2結(jié)果送R1 MOVA,31H ;將31H中的內(nèi)容b送入A ACALLSQR ;轉(zhuǎn)求平方子程序SQR處執(zhí)行

ADDA,R1 ;a2+b2結(jié)果送A MOV40H,A ;結(jié)果送40H單元中

SJMP$ ;程序執(zhí)行完,“原地踏步”求平方子程序如下(采用查平方表的方法):

SQR:INCA MOVCA,@A+PC RET TABLE:DB0,1,4,9,16 DB25,36,49,64,81 END 編輯pptP88例2.69編寫子程序,將由R0和R1所指的片內(nèi)RAM中的兩個3字節(jié)無符號數(shù)相加,結(jié)果送到R0所指的片內(nèi)RAM中。入口參數(shù):R0,R1分別指向兩個加數(shù)的低字節(jié)。出口參數(shù):R0指向結(jié)果的高位字節(jié)子程序功能:將由R0和R1所指的片內(nèi)RAM中的兩個3字節(jié)無符號數(shù)相加,結(jié)果送到R0所指的片內(nèi)RAM中。編輯ppt程序:

ORG0100HNADD:MOVR7,#03CLRCNADD1:MOVA,@R0

ADDCA,@R1MOV@R0,AINCR0INCR1DJNZR7,NADD1DECR0RETEND編輯pptP102作業(yè)題20

ORG0100HMOVR0,#30HMOVR7,#08HMOVA,

#00HL1:ADDA,@R0INCR0DJNZR7,L1MOV

B,#08HDIVABMOV3AH,AMOV3BH,BSJMP$END

編程計算片內(nèi)RAM30H—37H這8個單元中的數(shù)的算術(shù)平均值,結(jié)果存放在3AH單元中。編輯ppt2.5程序設(shè)計舉例2.5.1多字節(jié)算術(shù)運算程序例2.70已知片內(nèi)RAM以BLOCK1和BLOCK2為起始的單元中,分別存有5字節(jié)無符號被減數(shù)和減數(shù)(低位在前,高位在后)。編程序求差值,并把結(jié)果存入以BLOCK1為起始地址的片內(nèi)RAM中。解:兩個5字節(jié)的數(shù)做減法,需要用循環(huán)結(jié)構(gòu)設(shè)計程序。編輯ppt程序

ORG0100HSYSUB:MOVR0,#BLOCK1MOVR1,#BLOCK2MOVR2,#05HCLRCLOOP:MOVA,@R0SUBBA,@R1MOV@R0,AINCR0INCR1DJNZR2,LOOPRETEND編輯ppt[例2.71]編制程序?qū)崿F(xiàn)兩個16位二進制數(shù)乘法運算:

(R7R6)16×(R5R4)16→(R3R2R1R0)16

R7R6

×R5R4R4×R6R1R0

R4×R7R2R1

R5×R6R2R1R5×R7R3R2編輯pptP89程序解:MCS-51乘法指令只能完成兩個8位無符號數(shù)相乘,因此16位無符號數(shù)求積必須將它們分解成8位數(shù)相乘來實現(xiàn)。其方法有先乘后加和邊乘邊加兩種。現(xiàn)以邊乘邊加為例設(shè)計。程序如下

ORG1000H DMUL:MOVA,R6;第一個因數(shù)的低位送A MOVB,R4;第二個因數(shù)的低位送B MULAB ;第一個因數(shù)的低位乘以第二個因數(shù)的低位

R4×R6編輯ppt

MOVR0,A ;積的低位送R0 MOVR1,B ;積的高位送R1MOVA,R7 ;第一個因數(shù)的高位送A

MOVB,R4

;第二個因數(shù)的低位送B MULAB ;R4×R7

ADDA,R1

;部分積相加,形成進位Cy MOVR1,A ;部分積相加送R1 MOVA,B ;部分積的進位Cy加到高位

ADDCA,#00H MOVR2,A MOVA,R6 ;第一個因數(shù)的低位送A MOVB,R5 ;第二個因數(shù)的高位送B MULAB ;R5×R6

ADDA,R1 ;部分積相加,形成進位Cy MOVR1,A ;回送部分積

MOVA,R2 編輯ppt

ADDCA,B ;部分積相加

MOVR2,A ;回送部分積

MOVA,#00H ;部分積的進位Cy加到高位

ADDCA,#00H MOVR3,A ;回送部分積

MOVA,R7 ;第一個因數(shù)的高位送A MOVB,R5 ;第二個因數(shù)的高位送B MULAB ;R5×R7

ADDA,R2 ;部分積相加,形成進位Cy MOVR2,A ;回送部分積

MOVA,R3 ADDCA,B ;部分積相加

MOVR3,A ;回送部分積

RET END 編輯ppt2.5.2數(shù)制轉(zhuǎn)換程序例2.72將4位壓縮BCD碼(十進制數(shù))轉(zhuǎn)換為二進制數(shù)。a3a2a1a0=a3×1000+a2×100+a1×10+a0=(a3×10+a2)×100+(a1×10+a0)公因式(ai×10+aj),可用雙重嵌套子程序的方法將公因式用內(nèi)層子程序編寫。(ai為高4位,aj為低4位)外層子程序入口參數(shù):4位壓縮BCD碼存R6R5。外層子程序出口參數(shù):轉(zhuǎn)換后的二進制數(shù)存R6R5。內(nèi)層子程序入口參數(shù):待轉(zhuǎn)換的BCD存R2。內(nèi)層子程序出口參數(shù):轉(zhuǎn)換后的二進制數(shù)存R2。編輯ppt程序(a3×10+a2)×100+(a1×10+a0)

ORG0100HBCDBIN2:MOVA,R6

MOVR2,AACALLBCDBIN1MOVA,R2MOVB,#100MULABMOVR6,BMOVR4,AMOVA,R5MOVR2,AACALLBCDBIN1MOVA,R2ADDA,R4MOVR5,AMOVA,R6

ADDCA,#00MOVR6,ARETBCDBIN1:MOVA,R2ANLA,#0F0HMOVB,#10SWAPAMULABMOVR3,AMOVA,R2ANLA,#0FHADDA,R3MOVR2,ARETEND編輯ppt[例2.73]將雙字節(jié)二進制數(shù)轉(zhuǎn)換成BCD碼(十進制數(shù))。解:將二進制數(shù)轉(zhuǎn)換成BCD碼的數(shù)學(xué)模型為:(a15a14…a1a0)2=(a15×215+a14×214+…+a1×21+a0×20)10上式右側(cè)即為欲求的BCD碼。它可作如下變換

(a15×214+a14×213+…+a1)×2+a0括號里的內(nèi)容可變?yōu)椋海╝15×213+a14×212+a13×211+…+a2)×2+a1括號里的內(nèi)容可變?yōu)椋海╝15×212+a14×211+a13×210+…+a3)×2+a2……

經(jīng)過16次的變換后,括號里的內(nèi)容可變?yōu)椋?/p>

(0×2+a15)×2+a14

所以括號里的內(nèi)容的通式為ai+1×2+ai,即為二進制數(shù)轉(zhuǎn)換成BCD碼的公因式。編輯ppt

在程序設(shè)計中,可利用左移指令(乘以2)實現(xiàn)ai+1×2,采用循環(huán)計算16次公因式的方法來完成二進制數(shù)轉(zhuǎn)換成BCD碼。入口參數(shù):16位無符號數(shù)送R3,R2。出口參數(shù):共有5位BCD數(shù),萬位→R6;千、百位→R5;十、個位→R4位。程序流程圖如右圖所示。編輯ppt程序如下:

ORG1000H BINBCD1:CLRA ;A清0 MOVR4,A ;清0出口參數(shù)寄存器

MOVR5,A MOVR6,A MOVR7,#10H ;設(shè)置循環(huán)次數(shù)16LOOP:CLRC ;標(biāo)志位Cy清0,為二進制數(shù)×2作準(zhǔn)備

MOVA,R2 ;ai+1×2 RLCA MOVR2,A MOVA,R3 RLCA MOVR3,A MOVA,R4 編輯ppt

ADDCA,R4 ;帶進位自身相加,相當(dāng)于乘2 DAA MOVR4,A MOVA,R5 ADDCA,R5 DAA MOVR5,A MOVA,R6 ADDCA,R6 MOVR6,A ;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整

DJNZR7,LOOP ;若16位未循環(huán)完,轉(zhuǎn)向LOOP繼續(xù)循環(huán),否則繼續(xù)執(zhí)行

RET END 編輯ppt2.5.3散轉(zhuǎn)程序

散轉(zhuǎn)程序:是一種并行分支程序(多分支程序),它是根據(jù)某種輸入或運算結(jié)果,分別轉(zhuǎn)向各個處理程序。在MCS-51中用JMP@A+DPTR指令來實現(xiàn)程序的散轉(zhuǎn)。轉(zhuǎn)移的地址最多為256個。其結(jié)構(gòu)如圖下所示。編輯ppt散轉(zhuǎn)程序的設(shè)計方法:(1)應(yīng)用轉(zhuǎn)移指令表實現(xiàn)的散轉(zhuǎn)程序直接利用轉(zhuǎn)移指令(AJMP或LJMP)將欲散轉(zhuǎn)的程序組形成一個轉(zhuǎn)移表,然后將標(biāo)志單元內(nèi)容讀入累加器A,轉(zhuǎn)移表首址送入DPTR中,再利用散轉(zhuǎn)指令JMP@A+DPTR實現(xiàn)散轉(zhuǎn)。(2)應(yīng)用地址偏移量表實現(xiàn)的散轉(zhuǎn)程序直接利用地址偏移量形成轉(zhuǎn)移表,特點是程序簡單、轉(zhuǎn)移表短,轉(zhuǎn)移表和處理程序可位于程序存儲器的任何地方。(3)應(yīng)用轉(zhuǎn)向地址表的散轉(zhuǎn)程序直接使用轉(zhuǎn)向地址表。其表中各項即為各轉(zhuǎn)向程序的入口。散轉(zhuǎn)時,使用查表指令,按某單元的內(nèi)容查找到對應(yīng)的轉(zhuǎn)向地址,將它裝入DPTR,然后清累加器A,再用JMP@A+DPTR指令直接轉(zhuǎn)向各個分支程序。編輯ppt(4)應(yīng)用RET指令實現(xiàn)散轉(zhuǎn)程序用子程序返回指令RET實現(xiàn)散轉(zhuǎn)。其方法是:在查找到轉(zhuǎn)移地址后,不是將其裝入DPTR中,而是將它壓入堆棧中(先低位字節(jié),后高位字節(jié),即模仿調(diào)用指令)。然后通過執(zhí)行RET指令,將堆棧中的地址彈回到PC中實現(xiàn)程序的轉(zhuǎn)移。[例題12]

編制程序用單片機實現(xiàn)四則運算。解:在單片機的鍵盤上設(shè)置“+、-、×、÷”四個運算按鍵。其鍵值存放在寄存器R2中,當(dāng)(R2)=00H時做加法運算,當(dāng)(R2)=01H時做減法運算,當(dāng)(R2)=02H時做乘法運算,當(dāng)(R2)=03H時做除法運算。

P1口輸入被加數(shù)、被減數(shù)、被乘數(shù)、被除數(shù),輸出商或運算結(jié)果的低8位;

P3口輸入加數(shù)、減數(shù)、乘數(shù)、除數(shù),輸出余數(shù)或運算結(jié)果的高8位。編輯ppt程序簡化流程圖如下圖所示。

程序如下:

ORG1000H START:MOVP1,#DATA1H;給P1口、P3口送入數(shù)據(jù)DATA1,DATA2,用于計算

MOVP3,#DATA2H 編輯ppt

MOVDPTR,#TABLE;將基址TABLE送DPTR CLRC;Cy清0MOVA,R2;將運算鍵鍵值送ASUBBA,#04H ;將鍵值和04H相減,用于產(chǎn)生Cy標(biāo)志

JNCERROR ;若輸入按鍵不合理,程序轉(zhuǎn)ERROR處;否則,按鍵合理,程序繼續(xù)執(zhí)行

ADDA,#04H ;還原鍵值

CLRC ;Cy清0 RLA ;將A左移,即鍵值×2,形成正確的散轉(zhuǎn)偏移量

JMP@A+DPTR ;程序跳到(A)+(DPTR)形成的新地址TABLE:AJMPPRG0 ;程序跳到PRG0處,將要做加法運算

AJMPPRG1 ;程序跳到PRG1處,將要做減法運算

AJMPPRG2 ;程序跳到PRG2處,將要做乘法運算

AJMPPRG3 ;程序跳到PRG3處,將要做除法運算ERROR:(按鍵錯誤的處理程序)(略) 編輯ppt

PRG0:MOVA,P1 ;被加數(shù)送A ADDA,P3 ;做加法運算,結(jié)果送入A,并影響進位Cy MOVP1,A ;和的低8位結(jié)果送P1 CLRA ;A清0 ADDCA,#00H ;將進位Cy送入A,作為和的高8位

MOVP3,A ;和的高8位結(jié)果送P3 RET ;返回開始程序

PRG1:MOVA,P1 ;被減數(shù)送A CLRC ;Cy清0 SUBBA,P3 ;做減法運算,結(jié)果送入A,并影響借位Cy MOVP1,A ;差的低8位結(jié)果送P1 CLRA ;A清0 RLCA ;將借位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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論