单片机原理及应用学习笔记(二)

接下来这部分主要是51系列单片机指令系统的具体介绍

(3.1)数据传送类指令(28条)
通用格式:MOV <目的操作数>,<源操作数> 属于“”复制“”性质,不影响标志位

第一类:以累加器为目的的操作数

MOV A,Rn......................MOV A,R6;  (R6)->A寄存器寻址。。。。。。(n=0-7)
MOV A,@Ri....................MOV A,70H;  (70H)->A直接寻址
MOV A,direct..................MOV A,@R0;((R0))->A间接寻址
MOV A,#data..................MOV A,#78H;78H->A立即寻址

第二类:以Rn为目的的操作数指令

MOV Rn,A
MOV Rn, direct
MOV Rn, #data 

//功能:是把源操作数的内容送入当前一组工作寄存器区的R0-R7中的某一个寄存器

第三类:以直接地址direct为目的的操作数指令

MOV direct,A
MOV direct,Rn
MOV direct1,direct2
MOV direct,@Ri
MOV direct,#data

//功能:把源操作数送入直接地址指出的存储单元。direct是指内部RAM或者SFR的地址

第四类:以寄存器间接地址为目的的操作数指令

MOV @Ri,A
MOV @Ri,direct
MOV @Ri,#data

第五类:16位数传送指令

MOV DPTR,#data16       (#data16->DPTR)

/唯一的16位数据传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL/

第六类:堆栈操作指令
/堆栈:MCS-51内部RAM可设定一个后进先出的区域/
(1)进栈指令:

PUSH  direct

//现将栈指针SP加一,然后把direct中内容送入到栈指针 SP的内部RAM单元中
(2)进栈指令;

POP  direct

//SP指示的栈顶(内部RAM单元)内容送入到direct字节单元中,栈指针SP减一

第七类:累加器A与外部数据存储器传送指令

MOV A,@DPTR;
MOV A,@Ri;
MOV @DPTR,A;
MOV @Ri,A;

//功能:读取外部RAM存储起或者I/O中的一个字节,或把A中的一个字节的数据写入到外部RAM存储器或者I/O口中。(注意:RD*或者WR*信号有效)

第八类:查表指令
/用于读取程序寄存器中的数据表格的指令,均采用基址寄存器加变址寄存器间接寻址方法/

1)MOVC A ,@A+PC
(2)MOVC A ,@A+DPTR

第九类:字节交换指令

XCH  A,Rn
XCH  A,direct
XCH  A,@Ri 

第十类:半字节交换指令

XCHD  A,@Ri

/……………………………………………………………………………………………………………………………………../

(3.2)算数操作类(24条)
//单字节的加减乘除指令,都是针对8位二进制无符号数。执行结果对Cy\Ac\OV三种标志位有影响。但是增一 减一不影响上述标志位。
第一类:加法指令 (一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放到A中)

MOV A,Rn
MOV A,direct
MOV A,@Ri
MOV A,#data

//!!注意:使用加法指令的时候,要注意累加器A中的运算对各个标志位的影响:
第一:如果位七有进位,则置“1”进位标志Cy,否则则请“0”Cy;
第二:如果位三有进位,则置“1”辅助进位标志Ac,否则清“0”(Ac为PSW中的一位);
第三:如果为6有进位,位7没有进位;或者位7有进位,位6没有进位,则溢出标志位OV置“1”否则请“0”。

第二类:带进位的加法指令 (标志位Cy参与运算,因此是三个数相加)

ADDC  A,Rn;.....................(A)+(Rn)+C->A
ADDC  A,direct;.................(A)+(direct)+C->A
ADDC  A,@Ri;....................(A)+(Ri)+C->A
ADDC  A,#data;..................(A)+#data+C->A

第三类:增1指令:

INC A
INC Rn
INC direct
INC @Ri
INC DPTR

//不影响PSW中的任何标志位,若变量中的内容位FFH,程序执行后变量变为00H

第四类:十进制调整指令
格式: DA A //两个压缩BCD码的数按二进制相加后,必须经过本指令的调整才能得到正确的和数(仍为压缩BCD码表示)
应用背景:
(1)该指令执行前,一般有一条加法指令
(2)加法指令中的两个加数,应该用压缩BCD码表示的十进制数,和存放在A中
(3)执行完DA指令后,A中存放的数是两个加数的十进制和,也用压缩BCD码表示

第五类:带借位的减法指令

SUBB  A,Rn
SUBB  A,direct
SUBB  A,@Ri
SUBB  A,#data

/从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中/
//!!!!注意:
第一:如果位7需要借位则置‘1’Cy,否则清‘0’
第二:如果位3需要借位则置‘1’Ac,否则清‘0’
第三:如果位6需要借位而位7不需要借位,或者位7需要借位而位6不需要借位,则置‘1’溢出标志位OV,否则清‘0’

第六类:减1指令

DEC  A
DEC  Rn
DEC  direct
DEC  @Ri

//减1指令不影响标志位

第七类:乘法指令

MULL  AB;...................AxB->BA

//如果积大于255,则置‘1’溢出标志位OV

第八类:除法指令

DIV  AB;......................A/B->A(商)  余数->B

//如果B的内容位‘0’(即除数为0),则存放结果的A,B中的内容不定

/………………………………………………………………………………………………………………………………………/
(3.3)逻辑运算类指令(25条)
第一类:简单逻辑操作指令

1)CLR  A

//功能:累加器A清0.不影响Cy、Ac、等标志位

(2)CPL A

//功能:将累加器A的内容按位逻辑取反,不影响标志位

第二类:左环移指令

RL  A

//功能:累加器A的8位向左循环移位,位7循环移入位0,不影响标志位

第三类:带进位左环移指令

RLC A

//功能:将累加器A的内容和进位标志位Cy一起向左移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其他标志位

第四类:右环移指令

RR  A

//功能:累加器A的内容向右移一位,Acc.0移入Acc.7,不影响其他标志位

第五类:带进位右环移指令

RRC  A

//功能:累加器A的内容和进位标志位Cy一起向右环移一位,Acc.0进入Cy,Cy移入Acc.7

第六类:累加器半字节交换指令

SWAP  A

//功能:将累加器A的高半字节(Acc.7-Acc.4)和低半字节(Acc.3-Acc.0)互换

第七类:逻辑与指令

ANL  A,Rn...................(A)^(Rn)->A
ANL  A,direct
ANL  A,#data
ANL  A,@Ri;(i=0/1)
ANL  direct,A
ANL  direct,#data

//运算结果存入第一操作数中,按位进行与运算

第八类:逻辑或指令

ORL  A,Rn...................(A)v(Rn)->A
ORL  A,direct
ORL  A,#data
ORL  A,@Ri;(i=0/1)
ORL  direct,A
ORL  direct,#data

//运算结果存入第一操作数中,按位进行或运算

第九类:逻辑异或指令

XRL  A,Rn;
XRL  A,direct;
XRL  A,#data;
XRL  A,@Ri;(i=0/1);
XRL  direct,A;
XRL  direct,#data;

‘’‘
//运算结果存入第一操作数中,按位进行异或运算

/………………………………………………………………………………………………………………………………………/

(3.4)控制转移类指令(17条)
第一类:无条件转移指令
(1)绝对跳转指令

AJMP  addr11

//2K字节范围内的无条件转移指令,64k程序存储器空间分为32个区,每个区2k字节 ,
转移的目标地址必须与AJMP下一条指令的地址(pc)的高五位地址码A15-A11相同。

(2)长跳转指令

LJMP addr16

//指令执行时把指令的第二个和第三个字节分别装入pc的高位和低位字节中,
无条件的跳转向addr16指出的目标地址。目标地址可以在64k程序存储器地址空间的任何位置。

(3)相对转移指令

SJMP  rel

//在编写程序时,直接写上要转向的目标地址标号就可以,由汇编程序自动计算和填入偏移量
跳转目标地址处于当前pc值的-128字节~+127字节之间。

(4)间接跳转指令

JMP  @A+DPTR

//由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址,A的内容作为变址,给A赋不同的值,即可实现程序的多分支转移。

第二类:条件转移指令
(1)判0跳转指令

JZ  rel;............如果累加器为0,则转移
JNZ  rel;..........如果累加器非0,则转移

//规定的条件满足,则进行转移,跳转到相应的标号处,跳转目的地址的要求同SJMP。条件不满足则执行下一条指令

(2)比较不相等跳转指令

CJNE  A,direct,rel
CJNE  A,#data,rel
CJNE  Rn,#data,rel
CJNE  Ri,#data,rel

//比较前两个操作数的大小,如果他们不相等则转移,转换的目的地址要求同SJMP
//如果第一操作数(无符号位整数)小于第二操作数(无符号整数),则置进位标志位Cy,否则清0

(3)减一不为0跳转指令

DJNZ  Rn,rel; (n=0~7)
DJNZ  direct,rel

//将源操作数减一,结果回送到Rn寄存器或者direct中去,如果结果不为0则转移,转移的目的地址要求同SJMP
//允许程序员把寄存器Rn或者内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。
以减一后是否为0作为转移条件,即可实现按次数控制转移循环

第三类:调用和返回指令
(1)短调用指令

ACALL  addr11

//与AJMP指令相似,是为了与MCS-48中的CALL指令兼容而设立的,不建议使用

(2)长调用指令

LCALL  addr16

//该指令执行时,MCS51执行如下操作:(1)当前PCL,PCH进栈(2)addr16送入PC

(3)从子程序返回指令

RET 

//执行该指令的时候:
(SP)->PCH,然后(SP)-1->SP
(SP)->PCL,然后(SP)-1->SP
//功能:从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值开始执行程序

(4)中断返回指令

RETI

//功能与RET相似,不同之处是本指令清楚中断响应时,被置1的MCS51内部中断优先级寄存器的优先级状态

第四类:空操作指令

NOP

/………………………………………………………………………………………………………………………………………/

(3.5)位操作指令(17条)
第一类:数据传送指令

MOV C,bit
MOV bit,C

第二类:位变量修改指令

CLR  C;     清0Cy位
CLR  bit;   清0bit位
CLR  C;     Cy求反
CPL  bit;   bit位求反
SETB C;    置1Cy
SETB bit;   置1bit

第三类:位变量逻辑与指令

ANL  C,bit;   bit^Cy->Cy
ANL  C,/bit;

第四类:位变量逻辑或指令

ORL  C,bit;
ORL  C,/bit;

第五类:条件转移类指令

JC  rel;    如果进位位Cy=1,则转移
JNC rel;   如果进位位Cy=0,则转移
JB  bit,rel;  如果直接寻址位=1,则转移
JNB bit,rel;如果直接寻址位=0,则转移
JBC bit,rel;如果直接寻址位=1,则转移,并清0直接寻址位

(持续更新中!!!)

猜你喜欢

转载自blog.csdn.net/kyanyu/article/details/81587348