第 3章 单片机指令系统
3.1 MCS- 51指令简介
3.2 指令系统
LOOP,MOV A,R0 ;将 R0的内容送 A
[标号 ] 操作码 第一操作数 第二操作数 [注释 ]
(目的操作数) (源操作数)
注:白色的内容不是必须的
3.1 MCS- 51指令简介
一,MCS- 51指令格式
二,MCS- 51系列单片机指令系统分类
按寻址方式分为以下七种:按功能分为以下四种:
1,立即立即寻址 1,数据传送指令位操
2,直接寻址 2,算术运算指令
3,寄存器寻址 3,逻辑运算指令
4,寄存器间接寻址指令 4,控制转移类指令
5,相对寻址 5,位操作指令
6,变址寻址
7,位寻址
三,寻址方式
寻址方式:寻找(或确定)操作数所在单元地址的方式。
寻址方式越多,计算机寻址能力越强,但指令系统也越复杂。
说明:以下讨论的寻址方式都是针对源操作数的。但实际
上目的操作数也有寻址问题。
1、寄存器寻址 MOV A,Rn
操作数在寄存器中,如 R0~R7,A,B,Cy(位 ),DPTR
2、直接寻址 MOV A,40H
操作数直接以单元地址形式给出(也可以寄存器名称形式
给出,但 A B DPTR 除外)
如,MOV A,P0 ; MOV R0,TH0
3、寄存器间接寻址 MOV A,@R1
操作数是通过寄存器间接得到的。
4、立即寻址 MOV A,#40H
操作数在指令中直接给出。
5、基址寄存器加变址寄存器寻址
以 DPTR或 PC为基址寄存器,以 A为变址寄存器,
以两者相加形成的 16位地址为操作数的地址。
MOVC A,@A+DPTR
MOVC A,@A+PC
四,指令中常用符号说明
Rn——当前寄存器区的 8个工作寄存器 R0~ R7(n= 0~ 7);
Ri——当前寄存器区可作地址寄存器的 2个工作寄存器
R0和 R1(i= 0,1);
direct——8位内部数据存储器单元的地址及特殊功能
寄存器的地址;
#data——表示 8位常数 ( 立即数 ) ;
#datal6——表示 16位常数;
add 16——表示 16位地址;
addrll——表示 11位地址;
rel——8位带符号的地址偏移量;
bit——表示位地址;
@——间接寻址寄存器或基址寄存器的前缀;
( )——表示括号中单元的内容
(( ))——表示间接寻址的内容;
五,MCS- 51指令简介
1,以累加器 A为目的操作数的指令
MOV A,# data ; A← # data
MOV A,Rn ; n=0~7,A← (Rn)
MOV A,@Ri ; i=0,1, A← ((Ri))
MOV A,direct ; A← (Rn) direct为内部 RAM或 SFR地址
注:
MOV A,@Ri ; 以 Ri的内容为地址,把该地址中
的内容送到 A中去。 A← ((Ri))
MOV A,R0 ; 将 R0的内容送到 A去。 A← (R0))
MOV A,#20H ; (A) = 20H A的内容为 20H
MOV A,20H ; (A) = (20H) A的内容为 20H中的内容
注意以上两组指令的不同点
例:
MOV R0,#30H
MOV 30H,#60H
MOV A,@R0
(A)=?
2,以 Rn为目的操作数的指令
MOV Rn,A ; Rn ← (A), n=0~7
MOV Rn, direct ; Rn ← (direct)
MOV Rn,# data ; Rn ← # data
3,以直接地址为目的操作数的指令
MOV direct,A ; direct← (A)
MOV direct,Rn ; direct← (R n), n=0~7
MOV direct,@Ri ; direct← (( Ri ) ), i=0,1
MOV direct,direct ; direct← (direct)
MOV direct,#data ; direct← # data
4,以寄存器间接地址为目的操作数指令
MOV @Ri,A ; ((Ri) )← (A), i=0,1
MOV @Ri, direct ; ((Ri) )← (direct)
MOV @Ri,# data ; ((Ri) )← # data
应用举例 1
MOV P1,#0FEH ; 11111110B
可以使 P1.0上的发光二极管点亮
MOV P1,#0F0H ; 11110000B
可以使 P1口上的上面 4个发光二
极管点亮
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
5v
8段数码管显示
P1.0 a
P1.1 b
P1.2 c
P1.3 d
P1.4 e
P1.5 f
P1.6 g
P1.7 dp
5v
MOV P1,#00H ; 显示 8.
MOV P1,#0F8H ; 显示 7
MOV P1,#88H ; 显示 A
应用举例 2
一个引脚的高低电平,可以通过“光电耦合器”控制
继电器,从而以“弱电”控制“强电”。
3.2 指令系统
一,数据传送指令位操作
1,16位数据传输指令
MOV DPTR,#data16; DPTR← # data16
DPTR----数据指针,为 SFR中 (DPH),(DPL)
MOV DPTR,#2010H
相当于,MOV DPH,#20H
MOV DPL,#10H
2,堆栈操作指令
进栈指令 PUSH direct
如, (SP)=60H,(A)=30H,(B)=70H 时,执行
PUSH Acc ; (SP)+1=61H→SP,(A) → 61H
PUSH B ; (SP)+1=62H→SP,(B) → 62H
结果, (61H)=30H,(62H)=70H,(SP)=62H
退栈指令 POP direct
如, (SP)=62H,(62H)=70H,(61H)=30H 时,执行
POP DPH ; ((SP)) →DPH,(SP) - 1=61H→SP
POP DPHL ; ((SP)) →DPL,(SP) - 1=60H→SP
结果, (DPTR)=7030H,(SP)=60H
堆栈的存储原则:先进后出
(SP)
(SP+1)
(SP+2)
(SP+3)
3,累加器 A与外部数据传输指令
MOVX A,@DPTR ; A← ((DPTR))
地址范围 64K
MOVX A,@Ri ; A← ((Ri))
地址范围 0~ 255
MOVX @DPTR,A ; (DPTR) ←(A)
MOVX @Ri,A ; (Ri) ←(A)
4,查表指令
MOVC A,@A+DPTR; A ←((A)+(DPTR))
例, (DPTR)=0300H,( A)= 02H
ROM中 (0302H)=55H
执行:
MOVC A,@A+DPTR
结果,(A)=55H
MOVC A,@A+PC
A ←((A)+(pc))
PC--程序指针,指向下一条指令的地址
例:根据 A中的内容( 0~ 9)查平方表
MOVC A,@A+PC 例子:
地址 机器码 源程序
ORG 0000H
0000 7403 MOV A,#03H
0002 83 MOVC A,@A+PC
0003 00 DB 00H
0004 01 DB 01H
0005 04 DB 04H
0006 09 DB 09H
0007 10 DB 10H
0008 19 DB 19H
0009 24 DB 24H
000A 31 DB 31H
000B 40 DB 40H
000C 51 DB 51H
(顺便讲解如何查机器码) END
5,字节交换指令
XCH A,Rn ; (A) ← →(Ri)
XCH A,direct ; (A) ← →(direct)
XCH A,@Ri ; (A) ← →(Ri)
例,(A)=80H,(R7)=97H
执行,XCH A,R7
结果,(A)=97H,(R7)=80H
例:将片内 RAM 60H单元与 61H单元的数据交换。
XCH 60H,61H ← 对吗?
6,半字节交换指令
XCHD A,@Ri ; (A)0-3 ← →((Ri )) 0 -3
例, (R0)=60H,(60H)=3EH,(A)=59H
执行,XCHD A,@R0
结果,( A) = 5E H
( 60H)= 39 H
二,算术操作类指令
1,加法指令( Addtion)
2,带进位加法指令
3,加 1指令 ( Increase)
4,十进制调整指令
5,带借位减法指令( Subtraction)
6,减 1指令( Decrease)
7,乘法指令( Multiplication)
8,除法指令( Division)
PSW寄存器
C y AC F0 RS1 RS0 OV — P
Cy:进位标志位
AC:辅助进位标志位
F0,供用户使用的标志位
OV:溢出标志位
P:奇偶标志位
A中数据的奇偶性。当 1的个数为奇数,P=1,否则 P=0。
RS1 RS0
0 0 区 0(地址,00H~ 07H)
0 1 区 1(地址,08H~ 0FH)
1 0 区 2(地址,10H~ 17H)
1 1 区 3(地址,18H~ 1FH)
2,带进位加法指令
ADDC A,Rn ; A←(A)+(R n)+(Cy)
ADDC A,@Ri ; A←(A)+((R i )) +(Cy)
ADDC A,direct ; A← ( A)+(direct) +(Cy)
ADDC A,# data ; A← ( A)+#data +(Cy)
对标志位的影响与 ADD相同
3,加 1指令
INC A ; A←(A)+1
INC Ri ; Ri← ( A)+1
INC direct ; direct← ( direct)+1
INC @Ri ; (Ri)←((Ri))+1
INC DPTR ; DPTR←(DPTR)+1
对标志位不产生影响
若,( A)= 0FFH,(Cy)=0
执行,INC A
结果:( A)= 00H,(Cy)=0
4,十进制调整指令
DA A
用途:紧跟在 BCD码加法指令(不包括减法)之
后,进行十进制调整。
( 96H 为压缩 BCD码,表示十位为 9,个位为 6)
如两 BCD码加:
MOV A,#35H
ADD A,#46H
(A)=7BH,并不是 81H
但,DA A 后,
( A)= 81H
5,带借位减法指令( Subtraction)
( 1) SUBB A,Rn ; A← ( A)-(Rn)-(Cy)
( 2) SUBB A,@Ri ; A← ( A)-((Ri) ) -(Cy)
( 3) SUBB A,direct ; A← ( A)-(direct) -(Cy)
( 4) SUBB A,# data ; A← ( A)-#data -(Cy)
( 5) 对标志位的影响
(6) Cy ------ 进位位
( 7) AC ------ 半进位位
( 8) OV ------ 溢出位
6,减 1指令( Decrease)
减 1类指令共 4条,其功能是将操作数指定单元内容
减 1。
DEC A ; A-1→A,A 中内容减 1
DEC Rn ; Rn-1→Rn,Rn中内容减 1
DEC direct ; ( direct) -1→(direct),
直接地址中内容减 1
DEC @Ri ; (Ri)-1→(Ri),Ri间址中的内容减 1
7,乘法指令( Multiplication)
MUL AB ; (A)× (B) 低 8位 → A
高 8位 → B
A,B中都是无符号整数
如果积大于 255,OV= 1,否则 OV= 0;进位标志
总是清零 Cy= 0。
8,除法指令( Division)
DIV AB ; (A)÷ (B) 商 → A
余数 → B
A,B中都是无符号整数
如果除数 B为,0”,OV= 1,否则 OV= 0;
进位标志总是清零 Cy= 0。
三,逻辑运算指令
1,简单逻辑操作指令
CLR A ; A←,0”
CPL A ; A← A
SWAP A ; A0~3 A4~7
例, (A)=3AH,CPL A,(A)=0C5H
0011 1010B → 1100 0101B
(A)=3AH,SWAP A,(A)=0A3H
?
2,循环指令
左循环指令 ( Rotate Accumulator Left)
RL A
例 ( A)= 6CH = 0110 1100B
RL A
(A)=1101 1000B=0D8H
a7 ← a 0 C
带进位左循环指令( Rotate Accumulator Left
through Carry flag)
RLC A
例 ( A)= 6CH = 0110 1100B,(C) =1
RLC A
(A)=1101 1001B=0D9H
a7 ← a 0 C
右循环指令( Rotate Accumulator Right)
RR A
例 ( A)= 6CH = 0110 1100B
RR A
(A)=0011 0110B=36H
a7 ← a 0 C
带进位右循环指令( Rotate A Right with C)
RRC A
例 ( A)= 6CH = 0110 1100B,(C) =1
RRC A
(A)=1011 0110B=0B6H
a7 ← a 0 C
3,逻辑与指令
ANL A,Rn
ANL A,direct
ANL A,# data
ANL A,@Ri
ANL direct,A
ANL direct,# data
∧ --,与”,,有 0即 0,全 1为 1”
0000 0111
∧ ) 1111 1101
0000 0101 B = 05H
4,逻辑或指令
ORL A,Rn
ORL A,direct
ORL A,# data
ORL A,@Ri
ORL direct,A
ORL direct,# data
∨ --,或”,,有 1即 1,全 0为 0”
0000 0110
∨ ) 0110 1101
0110 1111 B = 6FH
5,逻辑异或指令
XRL A,Rn
XRL A,direct
XRL A,# data
XRL A,@Ri
XRL direct,A
XRL direct,# data
--,异或”,,相异为 1,相同为 0”
0000 0110
) 0110 1101
0110 1011 B = 6BH
?
?
例 ( A) =01×××××× B,× 表示随机状态,为 1或 0,执
行下述一组指令执行后 A的值如何?
XRL A,#0C0H ;将累加器 A的内容 D7,D6取反 0 1××××××
ORL A,#03H ;将累加器 A的内容 D1,D0置 1 1 1 0 1 0 0 0 0
ANL A,#0E7H ;将累加器 A的内容 D4,D3清 0 1 0××××××
0 0 0 0 0 0 1 1
1 0 ×××× 1 1
1 1 1 0 0 1 1 1
1 0 × 0 0 × 1 1
解,执行上述指令后,( A) =10× 00× 11B。
习题 1,如何将累加器 A中的数据高 4位清 0,低位不变?
习题 2,如何将寄存器 R2中的数据奇数位取反,偶数位不变?
四,控制转移类指令
1,跳转指令
短跳指令 AJMP addr11
PC←addr11,跳转范围 2k
长跳指令 LJMP addr16
PC←addr16,跳转范围 64k
间接跳转指令 JMP @A+DPTR
PC← ( A)+( DPTR)
相对转移指令 SJMP rel PC←(PC)+2
PC←(PC)+rel
rel--机器码的相对偏移量,为 8位补码
转移范围:前 128~后 127字节
rel=(目的地址-转移指令地址-转移指令字节数)补
=(目的地址- PC当前值)补编程时,可用标号代
替转移目的地址,rel 交给编译程序计算。
SJMP NEXT (或 AJMP NEXT,SJMP NEXT)

NEXT,…
原地踏步指令的指令,
HERE,SJMP HERE
常写成,SJMP $
地址 机器码 源程序 注释
ORG 0000H ; 整个程序起始地址
0000 20 00 30 LJMP MAIN ; 跳向主程序
ORG 0030H ; 主程序起始地址
0030 C3 MAIN,CLR C ; MAIN为程序标号
0031 E6 LOOP,MOV A,@R0
0032 37 ADDC A,@R1
0033 08 INC R0
0034 DA FB DJNZ R1,LOOP ;相对转移
0036 80 03 SJMP NEXT
0038 78 03 MOV R0,#03H
003A 18 NEXT,DEC R0
003B 80FE SJMP $ ; HERE,SJMP HERE
END ; 结束标记
程序中标号与地址之间的关系
2,条件转移指令
JZ rel ;( A)= 0,转移
JNZ rel ;( A) ≠0,转移
3,比较不相等转移指令
CJNE A,#data,rel; (A)=#data,继续 C←0
(A)> #data,转 C←0
(A)< #data,转 C←1
特点:只有<时,C←1
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
4,减 1 不为 0 转移指令
DJNZ Rn,rel ; Rn ←(Rn ) - 1
(Rn ) ≠0,转移
(Rn ) = 0,继续
DJNZ direct,rel
例:延时子程序
delay,MOV R7,#03H
delay0,MOV R6,#19H
delay1,DJNZ R6,delay1
DJNZ R7,delay0
RET
5,调用子程序指令
短调用指令
ACALL addr11
长调用指令
LCALL addr16
编程时,可用标号代替转移目的地址,addr11,
addr16交给编译程序计算。
7,中断返回指令
NOP
6,子程序返回指令
8,空操作指令
RETI
RET
RET指令从堆栈弹出保存的 PC地址,实现子程序返回。
五,位操作指令
1,数据位传送指令
MOV C,bit ; bit 可直接寻址位 C←(bit)
MOV bit,C ; C 进位位 (bit) ← C
例:将位地址 20H的一位数传送到位地址 30H中:
MOV C,20H
MOV 30H,C
位变量修改指令
CLR C ; 将 C= 0
CLR bit
CPL C ; 将 C求反再存入 C
CPL bit ; 将 bit求反再存入 bit
SETB C ; 将 C= 1
SETB bit ; (bit) ← 1
2,位变量逻辑指令
ANL C,bit
ANL C,bit
ORL C,bit
ORL C,bit
3,条件转移类指令
JC rel ;如 C=1,转移
JNC rel ;如 C=0,转移
JB bit,rel ;如 bit=1,转移
JNB bit,rel ;如 bit=0,转移
JBC bit,rel ;如 bit=1,转移并 bit= 0