Evan Xiao

随缘更新,随缘分享

0%

51单片机复习

51 单片机复习

要不是期末我才不会去看这个呢

1.单片机的基本概念

单片机,可以看作是一个做成了一个芯片的电脑,相比于平时的电脑,单片机性能弱得很多。但是麻雀虽小五脏俱全,单片机同样拥有 CPU,存储器,IO 口等部件。可以通过编程实现一些简单的功能。

2.需要记忆的内容

单片机的编程过程大部分都是操作寄存器和存储器,只需要牢记相关的寄存器结构,汇编指令就可以了。

3.汇编指令

操作数类型

助记符 含义 说明
A 累加器 累加器 A
Rn 工作寄存器 单片机有多组 R0~R7 的工作寄存器,用于临时存储数据
@Rn 工作寄存器保存的地址所指向的内容 -
direct 地址 直接指定一个地址
#data 立即数 直接作为值
#data16 16 位立即数 16 位数据
DPTR 16 位数据指针 此寄存器可以保存 16 位数据
@DPTR DPTR 所保存的 16 位指针

数据传送类

MOV

片内 RAM 数据转移指令

MOV 大概是最常用的指令了,他的作用很简单,就是把一段数据从一个地方转移到另一个地方,不过这个指令有一些约束,并不是可以随便转移的。

约束:

  • 操作的数据必须是片内 RAM 的,不能操作片外 RAM 或者 ROM。
  • 源操作数的类型与目标操作数有关

指令 MOV A, XXX

将源操作数内容送入累加器 A

支持的源操作数

源操作数类型 支持 备注
Rn 工作寄存器
@Ri 工作寄存器存储的地址
direct 指定地址
#data 立即数,但请注意数据长度

指令 MOV Rn, XXXX

将数据送到 Rn 工作寄存器中

支持的操作数

源操作数类型 支持 备注
A 累加器 A
direct 指定地址
#data 立即数,但请注意数据长度

指令 MOV direct, XXXX

将数据送到 direct 所指的内存单元,支持所有类型的操作数

源操作数类型 支持 备注
Rn 工作寄存器
@Ri 工作寄存器存储的地址
direct 指定地址
#data 立即数,但请注意数据长度
A 累加器 A

指令 MOV @Ri, XXXX

将数据送入 Ri 中保存的地址处

支持的操作数

源操作数类型 支持 备注
A 累加器 A
direct 指定地址
#data 立即数,但请注意数据长度

指令 MOV DPTR XXXX

将 16 位数据输入 16 位数据指针中

支持的操作数

源操作数类型 支持 备注
#data16 立即数,但请注意数据长度

DPTR 寄存器有特殊方式操作

DPTR 可以分成 DPH 和 DPL 进行操作,例如

1
2
MOV DPH, #08H;
MOV DPL, #00H;

MOVX

片外 RAM 数据转移指令

8 位寄存器间接寻址,将地址指向的内容输入累加器 A 中
MOVX A, @Ri;

16 位寄存器间接寻址,将地址指向的内容送入累加器 A 中
MOVX A, @DPTR;

将 A 中的内容送入 R1 指向的地址处
MOVX @R1, A;

将 A 中的内容送入 DPTR 指向的地址处
MOVX @DPTR, A;

MOVC

片内片外 ROM 数据转移指令

ROM 在运行的时候只读不写

例:

MOVC A, @A + DPTR
MOVC A, @A + PC

这里,先将 A 和 DPTR 的内容相加得到一个地址,然后读取该地址的值保存到 A 处

PUSH, POP 指令

1
2
PUSH direct;

先向上移动 SP (SP + 1),然后将内容写入 SP 指向的位置

1
2
3

POP direct;

先将内容读出,再向下移动指针 SP (SP - 1)

XCH

交换源操作数和累加器 A 的内容

XCH A, Rn
XCH A, direct
XCH A, @Ri

XCHD A, @Ri

交换累加器中低 8 位和 Ri 间接寻址的单元内容低 4 位。高 4 位不变

例:
XCHD A, @Ri

常用的其他指令

  • CLR A; 清零
  • CPL A; 取反
  • SWAP A; 前后 4 位交换

位移

  • RL A; 左移
  • RR A; 右移
  • RLC A; 带 CY 位的左移
  • RRC A; 带 CY 位的右移

逻辑

  • ANL A, xxx; 与运算
  • ORL A, xxx; 或运算
  • XRL A, xxx; 异或运算

位操作

  • MOV C, bit; 数据传送
  • MOV bit, C; 数据传送
  • CLR C; 清零
  • SETB C; 置 1
  • CPL X; 取反
  • ANL C, X; 逻辑与
  • ORL C, X; 逻辑或
  • XRL C, X; 逻辑异或

算术

  • ADD A, XXX; 将 A 和 XXX 相加,结果保存到 A 中
  • ADDC A, XXX; 将 A 、CY 和 XXX 相加,结果保存到 A 中
  • SUBB A, XXX; (A) - (XXX) - CY -> A
  • MUL AB; 将累加器 A 和 寄存器 B 两个 8 位无符号数相乘,结果低 8 位存在 A 中,高 8 位存放在 B 中
  • DIV AB; A/B, 商放到 A 中,余数放到 B 中。

转移

无条件转移

  • LJMP addr16; 将程序跳转到指定的 16 位地址处
  • AJMP addr11; 绝对跳转指令。跳转地址的范围是 2KB。PC + 2 -> PC addr11 -> PC
  • SJMP rel; 相对短转移指令。将当前的 PC + 2,然后加 rel 地址
  • JMP @A + DPTR; 间接转移指令 (A) + (DPTR) -> PC

条件转移

  • JZ rel; A 为 0,则跳转
  • JNZ rel; A 不为 0,则跳转
  • CJNE xxx,xxx, rel; 比较转移指令,不相等时转移,相等时继续执行,前大于后时 CY = 0, 后大于前时 CY = 1
  • DJNZ XXX, rel; 循环转移指令,每次循环将 XXX 减 1,然后判断是否为 0,不为 0 则跳转 rel。

寄存器

ACC

名字是累加器,但是跟累加的功能没什么关系,但是很多指令都需要用的这个寄存器

B

在乘除有关指令中需要用到

PSW 程序状态字

记录了一些工作状态。很多指令会更新这个寄存器

D7 D6 D5 D4 D3 D2 D1 D0
CY AC F0 RS1 RS0 OV - P
  • CY: 进位标志。当加减运算出现了进位或者借位时,这个位会被设置位 1。此外,一些位移指令可能也会修改这个位。
  • AC: 当加减运算时,低 4 位出现借位进位时,将会置位
  • F0: 用户自用
  • RS1 和 RS0: 工作寄存器选择
  • OV: 溢出寄存器,当运算出现溢出时,将置位 1
  • P: 奇偶校验位,当有奇数个 1 时为 1 ,偶数个 1 时为 0

IE 中断允许寄存器

D7 D6 D5 D4 D3 D2 D1 D0
EA - ET2 ES ET1 EX1 ET0 EX0
  • EA: 中断使能总开关
  • ET2: 定时器 2 溢出中断
  • ES: 串口中断
  • ET1: 定时器 1 溢出中断
  • EX1: 外部中断 1
  • ET0: 定时器 0 溢出中断
  • EX0: 外部中断 0

SP 堆栈指针

MCS-51 的堆栈是向上生长的,规则是先加后压

DPTR 数据指针

可以存储 16 位指针的寄存器,可以拆开 DPH 和 DPL 使用,通常用于寻址(尤其是片外)。

P0 ~ P3

用于访问 P0 ~ P3 端口

TL0 ~ TH1 定时/计数器

用于存储定时器的计数值,在某些模式下,部分寄存器用于保存重载值。

IP 中断优先级寄存器

D7 D6 D5 D4 D3 D2 D1 D0
- - - PS PT1 PX1 PT0 PX0
  • PX0: 外部中断 0 优先
  • PT0: 定时器中断 0 优先
  • PX1: 外部中断 1 优先
  • PT1: 定时器中断 1 优先
  • PS: 串口中断优先

51 有两个优先级,最多中断嵌套一层

TMOD 定时器工作模式寄存器

D7 D6 D5 D4 D3 D2 D1 D0
GATE C/T M1 M0 GATE C/T M1 M0
  • M0, M1: 定时器工作模式
    • 模式为 00 时,模式为 13 位定时器/计数器
    • 模式为 01 时,模式为 16 位定时器/计数器
    • 模式为 10 时,模式为 8 为重载寄存器
    • 模式为 11 时,定时器 0 分成两个 8 位定时器和计数器,此时定时器 1 不能产生中断,但能正常工作。
  • C/T: 置 0 为定时器,置 1 为计数器
  • GATE: 置 0 时只需要 TR=1 即可打开定时器。置 1 时需要打开外部中断,且外部中断为高时才会启动定时器。

TCON

D7 D6 D5 D4 D3 D2 D1 D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
  • ITx: 外部中断触发方式控制
  • IEx: 外部中断请求标志位。低电平/下降沿, IE 置 1,电平触发时不能自动清 0
  • TRx: 定时器/计数器启动控制位,置 1 启动
  • TFx: 定时器/计数器溢出标志位

SCON

D7 D6 D5 D4 D3 D2 D1 D0
SM0 SM1 SM2 REN TB8 RB8 RI TI
  • TI: 发送中断标志位,TI 不能自动清 0
  • RI: 接收中断标志位,RI 不能自动清 0
  • RB8: 在方式 2 或 3 中,是接收的第 9 位数据
  • TB8: 当方式 2 或 3 中,是要发送第 9 位数据
  • REN: 允许/禁止串行接收控制,REN = 1 时开启接收
  • SM2: 允许方式 2 或方式 3 多机通信控制位
  • SM1SM0:
    • 00: 方式 0, 同步位移串行寄存器
    • 01: 方式 1: 8 位 UART,波特率可变
    • 10: 方式 2: 9 位 UART,波特率可变
    • 11: 方式 3: 9 位 UART,波特率可变

SBUF 串行数据寄存器

Serial Buffer, 用于串行通信。逻辑上是一个寄存器,物理上是两个寄存器。

PCON 电源控制寄存器

D7 D6 D5 D4 D3 D2 D1 D0
SMOD - - - - - PD IDL
  • IDL: 空闲节电模式,开了省电
  • PD: 掉电方式。
  • SMOD: 波特率选择。当 SMOD = 1时,方式 1、2、3 的波特率加倍。

串口使用

波特率计算

波特率就是每秒传送多少 bit

晶振频率: FOSC
是否倍频: SMOD

定时器溢出率 = (FOSC / 12) / (256 - X)
波特率 = ((2 ^ SMOD) / 32) * 定时器溢出率

其他内容

1. 存储

51 单片机的 RAM 和 ROM 都可以扩展 ,由于 IO 紧张,通常使用锁存器实现 IO 复用。

常用的存储芯片

  1. ROM

EPROM2764, 8k x 8b, 拥有 13 根地址线, 8 根数据线

  1. RAM

SRAM6264, 8k x 8b, 拥有 13 根地址线, 8 根数据线, 4 根控制线

扩展 ROM

  1. P0 口复用复用为数据和地址线,P2 口全部作为地址线。
  2. 锁存器锁存控制引脚 LE 连接到 ALE
  3. PSEN 连接到存储芯片 OE 引脚(输出允许)。
  4. EA 引脚可以控制是否使用片内 ROM,当高电平时将使用片内 ROM,直到访问地址超过片内 ROM 范围时,才会访问片外 ROM。低电平则直接使用片外 ROM

扩展 RAM

  1. P0 口复用复用为数据和地址线,P2 口全部作为地址线
  2. 锁存器锁存控制引脚 LE 连接到 ALE
  3. RD 引脚连接到 OE 引脚
  4. WR 引脚连接到 WR 引脚

2. IO

P0 口不能直接输出高电平,需要通过上拉电阻实现。
引脚口如果希望作为输入引脚,需要写 1,因为这时只有上拉电阻来维持电平,外部信号才能改变IO 电平

3. 串口

  • 常用波特率为 9600,太高的波特率对时钟的同步要求较高。
  • 11.05926 mHz 晶振可以实现配置定时器装载值时为整数

4. 中断

  • 有两个优先级,可以实现一层中断嵌套
  • 中断有默认的扫描顺序,也就是说,当同一优先级的中断同时触发时,将按照扫描顺序触发中断

5. 汇编寻址

1. 立即寻址

立即寻址也就是不寻址,直接把操作的数据写在指令中

MOV A,#data

2. 直接寻址

直接将地址写在指令处

MOV A,70H

3.寄存器寻址

将数据放在寄存器中,常见的有 A,B,DPTR,Ri

MOV A, R1

4. 寄存器间接寻址

寄存器中保存操作数的地址,可以用 R0,R1,DPTR实现

MOV A, @R0;

5. 基址加变址寻址

基址寄存器只能说 PC 和 DPTR, 变址寄存器是累加器 A

MOV A,@A + DPTR

6. 相对寻址

相对寻址就是根据 PC 当前的值与 JC 偏移量相加作为目标地址。

JC 80H

7. 位寻址

51 单片机有21个特殊功能寄存器,其中11个可以位寻址,有四种形式:

  1. 直接位地址
  2. 位名称
  3. 单元地址 + 位
  4. 特殊功能寄存器名称 + 位