您的位置:首页->MCS-51操作指令?

相关链接

·激光技术革新放射仪实现“即插即用”
·指北针为何指北?
·万用表应用技巧有哪些?
·焊接的注意?
·运算放大器是什么?
·温度计有哪些?
·钳形电流表是什么?
· 集成运算放大器是什么?
·电磁流量计使用中的常见故障主要有哪些?
·原子吸收分光光度法常使用哪些定量分析方法?


MCS-51操作指令?
(一) 指令系统简介
1. 指令分类统计
指令总数:111条  操作码:255个  助记符:48个
单字节指令:49条                单周期指令:64条
 双字节指令:48条          双周期指令:45条
三字节指令:17条       四周期指令:2条

表3-1 MCS-51指令分类
数据传送指令(29) 数据处理指令(48) 位操作指令(12) 程序控制指令(22)
1) 内部传送(16)
2) 外部传送(4)
3) 查表     (2)
4) 交换     (5)
5) 栈操作   (2) 1) 算术运算(24)
2) 逻辑运算(24) 1) 位传送(2)
2) 位置值(4)
3) 位逻辑(6) 1) 调用及返回(4)
2) 无条件转移(4)
3) 条件转移  (11)
4) 循环       (2)
5) 空操作     (1)

2. 符号约定
 Rn          表示当前工作寄存器中的R0R7
 Direct      表示对内部单元直接寻址的8位地址
 Ri        表示8位地址指针R0或R1,地址在R0或R1中。
 DPTR      表示16位地址指针,地址在DPTR中。
 #data       表示8位立即数。
 #data16      表示16位立即数。
 A+基地址  表示以A为变址寄存器。
 addr11      表示短转移的11位地址。
 addr16      表示长转移的16位地址。
 rel         表示相对转移的地址偏移量。
 bit         表示位地址。
 (xx)         表示XX单元的内容,如(A)表示寄存器A的内容。
 ((xx))       表示以(xx)为指针,所指单元的内容。例如,
                  ((DPTR))表示数据指针DPTR所指单元的内容。
3. 寻址方式
表 F1-1  MCS-51指令系统的寻址方式
寻 址
方 式 
寻 址 范 围 
操作数形式 
举  例
寄存器
寻址 R0-R7 ,DPTR 
Acc,B,C(Cy 位) 
寄存器名 MOV  R3,A
INC  DPTR
直接
寻址   内部RAM     00H-7FH
特殊功能寄存器  80H-FFH 8位地址
SFR名 MOV  79H,SP
PUSH  P1

 直接
位寻址 内部RAM位寻址区 (20H-2FH):
  位地址00H-7FH
可寻址的特殊功能寄存器:
  位地址  80H-F7H 8位地址
位名
SFR名.位序 MOV  C,78H 
CLR  TR0
ANL  C,P0.1

寄存器
间接
寻址   以数据指针表示操作数。
  内部RAM  00H-7FH @R0
@R1 MOV  A, @R0 
ADD  A, @R1
   外部RAM或I/O端口
  00H-FFH / 0000H-FFFFH @R0 ,@R1@DPTR MOVX  A, @R0
MOVX  @DPTR,A
立即
寻址   8位(二进制)立即数, # data MOV  A,# 1
   16位(二进制)立即数 # data16 MOV  DPTR,#2000H
基址

变址
寻址      以变址方式读程序存贮器
 实际地址=基址+变址偏移量
 8位无符号变址偏移量由A提供
 基址由PC或DPTR提供 @A+DPTR
@A+PC MOVC  A,@A+DPTR
MOVC  A,@A+PC

转 移 地 址 的 寻 址 方 式
相对
寻址 转移地址= 基址+相对偏移量rel
 基址为取指令后的PC 值 
8位有符号数rel在指令中给出 rel SJMP  0EBH
  标号 SJMP  LOOP   标号
直接
寻址 短转移,指令直接给出11位地址 Addr11或标号 AJMP  NEW   标号
 长转移,指令直接给出16位地址 Addr16或标号 LJMP  2010H
(二) 数据传送指令
表 3-2  数据传送指令
操作码 目标操作数 可选择的源操作数 说         明
MOV A
Rn
direct
@Ri
DPTR  Rn;direct;@Ri;# data
 A;direct;# data
 A;Rn;direct;@Ri;# data
 A;direct;# data
 # data16  内部传送
 内部传送
 内部传送
 内部传送
 数据指针赋值
PUSH
POP 隐含(SP)
direct  direct
 隐含(SP)  压栈,只能用直接寻址
 退栈,只能用直接寻址
XCH A  Rn; direct; @Ri  内部交换
XCHD
SWAP A
A  @Ri
 隐含A  只交换低四位
 A的高、低四位互换
MOVX A
@Ri
@DPTR  @Ri; @DPTR
 A
 A   A与外部数据存储器间传送
MOVC A  @A+DPTR; @A+PC   读外部程序存储器
MOV C
bit  bit
 C   Cy与可寻址位间传送

1. 数据传送指令的一般性说明
 指令的一般格式:  操作码  目标操作数,源操作数
操作码  说明操作的性质
操作内容一般为   (目标操作数)←(源操作数)
 8位操作数的形式有A、Rn、direct、@Ri、# data 等五种
16位操作数的形式有DPTR 与 # data16
1位操作数的形式有 C 与 bit 
 目标与源应同类型,且有规定的允许搭配,一般可逆。
A及direct可全搭配,@Ri、Rn不能相互搭配,# data只可作源.。
 传送指令一般不影响标志位。
直接改写PSW的情况除外,改写Acc影响P标志。
2. 内部传送(MOV)
 内部RAM、特殊功能寄存器(SFR)之间的数据传送。
 注意立即数 #XXH与直接地址XXH 的区别。
 @Ri指针使用要点:①与循环配合,适用于连续数据区的操作。
②Ri应先赋确定值。i=0,1。
③是XCHD指令唯一的源操作数。

3. 外部传送(MOVX)
 以指针方式读、写外部数据存储器或I/O端口。
 @DPTR提供16位地址指针,可访问总线扩展的整个64k空间。
 @Ri只提供低8位地址指针,适用于256个地址的小规模总线扩展。
或者由P2口以I/O方式提供高8位(页) 地址,采用页访问模式。例如:
MOV   P2,#30H     ;由P2口提供高8位地址30H
MOV   R0,#0        ;低8位地址为00H
MOVX  A,@R0       ;读(3000H)单元

 应用例:将内部30H40H单元的内容送外部数据存储器,从4000H单元开始存放。
 
MOV  R0,#30H
MOV  R2,#17
MOV  DPTR,#4000H
LOOP: MOV  A,@R0
MOVX  @DPTR,A
INC  R0
INC  DPTR
DJNZ  R2,LOOP
;设置(内部)源指针初值
;设置循环计数器初值
;设置(外部)目标指针初值
;循环入口,读源数据
;写目标数据
;源指针下移
;目标指针下移
;循环计数器减一,不为0则继续循环 

4. 读外部程序存储器(MOVC)
 读取外部程序存储器中的数据,用于查表。
 MOVC  A,@A+PC   ;(A)←((A)+(PC)+1)
PC为本指令的地址,取指令后加一。
变址偏移量(A)是8位无符号数,因此查表的范围在(PC)+1  (PC)+255。
 MOVC  A,@A+DPTR   ;(A)←((A)+(DPTR))
DPTR是16位指针,因此查表的范围为全64k空间。
 应用例:查Y(x)函数表。
3000H  MOV A,#表元素序号
3002H  ADD A,#表头偏移量
3004H  MOVC A, @A+PC

       ORG 30A0H
TABLE: DB 17,22,34,58,82,103
表头偏移量=表头地址-(MOVC指令地址+1)

5. 栈操作(PUSH / POP)
 堆栈在内部RAM区。
 PUSH和POP的对象可以是内部RAM单元或SFR。
 寻址方式只能用direct。例如,
PUSH 30H ;(SP)←(SP)+1,((SP))←(30H)
POP DPH  ;(DPH)←((SP)),(SP)←(SP)-1

6. 交换(XCH / XCHD /SWAP)
 XCH 字节交换:A与内部RAM单元或SFR交换。例如
XCH A,R2  ;(A)(R2)
 XCHD 半字节交换:A与内部RAM单元进行低四位交换,只能用寄存器间址@Ri。例如
XCHD A,@R1    ;(A)D0- D 3 ((R1))D0- D 3
 SWAP A  ;(A)D0- D 3  (A)D4- D 7
 应用例:拆字,将压缩BCD码扩展为单字节BCD码。

MOV  R0, #30H   设立指针
MOV  A, #0     ;(A)=0
XCHD  A, @R0   ;(A)=0BH
MOV  R4, A    ;(R4)=0BH
XCH  A,30H    ;(A)=30H
SWAP  A       ;(A)=03H
MOV  R3,A     ;(R3)=03H

(三) 算术运算指令
表 3-3  算术运算指令
操作码 目标操作数 参与运算的操作数 说     明 Cy AC OV P
ADD A Rn; direct; @Ri; # data 不带进位加 
 
 
 

ADDC A Rn; direct; @Ri; # data 带进位加    
SUBB A Rn; direct; @Ri; # data 带借位减    
MUL AB (A)*(B) 积在(B)(A) 


 

DIV AB (A)/(B) 商 (A) ,余数 (B)    
DA  A 只对加法作十进制修正  - - 
INC A; Rn; direct; @Ri; DPTR 加一 




DEC A; Rn; direct; @Ri (无DPTR) 减一    
*“”表示标志位根据运算结果取值,“-”表示对标志位无影响。

1. 算术运算指令的一般性说明
 除加1/减1指令外,一般以累加器Acc为目标,且影响标志位。
 没有不带借位减指令。用SUBB作不带借位减运算,Cy应先清零。
 乘法若  积 > 255 , 则OV = 1  除法若  除数 = 0 , 则OV = 1 。
 DA  A 指令只对ADD 或ADDC作十进制修正。
 无 DEC  DPTR指令。

2. 加/减指令应用例
 将内部RAM中从30H开始存放的10个双字节无符号整数相加,其和送(R5 R4 R3),低字节在R3。
 

 
MOV  R0,#30H
MOV  R2,#10
MOV  R3,#0
MOV  R4,#0
MOV  R5,#0
LOOP:MOV  A,@R0
ADD  A, R3
MOV  R3,A
INC  R0
MOV  A,@R0
ADDC  A,R4
MOV  R4,A
INC  R0
MOV  A,#0
ADDC  A,R5
MOV  R5,A
DJNZ  R2,LOOP

 
 将内部RAM中从30H开始存放的10个4位十进制正整数(压缩BCD码)相加,其和送(R5 R4 R3),低字节在R3。

 比较A与B中的无符号数,大数存B。
MOV  R2,A
CLR  C       ;确保C = 0
SUBB  A,B
JC  DONE     ;若有借位,A<B,转DONE 结束。
MOV  B,R2  ;没有借位,A>B,将大数存B。
DONE: 
 

3. 乘/除指令应用例
 双字节数乘单字节数:双字节数在(R3R4),单字节数在(R2),积送(R3R4R5)
 
MOV  A,R2   
MOV  B,R4   
MUL  AB       (R4)(R2)
MOV  R5,A   
MOV  R4,B   
MOV  A,R2   
MOV  B,R3   
MUL  AB       (R3)(R2)
ADD  A,R4   
MOV  A,#0   
ADDC  A,B   
MOV  R3,A   
 

 单字节二进制数转十进制(BCD)数:二进制数在A,十进制数存入(R2R3)
 
MOV  B,#10
DIV  AB       除十, 余个位
MOV  R3,B   个位存R3
MOV  B,#10
DIV  AB      再除十, 余十位
MOV  R2,A  商为百位,存R2
MOV  A,B
SWAP  A     
ADD  A,R3  十位与个位合并
MOV  R3,A;