500 likes | 695 Vues
第 3 章 单片机指令系统. 3.1 MCS - 51 指令简介 3.2 指令系统. 3.1 MCS - 51 指令简介. 一、 MCS - 51 指令格式. LOOP: MOV A, R0 ; 将 R0 的内容送 A [ 标号 ] 操作码 第一操作数 第二操作数 [ 注释 ] (目的操作数) (源操作数) 注:白色的内容不是必须的. 二、 MCS - 51 系列单片机指令系统分类 按寻址方式分为以下七种:按功能分为以下四种:
E N D
第3章 单片机指令系统 3.1MCS-51指令简介 3.2指令系统
3.1 MCS-51指令简介 一、MCS-51指令格式 LOOP: MOV A, R0 ;将R0的内容送A [标号]操作码 第一操作数 第二操作数 [注释] (目的操作数) (源操作数) 注:白色的内容不是必须的
二、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← (Rn), 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
P1.0 P1.1 P1.2 P1.3 5v P1.4 P1.5 P1.6 P1.7 应用举例1 MOV P1, #0FEH ; 11111110B 可以使P1.0上的发光二极管点亮 MOV P1, #0F0H ; 11110000B 可以使P1口上的上面4个发光二极管点亮
P1.0 a P1.1 b P1.2 c P1.3 d 5v P1.4 e P1.5 f P1.6 g P1.7 dp 8段数码管显示 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
(SP+3) (SP+2) (SP+1) (SP) 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 堆栈的存储原则:先进后出
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 0000H0000 7403 MOV A, #03H0002 83 MOVC A, @A+PC0003 00 DB 00H0004 01 DB 01H0005 04 DB 04H0006 09 DB 09H0007 10 DB 10H0008 19 DB 19H0009 24 DB 24H 000A 31 DB 31H000B 40 DB 40H000C 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寄存器 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)+(Rn)+(Cy) ADDC A, @Ri ;A←(A)+((Ri )) +(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
C a7 ← a0 2.循环指令 左循环指令 (Rotate Accumulator Left) RL A 例 (A)=6CH = 0110 1100B RL A (A)=1101 1000B=0D8H
C a7 ← a0 带进位左循环指令(Rotate Accumulator Left through Carry flag) RLC A 例(A)=6CH = 0110 1100B, (C) =1 RLC A (A)=1101 1001B=0D9H
C a7 ← a0 右循环指令(Rotate Accumulator Right) RR A 例(A)=6CH = 0110 1100B RR A (A)=0011 0110B=36H
C a7 ← a0 带进位右循环指令(Rotate A Right with C) RRC A 例(A)=6CH = 0110 1100B, (C) =1 RRC A (A)=1011 0110B=0B6H
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交给编译程序计算。
6.子程序返回指令 7.中断返回指令 RET RET指令从堆栈弹出保存的PC地址,实现子程序返回。 NOP RETI 8.空操作指令
五、位操作指令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