3.2.1 内部8位数据传送指令
MOV指令是8051单片机中最基本的数据传送指令之一,用于在不同的寄存器或存储器之间传送8位数据。其基本格式为:
MOV指令的主要特点:
- 指令执行后,源操作数持不变,目的操作数被源操作数取代
- 不影响任何标志位
- 只能在相容的寄存器之间进行传送
MOV指令的源操作数和目的操作数类型:
源操作数(5种):
- 寄存器(R0-R7)
- 立即数(如#25H)
- 直接地址(如内部RAM、SFR等)
- 间接地址(@R0或@R1)
- 累加器A
目的操作数(4种):
- 寄存器(R0-R7)
- 直接地址(如内部RAM、SFR等)
- 间接地址(@R0或@R1)
- 累加器A
MOV指令的常见用法包括:
- 寄存器之间的数据传送例如:MOV A, R0 - 将R0中的内容传送到累加器A中
- 立即数传送例如:MOV A, #25H - 将立即数25H传送到累加器A中
- 直接地址传送例如:MOV P1, A - 将累加器A的内容传送到P1端口
- 间接地址传送例如:MOV A, @R0 - 将R0指向的内部RAM单元的内容传送到累加器A中
以累加器A为目的操作数

以寄存器Rn为目的操作数的指令组

这组指令的功能是把源操作数的内容送入当前工作寄存器区的R0~R7中的某一个寄存器。源操作数有寄存器寻址、直接寻址和立即寻址等寻址方式。
以直接地址direct为目的操作数的指令组

这组指令的功能是把源操作数的内容送入由直接地址指出的存储单元。源操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。
直接地址 direct为8位直接地址,可寻址0~255个单元,对80C51可直接寻址内部数据存储器0~127个地址单元和128~255地址的特殊功能寄存器。对80C51而言,这128~255共128个地址单元很多是没有定义的。对于无定义的单元进行读写时,读出的为不定数,而写入的数将被丢失。
以间接寻址寄存器 为目的操作数的指令组

这组指令的功能是把源操作数的内容送入由RO或R1的内容所指向的内部数据存储器中的存储单元。源操作数有寄存器寻址、直接寻址和立即寻址等寻址方式。
3.2.2 16位数据传送指令
这是80C51中唯一的一条16位指令(因为DPTR是唯一一个16位寄存器)。此指令把16位常数装入数据指针DPTR,即数据高8位送入DPH寄存器,数据低8位送入DPL寄存器。16位常数在指令的第二、第三字节中(第二字节为高位字节DPH,第三字节为低位字节DPL)。
此操作不影响标志位。
例:执行指令 MOV DPTR, #1234H
执行结果:(DPH)=12H, (DPL)=34H
3.2.3 外部数据传送指令
实现累加器A与外部数据存储器或I/O口之间传送一个字节数据。
MOVX指令必须要以累加器A为中转
采用间接寻址方式访问外部数据存储器,有Ri和DPTR两种间接寻址方式:
1. 使用R0/R1间接寻址
采用R0或R1作间址寄存器时:
- 可寻址256个外部数据存储器单元
- 8位地址和数据均由P0口分时输入和输出
- P0口会在不同时间分别用于:
- 输出8位地址
- 输入/输出8位数据
具体来说,当使用R0或R1作为间址寄存器时:
这是一种复用端口的方式,通过时分复用来节省引脚资源。
- 当访问大于256个单元的片外数据存储器时,可选用任何其他输出口线来输出高8位的地址(一般选用P2口输出高8位地址)
2. 使用DPTR寻址
采用16位DPTR作间址:
- 可寻址整个64KB片外数据存储空间
- P0口输出地址的低8位(DPL)
- P2口输出地址的高8位(DPH)
这样就可以寻址完整的64KB外部存储空间。P0口会分时使用,即先用于输出地址(的低8位),然后再用于数据的输入/输出。
1. 外部存储器或I/O口内容送累加器A
说明:指令执行时,在P3.7引脚上输出RD有效信号,可用作外部数据存储器或I/O的读选通信号。
(Read)有效信号是一个控制信号,用于读取外部数据存储器或I/O设备的数据。当8051单片机执行MOVX指令从外部读取数据时,P3.7引脚会输出一个有效的RD信号。
这个信号的主要作用是:
- 作为外部数据存储器的读选通信号
- 控制外部设备向单片机发送数据
这是8051单片机与外部设备进行数据交互的重要控制信号之一,配合P0口(用于地址和数据的分时传输)和P2口(用于输出高8位地址)来完成完整的数据读取操作。
具体过程:
- P0口分时输出由Ri或DPL指定的低8位地址信息和输入累加器中的数据信息
- P2口则输出DPH指定的高8位地址信息
2. 累加器A内容送外部数据存储器或I/O

3.2.4 程序存储器数据转送指令(查表指令)
MOVC(Move Code)指令是用于从程序存储器中读取数据的指令。这是一个特殊的数据传送指令,主要用于查表操作。
MOVC指令有两种形式:
MOVC指令的主要特点:
- 只读操作:MOVC只能从程序存储器中读取数据,不能向其写入数据
- 累加器必需:数据必须读入累加器A中
- 地址计算:通过A与DPTR或PC的内容相加来获取要读取的数据地址
- 就是变址寻址
- 累加器A为变址寄存器,而PC、DPTR为基址寄存器
MOVC A,@A+DPTR(远程查表)
- 将累加器A的内容与DPTR的内容相加,得到程序存储器的地址
- 从该地址读取一个字节的数据
- 将读取的数据存入累加器A中
MOVC A,@A+PC(近程查表)
- 将累加器A的内容与PC+3的内容(因为这个指令是3个字节的)相加,得到程序存储器的地址
- 从该地址读取一个字节的数据
- 将读取的数据存入累加器A中

3.2.5 数据交换指令
1.字节交换指令XCH组

这类指令的功能是将累加器A与源操作数的字节内容互换。源操作数有寄存器寻址、直接寻址和寄存器间接寻址等寻址方式。操作码分别为C5H~CFH。
示例:
2. 半字节交换指令组
XCHD A,@Ri
XCHD指令用于交换累加器A的低4位(低半字节)与由Ri(R0或R1)间接寻址的内部RAM单元的低4位。高4位保持不变。
这个指令的主要特点:
- 只能与内部RAM进行交换
- 只交换低4位数据
- 只能使用R0或R1进行间接寻址
示例代码:
在上述示例中,只有低4位(1011B和0101B)进行了交换,而高4位(0011B和1100B)保持不变,因此不影响符号位。
SWAP A
SWAP A指令用于交换累加器A中高4位和低4位的内容。这是一个单字节指令,执行时不影响任何标志位。

示例代码:
在上述示例中:
- 原始值3BH的高4位(0011B)和低4位(1011B)互换位置
- 执行SWAP A后得到B3H,即高4位变为1011B,低4位变为0011B
这个指令在BCD码运算和其他需要处理4位数据的场合特别有用。