51单片机学习

51单片机指令集

*51指令不区分大小写

1个机器周期=12个时钟振荡周期

只有乘除两条指令的执行时间为4个机器周期

指令由两部分组成:操作码+操作数

指令系统的寻址方式

共7种寻址方式

  1. 寄存器寻址方式

    MOV A,Rn;n=0~7 寄存器Rn的内容传送到累加器A

  2. 直接寻址方式

    MOV A,40H 直接地址传送给累加器A

  3. 寄存器间接寻址方式

    MOV R1,#40H

    MOV A,@Ri 累加器传送到外部RAM

    PUSH(压栈)和POP(出栈)

  4. 立即寻址方式

    MOV A,#40H

    MOV A,#0FFH

    若立即数的首位为A~F,前面还要加零

  5. 基址寄存器加变址寄存器间址寻址方式

    以DPTR或PC作基址寄存器,以累加器A作为变址寄存器。

    MOVC A,@A+DPTR

    MOVC A,@A+PC

    JMP @A+DPTR

    专门针对程序存储器的寻址方式

  6. 位寻址方式、

    MOV C,bit

    MOV C,40H 直接寻址位传送到进位位C

    可寻址位4种表示方法

    1. 直接使用位地址。例如PSW.5的位地址为0D5H。
    2. 用位名称表示。例如PSW.5用F0表示该位。
    3. 单元地址加位数的表示方法。例如PSW.5可表示为(0D0H).5
    4. 特殊功能寄存器符号价位数的表示方法。例如PSW.5。
  7. 相对寻址方式

    目的地址=源地址+2(相对转移指令字节数)+rel

指令系统分类

  1. 数据传送类(28条)
  2. 算术操作类(24条)
  3. 逻辑运算类(25条)
  4. 控制转移类(17条)
  5. 位操作类(17条)

指令中符号的意义:

Rn 当前寄存器区的8个工作寄存器R0~R7。

Ri 当前选中的寄存器区中可作间接寻址寄存器的2个寄存器R0、R1。

Direct 直接地址,即8位的内部数据存储器单元或特殊功能寄存器的地址。

#data 包含在指令中的8位立即数。

#data16 包含在指令中的16位立即数。

rel 相对转移指令中的偏移量,为8位的带符号补码数。

DPTR 数据指针,可用作16位的数据地址寄存器。

bit 内部RAM或特殊功能寄存器中的直接寻址位。

C(或Cy) 进位标志位或位处理机中的累加器。

addr11 11位目的地址

addr16 16位目的地址

@ 间接寻址寄存器前缀

(X)X中的内容

((X))由X寻址的单元中的内容

数据传送类指令

MOV <目的操作数>,<源操作数>

1. 以累加器为目的操作数的指令

MOV A,Rn

MOV A,@Ri

MOV A,direct

MOV A,#data

2. 以Rn为目的操作数的指令

MOV Rn,A

MOV Rn,direct

MOV Rn,#data

3. 以直接地址direct为目的操作数的指令

MOV direct,A

MOV direct,Rn

MOV direct1,direct2

MOV direct,@Ri

MOV direct,#data

4. 以寄存器间接地址为目的操作数的指令

MOV @Ri,A

MOV @Ri,direct

MOV @Ri,#data

5. 16位传送指令

MOV DPTR,#data16

DPH:指向高八位

DPL:指向低八位

6.堆栈操作指令
进栈指令

PUSH direct

出栈指令

POP direct

----先进后出!!!

7. 累加器A与外部数据存储器传送指令

MOVX A,@DPTR

MOVX A,@Ri

MOVX @DPTR,A

MOVX @Ri,A

8.查表指令

MOVC A,@A+PC PC中的内容是将要执行的下一条指令的地址

MOVC A,@A+DPTR

9. 字节交换指令

XCH A,Rn

XCH A,direct

XCH A,@Ri

10. 半字节交换指令

XCHD A,@Ri 累加器的低4位与内部RAM低四位交换

算数操作类指令

1. 加法指令

ADD A,Rn

ADD A,direct

ADD A,@Ri

ADD A,#data

结果总是放在累加器ACC中

位7有进位Cy=1,否则置零

位3有进位Ac=0,否则置零

位6和位7有且只有一个进位OV=0,否则置零

A中结果1的位数为奇数个,奇偶校验位P=1,否则置零

2. 带进位加法指令

ADDC A,R0

ADDC A,direct

ADDC A,@Ri

ADDC A,#data

3. 加1指令

INC A

INC Rn

INC direct

INC @Ri

INC DPTR

不影响PSW中的任何标志(Cy,Ac,OV)!

4. 十进制调整指令

用于对BCD码十进制数加法运算结果的内容修正

两个压缩BCD码按二进制相加之后,必须经本指令的调整才能得到正确的和数(仍为压缩BCD码表示)。

DA A

应用背景

①执行前一般有一条加法指令。

②加法指令中的两个家属,应该是用压缩BCD码表示的十进制数,和存放在A中。

③执行完DA指令后,A中存放的数是两个加法指令的十进制和,也使用压缩BCD码表示。

5. 带借位的减法指令

SUBB A,Rn

SUBB A,direct

SUBB A,@Ri

SUBB A,#data

位7有借位Cy=1,否则置零

位3有借位Ac=0,否则置零

位6和位7有且只有一个借位OV=0,否则置零

6. 减1指令

DEC A

DEC Rn

DEC direct

DEC @Ri

7. 乘法指令

MUL AB A×B→BA

如果积大于255,则。如果OV为1,需读B。

8. 除法指令

DIV AB A/B→A(商),余数→B

如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。

逻辑运算指令

1.简单逻辑操作指令

CLR A 功能是对累加器A清“0”

CPL A 功能是将累加器A的内容按位逻辑取反

不影响PSW中的任何标志(Cy,Ac,OV)!

2. 左环移指令

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

3. 带进位左环移指令

RLC A 功能室将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy进入Acc.0,不影响其它标志。

4. 右环移指令

RR A

5. 带进位右环移指令

RRC A

6. 累加器半字节交换指令

SWAP A 将累加器A的高半字节(Acc.7Acc.4)和低半字节(Acc.3Acc.0)互换。

7.逻辑与指令

ANL A,Rn

ANL A,direct

ANL A,#data

ANL A,@Ri

ANL direct,A

ANL direct,#data

8.逻辑或指令

ORL A,Rn

ORL A,direct

ORL A,#data

ORL A,@Ri

ORL direct,A

ORL direct,#data

9. 逻辑异或指令

XRL A,Rn

XRL A,direct

XRL A,#data

XRL A,@Ri

XRL direct,A

XRL direct,#data

不同为1相同为0

控制转移类指令

1. 无条件转移指令

AJMP addr11

2. 长跳转指令

LJMP addr16 addr16→可用程序的标号来代替

3.相对转移指令

SJMP rel 处于当前PC值的-128字节——+127字节字节之内

4.间接跳转指令

JMP @A+DPTR

5. 条件转移指令

JZ rel 如果累加器为"0",则转移

JNZ rel 如果累加器非"0",则转移

6. 比较不相等转移指令

CJNE A,direct,rel

CJNE A,#data,rel

CJNE Rn,#data,rel

CJNE @Ri,#data,rel

如果第一操作数(无符号整数)小于第二操作数(无符号整数),则进位标志位Cy置"1",否则置"0"

7. 减1不为0转移指令

DJNZ Rn,rel

DJNZ direct,rel

8. 调用子程序指令

(1) 短调用指令

ACALL addr11

(2) 长调用指令

LCALL addr11

该指令执行时,MCS51执行如下操作:

(1)当前PCL、PCH进栈

(2)addr 16送入PC

9. 子程序的返回指令

RET

10. 中断返回指令

RET1

11. 空操作指令

NOP

位操作指令

1. 数据位传送指令

MOV C,bit

MOV bit,C

2. 位变量修改指令

CLR C 清零

CLR bit

CPL C 求反

CPL bit

SETB C 置1

SETB bit

3. 位变量逻辑与指令

ANL C,bit

ANL C,/bit

4. 位变量逻辑或指令

ORL C,bit

ORL C,/bit

5. 条件转移类指令

JC rel Cy位

JNC rel

JB bit,rel 直接寻址位

JNB bit,rel

JBC bit,rel 直接寻址位=1则转移,并清0直接寻址位

问答

  1. 如何对SFR中的内容进行读写

直接寻址方式访问。MOV A,80H或者MOV A,P0

  1. 如何对52系列单片机的高128字节RAM进行读写?

间接寻址方式访问。

MOV R0,#80H

MOV A,@R0

  1. 如何读出片外数据存储器字节地址为2000H中的内容?

MOV DPTR,#2000H

MOVX A,@DPTR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值