版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1.MCS-51系列
MCS-51是Itenl公司生產(chǎn)的一個(gè)單片機(jī)系列名稱,型號(hào)有:
8051/8751/8031,8052/8752/8032,80C51/87C51/80C31,80C50/87C52/80C32等。生產(chǎn)工藝:一是:HMOS(高密度短溝道MOS工藝);二是:CHMOS工藝(互補(bǔ)金屬氧化物的HMOS工藝)
CHMOS是CMOS和HMOS的結(jié)合,既保持HMOS高速度和高密度的特點(diǎn),還具備CMOS的低功耗的特點(diǎn)。故在單片機(jī)應(yīng)用系統(tǒng)中應(yīng)盡量采用CHMOS工藝芯片。根據(jù)功能分:基本型;增強(qiáng)型根據(jù)配置分:掩模ROM,EPROM和ROMLess(無片內(nèi)程序存儲(chǔ)器)。7.180C51的尋址方式27.180C51的尋址方式尋址方式:尋找操作數(shù)的方法。80C51共有七種尋址方式:寄存器尋址直接尋址立即尋址寄存器間址變址尋址相對(duì)尋址位尋址37.1.1寄存器尋址特點(diǎn):操作數(shù)位于某個(gè)寄存器單元,寄存器尋址的尋址范圍:
32個(gè)通用寄存器(4個(gè)工作寄存器組,地址范圍為00H~1FH。當(dāng)前工作寄存器組由PSW中RS1、RS0位的狀態(tài)而確定。)
部分特殊功能寄存器SFR,如累加器A,通用寄存器B、數(shù)據(jù)指針DPTR等。
4MOVA,R0;(R0)→AMOVP1,A;(A)→P1口
ADDA,R0;(A)+(R0)→A57.1.2直接尋址指令碼中給出的是操作數(shù)地址,常以direct表示。80C51系列單片機(jī)可直接尋址的地址空間主要有:片內(nèi)RAM的低128個(gè)字節(jié)
SFR3AH片內(nèi)RAM累加器AMOVA,3AH88H88H6注:指令助記符中的direct是操作數(shù)所在存儲(chǔ)單元的物理地址,由兩位十六進(jìn)制數(shù)碼表示。當(dāng)直接尋址為SFR時(shí),即可用物理地址表示,也可用其符號(hào)表示。指令系統(tǒng)中,累計(jì)器A、ACC和E0H等三種表示方式,分屬于兩種不同的尋址方法,但指令的執(zhí)行效果相同。在指令系統(tǒng)中,字節(jié)地址和位地址是有區(qū)別的。前者用direct表示,后者用bit表示。77.1.3立即尋址特點(diǎn):CPU所需尋址的操作數(shù)直接包含在指令字節(jié)中,常以#對(duì)該操作數(shù)加以標(biāo)識(shí)。該操作數(shù)也稱為立即數(shù),可以是二進(jìn)制8位或16位,通常用#data或#data16表示。MOVA,#7AH;A←7AHMOVDPTR,#1234H;DPH←12H,DPL←34HADD30H,#30H;direct←(direct)+30H87.1.4寄存器間接尋址
寄存器中存放的是操作數(shù)地址,用@加以標(biāo)識(shí)。間址寄存器:@Ri,@DPTR
@Ri,主要用于尋址片內(nèi)或片外RAM的256個(gè)單元;
@DPTR,尋址外部ROM/RAM的全部64K個(gè)存儲(chǔ)單元;
不能用于訪問特殊功能寄存器SFR。9MOVA,R0;A←(R0)MOVA,@R0;A←((R0))R0A3AH3AH片內(nèi)RAM3AHR0A3AH65H65H107.1.5變址尋址常用于訪問ROM中的數(shù)據(jù)表格(1)指令操作碼含有基地址寄存器DPTR或PC;(2)指令操作碼含有累加器A,A中應(yīng)預(yù)先存放被尋址操作數(shù)地址對(duì)基地址之間的偏移量;(3)指令執(zhí)行時(shí),單片機(jī)先將基地址和地址偏移量相加以形成操作數(shù)地址,然后獲得操作數(shù)。
MOVCA,@A+DPTRMOVCA,@A+PCPC當(dāng)前值8位無符號(hào)數(shù)11例:已知片外ROM的0302單元中有一常數(shù)X,現(xiàn)欲將其送到累加器A,試編寫相應(yīng)的程序。解:(1)選DPTR作為基址寄存器,則基地址取0300H,地址偏移量取02H。
MOVDPTR,#0300HMOVA,#02HMOVCA,@A+DPTR(2)選PC作為基址寄存器
ORG0200HMOVA,#00HADDA,#FDHMOVCA,@A+PC12A02H0302HROM0000H03H00HDPTRALU計(jì)算操作數(shù)地址獲取操作數(shù),并送入AXX……137.1.6相對(duì)尋址用在相對(duì)轉(zhuǎn)移指令中:轉(zhuǎn)移的目標(biāo)地址由PC當(dāng)前值和指令中給出的8位相對(duì)偏移量rel共同形成。目標(biāo)地址=PC當(dāng)前值+偏移量(1)雙字節(jié)轉(zhuǎn)移類指令(6條)(2)三字節(jié)轉(zhuǎn)移類指令(7條)基地址,與該條轉(zhuǎn)移類指令相鄰的下一條指令的起始地址8位帶符號(hào)數(shù),-128~127142000H8054HSJMPrel;PC←PC+2+relA...80H54H......2056H程序存儲(chǔ)器0000HALU2000H2002H2001H......54HPCPCPC157.1.7位尋址
80C51系列單片機(jī)具有位處理功能,可對(duì)特定數(shù)據(jù)位進(jìn)行操作,其位尋址的空間有:片內(nèi)RAM的位尋址區(qū),其字節(jié)地址為20H~2FH,共16*8=128位,其位地址為00H~7FH;某些SFR,其特征是物理地址能被8整除,離散的分布在80H~FFH內(nèi)。位地址的表示方法:直接使用物理位地址MOVC,7FH字節(jié)地址加位MOVC,2FH.7可位尋址的SFR允許直接采用寄存器名加位數(shù)的表示方法MOVC,ACC.7經(jīng)偽指令定義過的字符名稱
A1BIT00HMOVC,A1尋址方式源操作數(shù)尋址空間指令立即數(shù)尋址程序存儲(chǔ)器ROMMOVA,#20H直接尋址片內(nèi)RAM128字節(jié)低特殊功能寄存器SFRMOVA,20H寄存器尋址工作寄存器R0~R7,A、B、C、DPTRMOVA,R0寄存器間接尋址片內(nèi)RAM低128字節(jié)[@R0,@R1,SP]片外RAM[@R0,@R1]MOVA,@R0MOVXA,@DPTR變址尋址程序存儲(chǔ)器ROM[@A+PC,@A+DPTR]MOVCA,@A+DPTR相對(duì)尋址程序存儲(chǔ)器SJMP55H位尋址片內(nèi)RAM的20H~2FH字節(jié)地址部分特殊功能寄存器CLRCSETB01H177.1.8指令的分類80C51單片機(jī)的指令,按功能可以分為5類:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯操作和環(huán)移指令、控制轉(zhuǎn)移指令和位操作指令等。(1)數(shù)據(jù)傳送指令(28條)功能:主要用于單片機(jī)片內(nèi)RAM和SFR之間傳送數(shù)據(jù),也可以用于單片機(jī)片內(nèi)和片外存儲(chǔ)單元之間傳送數(shù)據(jù)。特點(diǎn):把源地址中操作數(shù)傳送到目的地址(或目的寄存器),該類指令執(zhí)行后,源地址中的操作數(shù)不會(huì)發(fā)生改變。18(2)算術(shù)運(yùn)算指令(24條)功能:用于對(duì)兩個(gè)操作數(shù)進(jìn)行加、減、乘、除等算術(shù)運(yùn)算。在兩個(gè)操作數(shù)中,一個(gè)應(yīng)放在累加器A中,另一個(gè)可以在某個(gè)寄存器或片內(nèi)RAM單元中,也可以存放在指令碼的第二和第三字節(jié)中。(3)邏輯操作和環(huán)移指令邏輯操作指令用于對(duì)兩個(gè)操作數(shù)進(jìn)行邏輯乘、邏輯加、邏輯取反和異或等操作,大多數(shù)指令也需要把兩個(gè)操作數(shù)中的一個(gè)預(yù)先放入累加器A,操作結(jié)果也在累加器A中。環(huán)移指令用于對(duì)累加器A中的數(shù)進(jìn)行環(huán)移。環(huán)移指令有左環(huán)移和右環(huán)移之分,也有帶Cy和不帶Cy之分。19(4)控制轉(zhuǎn)移指令(17條)
分為條件轉(zhuǎn)移、無條件轉(zhuǎn)移、調(diào)用和返回等指令。特點(diǎn)是可改變程序執(zhí)行的流向,或者是使CPU轉(zhuǎn)移到另一處執(zhí)行,或者是繼續(xù)順序地執(zhí)行。(5)位操作指令(17條)
共分為位傳送、位置位、位運(yùn)算和位控制轉(zhuǎn)移指令等四類。位傳送、位置位和位運(yùn)算指令的操作數(shù)不是以字節(jié)為單位進(jìn)行操作,而是以字節(jié)中的某位為單位進(jìn)行操作,位控制轉(zhuǎn)移指令不是以檢測(cè)某個(gè)字節(jié)為條件而轉(zhuǎn)移,而是檢測(cè)字節(jié)中的某一位的狀態(tài)來轉(zhuǎn)移。207.1.9指令系統(tǒng)綜述指令的集合或全體稱為指令系統(tǒng),是CPU的重要性能標(biāo)志。不同系列的單片機(jī),其指令系統(tǒng)也不相同,但同一系列單片機(jī),其指令系統(tǒng)大多兼容。
80C51的指令系統(tǒng)共包含有111條指令。(1)符號(hào)說明除操作碼段采用了42種助記符以外,還在源操作數(shù)和目的操作數(shù)段中使用了一些符號(hào)。典型符號(hào)的含義歸納如下:Rn,工作寄存器,R0-R7中的一個(gè)#data,8位立即數(shù),取值范圍:00H~FFH#data16,16位立即數(shù),取值范圍:0000H~FFFFH21direct,8位直接地址,取值范圍00H~FFH和SFR@Ri,8位間址寄存器,i=0或1@DPTR,16位間址寄存器,用于訪問片外寄存器bit,位地址addr11,11位目標(biāo)地址addr16,16位目標(biāo)地址rel,8位帶符號(hào)地址偏移量,-128~127$,當(dāng)前指令的地址(2)指令對(duì)標(biāo)志位的影響對(duì)PSW中各標(biāo)志位無影響的指令對(duì)PSW中某些標(biāo)志位有影響的指令227.2數(shù)據(jù)傳送指令在80C51單片機(jī)中,數(shù)據(jù)傳送是最基本和最主要操作。數(shù)據(jù)傳送操作可以在片內(nèi)RAM和SFR內(nèi)進(jìn)行,也可以在累加器A和片外存儲(chǔ)器之間進(jìn)行。一般不會(huì)影響標(biāo)志位的狀態(tài)。數(shù)據(jù)傳送指令共有28條,分為內(nèi)部數(shù)據(jù)傳送指令、外部數(shù)據(jù)傳送指令、堆棧操作指令和數(shù)據(jù)交換指令四類。237.2.1內(nèi)部數(shù)據(jù)傳送指令(15條)特點(diǎn):操作數(shù)均位于單片機(jī)內(nèi)部,其格式為:
MOV目的操作數(shù),源操作數(shù)
(1)以累加器A為目的操作數(shù)
MOVA,directMOVA,#dataMOVA,RnMOVA,@Ri24(2)以寄存器Rn為目的操作數(shù)
MOVRn,directMOVRn,#dataMOVRn,A(3)以直接地址為目的操作數(shù)
MOVdirect1,direct2MOVdirect,#dataMOVdirect,AMOVdirect,RnMOVdirect,@Ri25(4)以間接地址為目的操作數(shù)
MOV@Ri,directMOV@Ri,#dataMOV@Ri,A累加器Adirect直接尋址@Ri間址Rndata267.2.2特殊數(shù)據(jù)傳送指令(7條)(1)16位數(shù)據(jù)傳送指令
MOVDPTR,#data16(2)訪問外部ROM的傳送指令
MOVCA,@A+DPTRMOVCA,@A+PC
例:已知累加器A中有一個(gè)0~9之間的整數(shù),試用查表指令編寫查找出該數(shù)平方值的程序。解:確定平方表,并設(shè)其首地址為2000H,如圖所示。272000H2001H2002H2003H2004H2005H2006H2007H2008H2009H0149162536496481(1)采用DPTR作為基址寄存器MOVDPTR,#2000HMOVCA,@A+DPTR(2)采用PC作為基址寄存器
ORG1FFBH1FFBH24dataADDA,#data1FFDH83HMOVCA,@A+PC1FFEH80FEHSJMP$PC當(dāng)前值+data=平房表首址取數(shù)地址=基地址+偏移量
=表首址+索引值28(3)訪問外部RAM的傳送指令
MOVXA,@RiMOVX@Ri,AMOVXA,@DPTR
MOVX@DPTR,A
例:已知外部RAM的88H單元中有一數(shù)X,試編寫程序?qū)送到外部RAM的1818H單元中。解:ORG2000HMOVR0,#88HMOVDPTR,#1818HMOVXA,@R0MOVX@DPTR,ASJMP$END29(4)
堆棧操作指令PUSHdirect;SP←SP+1,SP←
(direct)POPdirect;(direct)←SP,SP←SP-1
特點(diǎn):(1)操作數(shù)的尋址方式必須是直接尋址(2)Rn和A不能直接在指令中:A用ACC代替;Rn用其物理地址。(3)均為雙字節(jié)指令,操作碼和操作數(shù)分別占用一個(gè)字節(jié)。30例:讀程序段,分析其功能
MOVSP,#70HMOVA,#100MOVB,#20PUSHACCPUSHBPOPACCPOPB31片內(nèi)RAM片內(nèi)RAM70H71H72H70H71H72HSP→棧底10020SP→SP→
A
B10020SP→SP→SP→
B
A20100棧底2010032(5)數(shù)據(jù)交換指令
XCHA,Rn;A←(Rn),Rn←(A)XCHA,@Ri;A←((Ri)),(Ri)←(A)XCHA,direct;A←(direct),direct←(A)XCHDA,@Ri;A3~0←((Ri)3~0),(Ri)3~0←(A3~0)
例:已知外部RAM的20H單元中有一個(gè)數(shù)X,內(nèi)部RAM的20H單元中有一個(gè)數(shù)Y,試編出可以使它們相互交換的程序。33MOVR1,#20H;R1←20HMOVXA,@R1;A←XXCHA,@R1;A←Y,20H←XMOVX@R1,A;20H(片外RAM)←Y
例:已知50H中有一個(gè)0~9之間的數(shù),試編程將其變?yōu)橄鄳?yīng)的ASCII碼。(1)采用半字節(jié)交換指令MOVR0,#50HMOVA,#30HXCHDA,@R0MOV@R0,A(2)采用加法指令MOVA,#30HADDA,50HMOV50H,A343.3數(shù)據(jù)傳送指令在80C51單片機(jī)中,數(shù)據(jù)傳送是最基本和最主要操作。數(shù)據(jù)傳送操作可以在片內(nèi)RAM和SFR內(nèi)進(jìn)行,也可以在累加器A和片外存儲(chǔ)器之間進(jìn)行。一般不會(huì)影響標(biāo)志位的狀態(tài)。數(shù)據(jù)傳送指令共有28條,分為內(nèi)部數(shù)據(jù)傳送指令、外部數(shù)據(jù)傳送指令、堆棧操作指令和數(shù)據(jù)交換指令四類。351、內(nèi)部數(shù)據(jù)傳送指令(15條)特點(diǎn):操作數(shù)均位于單片機(jī)內(nèi)部,其格式為:
MOV目的操作數(shù),源操作數(shù)
(1)以累加器A為目的操作數(shù)
MOVA,directMOVA,#dataMOVA,RnMOVA,@Ri36(2)以寄存器Rn為目的操作數(shù)
MOVRn,directMOVRn,#dataMOVRn,A(3)以直接地址為目的操作數(shù)
MOVdirect1,direct2MOVdirect,#dataMOVdirect,AMOVdirect,RnMOVdirect,@Ri37(4)以間接地址為目的操作數(shù)
MOV@Ri,directMOV@Ri,#dataMOV@Ri,A累加器Adirect直接尋址@Ri間址Rndata382、外部數(shù)據(jù)傳送指令(7條)(1)16位數(shù)據(jù)傳送指令
MOVDPTR,#data16(2)訪問外部ROM的傳送指令
MOVCA,@A+DPTRMOVCA,@A+PC
例:已知累加器A中有一個(gè)0~9之間的整數(shù),試用查表指令編寫查找出該數(shù)平方值的程序。解:確定平方表,并設(shè)其首地址為2000H,如圖所示。392000H2001H2002H2003H2004H2005H2006H2007H2008H2009H0149162536496481(1)采用DPTR作為基址寄存器MOVDPTR,#2000HMOVCA,@A+DPTR(2)采用PC作為基址寄存器
ORG1FFBH1FFBH24dataADDA,#data1FFDH83HMOVCA,@A+PC1FFEH80FEHSJMP$PC當(dāng)前值+data=平房表首址取數(shù)地址=基地址+偏移量
=表首址+索引值40(3)訪問外部RAM的傳送指令
MOVXA,@RiMOVX@Ri,AMOVXA,@DPTR
MOVX@DPTR,A
例:已知外部RAM的88H單元中有一數(shù)X,試編寫程序?qū)送到外部RAM的1818H單元中。解:ORG2000HMOVR0,#88HMOVDPTR,#1818HMOVXA,@R0MOVX@DPTR,ASJMP$END413、堆棧操作指令
PUSHdirect;SP←SP+1,SP←
(direct)POPdirect;(direct)←SP,SP←SP-1
特點(diǎn):(1)操作數(shù)的尋址方式必須是直接尋址(2)Rn和A不能直接在指令中:A用ACC代替;Rn用其物理地址。(3)均為雙字節(jié)指令,操作碼和操作數(shù)分別占用一個(gè)字節(jié)。42例:讀程序段,分析其功能
MOVSP,#70HMOVA,#100MOVB,#20PUSHACCPUSHBPOPACCPOPB43片內(nèi)RAM片內(nèi)RAM70H71H72H70H71H72HSP→棧底10020SP→SP→
A
B10020SP→SP→SP→
B
A20100棧底20100444、數(shù)據(jù)交換指令
XCHA,Rn;A←(Rn),Rn←(A)XCHA,@Ri;A←((Ri)),(Ri)←(A)XCHA,direct;A←(direct),direct←(A)XCHDA,@Ri;A3~0←((Ri)3~0),(Ri)3~0←(A3~0)
例:已知外部RAM的20H單元中有一個(gè)數(shù)X,內(nèi)部RAM的20H單元中有一個(gè)數(shù)Y,試編出可以使它們相互交換的程序。45MOVR1,#20H;R1←20HMOVXA,@R1;A←XXCHA,@R1;A←Y,20H←XMOVX@R1,A;20H(片外RAM)←Y
例:已知50H中有一個(gè)0~9之間的數(shù),試編程將其變?yōu)橄鄳?yīng)的ASCII碼。(1)采用半字節(jié)交換指令MOVR0,#50HMOVA,#30HXCHDA,@R0MOV@R0,A(2)采用加法指令MOVA,#30HADDA,50HMOV50H,A467.3算術(shù)運(yùn)算指令算術(shù)運(yùn)算指令有24條,大多數(shù)指令都要用累加器A來存放一個(gè)操作數(shù),另一個(gè)操作數(shù)可以存放在任何一個(gè)工作寄存器Rn或片內(nèi)RAM單元中,也可以是指令碼中的一個(gè)立即數(shù)。在執(zhí)行指令時(shí),CPU總是根據(jù)指令碼中的源操作數(shù)地址找到源操作數(shù)和累加器A中操作數(shù)進(jìn)行相應(yīng)操作,并把操作結(jié)果保留在累加器A中。因此,累加器A既可以看作是一個(gè)源操作數(shù)寄存器,也可以認(rèn)作目的操作數(shù)寄存器。477.3.1加法指令(13條)①不帶Cy加法指令(4條)ADDA,Rn;A←(A)+(Rn)ADDA,direct;A←(A)+(direct)ADDA,@Ri;A←(A)+((Ri))ADDA,#data;A←(A)+data48例:試分析8051執(zhí)行如下指令后累加器A和PSW中各標(biāo)志位的變化狀況。
MOVA,#19H;A←19HADDA,#66H;A←(A)+66H
例:試分析8051執(zhí)行如下指令后累加器A和PSW中各標(biāo)志位的變化狀態(tài)。
MOVA,#5AH;A←5AHADDA,#6BH;A←(A)+6BH49②帶Cy的加法指令(4條)ADDCA,Rn;A←(A)+(Rn)+CyADDCA,direct;A←(A)+(direct)+CyADDCA,@Ri;A←(A)+((Ri))+CyADDCA,#data;A←(A)+data+Cy
例:已知:A=85H,R0=30H,(30H)=11H,(31H)=FFH,Cy=1,試問CPU執(zhí)行如下指令后累加器A和Cy中的值是多少?①ADDCA,R0②ADDCA,31H③ADDCA,@R0④ADDCA,#85H多字節(jié)加法運(yùn)算50③加1指令(5條)INCA;A←(A)+1INCRn;Rn←(Rn)+1INCdirect;direct←(direct)+1INC@Ri;(Ri)←((Ri))+1INCDPTR;DPTR←DPTR+1例:已知M1和M2單元中存放有兩個(gè)16位無符號(hào)數(shù)X1和X2(低8位在前,高8位在后),試寫出X1+X2并把結(jié)果放在M1和M1+1單元(低8位在M1單元,高8位在M1+1單元)的程序。設(shè)兩數(shù)之和不會(huì)超過16位。51ORG0500HMOVR0,#M1;X1的起始地址送R0MOVR1,#M2;X2的起始地址送R1MOVA,@R0;A←X1的低8位ADDA,@R1;A←X1低8位+X2低8位,形成CyMOV@R0,A;和的低8位存入M1INCR0;修改地址指針R0INCR1;修改地址指針R1MOVA,@R0;A←X1的高8位ADDCA,@R1;A←X1高8位+X2高8位+CyMOV@R0,A;和的高8位存入M1+1SJMP$END527.3.2減法指令(8條)①帶Cy的減法指令(4條)SUBBA,Rn;A←(A)-(Rn)-CySUBBA,direct;A←(A)-(direct)-CySUBBA,@Ri;A←(A)-((Ri))-CySUBBA,#data;A←(A)-data-Cy例:試判斷8031執(zhí)行如下程序后累加器A和PSW中各標(biāo)志位的狀態(tài)。CLRCMOVA,#52HSUBBA,#0B4H53②減1指令
DECA;A←(A)-1DECRn;Rn←(Rn)-1DECdirect;direct←(direct)-1DEC@Ri;(Ri)←((Ri))-1例:已知:A=DFH,R1=40H,R7=19H,(30H)=00H,(40H)=FFH,試問執(zhí)行如下指令后累加器A和PSW中各標(biāo)志位狀態(tài)如何?①DECA②DECR7③DEC30H④DEC@R154解:①A=DEH,P=0②R7=18H,PSW不變③(30H)=FFH,PSW不變④40H=FEH,PSW不變例:編程求兩個(gè)16位數(shù)之差。(差也是16位)解:被減數(shù)存M1和M1+1單元;減數(shù)存M2和M2+1單元,且均是低8位在前,高8位在后。ORG0300HMOVRO,#M1MOVR1,#M2CLRCMOVA,@R0SUBBA,@R1MOV@R0,ADECR0DECR1MOVA,@R0SUBBA,@R1MOV@R0,ASJMP$END55④十進(jìn)制調(diào)整指令
DAA;若AC=1或A3~0>9,則A←(A)+06H
;若Cy=1或A7~4>9,則A←(A)+60HBCD加法ALU只能進(jìn)行二進(jìn)制加法運(yùn)算(低4位向高4位是逢16進(jìn)1),為實(shí)現(xiàn)BCD加法就要對(duì)加法結(jié)果進(jìn)行調(diào)整,使其變成BCD數(shù)(逢10進(jìn)1)。BCD減法BCD減法可采用以下方法:求減數(shù)補(bǔ)碼;被減數(shù)+減數(shù)補(bǔ)碼;對(duì)所得兩數(shù)之和進(jìn)行BCD調(diào)整。56例:試寫出能完成85+59的BCD加法程序,并對(duì)其工作過程進(jìn)行分析。解:ORG1000HMOVA,#85HADDA,#59HDAASJMP$END57例:寫出91-34=57的BCD減法程序。解:ORG1000HCLRCMOVA,#9AHSUBBA,#34HADDA,#91HDAASJMP$END58乘法和除法指令
MULABDIVAB例:已知兩個(gè)8位無符號(hào)數(shù)分別存放在30H和31H單元中,試編寫兩數(shù)相乘且將積的低8位存入32H單元、高8位存入33H單元的程序。解:59ORG0100HMOVR0,#30H;R0←第一個(gè)乘數(shù)地址MOVA,@R0;A←第一個(gè)乘數(shù)INCR0;修改乘數(shù)地址MOVB,@R0;B←第一個(gè)乘數(shù)MULAB;A×B=BAINCR0;修改目標(biāo)單元地址MOV@R0,A;積的低8位→32HINCR0;修改目標(biāo)單元地址MOV@R0,B;積的高8位→33HSJMP$END607.4.1邏輯與指令(6條)ANLA,Rn;A←(A)∧(Rn)ANLA,direct;A←(A)∧(direct)ANLA,@Ri;A←(A)∧((Ri))ANLA,#data;A←(A)∧dataANLdirect,A;A←(direct)∧(A)ANLdirect,#data;A←(direct)∧data用途:可從一個(gè)字節(jié)中取出某些位。7.4邏輯運(yùn)算指令61例:已知數(shù)59H存于片內(nèi)RAM的M1單元,試編程取出其高4位,并存于M1單元。解:ORG0100HMOVA,M1ANLA,#0F0HMOVM1,ASJMP$ENDORG0100HMOVR0,#M1MOVA,#0F0HANLA,@R0MOVM1,ASJMP$END627.4.2邏輯或指令(6條)ORLA,Rn;A←(A)∨(Rn)ORLA,direct;A←(A)∨(direct)ORLA,@Ri;A←(A)∨((Ri))ORLA,#data;A←(A)∨dataORLdirect,A;direct←(direct)∨(A)ORLdirect,#data;direct←(direct)∨data用途:將一個(gè)字節(jié)中某些位置1。例:設(shè)A=55H,P1=97H,試通過編程將累加器A中的低4位送入P1口低4位,P1口高位不變。63解:ORG0100HMOVR0,A;R0←(A),(R0)=55HANLA,#0FH;A←55H∧0FH,(A)=05HANLP1,#0F0H;P1←97H∧F0H,(P1)=90HORLP1,A;P1←90H∨05H,(P1)=95HMOVA,R0;A←(R0),(A)=55HSJMP$END647.4.3邏輯異或指令(6條)XRLA,Rn;A←(A)⊕(Rn)XRLA,direct;A←(A)⊕(direct)XRLA,@Ri;A←(A)⊕((Ri))XRLA,#data;A←(A)⊕dataXRLdirect,A;direct←(direct)⊕(A)XRLdirect,#data;direct←(direct)⊕data用途:將一個(gè)字節(jié)中某幾位取反。例:已知外部RAM30H單元中有一數(shù)ABH,試編出使其高4位不變、低4位取反的程序。65解:ORG0100HMOVR0,#30H;地址30H送入R0MOVXA,@R0;A←ABHXRLA,#0FH;A←ABH⊕0FH=A4HMOVX@R0,A;結(jié)果送回30H單元SJMP$END667.4.4累加器清零和取反指令
80C51單片機(jī)中,累加器清零和取反指令各有1條,均是單字節(jié)單周期指令。雖然采用數(shù)據(jù)傳送或邏輯異或指令也同樣可以使累加器A清零或取反,但它們至少需要兩個(gè)字節(jié)。
CLRA;A←0CPLA;A←ā
取反指令常用于求取某個(gè)存儲(chǔ)單元或存儲(chǔ)區(qū)域中的帶符號(hào)數(shù)的補(bǔ)碼。67例:若(30H)=X,且X為負(fù)數(shù)的原碼,求其補(bǔ)碼。解:ORG1000HMOVA,30H;A←|X|CPLA;A中內(nèi)容取反INCA;取反后的內(nèi)容加1MOV30H,A;結(jié)果送回SJMP$END687.4.5循環(huán)移位指令(5條)A7←───A0RLARRAA7───→A0RLCARRCAA7←──A0CyA7──→A0CySWAPAA7~4A3~069用途:對(duì)某數(shù)擴(kuò)大/縮小一倍;代碼轉(zhuǎn)換。例:已知A=35H,Cy=1,試問執(zhí)行如下指令后的A中的內(nèi)容為多少?①RRA②RLA③RRCA④RLCA⑤SWAPA00110101A70例:已知M1和M1+1單元中有一個(gè)16位的二進(jìn)制數(shù)(M1中為低位),請(qǐng)編程將該數(shù)擴(kuò)大為原來的二倍(設(shè)擴(kuò)大后的結(jié)果小于65536)。M1+1M1ORG1000HCLRCMOVR1,#M1MOVA,@R1RLCAMOV@R1,AINCR1MOVA,@R1RLCAMOV@R1,ASJMP$END解:71例:編程完成如下代碼轉(zhuǎn)換。0000BCD10000BCD2M1M1+1BCD2BCD1M1ORG0200HMOVR0,#M1+1MOVA,@R0SWAPADECR0ORLA,@R0MOV@R0,ASJMP$END72長(zhǎng)轉(zhuǎn)移指令LJMPaddr16;PC←addr16尋址范圍:64KB7.5控制轉(zhuǎn)移指令02Haddr15~addr8addr7~addr0操作碼高8位地址低8位地址7.5.1無條件轉(zhuǎn)移指令(4條)73ORG0000HLJMPUSER……ORG1000HUSER:MOVA,#05H……END74短轉(zhuǎn)移指令A(yù)JMPaddr11;PC←PC+2,PC10~PC0←addr11a10a9a800001a7a6a5a4a3a2a1a0操作碼75ORG0800H
AJMPLOOP……ORG0FF0HLOOP:MOVA,#08H……ENDAJMPaddr11ROMPCPC+1PC+2-102410232KB76相對(duì)轉(zhuǎn)移SJMPrel;PC←PC+2,PC←PC+rel轉(zhuǎn)移范圍:80Hrel操作碼地址偏移量SJMPaddr11ROMPCPC+1PC+2-128127256間接轉(zhuǎn)移JMP@A+DPTR;PC←(A)+(DPTR)MOVDPTR,#TAB;TAB代表的地址送入DPTRJMP@A+DPTR;跳轉(zhuǎn)TAB:AJMPROUT0;跳轉(zhuǎn)ROUT0開始的程序段
。。。ROUT0:。。。78累加器A判零轉(zhuǎn)移指令(2條)JZrel;若A=0,則PC←PC+2+rel
;若A≠0,則PC←PC+2JNZrel;若A≠0,則PC←PC+2+rel
;若A=0,則PC←PC+27.5.2條件轉(zhuǎn)移指令79比較條件轉(zhuǎn)移指令(4條)CJNEA,#data,rel;若A=data,則PC←PC+3;若A≠data,則PC←PC+3+rel;形成Cy標(biāo)志位CJNEA,direct,rel;若A=(direct),則PC←PC+3;若A≠(direct),則PC←PC+3+rel
;形成Cy標(biāo)志位CJNERn,#data,rel;若Rn=data,則PC←PC+3;若Rn≠data,則PC←PC+3+rel;形成Cy標(biāo)志位80CJNE@Ri,#data,rel;若(Ri)=data,則PC←PC+3;若(Ri)≠data,則PC←PC+3+rel;形成Cy標(biāo)志位說明:Cy的形成原則為:若A-B≥0,則Cy=0
若A-B<
0,則Cy=181減1條件轉(zhuǎn)移指令(2條)DJNZRn,rel;若(Rn)-1=0,則PC←PC+2;若(Rn)-1≠0,則PC←PC+2+relDJNZdirect,rel;若(direct)-1=0,則PC←PC+3;若(direct)-1≠0,則PC←PC+3+rel用途:判斷循環(huán)是否結(jié)束82子程序:功能完整、通用性好,可多次調(diào)用,使用子程序調(diào)用可縮短程序開發(fā)周期、縮短用戶程序長(zhǎng)度。調(diào)用指令的作用:斷點(diǎn)地址(PC中內(nèi)容)壓入堆棧中,然后轉(zhuǎn)入子程序的第一行指令開始執(zhí)行。返回指令的作用:堆棧中的斷點(diǎn)地址送入PC。7.5.3子程序調(diào)用和返回指令83絕對(duì)調(diào)用指令(短調(diào)用指令)ACALLaddr11;PC←PC+2;SP←SP+1,(SP)←PC7~PC0;SP←SP+1,(SP)←PC15~PC8;PC10~0←addr11目標(biāo)地址:PC15-11←(PC+2)15-11;PC10-0←addr11a10a9a81001a7a6a5a4a3a2a1a084長(zhǎng)調(diào)用指令LCALLaddr16;PC←PC+3;SP←SP+1,(SP)←PC7~PC0;SP←SP+1,(SP)←PC15~PC8;PC←addr1612Haddr15-8addr7-0addr16:0000H-FFFFH85返回指令(2條)子程序返回指令RET;PC15~PC8←(SP),SP←SP-1;PC7~PC0←(SP),SP←SP-1中斷返回指令RETI;PC15~PC8←(SP),SP←SP-1;PC7~PC0←(SP),SP←SP-1867.5.4空操作指令NOP;PC←PC+1已知8031的晶振頻率為12MHz,試計(jì)算執(zhí)行如下程序需要的時(shí)間。ORG1000HDELAY:MOVR2,#250DELAY1:MOVR3,#38NOPDELAY2:DJNZR3,DELAY2DJNZR2,DELAY1RET機(jī)器周期數(shù)11122287解:根據(jù)晶振頻率計(jì)算機(jī)器周期T:計(jì)算程序所用機(jī)器周期數(shù):(38×2+4)×250+3=20003運(yùn)行該程序需要的時(shí)間:20003×1μs=20.003ms88布爾操作指令,其操作對(duì)象:片內(nèi)RAM低128個(gè)單元中的20H-2FH單元的16×8=128位;22個(gè)SFR中的11個(gè),共83位。7.6.1位傳送指令(2條)MOVC,bit;Cy←(bit)MOVbit,C;bit←Cy7.6位操作指令897.6.2位復(fù)位/置位指令(4條)CLRC;Cy←0CLRbit;bit←0SETBC;Cy←1SETBbit;bit←1例:編程實(shí)現(xiàn)如下16位數(shù)左環(huán)移一次。A15←A8A7←A0907.6.3位運(yùn)算指令(6條)ANLC,bit;Cy←Cy∧(bit)ANLC,/bit;Cy←Cy∧bit的非ORLC,bit;Cy←Cy∨(bit)ORLC,/bit;Cy←Cy∨bit的非CPLC;Cy取反CPLbit;bit取反917.6.4位控制轉(zhuǎn)移指令(5條)以Cy中內(nèi)容為條件的轉(zhuǎn)移指令(2條)JCrel;若Cy=0,則PC←PC+2
;若Cy=1,則PC←PC+2+relJNCrel;若Cy=0,則PC←PC+2+rel
;若Cy=1,則PC←PC+292以位地址中內(nèi)容為條件的轉(zhuǎn)移指令JBrel;若bit=0,則PC←PC+3
;若bit=1,則PC←PC+3+relJNBrel;若bit=0,則PC←PC+3+rel
;若bit=1,則PC←PC+3JBCrel;若bit=0,則PC←PC+3
;若bit=1,則PC←PC+3+rel,且bit←0例:編程設(shè)計(jì),若片內(nèi)RAM30H單元內(nèi)容大于0,40H單元置00;30H單元內(nèi)容<于0,40H單元置FFH;30H單元內(nèi)容等于0,40H單元置1;源程序?yàn)椋?/p>
CJNE30H,#00H,LP1 MOV 40H,#01H SJMP LP2LP1: JC LP3 MOV 40H,#00H SJMP LP2LP3: MOV 40H,#0FFHLP2: SJMP $例:P3.2和P3.3上各接有一只按鍵,要求它們分別按下時(shí)(P3.2=0或P3.3=0),分別使P1口為0或FFH。源程序?yàn)椋篠TART:MOVP1,#0FFH MOVP3,#0FFHL1:JNBP3.2,L2 JNBP3.3,L3;P3.2=1,P3.3=1,等待
LJMPL1L2:MOVP1,#00H;P3.2=0,使P1口全為“0”
LJMPL1L3:MOVP1,#0FFH;P3.3=0,使P1口全為“1”
LJMPL1957.7 匯編語(yǔ)言程序設(shè)計(jì)模塊化設(shè)計(jì)(按功能分:顯示、鍵盤解讀、中斷、打印、輸入、發(fā)送等)2.盡量采用循環(huán)及子程序結(jié)構(gòu)(節(jié)省內(nèi)存)3.在使用內(nèi)存時(shí)謹(jǐn)防內(nèi)存資源沖突7.7.1 程序編制的方法和技巧匯編語(yǔ)言語(yǔ)句包含兩種基本類型:指令語(yǔ)句和偽指令語(yǔ)句指令語(yǔ)句:(已講解)指令語(yǔ)句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼——機(jī)器代碼偽指令語(yǔ)句:(后面講解)是為匯編服務(wù)的。在匯編時(shí)沒有機(jī)器代碼與之對(duì)應(yīng)。
地址 機(jī)器碼 源程序
無代碼對(duì)應(yīng)
ORG 2000H 2000H7830 MAIN: MOVR0,#30H2002HE6 MOVA,@R0 …
7.7.2源程序的編輯和匯編偽指令ORG:起始偽指令Origin,指明程序和數(shù)據(jù)塊起始地址。指令地址機(jī)器碼 源程序
ORG 2000H 2000H7830 MAIN:MOVR0,#30H2002HE6 MOVA,@R0
… ORG3000H3000H23 DB23H,100,‘A’
3001H643002H41
END匯編結(jié)束偽指令。P94
例:START:…
…ENDEQU—賦值偽指令。為標(biāo)號(hào)或標(biāo)識(shí)符賦值Equate
X1 EQU2000H
X2 EQU0FH
MAIN: MOVDPTR,#X1
ADDA,#X2P95DB—定義字節(jié)偽指令。DefineByte8bit
例:DB12H,100,‘A’存儲(chǔ):00010010,01100100,01000001DW—定義雙字節(jié)偽指令。DefineWord16bit
例:DW2030H,8CH,“AB”
存儲(chǔ):001000000011000000000000100011000100000101000010
DS
定義存儲(chǔ)區(qū)偽指令DEFINESTORAGE
從指定地址開始保留指定數(shù)目的字節(jié)單元備用。
ORG810AHDS0AH;從8100H地址開始,保留10個(gè)連續(xù)的地址單元BIT
位定義偽指令把一個(gè)可位尋址的位單元賦值給所規(guī)定的字符名稱
ASBITP2.0;將P2.0的位地址賦給AS;
RSBIT39H;將位地址為39H的位定義為符號(hào)名1011.順序結(jié)構(gòu)程序org1000hstart:movdptr,#2000hmova,20hmovca,@a+dptrmov21h,asjmp$org2000htable:db0,1,4,9,16,25end例:變量存在內(nèi)部RAM的20H單元中,其取值范圍:0~5,編成,查表法求其平方值7.7.3基本程序結(jié)構(gòu)程序一條條地按順序執(zhí)行指令,直到全部指令執(zhí)行完畢。102開始表格首地址送DPTR變量送A(20H)A查平方表(A+DPTR)A結(jié)束結(jié)果送21H單元:A21H103例2:將20H單元的壓縮BCD碼拆成兩個(gè)ACSII碼存入21H、22H單元。BCD012...9ASCII30H31H32H...39H(20H)
A10H
BA/B,A中為高4位BCD碼,B中為低4位BCD碼B+30H
BB
(21H)A+30H
AA
(22H)開始結(jié)束104周期數(shù)源程序ORG2000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV21H,BORLA,#30HMOV22H,AEND124221113;除以10H;高4位BCD碼轉(zhuǎn)換位ASCII碼;低4位BCD碼轉(zhuǎn)換位ASCII碼1052.分支程序分支程序可根據(jù)要求無條件或條件地改變程序執(zhí)行流向。編寫分支程序主要在于正確使用轉(zhuǎn)移指令。分支程序有:?jiǎn)畏种ЫY(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散轉(zhuǎn))條件成立?下條指令程序段A單分支結(jié)構(gòu)YN條件成立?程序段AYN程序段A雙分支結(jié)構(gòu)106K=?程序段nn0程序段1多分支結(jié)構(gòu)程序段01107例:設(shè)變量x以補(bǔ)碼形式存放在片內(nèi)RAM30H單元中,變量y與x的關(guān)系是:編程根據(jù)x的值求y值并放回原單元。A=?y=x+5<0>0y=20Hy=x0取x即(30h)A開始存y即y20h結(jié)束108ORG1000HSTART:MOVA,30HJZNEXT;x=0,轉(zhuǎn)移ANLA,#80H;保留符號(hào)位JZED;x>0,轉(zhuǎn)移MOVA,#05H;x<0,不轉(zhuǎn)移ADDA,30HMOV30H,ASJMPEDNEXT:MOV30H,#20HED:SJMP$109START:MOVDPTR,#TAB;置分支入口地址表首址
MOVA,R7;分支轉(zhuǎn)移序號(hào)送AADDA,R7;分支轉(zhuǎn)移序號(hào)乘以2
MOVR3,A;暫存于R3MOVCA,@A+DPTR;取高位地址
XCHA,R3INCAMOVCA,@A+DPTR;取低位地址
MOVDPL,A;處理程序入口地址低8位送DPLMOVDPH,R3;處理程序入口地址高8位送DPHCLRAJMP@A+DPTRTAB:DWPP0DWPP1………DWPPN例:根據(jù)R7的內(nèi)容,轉(zhuǎn)至對(duì)應(yīng)的分支程序。設(shè)R7的內(nèi)容為0~N,對(duì)應(yīng)的處理程序地址分別為PP0~PPNPP0高位PP0低位TABPP1高位PP1低位TAB+21103.循環(huán)程序循環(huán)程序一般由:初始化部分循環(huán)體部分--處理部分、修改部分、控制部分結(jié)束部分其結(jié)構(gòu)一般有兩種:
先進(jìn)入處理部分,再控制循環(huán)至少執(zhí)行一次循環(huán)體先控制循環(huán),再進(jìn)入處理部分循環(huán)體是否執(zhí)行,取決于判斷結(jié)果。111開始設(shè)置循環(huán)初值循環(huán)處理循環(huán)修改結(jié)束處理結(jié)束循環(huán)結(jié)束?開始設(shè)置循環(huán)初值循環(huán)處理循環(huán)修改結(jié)束處理結(jié)束循環(huán)結(jié)束?NYYN112循環(huán)控制的一般方法:循環(huán)次數(shù)已知利用循環(huán)次數(shù)控制循環(huán)次數(shù)未知利用關(guān)鍵字控制113例:50ms延時(shí)子程序。設(shè)晶振頻率為12MHz,則機(jī)器周期為1us。DEL:MOVR7,#200;1μsDEL1:MOVR6,#123;1μsNOP;1μsDJNZR6,$;2μsDJNZR7,DEL1;2μsRET;2μs延時(shí)時(shí)間:t=1+200[(1+1+2*123)+2]+2≈50000us=50ms例:統(tǒng)計(jì)字串長(zhǎng)度。內(nèi)存從STRING開始有一字串,該字串以$(ASCII碼為24H)結(jié)束,試統(tǒng)計(jì)該字串長(zhǎng)度,結(jié)果存于NUM單元中源程序如下:
ORG 0800HNUM DATA 20HSTRINGDATA21HSTART:CLRA MOVR0,#STRINGLOOP:CJNE @R0,#24H,NEXT SJMPCOMPNEXT:INC A INCR0 SJMP LOOPCOMP:MOVNUM,A SJMP $1151.現(xiàn)場(chǎng)保護(hù)與恢復(fù)在主程序中實(shí)現(xiàn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州大學(xué)《電動(dòng)汽車動(dòng)力電池與能源管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴陽(yáng)學(xué)院《中法跨文化交際》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025天津市建筑安全員-C證(專職安全員)考試題庫(kù)
- 2025年河南建筑安全員《B證》考試題庫(kù)
- 2025年四川建筑安全員B證考試題庫(kù)附答案
- 2025江西省安全員考試題庫(kù)
- 廣州幼兒師范高等專科學(xué)?!豆补芾砼c服務(wù)課程開發(fā)與教材分析》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣州新華學(xué)院《軟件工程與實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025湖南建筑安全員《C證》考試題庫(kù)
- 2025年江蘇省建筑安全員知識(shí)題庫(kù)附答案
- 2024國(guó)有企業(yè)與民營(yíng)企業(yè)之間的混合所有制改革合同
- 物流倉(cāng)庫(kù)安全生產(chǎn)
- 2024年醫(yī)院食堂餐飲獨(dú)家承包協(xié)議
- 保險(xiǎn)公司廉政風(fēng)險(xiǎn)防控制度
- DB34T4868-2024智慧醫(yī)院醫(yī)用耗材院內(nèi)物流規(guī)范
- 2025年蛇年年會(huì)匯報(bào)年終總結(jié)大會(huì)模板
- 《稻草人》閱讀題及答案
- 國(guó)家職業(yè)技術(shù)技能標(biāo)準(zhǔn) X2-10-07-17 陶瓷產(chǎn)品設(shè)計(jì)師(試行)勞社廳發(fā)200633號(hào)
- 瑜伽基礎(chǔ)知識(shí)題庫(kù)單選題100道及答案解析
- 廣東省廣州市2024年中考數(shù)學(xué)真題試卷(含答案)
- 落實(shí)《中小學(xué)德育工作指南》制定的實(shí)施方案(pdf版)
評(píng)論
0/150
提交評(píng)論