单片机复习知识点总结

MCS-51单片机指令系统详解与应用
本文详细介绍了MCS-51系列单片机的硬件支持和指令系统,包括布尔处理机概念、七种寻址方式、指令格式、功能以及常见指令的使用。内容涵盖数据传送、程序存储器访问、位操作、跳转指令等,并通过实例解析了如何根据需求编写汇编指令。

第三章

了解布尔处理机的硬件支持

布尔处理机是一种位处理机。专门用于位处理

操作码必须有,操作数可有可无。

*****************一些易错知识:

PC : 存放下一条欲执行指令。自动加1,形成下一条指令地址;PC不能被MOV指令修改值

SP:堆栈指针,管出栈和入栈的数据


掌握MCS-51系列单片机指令中的常用符号的含义:#、direct、@、addr11、addr16、rel、bit、Rn、Ri、$

#:立即数前导符 ; #8000H表示立即数8000H

direct:8位直接地址;

@:间接寻址前导符 ;

addr11:11位目标地址;

addr16:16位目标地址;

rel:偏移量

bit:位地址;

Rn:表示工作寄存器中R0-R7的任意一个寄存器;

Ri:i只能取0或1

$:当前指令的地址;


掌握MCS-51系列单片机系统的七种寻址方式、每种寻址方式的表示形式及寻址空间

立即寻址:

直接给出操作数本身的寻址方式。

例如:

MOV DPTR,#3000H --------将立即数3000H写入DPTR中。

直接寻址:

直接给出操作数地址的寻址方式。

ps:访问SFR的唯一方式。操作码后面的一个字节是实际操作数地址。内部RAM的高128字节。

例如:

MOV ACC,60H ;

MOV 50H,65H;

MOV ACC,60H,#20H;

寄存器寻址:Rn

指出操作数所在的寄存器。相当于寄存器中放了操作数。

操作码的第三位表示的是R0-R7中的哪一个。

例如:

MOV A,B;

MOV A,#60H;

MOV B,80H;

寄存器间接寻址:Ri

指令指定的寄存器中存放的内容就是实际操作数的地址。相当于寄存器中放的是操作数的地址。

例如:

MOV A,@R1;

MOV @R0,#30H;

MOV @R0,30H;

PS:这里R只能取0或1哦。

基址变址寻址:

用DPTR或PC当成基址;用A当变址。存放8位无符号数。其中DPTR可拆成DPH,DPL两个寄存器使用,但是PC不行。

例如两条查表指令:

MOVC A,@A+DPTR;

MOVC A,@A+PC;

相对寻址:

在相对寻址指令执行时,加上偏移量rel。即 目标地址=rel+(PC);

例如:

假设指令 JNZ NEXT的地址为2000H,当前PC的值为2002H。标号NEXT的地址2040H。求JNZ NEXT的rel。

解:

2040H=2002H+rel

rel=3EH;

位寻址:

略。


掌握MCS-51系列单片机的指令系统(能读懂指令的功能、能写出指令的助记符、能判断指令的正误、能分析和写出程序段的执行结果。

数据传送指令:

内部RAM和寄存器之间的数据传送:16 MOV

MOV :

//能够根据上表写出16条基本的MOV指令

外部RAM和累加器A之间的数据传送:4 MOVX

CPU与外部RAM或者扩展的IO之间进行数据交换时,必须使用MOVX指令,外部数据的传送与接收必须用过寄存器A,只能采用寄存器间接寻址

MOVX A,@DPTR

MOVX A,Ri

MOVX Ri,A

MOVX @DPTR,A

例如:

MOV 30H,#44H;

MOV R1,#30H;

MOVX A,@R1;

MOV DPTR,#1234H;

MOV @DPTR,A;

求最后A和外部RAM中1234H的内容?

最后A=44H;(1234H)=44H;

程序存储器ROM和累加器A之间的数据传输:2 MOVC

MOVC A,@DPTR+A;

MOVC A,@PC+A;

数据交换指令:3

SWAP:

半字节交换指令。

MOV A,#78H;

SWAP A;

(A)=87H

XCHD:

低四位交换指令。

MOV R1,#55H;

MOV 55H,#23H;

MOV A,#67H;

XCHD A,@R1;

(A)=63H (R1)=27H

XCH:

全字节交换指令。

MOV R1,#55H;

MOV 55H,#23H;

MOV A,#67H;

XCH A,@R1;

(A)=67H (R1)=23H

堆栈指令:2

PUSH direct ;

POP direct;

ps:只能是直接寻址。同SFR。

对于PUSH:先移动指针+1,再放数据;

对于POP:先取出数据,再让指针-1;

PUSH,POP只能保护现场数据,不能保护断点。

例如:

MOV A,#12H;

PUSH ACC;

PUSH 30H,#50H;

POP 30H;

POP ACC;

(30H)=50H

(ACC)=12H

例如:

MOV A,#12H;

PUSH ACC;

PUSH 30H,#50H;

POP ACC;

POP 30H;

(30H)=12H

(ACC)=50H

练习:
在执行下列指令后,求A,R0,(60H);
MOV A,#45H
MOV R0,#60H
MOV @R0,A
XCH A,R0
----------------------
A=60H R0=45H (60H)=45H
设RAM中(2456H)=66H,(2457H)=34H,ROM中(2456H)=55H,(2457H)=64H.则(A),(DPTR)?
MOV A,#1
MOV DPTR,#2456H
MOVC A,@A+DPTR
----------------------
(A)=64H  (DPTR)=2456H
//DPTR是一个存放地址的16位寄存器。

三条传送MOV、MOVX、MOVC的格式、功能及它们访问的存储器类型和地址空间,能熟悉使用两条查表指令MOVC指令进行查表:MOVC A,@A+PC和MOVC A,@A+DPTR,可参考P90例4.24中的方法一和方法二;

MOV : 内部RAM;

MOVX : 外部RAM;

MOVC : ROM。

1010H: 30H
1011H: 31H
1012H: 32H
1013H: 33H
1014H: 34H
执行子程序:
1000H: MOV A,#0DH       // (A)=0DH
1002H: MOV A,@A+PC      //(PC)=1003H,@(A+PC)=1010H,等于 MOV A,@1010H = MOV A,30H. (A)=30H 
1003H: MOV RO,A         // MOV R0,#30H
A,RO,PC的内容为多少?
A=30H,RO=30H,PC=1004H.

SWAP A,PUSH和POP指令的格式和功能及其操作数的寻址方式;

ADD、ADDC、DA A、SUBB、INC、DEC、MUL、DIV指令的格式和功能;

加法指令:

ADD : 不带进位的加指令。

ADDC:带进位的加指令。

格式:

ADD A,#data ADD A,direct ADD A,Rn ADD A,@Ri

ADDC A,#data ADDC A,direct ADDC A,Rn ADDC A,@Ri

减法指令:【没有不带借位的减法指令。】

SUBB:带借位的减法指令。

SUBB A,#data SUBB A,direct SUBB A,Rn SUBB A,@Ri

在执行SUBB之前,需要使用CLR C 对Cy清零。

十进制调整指令:

DA A

将A中的内容调整为合适的BCD码。

如果累加器A的低四位大于9或者(AC)=1 : (A)=(A)+06H;

如果累加器A的高四位大于9或者(Cy)=1 : (A)=(A)+ 60H;

MOV A,#33H
ADD A,#49H    // (A)=33H+49H=7CH
MOV B,A       //  (B)=7CH
DA A          //  (A)=7CH+06H=82H
求(A),(B)?
----------------------------
(B)=7CH   (A)=7CH+06H=82H

加一指令:

INC A

INC direct

INC Rn

INC @Ri

INC DPTR

INC不影响Cy,ADD/ADDC会影响Cy。

减一指令:

DEC A

DEC direct

DEC Rn

DEC @Ri

编程实现DPTR的减一操作。
思路:先对低四位减一,在对高四位减一。
CLR Cy
MOV A,DPL;//先送低四位进入中转站A
SUBB A,#01H;
MOV DPL,A;
MOV A,DPH;
SUBB A,#00H
MOV DPH,A

乘除指令:

MUL AB

DIV AB

MUL AB : A*B=BA;高八位放在B中,低八位放在A中。

DIV AB:A/B=A...B


ANL、ORL、XRL、RL、RR、RLC、RRC、CPL A、CLR A指令的格式和功能以及ANL、ORL、XRL的用途:对一个操作数中的部分位置1、清0、求反;

逻辑与指令:

ANL A,#data

ANL A,direct

ANL A,Rn

ANL A,@Ri

ANL direct,A

ANL direct,#data

作用:对某些位清零,另外一些不变。

例如:

ANL A,#01010101B

对A中1,3,5,7位清零。

逻辑或指令:

ORL A,#data

ORL A,direct

ORL A,Rn

ORL A,@Ri

ORL direct,A

ORL direct,#data

作用:对某些位置1,另外一些不变

例如:

ORL A,#01010101B

对A中1,3,5,7位置1。

逻辑异或指令:

XRL A,#data

XRL A,direct

XRL A,Rn

XRL A,@Ri

XRL direct,A

XRL direct,#data

作用:对和1异或的取反,对和0异或的不变

例如:

MOV A,#0111 1101B

XRL A,#0101 0101B

结果是:(A)=0010 1000B

循环移位指令:

RL : 不带Cy的循环左移指令。

RLC:带Cy的循环左移指令。

RR : 不带Cy的循环右移指令。

RRC:带Cy的循环右移指令。

左移一次相当于乘以2,右移一次相当于除以2只能对累加器ACC做移位处理

例如:

MOV A,#40H // 0100 0000

RL A // A=80H 1000 0000

RR A // A =20H 0010 0000

累加器清零与取反指令:

CLR A

CPL A

LJMP、AJMP、SJMP、JMP指令的格式、功能以及跳转范围;

无条件转移指令:4

长转移指令:3BYTE

LJMP addr16

ADDR0-15--->PC

短转移指令:

SJMP rel

PC=PC+rel;

SJMP $ //死循环

绝对转移指令:2BYTE

AJMP addr11

PC=PC+2;

PC0-10<-----addr11

要求转移后的指令地址与原地址高五位不变

散转指令:

JMP @A+DPTR

(DPTR)+(A)----->PC


JZ/JNZ、CJNE、DJNZ、LCALL、ACALL、RET、RETI指令的格式、功能;

JZ:

JZ rel;

累加器判0转移。

若(A)=0,则PC=PC+rel。若(A)!=0,则顺序执行。

JNZ: not zero

JNZ rel;

累加器不判0转移。

若(A)!=0,则PC=PC+rel。若(A)=0,则顺序执行。

CJNE:

CJNE A,direct,rel

CJNE A,#data,rel

CJNE Rn,#data,rel

CJNE @Ri,#data,rel

比较转移指令。

若(A)=direct,则顺序执行。若(A)>direct,则(PC)=(PC)+rel,Cy=0;若(A)<direct,则(PC)=(PC)+rel,Cy=1.

DJNZ:

DJNZ Rn,rel

DJNZ direct,rel

减一不为0指令。

Rn=Rn-1,若此时Rn!=0,则PC=PC+rel,否则顺序执行。

子程序调用与返回指令:

ps:必须成对出现。

LCALL addr11

PC=PC+3

SP=SP+1 //低八位压栈

PC0-7---->SP

SP=SP+1 //高八位压栈

PC8-15---->SP

ADDR16---->PC0-15

ACALL addr16

PC=PC+2

SP=SP+1 //低八位压栈

PC0-7---->SP

SP=SP+1 //高八位压栈

PC8-15---->SP

ADDR16---->PC0-15

可在2KB的范围内调用子程序。

RET:

从堆栈中退出PC的高八位和低八位。将指针减去2,不影响任何标志。

先退高八位,再退低八位。

RETI: 中断返回

从堆栈中退出PC的高八位和低八位。将指针减去2,不影响任何标志。

先退高八位,再退低八位。

NOP:

空指令,占用1个机器周期。


位操作指令:MOV、SETB、CLR、CPL、JB、JNB指令的格式、功能。

MOV C,bit

MOV bit,C

***C指的是Cy。

CLR C C=0

CLR bit bit=0

SETB C C=1

SETB bit bit=1

开中断: CLR EA

关中断: STEB EA

JC rel

C=1,则PC=PC+rel.

JNC rel

C=0,则PC=PC+rel.

JB rel

bit=1,则PC=PC+rel.

JNB rel

bit=0,则PC=PC+rel.

JBC rel

C=1,则PC=PC+rel且C=0。

综合:能根据要求写汇编指令

例如:将片内RAM30H中的压缩的两位BCD码转换成二进制数送到片内RAM40H单元中。

已知:BCD转换二进制:10*A1+A0

ORG 0000H
AJMP START
---------以上是固定格式,背住即可-------------
ORG 40H
START: MOV A,30H
      SWAP A
       ANL A,#0FH
       MOV B,#10
       MUL BA
       MOV B,A
       MOV 30H
       ANL A,#0FH
       ADD A,B
       MOV 40H,A
       SJMP $ 
/*可不可以这样写呢?想想*/
START: MOV A,30H
       ANL A,#0F0H
       MOV B,#10
       MUL BA
       MOV B,A
       MOV 30H
       ANL A,#0FH
       ADD A,B
       MOV 40H,A
       SJMP $ 

求出内部RAM30H中数据含有1的个数,将结果送入32H。

ORG 0000H
AJMP START
START:CLR C
      MOV R2,#8
      MOV R1,#0
      MOV A,30H
LOOP: RCC A
      JNC NEXT
      INC R1
NEXT: DJNZ R2,LOOP
      MOV 32H,R1
      SJMP $
END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值