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 |
|
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 |
|
先向上移动 SP (SP + 1),然后将内容写入 SP 指向的位置
1 |
|
先将内容读出,再向下移动指针 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 复用。
常用的存储芯片
- ROM
EPROM2764, 8k x 8b, 拥有 13 根地址线, 8 根数据线
- RAM
SRAM6264, 8k x 8b, 拥有 13 根地址线, 8 根数据线, 4 根控制线
扩展 ROM
- P0 口复用复用为数据和地址线,P2 口全部作为地址线。
- 锁存器锁存控制引脚 LE 连接到 ALE
- PSEN 连接到存储芯片 OE 引脚(输出允许)。
- EA 引脚可以控制是否使用片内 ROM,当高电平时将使用片内 ROM,直到访问地址超过片内 ROM 范围时,才会访问片外 ROM。低电平则直接使用片外 ROM
扩展 RAM
- P0 口复用复用为数据和地址线,P2 口全部作为地址线
- 锁存器锁存控制引脚 LE 连接到 ALE
- RD 引脚连接到 OE 引脚
- 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个可以位寻址,有四种形式:
- 直接位地址
- 位名称
- 单元地址 + 位
- 特殊功能寄存器名称 + 位