版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1.MCS-51系列
MCS-51是Itenl公司生產的一個單片機系列名稱,型號有:
8051/8751/8031,8052/8752/8032,80C51/87C51/80C31,80C50/87C52/80C32等。生產工藝:一是:HMOS(高密度短溝道MOS工藝);二是:CHMOS工藝(互補金屬氧化物的HMOS工藝)
CHMOS是CMOS和HMOS的結合,既保持HMOS高速度和高密度的特點,還具備CMOS的低功耗的特點。故在單片機應用系統(tǒng)中應盡量采用CHMOS工藝芯片。根據功能分:基本型;增強型根據配置分:掩模ROM,EPROM和ROMLess(無片內程序存儲器)。7.180C51的尋址方式27.180C51的尋址方式尋址方式:尋找操作數的方法。80C51共有七種尋址方式:寄存器尋址直接尋址立即尋址寄存器間址變址尋址相對尋址位尋址37.1.1寄存器尋址特點:操作數位于某個寄存器單元,寄存器尋址的尋址范圍:
32個通用寄存器(4個工作寄存器組,地址范圍為00H~1FH。當前工作寄存器組由PSW中RS1、RS0位的狀態(tài)而確定。)
部分特殊功能寄存器SFR,如累加器A,通用寄存器B、數據指針DPTR等。
4MOVA,R0;(R0)→AMOVP1,A;(A)→P1口
ADDA,R0;(A)+(R0)→A57.1.2直接尋址指令碼中給出的是操作數地址,常以direct表示。80C51系列單片機可直接尋址的地址空間主要有:片內RAM的低128個字節(jié)
SFR3AH片內RAM累加器AMOVA,3AH88H88H6注:指令助記符中的direct是操作數所在存儲單元的物理地址,由兩位十六進制數碼表示。當直接尋址為SFR時,即可用物理地址表示,也可用其符號表示。指令系統(tǒng)中,累計器A、ACC和E0H等三種表示方式,分屬于兩種不同的尋址方法,但指令的執(zhí)行效果相同。在指令系統(tǒng)中,字節(jié)地址和位地址是有區(qū)別的。前者用direct表示,后者用bit表示。77.1.3立即尋址特點:CPU所需尋址的操作數直接包含在指令字節(jié)中,常以#對該操作數加以標識。該操作數也稱為立即數,可以是二進制8位或16位,通常用#data或#data16表示。MOVA,#7AH;A←7AHMOVDPTR,#1234H;DPH←12H,DPL←34HADD30H,#30H;direct←(direct)+30H87.1.4寄存器間接尋址
寄存器中存放的是操作數地址,用@加以標識。間址寄存器:@Ri,@DPTR
@Ri,主要用于尋址片內或片外RAM的256個單元;
@DPTR,尋址外部ROM/RAM的全部64K個存儲單元;
不能用于訪問特殊功能寄存器SFR。9MOVA,R0;A←(R0)MOVA,@R0;A←((R0))R0A3AH3AH片內RAM3AHR0A3AH65H65H107.1.5變址尋址常用于訪問ROM中的數據表格(1)指令操作碼含有基地址寄存器DPTR或PC;(2)指令操作碼含有累加器A,A中應預先存放被尋址操作數地址對基地址之間的偏移量;(3)指令執(zhí)行時,單片機先將基地址和地址偏移量相加以形成操作數地址,然后獲得操作數。
MOVCA,@A+DPTRMOVCA,@A+PCPC當前值8位無符號數11例:已知片外ROM的0302單元中有一常數X,現欲將其送到累加器A,試編寫相應的程序。解:(1)選DPTR作為基址寄存器,則基地址取0300H,地址偏移量取02H。
MOVDPTR,#0300HMOVA,#02HMOVCA,@A+DPTR(2)選PC作為基址寄存器
ORG0200HMOVA,#00HADDA,#FDHMOVCA,@A+PC12A02H0302HROM0000H03H00HDPTRALU計算操作數地址獲取操作數,并送入AXX……137.1.6相對尋址用在相對轉移指令中:轉移的目標地址由PC當前值和指令中給出的8位相對偏移量rel共同形成。目標地址=PC當前值+偏移量(1)雙字節(jié)轉移類指令(6條)(2)三字節(jié)轉移類指令(7條)基地址,與該條轉移類指令相鄰的下一條指令的起始地址8位帶符號數,-128~127142000H8054HSJMPrel;PC←PC+2+relA...80H54H......2056H程序存儲器0000HALU2000H2002H2001H......54HPCPCPC157.1.7位尋址
80C51系列單片機具有位處理功能,可對特定數據位進行操作,其位尋址的空間有:片內RAM的位尋址區(qū),其字節(jié)地址為20H~2FH,共16*8=128位,其位地址為00H~7FH;某些SFR,其特征是物理地址能被8整除,離散的分布在80H~FFH內。位地址的表示方法:直接使用物理位地址MOVC,7FH字節(jié)地址加位MOVC,2FH.7可位尋址的SFR允許直接采用寄存器名加位數的表示方法MOVC,ACC.7經偽指令定義過的字符名稱
A1BIT00HMOVC,A1尋址方式源操作數尋址空間指令立即數尋址程序存儲器ROMMOVA,#20H直接尋址片內RAM128字節(jié)低特殊功能寄存器SFRMOVA,20H寄存器尋址工作寄存器R0~R7,A、B、C、DPTRMOVA,R0寄存器間接尋址片內RAM低128字節(jié)[@R0,@R1,SP]片外RAM[@R0,@R1]MOVA,@R0MOVXA,@DPTR變址尋址程序存儲器ROM[@A+PC,@A+DPTR]MOVCA,@A+DPTR相對尋址程序存儲器SJMP55H位尋址片內RAM的20H~2FH字節(jié)地址部分特殊功能寄存器CLRCSETB01H177.1.8指令的分類80C51單片機的指令,按功能可以分為5類:數據傳送指令、算術運算指令、邏輯操作和環(huán)移指令、控制轉移指令和位操作指令等。(1)數據傳送指令(28條)功能:主要用于單片機片內RAM和SFR之間傳送數據,也可以用于單片機片內和片外存儲單元之間傳送數據。特點:把源地址中操作數傳送到目的地址(或目的寄存器),該類指令執(zhí)行后,源地址中的操作數不會發(fā)生改變。18(2)算術運算指令(24條)功能:用于對兩個操作數進行加、減、乘、除等算術運算。在兩個操作數中,一個應放在累加器A中,另一個可以在某個寄存器或片內RAM單元中,也可以存放在指令碼的第二和第三字節(jié)中。(3)邏輯操作和環(huán)移指令邏輯操作指令用于對兩個操作數進行邏輯乘、邏輯加、邏輯取反和異或等操作,大多數指令也需要把兩個操作數中的一個預先放入累加器A,操作結果也在累加器A中。環(huán)移指令用于對累加器A中的數進行環(huán)移。環(huán)移指令有左環(huán)移和右環(huán)移之分,也有帶Cy和不帶Cy之分。19(4)控制轉移指令(17條)
分為條件轉移、無條件轉移、調用和返回等指令。特點是可改變程序執(zhí)行的流向,或者是使CPU轉移到另一處執(zhí)行,或者是繼續(xù)順序地執(zhí)行。(5)位操作指令(17條)
共分為位傳送、位置位、位運算和位控制轉移指令等四類。位傳送、位置位和位運算指令的操作數不是以字節(jié)為單位進行操作,而是以字節(jié)中的某位為單位進行操作,位控制轉移指令不是以檢測某個字節(jié)為條件而轉移,而是檢測字節(jié)中的某一位的狀態(tài)來轉移。207.1.9指令系統(tǒng)綜述指令的集合或全體稱為指令系統(tǒng),是CPU的重要性能標志。不同系列的單片機,其指令系統(tǒng)也不相同,但同一系列單片機,其指令系統(tǒng)大多兼容。
80C51的指令系統(tǒng)共包含有111條指令。(1)符號說明除操作碼段采用了42種助記符以外,還在源操作數和目的操作數段中使用了一些符號。典型符號的含義歸納如下:Rn,工作寄存器,R0-R7中的一個#data,8位立即數,取值范圍:00H~FFH#data16,16位立即數,取值范圍:0000H~FFFFH21direct,8位直接地址,取值范圍00H~FFH和SFR@Ri,8位間址寄存器,i=0或1@DPTR,16位間址寄存器,用于訪問片外寄存器bit,位地址addr11,11位目標地址addr16,16位目標地址rel,8位帶符號地址偏移量,-128~127$,當前指令的地址(2)指令對標志位的影響對PSW中各標志位無影響的指令對PSW中某些標志位有影響的指令227.2數據傳送指令在80C51單片機中,數據傳送是最基本和最主要操作。數據傳送操作可以在片內RAM和SFR內進行,也可以在累加器A和片外存儲器之間進行。一般不會影響標志位的狀態(tài)。數據傳送指令共有28條,分為內部數據傳送指令、外部數據傳送指令、堆棧操作指令和數據交換指令四類。237.2.1內部數據傳送指令(15條)特點:操作數均位于單片機內部,其格式為:
MOV目的操作數,源操作數
(1)以累加器A為目的操作數
MOVA,directMOVA,#dataMOVA,RnMOVA,@Ri24(2)以寄存器Rn為目的操作數
MOVRn,directMOVRn,#dataMOVRn,A(3)以直接地址為目的操作數
MOVdirect1,direct2MOVdirect,#dataMOVdirect,AMOVdirect,RnMOVdirect,@Ri25(4)以間接地址為目的操作數
MOV@Ri,directMOV@Ri,#dataMOV@Ri,A累加器Adirect直接尋址@Ri間址Rndata267.2.2特殊數據傳送指令(7條)(1)16位數據傳送指令
MOVDPTR,#data16(2)訪問外部ROM的傳送指令
MOVCA,@A+DPTRMOVCA,@A+PC
例:已知累加器A中有一個0~9之間的整數,試用查表指令編寫查找出該數平方值的程序。解:確定平方表,并設其首地址為2000H,如圖所示。272000H2001H2002H2003H2004H2005H2006H2007H2008H2009H0149162536496481(1)采用DPTR作為基址寄存器MOVDPTR,#2000HMOVCA,@A+DPTR(2)采用PC作為基址寄存器
ORG1FFBH1FFBH24dataADDA,#data1FFDH83HMOVCA,@A+PC1FFEH80FEHSJMP$PC當前值+data=平房表首址取數地址=基地址+偏移量
=表首址+索引值28(3)訪問外部RAM的傳送指令
MOVXA,@RiMOVX@Ri,AMOVXA,@DPTR
MOVX@DPTR,A
例:已知外部RAM的88H單元中有一數X,試編寫程序將X送到外部RAM的1818H單元中。解:ORG2000HMOVR0,#88HMOVDPTR,#1818HMOVXA,@R0MOVX@DPTR,ASJMP$END29(4)
堆棧操作指令PUSHdirect;SP←SP+1,SP←
(direct)POPdirect;(direct)←SP,SP←SP-1
特點:(1)操作數的尋址方式必須是直接尋址(2)Rn和A不能直接在指令中:A用ACC代替;Rn用其物理地址。(3)均為雙字節(jié)指令,操作碼和操作數分別占用一個字節(jié)。30例:讀程序段,分析其功能
MOVSP,#70HMOVA,#100MOVB,#20PUSHACCPUSHBPOPACCPOPB31片內RAM片內RAM70H71H72H70H71H72HSP→棧底10020SP→SP→
A
B10020SP→SP→SP→
B
A20100棧底2010032(5)數據交換指令
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單元中有一個數X,內部RAM的20H單元中有一個數Y,試編出可以使它們相互交換的程序。33MOVR1,#20H;R1←20HMOVXA,@R1;A←XXCHA,@R1;A←Y,20H←XMOVX@R1,A;20H(片外RAM)←Y
例:已知50H中有一個0~9之間的數,試編程將其變?yōu)橄鄳腁SCII碼。(1)采用半字節(jié)交換指令MOVR0,#50HMOVA,#30HXCHDA,@R0MOV@R0,A(2)采用加法指令MOVA,#30HADDA,50HMOV50H,A343.3數據傳送指令在80C51單片機中,數據傳送是最基本和最主要操作。數據傳送操作可以在片內RAM和SFR內進行,也可以在累加器A和片外存儲器之間進行。一般不會影響標志位的狀態(tài)。數據傳送指令共有28條,分為內部數據傳送指令、外部數據傳送指令、堆棧操作指令和數據交換指令四類。351、內部數據傳送指令(15條)特點:操作數均位于單片機內部,其格式為:
MOV目的操作數,源操作數
(1)以累加器A為目的操作數
MOVA,directMOVA,#dataMOVA,RnMOVA,@Ri36(2)以寄存器Rn為目的操作數
MOVRn,directMOVRn,#dataMOVRn,A(3)以直接地址為目的操作數
MOVdirect1,direct2MOVdirect,#dataMOVdirect,AMOVdirect,RnMOVdirect,@Ri37(4)以間接地址為目的操作數
MOV@Ri,directMOV@Ri,#dataMOV@Ri,A累加器Adirect直接尋址@Ri間址Rndata382、外部數據傳送指令(7條)(1)16位數據傳送指令
MOVDPTR,#data16(2)訪問外部ROM的傳送指令
MOVCA,@A+DPTRMOVCA,@A+PC
例:已知累加器A中有一個0~9之間的整數,試用查表指令編寫查找出該數平方值的程序。解:確定平方表,并設其首地址為2000H,如圖所示。392000H2001H2002H2003H2004H2005H2006H2007H2008H2009H0149162536496481(1)采用DPTR作為基址寄存器MOVDPTR,#2000HMOVCA,@A+DPTR(2)采用PC作為基址寄存器
ORG1FFBH1FFBH24dataADDA,#data1FFDH83HMOVCA,@A+PC1FFEH80FEHSJMP$PC當前值+data=平房表首址取數地址=基地址+偏移量
=表首址+索引值40(3)訪問外部RAM的傳送指令
MOVXA,@RiMOVX@Ri,AMOVXA,@DPTR
MOVX@DPTR,A
例:已知外部RAM的88H單元中有一數X,試編寫程序將X送到外部RAM的1818H單元中。解:ORG2000HMOVR0,#88HMOVDPTR,#1818HMOVXA,@R0MOVX@DPTR,ASJMP$END413、堆棧操作指令
PUSHdirect;SP←SP+1,SP←
(direct)POPdirect;(direct)←SP,SP←SP-1
特點:(1)操作數的尋址方式必須是直接尋址(2)Rn和A不能直接在指令中:A用ACC代替;Rn用其物理地址。(3)均為雙字節(jié)指令,操作碼和操作數分別占用一個字節(jié)。42例:讀程序段,分析其功能
MOVSP,#70HMOVA,#100MOVB,#20PUSHACCPUSHBPOPACCPOPB43片內RAM片內RAM70H71H72H70H71H72HSP→棧底10020SP→SP→
A
B10020SP→SP→SP→
B
A20100棧底20100444、數據交換指令
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單元中有一個數X,內部RAM的20H單元中有一個數Y,試編出可以使它們相互交換的程序。45MOVR1,#20H;R1←20HMOVXA,@R1;A←XXCHA,@R1;A←Y,20H←XMOVX@R1,A;20H(片外RAM)←Y
例:已知50H中有一個0~9之間的數,試編程將其變?yōu)橄鄳腁SCII碼。(1)采用半字節(jié)交換指令MOVR0,#50HMOVA,#30HXCHDA,@R0MOV@R0,A(2)采用加法指令MOVA,#30HADDA,50HMOV50H,A467.3算術運算指令算術運算指令有24條,大多數指令都要用累加器A來存放一個操作數,另一個操作數可以存放在任何一個工作寄存器Rn或片內RAM單元中,也可以是指令碼中的一個立即數。在執(zhí)行指令時,CPU總是根據指令碼中的源操作數地址找到源操作數和累加器A中操作數進行相應操作,并把操作結果保留在累加器A中。因此,累加器A既可以看作是一個源操作數寄存器,也可以認作目的操作數寄存器。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中各標志位的變化狀況。
MOVA,#19H;A←19HADDA,#66H;A←(A)+66H
例:試分析8051執(zhí)行如下指令后累加器A和PSW中各標志位的變化狀態(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é)加法運算50③加1指令(5條)INCA;A←(A)+1INCRn;Rn←(Rn)+1INCdirect;direct←(direct)+1INC@Ri;(Ri)←((Ri))+1INCDPTR;DPTR←DPTR+1例:已知M1和M2單元中存放有兩個16位無符號數X1和X2(低8位在前,高8位在后),試寫出X1+X2并把結果放在M1和M1+1單元(低8位在M1單元,高8位在M1+1單元)的程序。設兩數之和不會超過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中各標志位的狀態(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中各標志位狀態(tài)如何?①DECA②DECR7③DEC30H④DEC@R154解:①A=DEH,P=0②R7=18H,PSW不變③(30H)=FFH,PSW不變④40H=FEH,PSW不變例:編程求兩個16位數之差。(差也是16位)解:被減數存M1和M1+1單元;減數存M2和M2+1單元,且均是低8位在前,高8位在后。ORG0300HMOVRO,#M1MOVR1,#M2CLRCMOVA,@R0SUBBA,@R1MOV@R0,ADECR0DECR1MOVA,@R0SUBBA,@R1MOV@R0,ASJMP$END55④十進制調整指令
DAA;若AC=1或A3~0>9,則A←(A)+06H
;若Cy=1或A7~4>9,則A←(A)+60HBCD加法ALU只能進行二進制加法運算(低4位向高4位是逢16進1),為實現BCD加法就要對加法結果進行調整,使其變成BCD數(逢10進1)。BCD減法BCD減法可采用以下方法:求減數補碼;被減數+減數補碼;對所得兩數之和進行BCD調整。56例:試寫出能完成85+59的BCD加法程序,并對其工作過程進行分析。解:ORG1000HMOVA,#85HADDA,#59HDAASJMP$END57例:寫出91-34=57的BCD減法程序。解:ORG1000HCLRCMOVA,#9AHSUBBA,#34HADDA,#91HDAASJMP$END58乘法和除法指令
MULABDIVAB例:已知兩個8位無符號數分別存放在30H和31H單元中,試編寫兩數相乘且將積的低8位存入32H單元、高8位存入33H單元的程序。解:59ORG0100HMOVR0,#30H;R0←第一個乘數地址MOVA,@R0;A←第一個乘數INCR0;修改乘數地址MOVB,@R0;B←第一個乘數MULAB;A×B=BAINCR0;修改目標單元地址MOV@R0,A;積的低8位→32HINCR0;修改目標單元地址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用途:可從一個字節(jié)中取出某些位。7.4邏輯運算指令61例:已知數59H存于片內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用途:將一個字節(jié)中某些位置1。例:設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用途:將一個字節(jié)中某幾位取反。例:已知外部RAM30H單元中有一數ABH,試編出使其高4位不變、低4位取反的程序。65解:ORG0100HMOVR0,#30H;地址30H送入R0MOVXA,@R0;A←ABHXRLA,#0FH;A←ABH⊕0FH=A4HMOVX@R0,A;結果送回30H單元SJMP$END667.4.4累加器清零和取反指令
80C51單片機中,累加器清零和取反指令各有1條,均是單字節(jié)單周期指令。雖然采用數據傳送或邏輯異或指令也同樣可以使累加器A清零或取反,但它們至少需要兩個字節(jié)。
CLRA;A←0CPLA;A←ā
取反指令常用于求取某個存儲單元或存儲區(qū)域中的帶符號數的補碼。67例:若(30H)=X,且X為負數的原碼,求其補碼。解:ORG1000HMOVA,30H;A←|X|CPLA;A中內容取反INCA;取反后的內容加1MOV30H,A;結果送回SJMP$END687.4.5循環(huán)移位指令(5條)A7←───A0RLARRAA7───→A0RLCARRCAA7←──A0CyA7──→A0CySWAPAA7~4A3~069用途:對某數擴大/縮小一倍;代碼轉換。例:已知A=35H,Cy=1,試問執(zhí)行如下指令后的A中的內容為多少?①RRA②RLA③RRCA④RLCA⑤SWAPA00110101A70例:已知M1和M1+1單元中有一個16位的二進制數(M1中為低位),請編程將該數擴大為原來的二倍(設擴大后的結果小于65536)。M1+1M1ORG1000HCLRCMOVR1,#M1MOVA,@R1RLCAMOV@R1,AINCR1MOVA,@R1RLCAMOV@R1,ASJMP$END解:71例:編程完成如下代碼轉換。0000BCD10000BCD2M1M1+1BCD2BCD1M1ORG0200HMOVR0,#M1+1MOVA,@R0SWAPADECR0ORLA,@R0MOV@R0,ASJMP$END72長轉移指令LJMPaddr16;PC←addr16尋址范圍:64KB7.5控制轉移指令02Haddr15~addr8addr7~addr0操作碼高8位地址低8位地址7.5.1無條件轉移指令(4條)73ORG0000HLJMPUSER……ORG1000HUSER:MOVA,#05H……END74短轉移指令AJMPaddr11;PC←PC+2,PC10~PC0←addr11a10a9a800001a7a6a5a4a3a2a1a0操作碼75ORG0800H
AJMPLOOP……ORG0FF0HLOOP:MOVA,#08H……ENDAJMPaddr11ROMPCPC+1PC+2-102410232KB76相對轉移SJMPrel;PC←PC+2,PC←PC+rel轉移范圍:80Hrel操作碼地址偏移量SJMPaddr11ROMPCPC+1PC+2-128127256間接轉移JMP@A+DPTR;PC←(A)+(DPTR)MOVDPTR,#TAB;TAB代表的地址送入DPTRJMP@A+DPTR;跳轉TAB:AJMPROUT0;跳轉ROUT0開始的程序段
。。。ROUT0:。。。78累加器A判零轉移指令(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條件轉移指令79比較條件轉移指令(4條)CJNEA,#data,rel;若A=data,則PC←PC+3;若A≠data,則PC←PC+3+rel;形成Cy標志位CJNEA,direct,rel;若A=(direct),則PC←PC+3;若A≠(direct),則PC←PC+3+rel
;形成Cy標志位CJNERn,#data,rel;若Rn=data,則PC←PC+3;若Rn≠data,則PC←PC+3+rel;形成Cy標志位80CJNE@Ri,#data,rel;若(Ri)=data,則PC←PC+3;若(Ri)≠data,則PC←PC+3+rel;形成Cy標志位說明:Cy的形成原則為:若A-B≥0,則Cy=0
若A-B<
0,則Cy=181減1條件轉移指令(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)是否結束82子程序:功能完整、通用性好,可多次調用,使用子程序調用可縮短程序開發(fā)周期、縮短用戶程序長度。調用指令的作用:斷點地址(PC中內容)壓入堆棧中,然后轉入子程序的第一行指令開始執(zhí)行。返回指令的作用:堆棧中的斷點地址送入PC。7.5.3子程序調用和返回指令83絕對調用指令(短調用指令)ACALLaddr11;PC←PC+2;SP←SP+1,(SP)←PC7~PC0;SP←SP+1,(SP)←PC15~PC8;PC10~0←addr11目標地址:PC15-11←(PC+2)15-11;PC10-0←addr11a10a9a81001a7a6a5a4a3a2a1a084長調用指令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,試計算執(zhí)行如下程序需要的時間。ORG1000HDELAY:MOVR2,#250DELAY1:MOVR3,#38NOPDELAY2:DJNZR3,DELAY2DJNZR2,DELAY1RET機器周期數11122287解:根據晶振頻率計算機器周期T:計算程序所用機器周期數:(38×2+4)×250+3=20003運行該程序需要的時間:20003×1μs=20.003ms88布爾操作指令,其操作對象:片內RAM低128個單元中的20H-2FH單元的16×8=128位;22個SFR中的11個,共83位。7.6.1位傳送指令(2條)MOVC,bit;Cy←(bit)MOVbit,C;bit←Cy7.6位操作指令897.6.2位復位/置位指令(4條)CLRC;Cy←0CLRbit;bit←0SETBC;Cy←1SETBbit;bit←1例:編程實現如下16位數左環(huán)移一次。A15←A8A7←A0907.6.3位運算指令(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位控制轉移指令(5條)以Cy中內容為條件的轉移指令(2條)JCrel;若Cy=0,則PC←PC+2
;若Cy=1,則PC←PC+2+relJNCrel;若Cy=0,則PC←PC+2+rel
;若Cy=1,則PC←PC+292以位地址中內容為條件的轉移指令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例:編程設計,若片內RAM30H單元內容大于0,40H單元置00;30H單元內容<于0,40H單元置FFH;30H單元內容等于0,40H單元置1;源程序為:
CJNE30H,#00H,LP1 MOV 40H,#01H SJMP LP2LP1: JC LP3 MOV 40H,#00H SJMP LP2LP3: MOV 40H,#0FFHLP2: SJMP $例:P3.2和P3.3上各接有一只按鍵,要求它們分別按下時(P3.2=0或P3.3=0),分別使P1口為0或FFH。源程序為:START: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 匯編語言程序設計模塊化設計(按功能分:顯示、鍵盤解讀、中斷、打印、輸入、發(fā)送等)2.盡量采用循環(huán)及子程序結構(節(jié)省內存)3.在使用內存時謹防內存資源沖突7.7.1 程序編制的方法和技巧匯編語言語句包含兩種基本類型:指令語句和偽指令語句指令語句:(已講解)指令語句在匯編時都產生一個指令代碼——機器代碼偽指令語句:(后面講解)是為匯編服務的。在匯編時沒有機器代碼與之對應。
地址 機器碼 源程序
無代碼對應
ORG 2000H 2000H7830 MAIN: MOVR0,#30H2002HE6 MOVA,@R0 …
7.7.2源程序的編輯和匯編偽指令ORG:起始偽指令Origin,指明程序和數據塊起始地址。指令地址機器碼 源程序
ORG 2000H 2000H7830 MAIN:MOVR0,#30H2002HE6 MOVA,@R0
… ORG3000H3000H23 DB23H,100,‘A’
3001H643002H41
END匯編結束偽指令。P94
例:START:…
…ENDEQU—賦值偽指令。為標號或標識符賦值Equate
X1 EQU2000H
X2 EQU0FH
MAIN: MOVDPTR,#X1
ADDA,#X2P95DB—定義字節(jié)偽指令。DefineByte8bit
例:DB12H,100,‘A’存儲:00010010,01100100,01000001DW—定義雙字節(jié)偽指令。DefineWord16bit
例:DW2030H,8CH,“AB”
存儲:001000000011000000000000100011000100000101000010
DS
定義存儲區(qū)偽指令DEFINESTORAGE
從指定地址開始保留指定數目的字節(jié)單元備用。
ORG810AHDS0AH;從8100H地址開始,保留10個連續(xù)的地址單元BIT
位定義偽指令把一個可位尋址的位單元賦值給所規(guī)定的字符名稱
ASBITP2.0;將P2.0的位地址賦給AS;
RSBIT39H;將位地址為39H的位定義為符號名1011.順序結構程序org1000hstart:movdptr,#2000hmova,20hmovca,@a+dptrmov21h,asjmp$org2000htable:db0,1,4,9,16,25end例:變量存在內部RAM的20H單元中,其取值范圍:0~5,編成,查表法求其平方值7.7.3基本程序結構程序一條條地按順序執(zhí)行指令,直到全部指令執(zhí)行完畢。102開始表格首地址送DPTR變量送A(20H)A查平方表(A+DPTR)A結束結果送21H單元:A21H103例2:將20H單元的壓縮BCD碼拆成兩個ACSII碼存入21H、22H單元。BCD012...9ASCII30H31H32H...39H(20H)
A10H
BA/B,A中為高4位BCD碼,B中為低4位BCD碼B+30H
BB
(21H)A+30H
AA
(22H)開始結束104周期數源程序ORG2000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV21H,BORLA,#30HMOV22H,AEND124221113;除以10H;高4位BCD碼轉換位ASCII碼;低4位BCD碼轉換位ASCII碼1052.分支程序分支程序可根據要求無條件或條件地改變程序執(zhí)行流向。編寫分支程序主要在于正確使用轉移指令。分支程序有:單分支結構、雙分支結構、多分支結構(散轉)條件成立?下條指令程序段A單分支結構YN條件成立?程序段AYN程序段A雙分支結構106K=?程序段nn0程序段1多分支結構程序段01107例:設變量x以補碼形式存放在片內RAM30H單元中,變量y與x的關系是:編程根據x的值求y值并放回原單元。A=?y=x+5<0>0y=20Hy=x0取x即(30h)A開始存y即y20h結束108ORG1000HSTART:MOVA,30HJZNEXT;x=0,轉移ANLA,#80H;保留符號位JZED;x>0,轉移MOVA,#05H;x<0,不轉移ADDA,30HMOV30H,ASJMPEDNEXT:MOV30H,#20HED:SJMP$109START:MOVDPTR,#TAB;置分支入口地址表首址
MOVA,R7;分支轉移序號送AADDA,R7;分支轉移序號乘以2
MOVR3,A;暫存于R3MOVCA,@A+DPTR;取高位地址
XCHA,R3INCAMOVCA,@A+DPTR;取低位地址
MOVDPL,A;處理程序入口地址低8位送DPLMOVDPH,R3;處理程序入口地址高8位送DPHCLRAJMP@A+DPTRTAB:DWPP0DWPP1………DWPPN例:根據R7的內容,轉至對應的分支程序。設R7的內容為0~N,對應的處理程序地址分別為PP0~PPNPP0高位PP0低位TABPP1高位PP1低位TAB+21103.循環(huán)程序循環(huán)程序一般由:初始化部分循環(huán)體部分--處理部分、修改部分、控制部分結束部分其結構一般有兩種:
先進入處理部分,再控制循環(huán)至少執(zhí)行一次循環(huán)體先控制循環(huán),再進入處理部分循環(huán)體是否執(zhí)行,取決于判斷結果。111開始設置循環(huán)初值循環(huán)處理循環(huán)修改結束處理結束循環(huán)結束?開始設置循環(huán)初值循環(huán)處理循環(huán)修改結束處理結束循環(huán)結束?NYYN112循環(huán)控制的一般方法:循環(huán)次數已知利用循環(huán)次數控制循環(huán)次數未知利用關鍵字控制113例:50ms延時子程序。設晶振頻率為12MHz,則機器周期為1us。DEL:MOVR7,#200;1μsDEL1:MOVR6,#123;1μsNOP;1μsDJNZR6,$;2μsDJNZR7,DEL1;2μsRET;2μs延時時間:t=1+200[(1+1+2*123)+2]+2≈50000us=50ms例:統(tǒng)計字串長度。內存從STRING開始有一字串,該字串以$(ASCII碼為24H)結束,試統(tǒng)計該字串長度,結果存于NUM單元中源程序如下:
ORG 0800HNUM DATA 20HSTRINGDATA21HSTART:CLRA MOVR0,#STRINGLOOP:CJNE @R0,#24H,NEXT SJMPCOMPNEXT:INC A INCR0 SJMP LOOPCOMP:MOVNUM,A SJMP $1151.現場保護與恢復在主程序中實現
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化工廠保衛(wèi)培訓課件內容
- 2025~2026學年濟南市天橋區(qū)七年級第一學期地理期末考試試題以及答案
- 2025-2026學年河北省五個一名校聯盟高三(上)期末數學試卷(含答案)
- 鋼結構涂裝技術方法詳解
- 特異體質學生管理制度
- 2026山東事業(yè)單位統(tǒng)考威海市榮成市招聘初級綜合類崗位84人備考考試試題及答案解析
- 市場營銷管理制度
- 2026浙江杭州??荡鎯萍加邢薰菊衅缚荚噮⒖荚囶}及答案解析
- 2026云南中鋁數為(成都)科技有限責任公司社會招聘8人參考考試題庫及答案解析
- 小區(qū)私人財產管理制度內容(3篇)
- 2023-2024學年八年級(上)期末數學試卷
- DB33T 1238-2021 智慧燈桿技術標準
- 福建省泉州市晉江市2023-2024學年八年級上學期期末考試數學試卷(含解析)
- 【讀后續(xù)寫】2021年11月稽陽聯考讀后續(xù)寫講評:Saving the Daisies 名師課件-陳星可
- 農貿市場突發(fā)事件應急預案
- 項目論證制度
- 股東合作協(xié)議模板
- Y -S-T 732-2023 一般工業(yè)用鋁及鋁合金擠壓型材截面圖冊 (正式版)
- GB/T 43829-2024農村糞污集中處理設施建設與管理規(guī)范
- 萬科物業(yè)服務指南房屋和設施維修管理
- 高一英語完型填空10篇實戰(zhàn)訓練及答案
評論
0/150
提交評論