当前位置:首页 > 单片机原理与应用(第三章)及实验报告
单片机原理与应用(二)
第三章 单片机的指令系统及程序设计
单片机的应用可归纳为是对单片机的内、外存储器进行“存取”的操作,而“输入输出”的操作是对P0、P1、P2、P3这四个与芯片外部引脚相连的专用存储器的“存取”。
“存取”操作是在存储器之间进行的,可以直接用存储器的地址,如18、35H 也可以用专用的或自定义的变量名,如 A,R1, P3, Addr1,X1,ON。 3.1 MCS-51单片机指令系统概述
共有111条指令。
指令长度:单字节有49条,双字节有45条,三字节有17条。
执行时间:单周期指令有57条,双周期指令有52条,四周期指令有2条。 有7种寻址方式,42种助记符,33种功能。 指令可分为三大类:
1.数据传送指令:MOV、MOVC、MOVX
2.运算指令: ADDC、SUBB、RLC、ANL、SETB、CLR
3.转移控制指令:LJMP、JB、JNB、JZ、CJNE、DJNZ、LCALL、RET 指令格式:
标号: 功能助记符 [(目标操作数),(源操作数)] ;注释
例 START: MOV R1,#25H ; 常数25H送给寄存器R1
MOV A,45H ; 地址45H单元中的内容送给寄存器A
功能助记符也叫操作码。
3.2 MCS-51单片机指令系统的寻址方式
⑴ 立即(常数)寻址:MOV A,#18 ; 等价于C语言的A=18 表示为:A?18
MOV A,#3CH ; 等价于C语言的A=0X3C A?3CH MOV DPTR,#25D8H
⑵ 直接寻址: MOV A,18 ; 等价于C语言的A=数组名[18] A?(18)
MOV A,5BH ; 等价于C语言的A=数组名[5BH] A?(5BH) MOV DPH,62H ANL 40H,#50H LJMP 1234H
⑶ 寄存器寻址: MOV A,R1 ; 等价于C语言的A=R1 A?R1
MOV 27H,SP
⑷ 寄存器间接寻址:MOV A,@R1 ; 等价于C语言的A=数组名[R1] A?(R1)
MOVX A,@R1
MOVX A,@DPTR ; 等价于C语言的A=数组名[DPTR] A?(DPTR)
MOV @R0,#56H ; 等价于C语言的数组名[R0]=0X56 (R0)?56H
⑸ 相对(PC)寻址: SJMP 0E4H ; 等价于C语言的 goto 标号;
JZ -115 ; 等价于C语言的 if (A==0) goto 标号;
⑹ 变址寻址:MOVC A,@A+DPTR ; 等价于C语言的A=数组名[A+DPTR] A?(A+DPTR)
MOVC A,@A+PC
⑺ 位寻址: MOV C,25H C?(25H) MOV 25H,C (25H)?C SETB P1.0 P1.0?1 CLR P2.5 P2.5?0
SETB 37H (37H)?1 应表示为:(26H).7?1 更确切。 因为: MOV 37H, #1 也表示为:(37H)?1 3.3 MCS-51单片机指令系统的使用要点 3.3.1 会影响标志位的指令
PSW中的 C:进位 AC:半进位 OV:溢出 P:奇偶 例:(-104)+(-117)= (10011000) + (10001011) 补码运算
执行 MOV A, #98H 10011000 ADD A, #8BH +10001011 之后 A=23H=35, C=1, AC=1, OV=1, P=1 100100011 关于溢出:指令进行算术运算时,是以补码进行的。
值的范围:-128~+127,当运算的结果超出此范围时,OV=1 。
例:(-5)+(-6)= (11111011) + (11111010)
执行 MOV A, #0FBH 11111011
ADD A, #0FAH +11111010 之后 A=F5H= -11, C=1, AC=1, OV=0, P=0 111110101
3.3.2 伪指令:提供汇编的控制信息。
1. ORG 16位地址 ;指明下一条的地址 例1: ORG 100H ;指明下一条指令的地址是100H LJMP Main1 ;这条指令从程序存储器地址的100H开始存放
2. [标号:] DB 单字节数据项表 ;针对程序存储器 例2: ORG 2000H
MA:DB 68H,0F5H,128 ;MA≡2000H,(2000H)=68H,(2001H)=128 若执行指令 MOV DPTR,#MA ;等价于 MOV DPTR,#2000H CLR A ; A?0
MOVC A,@A+DPTR ;A?(A+DPTR)=(0+2000H)=68H
3. [标号:] DW 双字节数据项表 ; 例3: ORG 0F00H
MA: DW 68F5H,0234H
4. 名字 EQU 表达式 ;给表达式的值或字符串取名 这里的“名字”等同于高级语言中的变量名。 高级语言中注重“变量”,而汇编语言注重“地址”。 例4:ABC EQU 58H ; ABC≡58H
DianHuo EQU P1.4 ; DianHuo≡P1.4
指令 MOV A,ABC ; 等价于 MOV A,58H ;A?(58H) 指令 MOV A,#ABC ; 等价于 MOV A,#58H ;A?58H 指令 SETB DianHuo ; 等价于 SETB P1.4
5. 名字 DATA 直接字节地址 ;给内存RAM单元取名 6. 名字 WDATA 直接字节地址 ;给外存RAM单元取名 7. 名字 BIT 位地址 ;给可寻址的位单元取名 例5: DianHuo EQU P1.4 ; DianHuo≡P1.4 (或 DianHuo BIT P1.4 ; DianHuo≡P1.4 ) 指令 SETB DianHuo ; 等价于 SETB P1.4 BIT、DATA、WDATA是EQU的特例。
8. [标号:] END ;
9. [标号:] DS 表达式 ;空出若干个存储单元
3.3.3 指令系统的分类:共111条,可分为五大类。 1. 数据传送指令:不影响C、AC、OV ,影响P。 1). 内部数据存储器RAM的传输指令
汇编指令 机器指令
⑴ MOV A,R5 11101r r r
MOV A,65H 11100101 01100101 MOV A,#65H 11100100 01100101
MOV A,@R1 1110011 i ⑵ MOV R6,A (书上有错)
MOV R3,82H 10101r r r 10000010 MOV R0,#7DH 01111r r r 01111101 ⑶ MOV 15H,A ; (15H)?A MOV 38H,R5 ; (38H)?R5 MOV 6EH,@R1 ; (6EH)?(R1) MOV 53H,#8EH ; (53H)?8EH
例: K3 EQU 38H ; 请注意格式的对齐
MOV K3,R5 ; (K3)?R5 MOV 0E3H,2AH
⑷ MOV @R0,A MOV @R1,75H MOV @R0,#3BH
⑸ MOV DPTR,#15A3H ; DPTR?15A3H
⑹ PUSH 67H ; SP?SP+1 , (SP)?(67H) POP PSW ; PSW?(SP), SP?SP-1 ⑺ XCH A,R3 ; 字节交换 A←→R3 XCH A,27H ; A←→(27H) XCH A,@R1 ; A←→(R1)
⑻ XCHD A,@R0 ; 字节的低4位交换,高4位不变 SWAP A ; A的高4位和低4位交换 2). 累加器A与外部数据存储器RAM的传送指令 MOVX A,@DPTR ; A?(DPTR) MOVX @DPTR,A
MOVX A,@R1 ;A?(P2R1) MOVX @R0,A ;(P2R0) ?A 3). 查表指令(对程序存储器ROM) MOVC A,@A+PC
MOVC A,@A+DPTR ; A?(DPTR+A)
例:①对内部RAM:MOV A,@R0 ; R0的内容为表格中存放数据的地址。
②对外部RAM:MOVX A,@R0 ; P2,R0 为存放数据的地址
MOVX A,@DPTR ;
③对程序ROM:MOVC A,@A+DPTR ;一般A=0,DPTR作为增量。 表中取出的值与指定的值(如字符‘B’)比较、判别: CJNE A, ‘B’, L1
或 CJNE A,#42H,L1 ; 若 A≠42H 则转移到L1执行。 2. 算术操作指令
1). 加法指令 :⑴、⑵、⑷会影响C、AC、OV 、P。 ⑴ 不带进位的加法运算
ADD A,R3 ; A?A+R3 ⑵ 带进位的加法运算
ADDC A,R3 ; A?A+R3+C ⑶ 增量指令 INC A
INC R4 ; R4?R4+1
INC @R1 ; (R1)?(R1)+1 ⑷ 十进制调整指令
DA A ; 当A的高四位(低四位)的C=1(AC=1)或者大于9,则进行加6调整。 例: MOV A,#59H
ADD A,#69H ; A?59H+69H=C2H, C=0, AC=1 必须保证两个操作数均为BCD码 DA A ; A?C2H+66H=28H,C=1 2). 减法指令 :⑴会影响C、AC、OV 、P。 ⑴ 带借位减法指令 SUBB A,R5
SUBB A,63H ; A?A-(63H)-C SUBB A,@ R1 SUBB A,#4AH ⑵ 减1指令 DEC A DEC R3 DEC @R1 DEC 57H 3). 乘法指令
MUL AB ; A?A×B 结果的高8位在B, 低8位在A。 4). 除法指令
DIV AB ; A?A/B 结果的商在A, 余数在B。 3. 逻辑运算指令
1). 单操作数逻辑运算指令 ⑴ 累加器清零 CLR A
其余的寄存器或存储单元的清零,只能用 MOV R3,#00H ⑵ 累加器取反 CPL A ⑶ 累加器左移 RL A
RLC A ; 带进位C ⑷ 累加器右移 RR A
RRC A ; 带进位C
2). 双操作数逻辑运算指令:注意操作数没有 ANL 35H,R2的形式。 ⑴ 逻辑与
ANL 35H,A ; (35H)?(35H)∧A ⑵ 逻辑或
ORL A,@R1 ; A?A∨(R1)
⑶ 逻辑异或 若 MOV 6BH,#0C5H 11000101 XRL 6BH,#59H ;(6BH)?(6BH) + 59H=9CH + 01011001 主要用在判断两个字节内容是否相等。 10011100 相等时的结果为0。 4. 控制转移指令
1). 无条件转移
⑴ AJMP 11位地址 ;(PC)?PC的高5位后接11位地址 PC的高5位 地址段(2KB) 00000bbb XX 0000~07FF 00001bbb XX 0800~0FFF
共分享92篇相关文档