第二章 单片机指令系统_第1页
第二章 单片机指令系统_第2页
第二章 单片机指令系统_第3页
第二章 单片机指令系统_第4页
第二章 单片机指令系统_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章51单片机指令系统及程序设计补充:指令的字节数寻址方式指令系统及应用举例伪指令综合程序举例51系列单片机指令集含有111条指令

每条指令在执行时要花去一定的时间,以机器周期为单位。按指令执行时间分类:单周期(64条);双周期(45条);4周期(2条)按指令的功能分类,可分为5大类:数据传送类(29条);算术运算类(24条)逻辑运算及移位类(24);控制转移类(17条)位操作类(17条)每条指令在程序存储器ROM中占据一定的空间,以字节为单位。按指令所占字节数分类:单字节(49条);双字节(46条);3字节(16条)补充:指令的字节数在51单片机的指令系统中,因指令操作码和操作数的不同,指令(在存储器中)长度也各不相同。分为单字节、双字节和三字节。只要理解了指令占用这些字节是用来存放哪些量的,就自然会判断不同的指令是多少字节指令了。1、操作码占用一个字节;2、8位立即数占用一个字节,16位立即数占用两个字节;3、8位操作数地址占用一个字节,16位操作数地址占用两个字节;4、CPU内部的各种寄存器不占用指令字节,如A、B、R0、R1、R2、R3、R4、R5、R6、R7、DPTR等。例如:1、MOVA,R0;这条指令是单字节指令,操作码占一个字节,操作数隐含在操作码中。该指令的操作码是11101000B,寄存器名以三位数代码的形式在指令的后三位。2、MOVA,#07H;这是一个双节字指令,其中MOV占用一个字节,8位立即数07H占用一个字节。3、MOVDPTR,#0106H;这是一个三字节指令,MOV占用一个字节,16位立即数0106H占用两个节字;4、MOV07H,#07H;这是一个三字节指令,MOV占用一个字节,8位地址07H占用一个字节,8位立即数07H占用一个字节。指令的字节数与指令的运行时间指令的字节多是否意味着指令周期就长?指令字节数周期数指令说明MOVA,R011R0内容送累加器AMOVA,#0FFH21立即数FFH送AMOV20H,#30H32立即数30H送内存20h单元MULAB14乘法指令INCDPTR1116位寄存器DPTR加一从表中可见,指令的字节数与指令周期不是对等的关系51单片机指令的寻址方式立即寻址直接寻址寄存器寻址寄存器间接寻址基址变址寻址相对寻址位寻址寻址方式:指令中所规定的寻找操作数的方式七种寻址方式,一条指令可能含多种寻址方式立即寻址操作数直接就出现在指令中例:MOVA,#64H;A←立即数64H

ADDA,#05H

;A←(A)+立即数05H注意:符号“#”表明其后跟的是立即数,立即数——就是数字量本身。直接寻址指令中直接给出了操作数所在单元的地址或名称例:MOVR1,1FH;R1←(1FH)

MOV30H,4AH;30H←(4AH)在本单片机中规定:访问特殊功能寄存器SFR只能采用直接寻址方式。例如:MOVA,SP;A←(SP)MOVA,81H;A←(SP)

MOVP1,#5AH;P1←(#5AH)MOV90H,#5AH;P1←(#5AH)

MOVB,30H;B←(30H)相同相同寄存器寻址从寄存器中读取操作数或存放操作数进寄存器例:MOVA,B;A←(B)

MOV30H,R0

;30H←(R0)

MOVA,R1;A←(R1)寄存器间接寻址寄存器中的内容是一个地址,由该地址单元寻址到所需的操作数注意:1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。2)符号“@”表示“在…”,其含义与读音皆同“at”。例:MOVR1,#30H;R1←立即数30H

]

MOV@R1,#0FH;30H←立即数0FH

MOVA,@R1;A←((30H))=#0FH在本单片机中访问特殊功能寄存器SFR只能采用直接寻址方式的原因:SFR分布在80H~0FFH范围内,而52系列单片机有256字节的片内RAM,其中的80H~0FFH的RAM与SFR所占地址重叠。MOVA,90H等效于MOVA,

P1属直接寻址MOVA,@R0;[事先已知(R0)=#90H]执行的操作:A←(90H)属寄存器间接寻址,随意写的指令如:MOVA,85H则是非法的!于是规定:80H~0FFH范围内的RAM只能用寄存器间接寻址方式,而SFR只能用直接寻址方式。从而解决了地址冲突的问题。例如:存储器配置(片内RAM)51片内RAM

128字节(00H—7FH)52片内RAM

256字节(00H—0FFH)00H20H2FH7FH1FH30H80HFFH52子系列才有的RAM区普通RAM区位寻址区工作寄存器区SFR分布在80H-FFH其中92个位可位寻址80HFFH51子系列128字节52子系列256字节只能直接寻址只能寄存器间接寻址基址加变址寻址

以16位的地址指针寄存器DPTR或16位的PC寄存器为基址寄存器,以累加器A为变址寄存器,两者中的“内容”形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。例:[设:A中已存有#A4H,DPTR中已存有#1234H]

MOVCA,@A+DPTR;A←((A)+(DPTR))操作:将A4H+1234H=12D8H单元中的数放进累加器A相对寻址当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址例:SJMPrel

操作:跳转到的目的地址

=

当前16位PC值+rel注意:1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128—+127(80H—7FH),在实际编程中,“rel”通常用标号代替位寻址指令中直接给出了操作数所在的位地址。例:CLRP1.0;P1.0←0

SETBACC.7;ACC.7←1

CPLC

;C←NOT(C)注意:1)位地址里的数据只可能是一个0

1

2)有的位地址十分明确,如

P1.0,ACC.7等,

有的位地址则“不太明确”,如:

[MOVA,17H;A←(17H),17H是字节地址]

MOVACC.0,17H;ACC.0←(17H),这里ACC.0是位地址所以该指令中的17H是22H单元的第7位片内RAM中有128个位可按位寻址的位,位地址:00H—7FH分布在:20H—2FH单元;另外,在SFR中还有92个位可按位寻址00H20H2FH7FH1FH30H80HFFH52子系列才有的RAM区普通RAM区位寻址区工作寄存器区27H22H21H20H26H24H25H23H28H07060504030201000F0E0D0C0B0A090817161514131211101F1E1D1C1B1A191827262524232221202F2E2D2C2B2A292837363534333231303F3E3D3C3B3A393847464544434241402FH7F7E7D7C7B7A7978位地址总共128个可按位寻址的位单元地址17D7D6D5D4D3D2D1D051单片机的指令格式方括符[]表示可选项标号代表指令所在地址,1-8个字母/数字,“:”结尾操作码就是指令功能助记符,指令实体目的操作数源操作数注释,以“;”开头[标号:]操作码[目的操作数][,源操作数][;注释]51单片机指令集功能分五类,共111条指令五大类功能数据传送类指令:(29条)算术运算类指令:(24条)逻辑运算及移位类指令:(24条)控制转移类指令:(17条)位操作(布尔操作)类指令:(17条)内部存储器间传送:(MOV——16条)外部数据存储器与累加器间传送:(MOVX——4条)程序存储器向累加器传送:(MOVC——2条)数据交换:(XCH,XCHD,SWAP——5条)堆栈操作:(PUSH,POP——2条)(一)数据传送类指令(5种/29条)Rn:R0—R7@Ri:@R0,@R1#data:8位立即数#data16:16位立即数direct:直接地址rel:8位带符号偏移量(一)数据传送类指令(5种/29条)内部存储器间传送指令(15条):

MOV类指令的操作方向总是后面的操作数指向前面的操作数!例:MOVA,30H——A(30H)

累加器Adirect直接寻址@Ri间址Rn寄存器Data立即数内部数据传送类指令的使用1,在使用传送指令时,可以根据实际情况选用恰当寻址方式。上面给出的各种类型的传送指令是INTEL公司在设计51的硬件时就已经确定下来。编程人员只能像查字典一样去查找、使用。不能根据主观意愿去“创造”指令。

例如:要将R0中的数据传送到R1中。如何使用指令去完成上面的操作?

MOVR1,R0

是否可以?回答是否定的!因为在51的指令系统中没有此条指令!只能使用:

MOVA,R0或:MOV01H,00H

MOVR1,A

因此,必须从51的指令表中选择使用指令。注意:MOVRn,Rn

MOV@Ri,@RiMOVRn,@Ri

MOV#data,A等等指令是非法指令。

2,以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P,而其余的指令对PSW均无影响。3,要会正确地估计指令的字节。凡是指令中包含有立即数、直接地址的指令,都应当在原有的基础上加1。

【举例】:

mova,@Ri()个字节mova,direct()个字节movdirect,#data()个字节movdirect2,direct1()个字节4,对于同一问题可以有不同的编程方法。使用不同的方法虽然都可以实现题目的要求,但从指令长度、运行时间和可阅读性上等综合因素考虑,不同的方法就有合理和不合理、优化和繁杂之分。所以,在学习指令系统和编程时开始就要养成一个好的、合理的编程习惯。5,注意给程序进行正确的注释,这对于阅读、编写和修改程序都是非常重要的。下面就是一些注释的例子:MOVA,30H ;(30h)→AMOVA,R0 ;(R0)→AMOV40H,30H ;(30h)→40hMOVA,@Ri ;((Ri))→A内部传送类指令举例试编出把30h和40h单元内容进行交换。

RAMXY累加器A30H40HMOVA,30H

;(30h)→A

MOV30H,40H

;(40h)→30h

MOV40H,A

;A→40h数据传送类指令(续)外部数据存储器与累加器间传送(5条):MOVX类指令可在累加器与以@DPTR或@Ri所代表的外部RAM之间进行数据传送。例如:

MOVXA,@DPTR——A((DPTR))MOVXA,@Ri——A

((Ri))MOVX@DPTR,A——(DPTR)(A)MOVX@Ri,A——(Ri)(A)外部RAM的字节传送指令举例【解】:外部RAM中的数据是不能直接传送的,因此必须使用两次MOVX指令完成此操作。

ORG2000H

MOVDPTR,#88H;为8位指针赋值 MOVXA,@DPTR;取x到累加器AMOVDPTR,#1818H;为16位指针赋值 MOVX@DPTR,A;x送RAM的1818h单元试用R0,R1作间址寄存器编写程序,看看会遇到什么问题?

已知外部RAM的88H单元有一个数x,试编程将x送外部RAM的1818H单元。程序存储器向累加器传送指令(2条):MOVCA,@A+DPTR

MOVCA,@A+PC

——通常称为查表指令,寻址方式属:“基址加变址寻址”数据传送类指令(续)@A+DPTR或@A+PC指向程序存储器中的某单元。拟传送给累加器ACC的数据就是程序中事先写进去的表格数据。这些表格数据往往用伪指令DB,DW等定义在程序中。外部ROM的字节传送指令举例已知累加器A中存有0~9范围内的数,试用查表指令编写出查找出该数平方的程序。采用DPTR作基址寄存器:

设平方表的首地址为2000h,累加器A中的内容恰好是查表的偏移量。首先将表的起始地址2000h送入DPTR中。

MOVDPTR,#2000H;指针赋值MOVCA,@A+DPTR;平方值送AROM01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h2,采用PC作基址寄存器:与DPTR不同,使用PC作为基地址时,必须对累加器A的数据进行修正,以保证@a+pc恰好找到待查的平方值地址。

ORG1FFBH1FFBH74data

ADDA,#data;data=02h1FFDH83H

MOVCA,@A+PC;PC=1FFE1FFEH80FEH

SJMP$2000H00H

DB0 ;平房表首址2001H01H

DB12002H04H

DB42003H09H

DB92004H10H

DB162005H19H

DB25

:::2009H51H

DB81

ENDdata为MOVC指令首地址与表头地址之间的单元数。74hdata83h80hFEh01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh返回数据传送类指令(续)数据交换指令(5条):为提供一种方便的累加器和寄存器或RAM之间的数据交换。避免了使用一般mov传送指令完成交换时的不便。XCHA,direct(字节互换)XCHA,@Ri(字节互换)XCHA,Rn(字节互换)(A)(direct)[或((Ri)),或(Rn)]XCHDA,@Ri累加器Acc的低4位与((Ri))的低4位互换,各自的高4位不变SWAPA累加器Acc的低4位与自身的高4位互换数据交换指令举例MOVP2,#0

MOVR1,#20h;指针赋初值 MOVXa,@R1;x→a XCHa,@R1;交换a↔(20h),y→aMOVX@R1,a;y→(20h)片外RAM片内RAMy

(x)片外RAMx(y)(y)

x20h20h累加器A123举例:已知,片外RAM20h单元、内部RAM20h单元分别有数x和y,试编程互将两数相交换。堆栈操作指令(2条):√堆栈区由特殊功能寄存器堆栈指针SP

管理√堆栈区可以安排在RAM区任意位置,一般不安排在工作寄存器区和可按位寻址的RAM区,而是放在RAM区的靠后的位置√寻址方式为直接寻址√堆栈总是指向栈顶√通常PUSH与POP两条指令成对使用数据传送类指令(续)进栈操作:PUSHdirect;sp+1→sp,(direct)→(sp)出栈操作:POPdirect;(sp)→(direct),sp-1→sp【举例】:设片内RAM的30h单元存有x,40h单元存有y。试将两个单元内容互换。

RAMxyyxyx栈底SP=07h40h30hpush30h

push40h

pop30h

pop40h例如:设(A)=7BH;(35H)=11H并且知道(SP)=60HPUSHACC;61H#7BHPUSH35H;62H(35H)即:62H#11HPOPACC;A(62H)即:A#11HPOP5AH;5AH(61H)即:5AH#7BH执行下列程序后,A中的内容为多少?该程序是一个查表程序。

ORG2100H;各指令的地址为:MOVA,#09H;2100H

MOVCA,@A+PC;2102HRET;2103HORG210AHTAB:DB0C0H;210AHDB0F9H;210BHDB0A4H;210CHDB0B0H;210DH

运行结果:A=0A4H设累加器A中为16进制表示(00H~09H)的BCD码。试编程将其转换为ASCII码,并将其送到50H地址单元中。这是一个数值转换程序。解:

MOVR0,AMOVDPTR,#TABASC

MOVCA,@A+DPTRMOV50h,ATABASC:DB30H,31H,32H,33H,34H,35HDB36H,37H,38H,39H

将A中存放的2位BCD码转换为ASCⅡ码,并送到50H,51H单元中。解:ORG0030HMOVB,A

ANLA,#0FH

ADDA,#30HMOV51H,AMOVA,B

SWAPAANLA,#0FHADDA,#30HMOV50H,ARET算术运算指令不带进位的加法指令(ADD)1、加法指令:带进位的加法指令(ADDC)加1指令(INC)2、减法指令:带进位的减法指令(SUBB)减1指令(DEC)3、十进制调整指令:(DAA)4、乘法和除法指令:(MULDIV)加法指令(一):不带进位的加法指令格式: ADDA,Rn ;(A)+(Rn)→A ADDA,direct ;(A)+(direct)→A ADDA,@Ri ;(A)+((Ri))→A ADDA,#data ;(A)+data→A【注意】:1.参加运算的数据都应当是8位的,结果也是8位并影响PSW。2.根据编程者的需要,8位数据可以是无符号数(0~255),也可以是有符号数(-127~+128)。3.不论编程者使用的数据是有符号数还是无符号数,CPU都将它们视为补码进行运算并影响PSW。不带进位的加法指令举例(一)试分析执行下列指令后累加器A和PSW中各标志的变化。 MOVA,#19HCy=0; ADDA,#66HAC=0

OV=025A=00011001BP=1

+102data=01100110B127001111111B1,若两数都是无符号数,则因Cy=0无溢出,25+102=127。2,若两个数是有符号数,则因OV=0无溢出。cy000C7’C6’AC不带进位的加法指令举例(二)试分析执行下列指令后累加器A和PSW中各标志的变化。 MOVA,#5AHCy=0; ADDA,#6BHAC=0;

OV=190A=01011010BP=0

+107data=01101011B

197

011000101B

C7’C6’1,若两数是无符号数,因Cy=0无溢出:90+107=1972,若两数是有符号数,因OV=1,故有溢出,两个正数相加后变为负数,很明显结果是不正确的。加法指令(二):带进位的加法指令格式:ADDCA,Rn ;(A)+(Rn)+Cy→A ADDCA,direct ;(A)+(direct)+Cy→A ADDCA,@Ri ;(A)+((Ri))+Cy→A ADDCA,#data ;(A)+data+Cy→A【注意】:这里的Cy是指令执行前的Cy;对PSW的影响同ADD指令。加1指令格式: INCA;累加器A加一 INCRn;(Rn)+1→Rn INCdirect;内存单元数据加一 INC@Ri;内存单元数据加一 INCDPTR;(dptr)+1→dptr【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。

2,由于上面的原因,INC指令不能作为一般的数据算术运算使用,INC主要用于修改数据指针等控制、循环语句中使用。编程举例已知M1、M2单元中存有两个16位无符号数x1、x2(低位在前)。试写出x1+x2,并将结果放入M1、M1+1单元(低8位在M1单元)。设两数之和不会超过16位(65535)。RAMX2data8~15X2data0~7X1data8~15X1data0~7M1M1+1M2M2+1【解】:MOVR0,#M1;x1指针赋初值MOVR1,#M2;x2指针赋初值MOVA,@R0;取x1低8位送AADDA,@R1;x1与x2低8位相加MOV@R0,a;低8位和送m1单元INCR0 INCR1 ;修改指针MOVA,@R0;取x1的高8位送AADDCA,@R1

;x1与x2的高8位和Cy相加MOV@R0,A;结果送M1+1单元减法指令(带进位的减法指令)在51单片机的指令系统中,只有:

①带进位的减法SUBB

②减一DEC两种指令。减法指令:格式:SUBBA,Rn ;(A)–(Rn)–Cy→A SUBBA,direct;(A)–(direct)–Cy→A SUBBA,@Ri ;(A)–((Ri))–Cy→A SUBBA,#data;(A)–data–Cy→A使用减法指令要注意的几个问题无论相减两数是无符号数还是有符号数,减法操作总是按有符号数来处理、影响PSW中相关的标志(详见举例)。在51单片机的指令系统中没有不带Cy的减法,所以在使用SUBB指令前必须使用一条清除Cy的指令:CLRC。减法指令应用举例试分析执行下列指令后累加器A和PSW中各标志的变化。 CLRC MOVA,#52H01010010B=82 SUBBA,#0B4H10110100B=-76

82a=01010010

–-76

data=10110100

158110011110=-98

手工计算

C7’

C6’

AC

101

【分析】:CPU的计算得-98,很明显答案是错误的。原因是OV=1,既产生了溢出。所以,对于符号数的减法在运算后一定要检测OV=1减一指令格式: DECA;累加器A减一 DECRn;(Rn)-1→Rn DECdirect;内存单元数据减一 DEC@Ri;内存单元数据减一【注意】:1,除了第一条对PSW的P有影响外,其余对PSW均无影响。

2,由于上面的原因,DEC指令一般不作为数据算术运算使用(因为不能对PSW的OV等位产生影响,它主要用于修改数据指针在控制、循环语句中使用)。设(R0)=7FH,在内RAM中,(7EH)=00H,(7FH)=40H

执行:

DEC@R0DECR0DEC@R0答:(R0)=7EH,(7EH)=0FFH,(7FH)=3FH。

结果为:(R0)=

,(7EH)=

,(7FH)=

十进制调整指令在CPU进行BCD码运算时,必须在运算后进行十进制调整,这是因为,CPU在运算时,并不知道数据是二进制还是BCD码。格式:DAA;若AC=1或A3~0>9,则(A)+06h→A;若Cy=1或A7~4>9,则(A)+60h→A

;若上述2个条件均满足,则A←(A)+66h【注意】:1,DAA指令必须紧跟在加法指令之后;2,DAA指令只适用于加法指令的调整。BCD码是指“用二进制表达的十进制数”。如:十进制数20可以用二进制数00010100B表示;也可以用十六进制数14H表示;还可以用BCD码00100000B或20H

表示。4个二进制位就可以表示一位BCD码:0000~1001可表示十进制数(BCD数)0~9;

8个二进制位就可以表示两位压缩的BCD码:00000000~10011001表示00~99。十进制调整指令应用举例BCD加法运算:试写出完成85H+59H的BCD码的加法程序。 MOVA,#85H ADDA,#59H DAA SJMP$85a=10000101B+59dtat=01011001B1441101111

0B低4位〉9,所以加06h

+00000110B

11100100B高4位〉9,所以加60h

01100000B

101000100B结果为144h(1包含在Cy)【注意】:144H是用16进制数来表示十进制,即BCD码。乘法和除法指令这是51单片机唯一的一类单字节4周期指令,它相当于4条加法指令的运行时间。

格式:MULAB;a×b=ba(b存高8位,a存低8位)

DIVAB;a÷b=a…b(a存商,b存余数)【注意】:指令对标志的影响:

1,在乘法指令中对PSW的影响有Cy、OV、和P。具体如下:Cy←0;P取决于A中“1”的个数;OV表明积的大小。当积超过255(B≠0)时,OV=1。

2,在除法指令中,Cy、P与乘法相同。在执行除法指令时,若B=0时OV=1,表示除数=0除法无意义,其余情况下OV被复位。BCD:MOVR0,#30H;R0指向被加数的十位、个位,MOVR1,#40H;R1指向加数的十位、个位,MOVA,@R0ADDA,@R1;被加数的十位、个位+加数的十位、个位DAA;十进制调整MOV@R0,A;送结果6位BCD码加法程序。设被加数放在32H、31H、30H单元中,加数放在42H、41H、40H单元中,和放在32H、31H、30H中。INCR0;R0指向被加数的千位、百位INCR1;R1指向加数的千位、百位MOVA,@R0

ADDCA,@R1;被加数的千位、百位+加数的千位、百位DAA;十进制调整MOV@R0,A;送千位、百位的和INCR1INCR0MOVA,@R0ADDCA,@R1DAAMOV@R0,ARET无符号数的乘除运算。用MUL和DIV指令实现A中的二个BCD数的相乘,并再转换成二位BCD码放于A中。解:定义数据缓冲区:入口:A—压缩BCD数;出口:A存放积。MULBCD:MOVB,#10H;10H=16

DIVAB;A中的BCD数除16分成两个BCD数,;高字节在A中,低字节在B中。

MULAB;两个BCD数相乘,积在A中MOVB,#0AH

DIVAB;积除10,A中为十位数,B中为个位数SWAPA;A中的十位数置高4位中

ORLA,B;数位组合,A中高4位为积的十位数,;低4位为个位数RET逻辑运算指令功能:对2个8位二进制数进行逻辑与、或、非和异或操作;特点:除了以累加器A为目标寄存器的指令影响PSW的P位外,其余指令对PSW均无影响。

1,逻辑与运算指令(ANL) 2,逻辑或运算指令(ORL) 3,逻辑异或指令(XRL) 4,累加器清零和取反指令(CLR&CPL)5,循环移位指令逻辑与运算指令格式:ANLA,Rn;(A)∧(Rn)→AANLA,direct;(A)∧(direct)→A ANLA,@Ri ;(A)∧((Ri))→A ANLA,#data ;(A)∧data→A ANLdirect,A ;(direct)∧(A)→direct ANLdirect,#data;(direct)∧data→direct上面的指令也可以分为两类:1,以累加器A为目标寄存器的逻辑运算指令;2,以内存单元为目标的逻辑运算指令。应用举例(一)已知R0=30H和(30H)=0AAH,试问执行下列指令后累加器A和30H单元中的内容是什么?

1,MOVA,#0FFH2, MOVA,#0FH ANLA,R0 ANLA,30H(A=30H,(30H)=0AAH)(A=0AH,(30H)=0AAH) 3, MOVA,#0F0H4, MOVA,#80H ANLA,@R0 ANL30H,A(A=0A0H,(30H)=0AAH)(A=80H,(30H)=80H)很明显:ANL操作可以从某个存储单元中取出某几位,而把其它的为屏蔽掉(清零)。应用举例(二)已知:M1单元有一个9的ASCII码39H,试编程将其变为BCD码。解:1,使用ANLdirect,#data的指令。ANLM1,#0FH解:2,使用ANLA,#data指令。

MOVA,M1 ANLA,#0FH MOVM1,A逻辑或运算指令格式:ORLA,Rn ;(A)∨(Rn)→AORLA,direct;(A)∨(direct)→A ORLA,@Ri ;(A)∨((RI))→A ORLA,#data;(A)∨data→A ORLdirect,A;(direct)∨(A)→direct ORLdirect,#data;(direct)∨data→direct同与运算一样,上面的指令也可以分为两类:1,以累加器A为目标寄存器的逻辑运算指令;2,以内存单元为目标的逻辑运算指令。应用举例设累加器(A)=0AAH,(P1)=0FFH。试编程将累加器A中的低四位送P1口的低四位,而P1口的高四位不变。解: MOVR0,A ;累加器A中的数据暂存 ANLA,#0FH ;屏蔽A的高4位 ANLP1,#0F0H ;屏蔽P1口的低4位 ORLP1,A ;在P1口组装 MOVA,R0 ;恢复累加器A的数据【小结】:与运算可以“屏蔽”某些位;

或运算可以“置位”某些位。逻辑异或运算指令格式:XRLA,Rn ;(A)⊕(Rn)→A XRLA,direct ;(A)⊕(direct)→A XRLA,@Ri ;(A)⊕

((Ri))→A XRLA,#data ;(A)⊕

data→A XRLdirect,A ;(direct)⊕(A)→direct XRLdirect,#data;(direct)⊕

data→direct特点:按位运算,相同时为0,不同时为1。使用异或可以实现将某个字节的数据或将数据的某几位变反。举例已知:外部RAM的30H单元中有一个数AAH,现要将其高4位不变,低4位取反,试编程。解1,利用MOVXA,@Ri指令: MOVR0,#30H10101010 MOVXA,@R0⊕

00001111 XRLA,#0FH1010

0101 MOVX@R0,A解2,利用MOVXA,@DPTR

MOVDPTR,#0030H MOVXA,@DPTR XRLA,#0FH MOVX@DPTR,A累加器清零和取反指令用传送指令可以实现对累加器A的清零和取反操作,但是它们都是双字节指令。在51单片机的指令系统中专门设计了单字节、单周期对累加器清零和取反的指令。格式: CLRA;累加器清零 CPLA;累加器取反

逻辑运算指令应用举例设X、Y和Z分别存在X、Y和Z单元。试编出能实现此电路功能的程序,并将结果送入F单元。⊕+XYZF解:MOVA,X ANLA,Y ;X∧Y→A MOVR1,A;送R1暂存 MOVA,Y XRLA,Z ;Y∨Z→A CPLA ;A取反 ORLA,R1;(X∧Y)∨(Y∨Z)→A MOVF,A ;A→F移位指令虽然51单片机只有4条移位指令,但它可以处理所有移位问题。格式:

【注意】:只能对累加器A进行移位。RLA左环移累加器A累加器ACy累加器ACy累加器ARRCA

带进位位右环移RRA右环移RLCA带进位位左环移举例(一)已知:在M1和M1+1单元有一个16位数(M1存低8位),试编程将其扩大2倍(设结果小于65535)。解:扩大2倍可以用左移一位来实现。

CLRC ;清除Cy位 MOVR1,#M1 ;指针赋值 MOVA,@R1 ;取低8位数据 RLCA ;循环左移,Cy进低位,高位进Cy MOV@R1,A ;移位后数据回送 INCR1 ;指针加一 MOVA,@R1 ;取高8位数据 RLCA ;循环左移Cy进低位 MOV@R1,A ;数据回送举例(二)已知:M1、M2单元中有2个BCD码,试编程将其紧缩为一个字节并存入M1单元。解:MOVR1,#M1

MOVA,@R1

SWAPA INCR1

ORLA,@R1

MOVM1,A0000BCD10000BCD2M1M1+1BCD10000BCD1BCD20000BCD1累加器A书上部分例题编制一个循环闪烁灯的程序。有8个发光二极管,每次其中某个灯闪烁点亮5次后,转移到下一个灯闪烁10次,循环不止。本程序的硬件连接如图所示。当P1.i输出高电平时,LED灯亮,否则不亮。

MOVA,#01H;灯亮初值SHIFT:LCALLFLASH;调闪亮5次子程序RRA;右移一位SJMPSHIFT;循环FLASH:MOVR2,#05H;闪烁5次计数FLASH1:MOVP1,A;点亮LCALLDELAY;延时MOVP1,#00H;熄灭LCALLDELAY;延时DJNZR2,FLASH1;循环5次RETDELAY:MOVR6,#255;1TmLOOP1:MOVR7,#255LOOP2:DJNZR7,LOOP2;2TmNOP位操作指令特点:操作数不是字节,而是某一位。每位的取值只能是“0”或“1”,因而也称之为布尔变量操作。

布尔变量存在于片内RAM的位寻址区(20H~2FH)、11个可以按位寻址的SFR。1.位传送指令2.位置位、位清零和位取反指令3.位运算指令4.位控制转移指令1.位传送指令格式:MOVC,bit其中:C为PSW中的Cy; MOVbit,C bit为布尔变量的位地址。

【解】:两个位互换必须找一个位作为缓冲位。MOVC,00HMOV01H,C MOVC,7FH MOV00H,C MOVC,01H MOV7FH,C举例:试将00H位和7FH位中的内容互换。2.位置位、位清零和取反指令格式: CLRC ;0→Cy CLRbit ;0→(bit) SETBC ;1→Cy SETBbit ;1→(bit) CPLC ;/C→C CPLbit ;/(bit)→bit例:编程通过P1.0线连续输出128个宽度为5个机器周期长的方波。解:MOVR0,#128CLRP1.0LOOP:CPLP1.0NOPNOPDJNZR0,LOOP3.位运算指令格式: ANLC,bit ;C∧(bit)→C ANLC,/bit;C∧/(bit)→C ORLC,bit ;C∨(bit)→C ORLC,/bit ;C∨/(bit)→C

4.位控制转移指令(一)以Cy内容为条件的转移指令格式:JCrel ;若Cy=1,则(PC)+2+rel→PC ;若Cy=0,则(PC)+2→PC JNCrel ;若Cy=0,则(PC)+2+rel→PC ;若Cy=1,则(PC)+2→PC(二)以位地址内容为条件的转移指令格式:JBbit,rel;若(bit)=1,则(PC)+3+rel→PC ;若(bit)=0,则(PC)+3→PC

JNBbit,rel;若(bit)=0,则(PC)+3+rel→PC ;若(bit)=1,则(PC)+3→PC JBCbit,rel;若(bit)=1,则(PC)+3+rel→PC,0→bit ;若(bit)=0,则(PC)+3→PC

解:ORG0000HMOVA,30H

CJNEA,40H,LOOP1

SETB7FHSJMP$LOOP1:JCLOOP2MOV20H,AMOV21H,40HSJMP$LOOP2:MOV20H,40HMOV21H,ASJMP$

比较内部RAM的30H和40H单元中的二个无符号数的大小,将大数存入20H单元,小数存入21H单元,若二数相等,则使内RAM的第127位置1。

试判断30H中的数的正负,若为正数,存入20H单元;若为负数则存入21H单元。解:

ORG0000HMOVA,30H

JB

ACC.7,LOOPMOV20H,ASJMP$LOOP:MOV21H,ASJMP$

控制转移指令

1,无条件转移指令 2,条件转移指令 3,子程序调用和返回 4,空操作指令

1,无条件转移指令格式:LJMPaddr16长转移指令,寻址范围65535;AJMPaddr11绝对转移,寻址范围2K;

SJMPrel短转移,转移范围(+127~-128);JMP@A+DPTR变址转移,寻址范围65535。02Haddr15~8addr7~0a10~8

00001a7~a080Hrel73HLJMP指令(三字节)AJMP指令(双字节)SJMP指令(双字节)JMP指令(单字节)长转移指令:(三字节双周期指令)指令执行时,将指令码中的addr16送入PC中,使程序无条件的转向addr16所指向的新地址执行程序。【举例】:已知某单片机的监控程序地址为A080H,试问用什么方法使单片机开机后自动的转向该监控程序?【解】:因为单片机上电时,PC=0000H,所以在0000H单元存放一条LJMP0A080H的指令即可。LJMPA0H80HROM0000H0001H0002H0003H绝对转移指令:双字节、双周期指令。将AJMP指令中的11位转移地址替换掉原来PC中16位地址中的低11位地址。指令中的11位地址,确定了地址的转移范围在2K以内,所以AJMP也称“页内转移”指令。101

0000110100101

XXXX

X10110100101A10a9a8

操作码a7~a0AJMP指令PC程序计数器51单片机的ROM系统是以2K为一页来划分程序存储器,这样对于4K的片内ROM存储器可以分为2页;片外64K的ROM可以分为32页。在执行AJMP指令时,PC的高5位决定了ROM中的页地址;而AJMP指令的低11位地址用来选择页内地址。在一般情况下,AJMP指令应当与目标地址在同一页内。更具体的说:目标地址应当与AJMP指令取出后的PC值(PC=PC+2)在同一页内。否则转移将会出现错误。ROM的64K存储空间的页面(部分)划分表页面PC高5位页内地址页面PC高5位页内地址0页000000000H~07FFH8页010004000H~47FFH1页000010800H~0FFFH9页010014800H~4FFFH2页000101000H~17FFH10页010105000H~57FFH3页000111800H~1FFFH11页010115800H~5FFFH4页001002000H~27FFH12页011006000H~67FFH5页001012800H~2FFFH13页011016800H~6FFFH6页001103000H~37FFH14页011107000H~77FFH7页001113800H~3FFFH15页011117800H~7FFFHROM的64K存储空间的页面示意图::::AAA:MOVA,R0MOVR1,A::AJMPAAA0100H07FEH000001111111

11111110PC值000010000000

00000000PC+2值000010010000

00000000AJMP指令中的11位地址原本AJMP指令要转到本页的0100H单元但是由于PC的高5位页面地址发生了变化使AJMP指令实际转到下一页0900H单元。最后PC值发生跨页错误AJMP转一指令是用来做页内2K范围的转移,如果使用不当,会发生错误的“跨页”操作。产生跨页的原因是AJMP指令处于每一页的最后两个单元的结果,所以避免这种现象的方法就是不要在每一页的最后两个单元使用AJMP指令。如果目标地址与AJMP地址不在同一页内,建议使用LJMP指令替代AJMP。使用AJMP指令时,11位的绝对地址可以用符号地址取代正确使用AJMP转移指令例:在以下三种情况,判断执行KRD:AJMPKWRD后能否实现正常跳转。KRD为转移指令所在的地址,KWRD为跳转目标标号地址。

(1)KRD=0730H;KWRD=0100H(2)KRD=07FEH;KWRD=0100H(3)KRD=07FEH;KWRD=0830H第一种情况能够实现正常跳转,由于KRD+02=0732H与KWRD=0100H的高5位相同,在同1页内。第二种情况不能够实现正常跳转,由于KRD+02=0800H与KWRD=0100H的高5位不相同,不在同1页内。第三种情况能够实现正常跳转。短转移SJMP指令格式:SJMPrel

rel为偏移量(+127~-128)rel(偏移量)的计算公式:

rel=目标地址–源地址–2(其中:2为SJMP指令的长度)【例1】:如图,要转到0116H时:

rel=0116H-0110H-2=04H【例2】:要转到0109H时:rel=0109H-0110H-2=F7H(-9)实际编程时,使用符号地址取代rel以简化计算,在汇编时由汇编程序来计算rel。SJMPrelPCPC+20109H0110H0116H变址转移指令格式:JMP@A+DPTR单字节操作码为73H特点:转移地址由累加器A的内容与DPTR相加形成。用途:用来制作一个多分支的转移结构。根据A的数值设计散转表程序。

MOVR1,A

MOVB,#02

MULAB

MOVDPTR,#TABLE;DPTR指向数据散转表首地址

JMP@A+DPTR

RETTABLE:AJMPROVT0;散转表

AJMPROVTl

AJMPROVT2当(A)=0时,散转到ROVT0;(A)=1时,散转到ROVTl……。

因为AJMP是双字节指令,所以程序开始将A的内容乘以2。2,条件转移指令:(1)累加器A判零转移指令(双字节指令) JZrel ;若A=0,则PC=PC+2+rel

;若A≠0,则PC=PC+2JNZrel ;若A≠0,则PC=PC+2+rel

;若A=0,则PC=PC+2例1、将外RAM的一个数据块(首地址为10H)传送到内部数据RAM(首地址为30H),遇到传送的数据为零时停止传送,试编程。解:MOVR0,#30HMOVDPTR,#10HLOOP1:MOVXA,@DPTR

JZLOOP2

MOV@R0,AINCR0INCDPTRSJMPLOOP1LOOP2:SJMPLOOP2

(2)比较条件转移指令(3字节)

a=data时:PC+3→PC,Cy=0

CJNEA,#data,rel

a>data时:PC+3+rel,Cy=0 CJNERn,#data,rel a<data时:PC+3+rel,Cy=1 CJNEA,direct,rel CJNE@Ri,#data,rel

比较+转移的指令使编程更为方便。【注意】:1,4条指令都是3字节指令,所以执行时PC+3→PC。2,指令的执行实际上就是做不回送的减法,通过Cy反映出无符号数的两数的大小:Cy=0则X>=Y; 若Cy=1则X<Y。3,若参加比较的是有符号数时,无法直接用Cy来判断。必须事先对符号进行判断,再根据四种情况具体处理。

a,当x、y均>0时,同无符号数相同; b,当x、y均<0时,同无符号数相同; c,当x>0,y<0时,x>y; d,当x<0、y>0时,x<y;X>0?Y>0?Y>0?Cy>0?X<YX>YYNNYYNNY(3)减一条件转移指令1,DJNZRn,rel ;Rn-1→Rn,若Rn≠0则PC+2+rel→PC若Rn=0则PC+2→PC2,DJNZdirect,rel;(direct)-1→direct,若(direct)≠0则PC+3+rel→PC若(direct)=0则PC+3→PC注意:第一条指令为双字节,第二条指令为三字节。指令本身先做一个带回送的减一运算操作,然后根据运算的结果是否为零作为转

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论