【教学课件】第三章单片机指令系统.ppt

上传人:牧羊曲112 文档编号:5660721 上传时间:2023-08-07 格式:PPT 页数:114 大小:888KB
返回 下载 相关 举报
【教学课件】第三章单片机指令系统.ppt_第1页
第1页 / 共114页
【教学课件】第三章单片机指令系统.ppt_第2页
第2页 / 共114页
【教学课件】第三章单片机指令系统.ppt_第3页
第3页 / 共114页
【教学课件】第三章单片机指令系统.ppt_第4页
第4页 / 共114页
【教学课件】第三章单片机指令系统.ppt_第5页
第5页 / 共114页
点击查看更多>>
资源描述

《【教学课件】第三章单片机指令系统.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第三章单片机指令系统.ppt(114页珍藏版)》请在三一办公上搜索。

1、第三章 单片机指令系统,3.1 指令系统简介,3.2 寻址方式,3.3 数据传送指令,3.5 逻辑运算类指令,3.6 控制转移指令,3.4 算术运算类指令,3.7 位操作指令,3.1 指令系统的简介,MCS-51共有111条指令,指令的长度和执行时间因不同的指令而各不相同。3.1.1 指令格式 指令的三种表示形式 3.1.3 指令的字节数 指令的分类,继续,3.1.1 指令格式,指令格式:既指令的结构形式。,操作码,操作数或操作数地址,举例:MOV A,#0FFH ADD A,R0,(1)二进制的表示形式:(以“累加器的内容+08H”为例)00100100B 操作码 OP(加法)0000100

2、0B 操作数DATA(08H),3.1.2 指令的三种表示形式,(2)十六进制表示方式:它是对二进制形式的一种简化。00100100B 24H 00001000B 08H,(3)指令的“助记符”方式(“汇编格式”):00100100B 24H 00001000B 08H ADD A,#08H 1)是一种由英文单词或字母、数字来表征 指令功能形式。2)“汇编”格式的指令必须把它“翻译”为二 进制形式“机器码”后才能为CPU所识别。3)三种不同的表示方法适用于不同的场合。,二进制表示形式 十六进制表示 汇编格式,3.1.3 指令的字节数,分为单字节、双字节和三字节。一、单字节指令(49条):无操作

3、数:如 INC DPTR;10100011B INC A;00000100B【特点】:操作数隐含在操作码中。含有操作数寄存器名称的单字节指令:如:MOV A,R0 11101000B MOV A,R1 11101001B【特点】:寄存器名以三位数代码的形式在指 令的后三位。,二、双字节指令(46条):指令的操作码和操作数各占一个字节。如:MOV A,#data;01110100B data,n+1,MOV A,#data,双字节指令在程序存储器的存放示意图,三、三字节指令(16条)(1)指令中的操作数为双字节。如:MOV DPTR,#data16;(2)指令中分别包含1个字节的操作数和1个字节

4、的操 作数地址。如:MOV direct,#data 举例:MOV 20H,#0FFH,MOV direct,#data,MOV DPTR,#data16,三字节指令在存储器中存放的方式示意图,指令的字节数与指令的运行时间,指令的字节多是否意味着指令周期就长?,从表中可见,指令的字节数与指令周期不是对等的关系,3.1.4 指令的分类,(1)数据传送类指令:完成数据在单片机内部之间的传送。分为8位数和16位两种。(2)算术运算指令:用于操作数之间的加、减、乘除运算。【特点】:多数情况下:操作数之一在累加器A中,结果也保留在A中,运算结果要影响PSW(进位标志、奇偶和溢出标志等)。(3)逻辑操作和

5、循环移位指令:操作数之间的逻辑加、逻辑与、取反和异或等操作。多数情况下一个操作数在A中,结果也存于A。,(4)控制转移类指令:条件转移、无条件转移,调用和返回。【特点】:通过修改程序指针PC的内容,使CPU转到另一处执行,从而改变程序的流向。(5)位操作指令:位传送、位置位、位运算和位控制转移等操作。【特点】:按位操作而不是按字节的操作。位控转移的判断不是检测某一个字节而是对某一个位进行检测并决定是否进行程序转移。,3.2 寻址方式,在指令的操作数位置上,用于表征、寻找操作数的方式定义为“寻址方式”。在MCS-51单片机中,共使用了七种寻址方式。分别是:(1)寄存器寻址(5)变址寻址;(2)直

6、接寻址(6)相对寻址;(3)立即数寻址(7)位寻址。(4)寄存器间接寻址,继续,3.2.1 立即寻址,指令本身直接含有所需要的8位或16位的操作数。将此数称为“立即数”(使用#标明)。如:MOV A,#5FH;将(8位)立即数送累加器A MOV DPTR,#2000H;16位立即数送DPTR寄存器,3.2.2 直接寻址,指令直接给出了操作数的地址。如:MOV A,3AH;将RAM3AH单元内容送累加器 直接寻址的指令长度是两个或三个字节。,直接寻址示意图,使用直接寻址应注意的三个问题:,(1)指令助记符中direct是用16进制数表示的操作数地址。当地址在SFR区域时,指令用寄存器名表示。如:

7、MOV A,80H 可以写成 MOV A,P0 MOV A,SBUF;串口数据缓冲器数据送A MOV IE,#00H;初始化中断允许寄存器 MOV TH1,#0FEH;为定时器1赋初值,(2)当直接地址在工作寄存器区中时,可使用两种寻址方式来访问。如:MOV A,00H;MOV A,R0;类似的还有累加器A:INC A;寄存器寻址方式(单字节);INC ACC;直接寻址方式(双字节);INC 0E0H;直接寻址方式(双字节)。,片内 RAM(20H-2FH)中的位寻址区结构图,位地址,3.2.3 寄存器寻址,当所需要的操作数在内部某一个寄存器Rn中时,将此寄存器名Rn直接写在指令的操作数的位置

8、上。如:MOV A,R0 MOV 20H,R0 INC R1 ADD A,R3 注意:寄存器寻址方式的指令大多是单字节指令。指令本身并不带有操数,而是含有存放操作数的寄存器的3位代码。以MOV A,Rn为例,使用R7寄存器,所以rrr=111,既指令的机器码为:0EFH,1 1 1 0 1 r r r,返回,(3)在指令系统中:字节地址与位地址是完全 不同的概念。如:MOV A,20H;将RAM的20H单元内容送A MOV C,20H;将位寻址区中的位地址为 20H位内容送PSW 的Cy中。,3.2.4 寄存器间接寻址,指令中含有保存操作数地址的寄存器Ri。MOV A,Ri(i=0、1)如:M

9、OV R0,#3AH;立即数送R0寄存器 MOV A,R0;从RAM的H单元取数送累加器A,3AH,R0,00H,累加器A,1,2,3,使用寄存器间址指令时应注意问题,(1)间址寄存器Ri只能使用R0、R1(i=0、1)。(2)间址方式适用于片内和片外 RAM。对于片内RAM使用Ri,寻址范围为00HFFH。对于片外RAM,可以使用Ri,也可以使用DPTR 做间址寄存器。两者区别在于后者寻址范围为 0000HFFFFH,两者都可以RAM和ROM。(3)间址方式的指令不能访问SFR中的单元。MOV R1,#80H(错误)MOV A,R1(因为80H为SFR的物理地址),MCS-51 片内、片外

10、数据存储器示意图,特殊功能寄存器SFR,通用数据存储器,80H7FH,00H,FFH,片内数据存储器 片外数据存储器256B个字节 64KB个字节,片外数据存储器64KB,0000H,FFFFH,注意:1,访问片内RAM20H存储单元;MOV A,20H2,访问片外RAM存储单元;MOV R0,#20H MOVX A,R03,尽管片内与片外的RAM单元 的00H-FFH地址相重叠,但由于指令的不同不会发生地址混乱。,3.2.5 变址寻址,指令使用DPTR或PC中的内容作为基地址,再与累加器A的内容相加,和作为操作数地址。如:MOVX A,A+PC;PC内容与A的内容相加得操作数地址并将此操作数

11、送A MOVX A,A+DPTR;DPTR内容与A的内容相加得操作数地址并将此操作数送A,变址指令适用于对ROM存储器得访问,查表。【举例】:已知ROM中0302H 单元有一个数x,现要把它送到累加器A中,试编程。MOV DPTR,#0300H;立即数送DPTR MOV A,#02H;立即数送累加器A MOVC A,A+DPTR;从ROM的0302单元取数送A,变址寻址示意图,02H,0300H,ALU,0302H,累加器A,DPTR,0300H+02H0302H,MOVC A,A+DPTR,3.2.6 相对寻址,相对转移指令在执行中是将PC值与指令中的8位偏移量进行相加,形成指令要转移的目标

12、地址。SJMP rel由指令中有一个8位偏移量 rel 为带符号位的补码,所以控制程序转移的范围为+127-128。,例如:SJMP 54H;(80H、54H),54H,2002H,ALU,累加器A,PC,2002H+54H2056H,相对寻址使用中应注意的问题,1,CPU进行地址计算时,PC取值是执行本指令后的地址值。以上面的例子说明:指令本身的首地址是2000H,执行完后变为2002H(既下一条指令的首地址)。如果使用三字节的相对转移指令,则PC=PC+3。,2,偏移量的计算:rel=目标地址-源地址-2(2字节指令)结果用补码的形式书写。为了减少计算偏移量的计算,汇编程序允许使用“符号地

13、址”的方式代替偏移量。如:SJMP loop1 3,如果转移地址的范围超过相对寻址的范围(如:-127+128)时,就要采用别的方式法,否则在编译时,提示出错。,3.2.7 位寻址,在位寻址指令(位操作指令)中使用的位地址。单片机在控制、检测的应用中,系统的输入、输出数据有很多属于开关量信号。这些开关量信号以 bit-“位”的形式进行各种运算、处理和存储的。,【举例】:SETB 20H;将位地址为20H的位置1 SETB 90H;将P1口的d0位置1 第二例中,完全可以使用下面的指令格式:SETB P1.0;将P1口的d0位置1 类似还有:MOV C,ACC.7;将累加器中的d7位送PSW的c

14、y,3.3 数据传送指令,3.3.0 传送指令的特点3.3.1 内部数据传送类指令3.3.2 外部数据传送类指令3.3.3 堆栈操作指令3.3.4 数据交换指令,功能是将数据在累加器、片内的RAM、SFR及片外ROM、RAM之间进行传送。必须指定被传送数据的源地址和目标地址。在传送过程中,源地址的内容不被改变。传送类指令除了以累加器A为目标的传送对PSW的P有影响外,其余的传送类指令对PWS一概无影响。,【举例】:MOV A,R0;将R0寄存器中的数据送 累加器A中(注意寻址方式),指令通式:MOV,3.3.0 传送指令的特点,3.3.1 内部数据传送类指令,(1)以累加器为目的操作数的指令,

15、(2)以寄存器Rn为目的操作数的指令,(3)以寄存器间接地址为目的字节传送指令,(4)以直接地址为目的操作数的指令,(5)16位数据传送指令,(1)以累加器为目的操作数的指令(4条),MOV A,Rn;RnA MOV A,direct;(direct)A MOV A,Ri;(Ri)A MOV A,#data;dataA,(2)以寄存器Rn为目的操作数的指令(3条),MOV Rn,AMOV Rn,directMOV Rn,#data,(3)以寄存器间接地址为目的字节传送指令(3条),MOV Ri,A;A(Ri)MOV Ri,direct;(direct)(Ri)MOV Ri,#data;data

16、(Ri)例:MOV R0,A MOV R1,20H MOV R0,#34H,(4)以直接地址为目的操作数的指令(5条),MOV direct,A MOV direct,Rn MOV direct1,direct2 MOV direct,Ri MOV direct,#data 这组指令功能是把源操作数指定的内容送入由直 接地址指出的片内存储单元。例:MOV 20H,A MOV 20H,R1 MOV 20H,30H MOV 20H,R1 MOV A0H,#34H MOV P2,#34H,(5)16位数据传送指令(1条),MOV DPTR,#data16,(6)查表指令(2条),MOVCA,A+DP

17、TR;A(A)+(DPTR)MOVCA,A+PC;A(A)+(PC),已知内存单元40H中有一个09范围内的数,用查表指令编出能查出该数立方值的程序。设立方表表头地址为0200H。程序及执行后的结果如下:MOV A,40H MOV DPTR,#LAB MOVC A,A+DPTR LAB:DB 0,1,8,27,64 若(40H)为2,查表得8并存于A中,(7)内部数据传送类指令的使用,在使用传送指令时,可以根据实际情况选用恰当寻址方式。但不能根据主观意愿去“创造”指令。例如:要将R0中数据传送到R1中。如何使用指令去完成上面操作?MOV R1,R0 是否可以?只能使用:1,MOV A,R0 或

18、:2,MOV 01H,00H MOV R1,A,MCS-51内部数据传送类指令方式图,累加器A,direct直接寻址,Ri间址,Rn寄存器,Data立即数,返回上一次,以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。要会正确地估计指令的字节。【举例】:MOV A,RI()个字节 MOV A,DIRECT()个字节 MOV DIRECT,DATA()个字节 MOV DIRECT2,DIRECT1()个字节,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子:

19、MOV A,30H;(30h)A MOV A,R0;R0 A MOV 40H,30H;(30h)40h MOV A,Ri;(Ri)A,(8)内部传送类指令举例,试编出把30h和40h单元内容进行交换。MOV A,30H;(30h)AMOV 30H,40H;(40h)30h MOV 40H,A;A 40h,累加器A,1,2,3,3.3.2 外部数据传送类指令,(1)16位数传送指令,(2)外部ROM的字节传送,(3)外部RAM的字节传送指令,(1)16位数传送指令,MCS-51指令系统唯一的16位数据传送指令。MOV DPTR,#data16 DPTR是单片机内部SFR中的两个寄存器DPH、DP

20、L组合而成。其中DPH为高八位,DPL为低八位。DPTR是一个专门用于访问外部存储器的间址寄存器。寻址能力为 64K(065535)。,(2)外部ROM的字节传送指令,MOVC A,A+DPTR;A(A+DPTR)MOVC A,A+PC;PC PC+1,A(A+PC)该指令也称为“查表”指令。在ROM中建立 一 个数据表,可以使用DPTR、PC作为数据 表格的基地址。,外部ROM的字节传送指令举例,已知累加器A中存有09范围内的数,试用查表指令编写出查找出该数平方的程序。(1)采用DPTR作基址寄存器:MOV DPTR,#2000H MOVC A,A+DPTR;平方值送A(2)采用PC作基址寄

21、存器:,2000H,2009h,2008h,2007h,2006h,2005h,2004h,2003h,2002h,2001H,ORG 1FFBH1FFBH 74 DATA ADD A,#DATA;(DATA=02H)?1FFDH 83H MOVC A,A+PC;(PC=1FFEH)?1FFEH 80FEH SJMP$2000H 00H DB 0;平方表首址2001H 01H DB 12002H 04H DB 42003H 09H DB 92004H 10H DB 162005H 19H DB 25:2009H 51H DB 81 ENDDATA为MOVC指令首地址与表头地址之间的单元数。,思

22、考:如果在查表指令的后面增加:NOPNOP此时,DATA的值如何?,(3)外部RAM的字节传送指令,MOVX A,Ri MOVX Ri,A MOVX A,DPTR MOVX DPTR,A,外部RAM的字节传送指令举例,已知外部RAM的2040H单元有一个数x,试编程将x送外部RAM的2560H单元。【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次 MOVX 指令完成此操作。ORG 2000H MOV DPTR,#2040H;为16位指针赋值 MOVX A,DPTR;取 x 到累加器A MOV DPTR,#2560H;为16位指针赋值 MOVX DPTR,A;x 送RAM2560h单

23、元 SJMP$;停机 END,3.3.3 数据交换指令,格式:XCH A,Rn;A Rn XCH A,direct;A(direct)XCH A,Ri;A(Ri)XCHD A,Ri;A30(Ri)30,数据交换指令举例(一),举例:已知片外RAM20H单元、内部RAM20H单元分别 有数X和Y,试编程互将两数相交换。MOV R1,#20H;指针赋初值 MOVX A,R1;XA XCH A,20H;交换 A(20H),YA MOVX R1,A;Y(20H)片外RAM,(y)x,20h,20h,累加器A,1,2,3,数据交换指令举例(二),已知:RAM的50H单元有一个09的数,试编程将它 变成相

24、 应的ASCII码。【解】:09的ASCII码是30H39H,两者相差30H。MOV R0,#50H;指针赋值 MOV A,#30H;30HA XCHD A,R0;A30(R0)30,MOV R0,A;A中的ASCII送回50H单元,00110101,00110101,思考:另一种方法实现本题,试编程实现?,1,2,(5)堆栈操作指令,堆栈:一个用来保存程序断点、数据的特殊的存储区域。在MCS-51单片机中,栈区是占用片内RAM的存储空间,具体栈位置由指针SP来确定。1.进栈操作:PUSH direct;(SP)+1SP,(direct)SP 2.出栈操作:POP direct;(SP)dir

25、ect,(SP)-1SP,【注意】:寻址方式为直接寻址或者寄存器寻址,但 PUSH A 是错误的,应当是PUSH ACC或PUSH 0E0H,同理:PUSH R0也错误。进栈是堆栈向上“生长”的过程,即SP+1;出栈则相反。系统上电时,(SP)=07H。SP的值可以根据需要进行修改,以适应具体编程的需要。在确定栈区位置时要考虑对数据区的影响,以避免数据区与栈区冲突。,堆栈操作指令举例(一),例1:BCD码转换为二进制的子程序BCDB中有关堆栈操作的例子。进栈操作是为了保护主程序中相关寄存器中的数据。ORG 0800HBCDB:PUSH PSWPUSH ACCPUSH B:POP BPOP AC

26、CPOP PSWRET,栈底,RAM,SP,栈顶,B,ACC,PSW,堆栈操作指令举例(二),例 2:设片内RAM的30H单元存有x,40H单元存有y。试将两个单元内容互换。PUSH 30H PUSH 40H POP 30H POP 40H,栈底,x,y,y x,x y,RAM,SP=07h,40H,30H,继续,3.4 算术运算,功能:完成算术运算三大功能。特点:大多指令都要由累加器A来存放一个源操作数,并把操作结果放回累加器A中。,3.4.1:算术运算指令,1,加法指令:带进位的加法指令(ADC)不带进位的加法指令(ADD)加1指令(INC)2,减法指令:带进位的减法指令(SUBB)减1指

27、令(DEC)3,十进制调整指令:(DA A)4,乘法和除法指令:(MUL DIV),1.加法指令(1)不带进位的加法指令,格式:ADD A,Rn;A+RnAADD A,direct;A+(direct)AADD A,Ri;A+(Ri)AADD A,#data;A+dataA【注意】:结果影响PSW。根据编程者的需要,8位数据可以是无符号数(0255),也可以是有符号数(-128+127)。不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为有符号数(补码)进行运算并影响PSW。,不带进位的加法指令举例(一),试分析执行下列指令后累加器A和PSW中各标志的变化。MOV A,#19H A

28、DD A,#66H 25 A=0 0 0 1 1 0 0 1+102 data=0 1 1 0 0 1 1 0 B 127 0 0 1 1 1 1 1 1 1 B Cy=0;AC=0;OV=CPCS=0;P=1,不带进位的加法指令举例(二),分析执行下列指令后累加器A和PSW各标志变化。MOV A,#5AH ADD A,#6BH 90 A=0 1 0 1 1 0 1 0 B+107 data=0 1 1 0 1 0 1 1 B 197 0 1 1 0 0 0 1 0 1 B CP CS AC*Cy=0;AC=0;OV=CPCS=1;P=0,(2)带进位的加法指令,格式:ADDC A,Rn;A+

29、Rn+CyA ADDC A,direct;A+(direct)+CyA ADDC A,Ri;A+(Ri)+CyA ADDC A,#data;A+data+CyA【注意】:这里的Cy是指令执行前的Cy;对PSW的影响同ADD指令。,(3)加1指令(增量指令),格式:INC A;累加器A加一INC Rn;Rn+1RnINC direct;内存单元数据加一INC Ri;内存单元数据加一INC DPTR;dptr+1dptr【注意】:(1),除了第一条对PSW的P有影响外,其余对PSW均无影响。(2),INC主要用于修改数据指针控制、循环语句中使用。,编程举例,已知M1、M2单元中存有两个16位无符号

30、数X1、X2(低位在前)。试写出X1+X2,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。【解】:MOV R0,#M1;x1指针赋初值 MOV R1,#M2;x2指针赋初值 MOV A,R0;取x1低8位送A ADD A,R1;x1与x2低8位相加 MOV R0,a;低8位和送m1单元 INC R0 INC R1;修改指针 MOV A,R0;取x1的高8位送A ADDC A,R1;x1与x2的高8位和Cy相加 MOV R0,A;结果送M1+1单元,(4)十进制调整指令,在CPU进行BCD码运算时,必须在运算后进行十进制调整,(CPU在加法运算时是按

31、二进制加法)。,举例:试写出完成85+59的BCD码的加法程序。MOV A,#85H ADD A,#59H 85 A=1 0 0 0 0 1 0 1B+59 dtat=0 1 0 1 1 0 0 1B 正确的结果为 144 1 1 0 1 1 1 1 0B 所得结果是(DEH),请比较两个结果?,为什么?,格式:DA A;若AC=1或A30 9,则A+06hA;若Cy=1或A74 9,则A+60hA【注意】:1,DA A 指令必须紧跟在加法指令之后;2,DA A 指令只适用于加法指令的调整。,十进制调整指令应用举例,举例:试写出完成85+59的BCD码的加法程序。MOV A,#85H ADD

32、A,#59H DA A 85 A=1 0 0 0 0 1 0 1B+59 data=0 1 0 1 1 0 0 1B 144 1 1 0 1 1 1 1 0B 低4位9,所以加06h+0 0 0 0 0 1 1 0B 1 1 1 0 0 1 0 0B 高4位9,所以加60h 0 1 1 0 0 0 0 0B 1 0 1 0 0 0 1 0 0B 结果为144h,3.4.2 减法指令(带进位的减法指令),格式:SUBB A,Rn;A Rn Cy A SUBB A,direct;A(direct)Cy A SUBB A,Ri;A(Ri)Cy A SUBB A,#data;A data Cy A,使

33、用减法指令要注意的几个问题,在单片机内部,减法指令实际上是采用补码的加法实现的。无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响PSW中相关的标志。在MCS-51的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLR C。,减法指令应用举例,分析执行下列指令后累加器A和PSW中各标志变化。CLR CMOV A,#52H;01010010B=82SUBB A,#0B4H;10110100B=-76 82 A=0 1 0 1 0 0 1 0-76 data=1 0 1 1 0 1 0 0 158 1 1 0 0 1 1 1 1 0 手工计算

34、 CP CS AC 1 0 1=-62H=-98【分析】:CPU的计算得-98,很明显答案是错误的。原因是OV=1,既产生了溢出。所以,对于符号数的减法在运算后要检测OV=1?,返回本节目录,减一指令,格式:DEC A;累加器A减1DEC Rn;Rn-1RnDEC direct;内存单元数据减1DEC Ri;内存单元数据减1【注意】:除了第一条对PSW的P有影响外,其余对PSW均无影响。主要用于修改数据指针在控制、循环语句中使用)。,3.5 逻辑运算指令,1,逻辑与运算指令(ANL)2,逻辑或运算指令(ORL)3,逻辑异或指令(XRL)4,累加器清零和取反指令(CLR&CPL),1.逻辑与运算

35、指令,可以分为两类:1,以累加器A为目标寄存器的逻辑运算指令;2,以内存单元为目标的逻辑运算指令。格式 ANL A,Rn;A R n A ANL A,direct;A(direct)A ANL A,Ri;A(Ri)A ANL A,#data;A data A ANL direct,A;(direct)A direct ANL direct,#data;(direct)data direct,应用举例,已知R0=30H和(30H)=0AAH,试问执行下列指令后累加器A和30H单元中内容是什么?1.MOV A,#0FFH 2.MOV A,#0F ANL A,R0 ANL A,30H(A)=30H,

36、(A)=0AH,(30H)=0AAH(30H)=0AAH 很明显:ANL操作可以从某个存储单元中取出某几位,而把其它的为屏蔽掉(清零)。,2.逻辑或运算指令,格式:ORL A,Rn;A R n A ORL A,direct;A(direct)A ORL A,Ri;A(R I)A ORL A,#data;A data A ORL direct,A;(direct)A direct ORL direct,#data;(direct)data direct,应用举例,设累加器A=0AAH,P1口=0FFH。试编程将累加器A中的第四位送P1口低四位,而P1口高四位不变。解:MOV R0,A;累加器A中

37、的数据暂存ANL A,#0FH;屏蔽A的高4位ANL P1,#0F0H;屏蔽P1口的低4位ORL P1,A;在P1口组装MOV A,R0;恢复累加器A的数据【小结】:与运算可以“屏蔽”某些位;或运算可以“置位”某些位。,3.逻辑异或运算指令,格式:XRL A,Rn;A R n A XRL A,direct;A(direct)A XRL A,Ri;A(R I)A XRL A,#data;A data A XRL direct,A;(direct)A direct XRL direct,#data;(direct)data direct特点:按位运算,相同时为0,不同时为1。使用异或可以实现将某个

38、字节的数据或将数据的某几位变反。,举 例,已知:外部RAM30H单元中有一个数AAH,现要将 其高4位不变,低4位取反,试编程。解:MOV DPTR,#0030H 1 0 1 0 1 0 1 0 MOVX A,DPTR 0 0 0 0 1 1 1 1 XRL A,#0FH 1 0 1 0 0 1 0 1 MOVX DPTR,A,4.累加器清零和取反指令,格式:CLR A;累加器清零CPL A;累加器取反 举例:已知30H单元中有数x,写出对它求补的程序。MOV A,30H CPL A INC A MOV 30H,A,逻辑运算指令应用举例,设X、Y和Z分别存在X、Y和Z单元。试编出能实现此电路功

39、能的程序,并将结果送入F单元。解:MOV A,X ANL A,Y;XYA MOV R1,A;送R1暂存 MOV A,Y XRL A,Z;YZA CPL A;A取反 ORL A,R1;(XY)MOV F,A;AF,(YZ)A,5 移位指令,格式:RL ARR ARLC ARRC A SWAP A,A3 A0,A7 A4,举例(一),已知:在M1和M1+1单元有一个16位数(M1存低8位),试编程将其扩大2倍(设结果小于65535)。解:扩大2倍可以用左移一位来实现。,11001111,0,1,10011110,0,01011001,程序清单,CLR C;清除Cy位MOV R1,#M1;指针赋值M

40、OV A,R1;取低8位数据RLC A;循环左移,Cy进低位,高位进CyMOV R1,A;移位后数据回送INC R1;指针加一MOV A,R1;取高8位数据RLC A;循环左移Cy进低位MOV R1,A;数据回送,举例(二),已知:M1、M2单元中有2个BCD码,试编程将其紧缩为一个字节并存入M1单元。解:MOV R1,#M1MOV A,R1SWAP AINC R1ORL A,R1MOV M1,A,M1M1+1,BCD1 0000,BCD1 BCD2,0000 BCD1,返回本章目录,累加器A,3.6 控制转移和位操作指令,3.6.1 控制转移指令 1,无条件转移指令 2,条件转移指令 3,子

41、程序调用和返回 4,空操作指令,位操作指令 1,位传送指令:2,位置位和位清零指令:3,位运算指令:4,位控制转移指令:,格式:AJMP addr11 绝对转移,寻址范围2K;LJMP addr16 长转移指令,寻址范围65535;SJMP rel 短转移,转移范围(+127-128);JMP A+DPTR 变址转移,寻址范围65535。,LJMP指令(三字节),AJMP指令(双字节),SJMP指令(双字节),JMP指令(单字节),3.6.1 无条件转移指令,绝对转移指令,双字节、双周期指令。将AJMP指令中的11位转移地址替换掉原来PC中16位地址中的低11位地址。指令中的11位地址,确定了

42、地址的转移范围在2K以内,所以AJMP也称“页内转移”指令。,A10 a9 a8 操作码 a7 a0,AJMP指令,PC程序计数器,MCS-15的ROM系统是以2K为一页来划分程序存储器,这样对于4K的片内ROM存储器可以分为2页;片外64K的ROM可以分为32页。在执行AJMP指令时,PC的高5位决定了ROM中的页地址;而AJMP 指令的低11位地址用来选择页内地址。在一般情况下,AJMP指令应当与目标地址在同一页内。更具体的说:目标地址应当与AJMP指令取出后的PC值(PC=PC+2)在同一页内。否则转移将会出现错误。,ROM的64K存储空间的页面(部分)划分表,ROM的64K存储空间的页

43、面示意图,原本AJMP指令要转到本页的 0100H 单元但是由于 PC 的高5位页面地址发生了变化使AJMP指令实际转到下一页 0900H单元。,为什么?,AJMP转一指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。如果目标地址与AJMP地址不再同一页内,建议使用LJMP指令替代AJMP。使用AJMP指令时,11位的绝对地址可以用符号地址取代,正确使用AJMP转移指令,长转移指令,用法:指令执行时,将指令码中的addr16送入PC中,使程序无

44、条件的转向addr16所指向地址执行程序。【举例】:已知某单片机的监控程序地址为A080H,试问用什么方法使单片机开机后自动的转向该监控程序?【解】:因为单片机上电时,PC=0000H,所以在0000H单元存放一条LJMP 0A080H 的指令即可。,ROM,变址转移指令,格式:JMP A+DPTR 单字节操作码为73H特点:转移地址由累加器A的内容与DPTR相加形成。用途:用来制作一个多分支的转移结构。【举例】:MOV DPTR,#TABLE;指针赋表头地址 RL A JMP A,A+DPTR;TABLE:AJMP ROUT0;多分支转移表AJMP ROUT1AJMP ROUT1AJMP R

45、OUT2:,,条件转移指令,(1)累加器A判零转移指令(双字节指令)JZ rel;若A=0,则PC=PC+2+rel;若A0,则PC=PC+2 JNZ rel;若A0,则PC=PC+2+rel;若A=0,则PC=PC+2,(2)比较条件转移指令(3字节)(A)=data时:PC+3PC,Cy=0CJNE A,#data,rel(A)data时:PC+3+rel,Cy=0CJNE Rn,#data,rel(A)Y时;若Cy=1 则XY。,(3)减一条件转移指令,1,DJNZ Rn,rel;Rn-1Rn,若Rn0则 PC+2+relPC 若Rn=0则PC+2PC2,DJNZ direct,rel;

46、(direct)-1direct,若(direct)0则 PC+3+relPC 若(direct)=0则PC+3PC注意:第一条指令为双字节,第二条指令为三字节。指令本身先做一个带回送的减一运算操作,根据运算的结果是否为零作为转移的条件,应用举例,令片内RAM中DATA为起始地址的数据块中连续10个无符号数相加,并把和送到SUN单元(设其和小于256)。ORG 1000HSTART:MOV R2,#0AH;数据块长度10送计数器R2MOV R0,#DATA;数据块起始地址送指针R0CLR A;累加器清零LOOP:ADD A,R0;累加部分和INC R0DJNZ R2,LOOP;若R2-10则转

47、LOOP继续MOV SUN,A;存累加和SJMP$;停机END,3,子程序调用和返回指令,(一)子程序调用指令:1,短调用指令 ACALL addr11 2,长调用指令 LCALL addr16(二)返回指令:,(一)调用指令,1,短调用指令 ACALL addr11 PC+2PC SP+1SP,PC70(SP)SP+1SP,PC158(SP)addr11 PC100 2,长调用指令 LCALL addr16 PC+3PC SP+1SP,PC70(SP)SP+1SP,PC158(SP)addr16 PC,(二)返回指令,格式:RET 操作:(SP)PC158,SP-1SP(SP)PC 70,S

48、P-1SP 格式:RETI 操作:(SP)PC158,SP-1SP(SP)PC 70,SP-1SP,4,空操作指令,格式:NOP功能:仅使程序计数器PC加一,消耗12个时钟周期,所以时常用作延时。,3.7 位操作指令,特点:操作数不是字节,而是某一位。每位的取值只能是“0”或“1”,因而也称之为布尔变量操作。布尔变量存在于片内RAM的位寻址区(20H2FH)、11个可以按位寻址的SFR。,,位传送指令,格式:MOV C,bit 其中:C为PSW中的Cy;MOV bit,C bit为布尔变量的位地址。举例:试将00H位和7FH位中的内容互换。【解】:两个位互换必须找一个位作为缓冲位。MOV C,

49、00H MOV 01H,C MOV C,7FH MOV 00H,C MOV C,01H MOV 7FH,C,返回,,位置位和位清零指令,格式:CLR C;0CyCLR bit;0(bit)SETB C;1CySETB bit;1(bit),3.7.3 位逻辑运算指令,格式:ANL C,bit;C(bit)C ANL C,/bit;C/(bit)CORL C,bit;C(bit)CORL C,/bit;C/(bit)CCPL C;/C CCPL bit;/(bit)bit,,位控制转移指令,(一)以Cy内容为条件的转移指令 格式:JC rel;若Cy=1,则PC+2+relPC;若Cy=0,则P

50、C+2PC JNC rel;若Cy=0,则PC+2+relPC;若Cy=1,则PC+2PC,(二)以位地址为内容为条件的转移指令 格式:JB bit,rel;若(bit)=1,则PC+3+relPC;若(bit)=0,则PC+3PC JNB bit,rel;若(bit)=0,则PC+3+relPC;若(bit)=1,则PC+3PC JBC bit,rel;若(bit)=1,则PC+3+relPC,0bit;若(bit)=0,则PC+3PC,位操作指令应用举例(一),已知:内部RAM 的M1、M2单元各有两个无符号的8位数。试编程比较其大小,并将大数送MAX单元。【解】:ORG 1000H MO

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号