单片机原理复习
绪论
- ? 什么是单片机: 集成了 CPU, 存储器, 中断系统, 定时器/计数器和各种 IO 接口
- 组成: CPU, RAM/ROM, 串并行的 IO, 定时器
MCS-51 的硬件结构
运算器
- 程序状态字寄存器 PSW (顺序为由高位向低位):
- Cy: 最高位的进位标志
- Ac: 半进位标志, 低四位向高四位产生进位或借位时候进行置位
- F0: 用户标志位
- RS1 RS0: 工作寄存器组指针
- OV: 溢出标志位, 溢出逻辑表达式: OV=D_{6Cy}^ D_{7Cy}
- F1: 用户标志位
- ! P: 跟踪累加器中"1"的奇偶性, 奇数个 1 时候置 1
控制器
PC
是 16 位的, 有 16 根地址总线
MCS-51 单片机的存储器结构
- 存储空间分类:
- 程序存储器
- 内部数据存储器
- 外部数据存储器
- 特殊功能寄存器
- 堆栈
- !
SP
堆栈指针在复位时候会被初始化为07H
- 堆栈遵循的原则: 先进后出, 后进先出 (栈的特性)
- 栈的结构是向上增长的满堆栈: 执行入栈操作前, SP 自动+1, 出栈操作后, SP 自动-1 (SP 指针指向栈顶有数据的内存)
- !
- 外部数据存储器:
- 外部地址总线的宽度为 16bit
机器周期, 指令周期
- 时钟周期: 指晶振频率
- 机器周期: CPU 完成一个基本操作所需要的时间, 12 个时钟周期为一个机器周期
- 指令周期: 执行一条指令所需要的时间, 由 1~4 个机器周期组成
MCS-51 的指令系统
指令系统的寻址方式
- 立即寻址: 指令中直接给出操作数 ->
MOV A, #30H
- 直接寻址: 指令中给出存放数据的地址 ->
MOV A, 30H
- 寄存器寻址: 地址为寄存器中的内容 ->
MOV A, R1
- 寄存器间接寻址: 地址为寄存器所指向的内容上 (指针) ->
MOV A, @R1
- 变址寻址 (基址寄存器加变址寄存器间接寻址): 用于访问程序存储器中的一个字节, 地址为
A+DPTR/PC
->MOVC A, @A+DPTR
- 相对寻址: 与当前
PC
形成偏移量, 一般用于跳转 - 位寻址: 用于位操作
介绍
SUBB
(Sub Borrow)是带借位的减法, 使用时候需要注意Cy
RLC
循环左移, 左移右移根据中间的字母判断, 移进或移出都存储在Cy
中RET
从过程返回, 首先出栈的是目标地址的高位 (存储在高地址的是高位), 相当于执行了两次POP
操作,SP
的值也会发生改变
MCS-51 的中断系统
- 默认的顺序: INT0, T0, INT1, T1, 串行口, T2
中断请求源
- 特殊功能寄存器 TCON (外部中断与定时器中断):
IT0
,IT1
: 外部中断触发方式 (Interupt Trigger),1
为低电平触发,0
为下降沿触发IE0
,IE1
: 外部中断触发标志位TF0
,TF1
: 定时器中断请求标志位TR0
,TR1
: 用于启动和停止定时器/计数器
- 特殊功能寄存器 T2CON (T2 定时器中断专用)
- 特殊功能寄存器 SCON (串行口控制寄存器)
响应中断请求的条件
- 中断响应的必要条件:
- 必须开中断 (
EA=1
) - 对应中断源没有被屏蔽 (
1
为允许该中断源产生中断) - 该中断源发出中断请求 (中断源对应的中断请求标志为
1
) - 无同级或更高级的中断正在被服务
- 必须开中断 (
- 中断被推迟响应的条件
- CPU 正在处理更高级或同级的中断
- 当前机器周期不是正在执行的指令的最后一个机器周期 (当前指令完成前, 不响应任何中断请求)
- 正在执行的是中断返回指令RETI或访问专用寄存器IE或IP的指令。 也就是说,在执行RETI或是访问IE、IP的指令后,至少需要再执行 一条其他指令,才会响应中断请求
中断控制
- 中断优先级由
IP
控制 (Interupt Priority)
- 优先相应高优先级 (
1
为高优先级) - 低优先级会被高优先级中断源中断, 无法被同级中断源中断
- 同级则按照默认顺序进行响应
中断请求的条件
- 中断服务的入口地址: 低 4 位均为 3/B, 对应左侧外部中断/定时器 T (0), 外部中断/定时器 T(1) , 串行口/定时器 T2
中断请求的撤销
- 外部中断: 对于中断请求的标志位都是由硬件自动清除的, 但是对于低电平的中断请求信号需要特别处理, 因为电平是可维持的事件, 而下降沿是一个瞬时的事件
- 低电平触发方法: 硬件自动清除中断请求标志位, 但中断请求的低电平信号可能继续维持, 需要使用硬件电路解决
- 下降沿触发方式: 响应中断后, 自动清零
- 定时器/计数器 T0, T1: 中断响应后, 硬件自动清除
- 串行口: 硬件无法自动清除 TI 和 RI 标志位, 需要在中断服务程序中, 使用软件来清除相应的中断标志位
- 定时器 T2: 使用软件手动清除
[!note] RETI 与 RET 的区别 对于堆栈的操作是一致的: 从堆栈中弹出两个字节的返回地址 使用 RETI 返回时候, 会改变中断的状态, 也就是清零中断标志位
MCS-51 的定时器/计数器
定时器/计数器 T0 与 T1 的结构
- 控制寄存器 TMOD
GATE
: 门控位C/T
: 定时/计数模式选择位M1
,M0
: 设定定时器模式
- 中断请求标志位于 TCON 寄存器中
定时器/计数器 T0 与 T1 的初始化
- 不同的工作方式可使用的上限:
- 初值计算:
- 计数器: \(X=2^n-计数值\)
- 定时器: \(X=2^n-\frac{fosc\times 定时时间}{12}\)
MCS-51 的串行口
- 4 种方式的波特率计算
- 方式 0: \(fosc/12\) (固定)
- 方式 1 与方式 3: \(\frac{2^{SMOD}}{32}\times \frac{fosc}{12\times (256-TH1)}\)
- 方式 2: \(fosc\times \frac{2^{SMOD}}{64}\)