




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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的低功耗的特点。故在单片机应用系统中应尽量采用CHMOS工艺芯片。根据功能分:基本型;增强型根据配置分:掩模ROM,EPROM和ROMLess(无片内程序存储器)。7.180C51的寻址方式27.180C51的寻址方式寻址方式:寻找操作数的方法。80C51共有七种寻址方式:寄存器寻址直接寻址立即寻址寄存器间址变址寻址相对寻址位寻址37.1.1寄存器寻址特点:操作数位于某个寄存器单元,寄存器寻址的寻址范围:
32个通用寄存器(4个工作寄存器组,地址范围为00H~1FH。当前工作寄存器组由PSW中RS1、RS0位的状态而确定。)
部分特殊功能寄存器SFR,如累加器A,通用寄存器B、数据指针DPTR等。
4MOVA,R0;(R0)→AMOVP1,A;(A)→P1口
ADDA,R0;(A)+(R0)→A57.1.2直接寻址指令码中给出的是操作数地址,常以direct表示。80C51系列单片机可直接寻址的地址空间主要有:片内RAM的低128个字节
SFR3AH片内RAM累加器AMOVA,3AH88H88H6注:指令助记符中的direct是操作数所在存储单元的物理地址,由两位十六进制数码表示。当直接寻址为SFR时,即可用物理地址表示,也可用其符号表示。指令系统中,累计器A、ACC和E0H等三种表示方式,分属于两种不同的寻址方法,但指令的执行效果相同。在指令系统中,字节地址和位地址是有区别的。前者用direct表示,后者用bit表示。77.1.3立即寻址特点:CPU所需寻址的操作数直接包含在指令字节中,常以#对该操作数加以标识。该操作数也称为立即数,可以是二进制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)指令执行时,单片机先将基地址和地址偏移量相加以形成操作数地址,然后获得操作数。
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)双字节转移类指令(6条)(2)三字节转移类指令(7条)基地址,与该条转移类指令相邻的下一条指令的起始地址8位带符号数,-128~127142000H8054HSJMPrel;PC←PC+2+relA...80H54H......2056H程序存储器0000HALU2000H2002H2001H......54HPCPCPC157.1.7位寻址
80C51系列单片机具有位处理功能,可对特定数据位进行操作,其位寻址的空间有:片内RAM的位寻址区,其字节地址为20H~2FH,共16*8=128位,其位地址为00H~7FH;某些SFR,其特征是物理地址能被8整除,离散的分布在80H~FFH内。位地址的表示方法:直接使用物理位地址MOVC,7FH字节地址加位MOVC,2FH.7可位寻址的SFR允许直接采用寄存器名加位数的表示方法MOVC,ACC.7经伪指令定义过的字符名称
A1BIT00HMOVC,A1寻址方式源操作数寻址空间指令立即数寻址程序存储器ROMMOVA,#20H直接寻址片内RAM128字节低特殊功能寄存器SFRMOVA,20H寄存器寻址工作寄存器R0~R7,A、B、C、DPTRMOVA,R0寄存器间接寻址片内RAM低128字节[@R0,@R1,SP]片外RAM[@R0,@R1]MOVA,@R0MOVXA,@DPTR变址寻址程序存储器ROM[@A+PC,@A+DPTR]MOVCA,@A+DPTR相对寻址程序存储器SJMP55H位寻址片内RAM的20H~2FH字节地址部分特殊功能寄存器CLRCSETB01H177.1.8指令的分类80C51单片机的指令,按功能可以分为5类:数据传送指令、算术运算指令、逻辑操作和环移指令、控制转移指令和位操作指令等。(1)数据传送指令(28条)功能:主要用于单片机片内RAM和SFR之间传送数据,也可以用于单片机片内和片外存储单元之间传送数据。特点:把源地址中操作数传送到目的地址(或目的寄存器),该类指令执行后,源地址中的操作数不会发生改变。18(2)算术运算指令(24条)功能:用于对两个操作数进行加、减、乘、除等算术运算。在两个操作数中,一个应放在累加器A中,另一个可以在某个寄存器或片内RAM单元中,也可以存放在指令码的第二和第三字节中。(3)逻辑操作和环移指令逻辑操作指令用于对两个操作数进行逻辑乘、逻辑加、逻辑取反和异或等操作,大多数指令也需要把两个操作数中的一个预先放入累加器A,操作结果也在累加器A中。环移指令用于对累加器A中的数进行环移。环移指令有左环移和右环移之分,也有带Cy和不带Cy之分。19(4)控制转移指令(17条)
分为条件转移、无条件转移、调用和返回等指令。特点是可改变程序执行的流向,或者是使CPU转移到另一处执行,或者是继续顺序地执行。(5)位操作指令(17条)
共分为位传送、位置位、位运算和位控制转移指令等四类。位传送、位置位和位运算指令的操作数不是以字节为单位进行操作,而是以字节中的某位为单位进行操作,位控制转移指令不是以检测某个字节为条件而转移,而是检测字节中的某一位的状态来转移。207.1.9指令系统综述指令的集合或全体称为指令系统,是CPU的重要性能标志。不同系列的单片机,其指令系统也不相同,但同一系列单片机,其指令系统大多兼容。
80C51的指令系统共包含有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和片外存储器之间进行。一般不会影响标志位的状态。数据传送指令共有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)均为双字节指令,操作码和操作数分别占用一个字节。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之间的数,试编程将其变为相应的ASCII码。(1)采用半字节交换指令MOVR0,#50HMOVA,#30HXCHDA,@R0MOV@R0,A(2)采用加法指令MOVA,#30HADDA,50HMOV50H,A343.3数据传送指令在80C51单片机中,数据传送是最基本和最主要操作。数据传送操作可以在片内RAM和SFR内进行,也可以在累加器A和片外存储器之间进行。一般不会影响标志位的状态。数据传送指令共有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)均为双字节指令,操作码和操作数分别占用一个字节。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之间的数,试编程将其变为相应的ASCII码。(1)采用半字节交换指令MOVR0,#50HMOVA,#30HXCHDA,@R0MOV@R0,A(2)采用加法指令MOVA,#30HADDA,50HMOV50H,A467.3算术运算指令算术运算指令有24条,大多数指令都要用累加器A来存放一个操作数,另一个操作数可以存放在任何一个工作寄存器Rn或片内RAM单元中,也可以是指令码中的一个立即数。在执行指令时,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执行如下指令后累加器A和PSW中各标志位的变化状况。
MOVA,#19H;A←19HADDA,#66H;A←(A)+66H
例:试分析8051执行如下指令后累加器A和PSW中各标志位的变化状态。
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执行如下指令后累加器A和Cy中的值是多少?①ADDCA,R0②ADDCA,31H③ADDCA,@R0④ADDCA,#85H多字节加法运算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执行如下程序后累加器A和PSW中各标志位的状态。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,试问执行如下指令后累加器A和PSW中各标志位状态如何?①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用途:可从一个字节中取出某些位。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用途:将一个字节中某些位置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用途:将一个字节中某几位取反。例:已知外部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条,均是单字节单周期指令。虽然采用数据传送或逻辑异或指令也同样可以使累加器A清零或取反,但它们至少需要两个字节。
CLRA;A←0CPLA;A←Ā
取反指令常用于求取某个存储单元或存储区域中的带符号数的补码。67例:若(30H)=X,且X为负数的原码,求其补码。解:ORG1000HMOVA,30H;A←|X|CPLA;A中内容取反INCA;取反后的内容加1MOV30H,A;结果送回SJMP$END687.4.5循环移位指令(5条)A7←───A0RLARRAA7───→A0RLCARRCAA7←──A0CyA7──→A0CySWAPAA7~4A3~069用途:对某数扩大/缩小一倍;代码转换。例:已知A=35H,Cy=1,试问执行如下指令后的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用途:判断循环是否结束82子程序:功能完整、通用性好,可多次调用,使用子程序调用可缩短程序开发周期、缩短用户程序长度。调用指令的作用:断点地址(PC中内容)压入堆栈中,然后转入子程序的第一行指令开始执行。返回指令的作用:堆栈中的断点地址送入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,试计算执行如下程序需要的时间。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位数左环移一次。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 汇编语言程序设计模块化设计(按功能分:显示、键盘解读、中断、打印、输入、发送等)2.尽量采用循环及子程序结构(节省内存)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—定义字节伪指令。DefineByte8bit
例:DB12H,100,‘A’存储:00010010,01100100,01000001DW—定义双字节伪指令。DefineWord16bit
例:DW2030H,8CH,“AB”
存储:001000000011000000000000100011000100000101000010
DS
定义存储区伪指令DEFINESTORAGE
从指定地址开始保留指定数目的字节单元备用。
ORG810AHDS0AH;从8100H地址开始,保留10个连续的地址单元BIT
位定义伪指令把一个可位寻址的位单元赋值给所规定的字符名称
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基本程序结构程序一条条地按顺序执行指令,直到全部指令执行完毕。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.分支程序分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)条件成立?下条指令程序段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.循环程序循环程序一般由:初始化部分循环体部分--处理部分、修改部分、控制部分结束部分其结构一般有两种:
先进入处理部分,再控制循环至少执行一次循环体先控制循环,再进入处理部分循环体是否执行,取决于判断结果。111开始设置循环初值循环处理循环修改结束处理结束循环结束?开始设置循环初值循环处理循环修改结束处理结束循环结束?NYYN112循环控制的一般方法:循环次数已知利用循环次数控制循环次数未知利用关键字控制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例:统计字串长度。内存从STRING开始有一字串,该字串以$(ASCII码为24H)结束,试统计该字串长度,结果存于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. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论