MCS-51
CPU
由两个部分组成:运算器和控制器
运算器:算术逻辑单元(ALU)、位处理器、累加器 ACC 等组成;
控制器:主要有内部晶振和一些定时、控制逻辑组成
存储器
拥有三个存储器地址空间
- 程序存储器地址空间
- 内部数据存储器地址空间
- 外部数据存储器地址空间
累加器 ACC
:一个最常用的专用寄存器,大部分单操作数指令的操作数取自累加器,指令系统中采用 A 作为累加器的助记符
程序状态字 PSW
:一个 8 位寄存器,它包含了程序状态信息
栈指针 SP
:它指示出栈顶在内部 RAM 块中的位置;SP 的初值越小,堆栈深度就可以越深
数据指针 DPTR
:一个 16 位专用寄存器,当对 64KB 外部数据存储空间寻址时,可作为间址寄存器使用
IO 专用寄存器
:统一使用 MOV 指令操作
串行数据缓存器SBUF
:用于存放欲发送或已接受的数据,由两个独立的寄存器组成,一个是发送缓冲器,另一个是接受缓冲器
定时器与计数器
时序系统
XTAL1 作为芯片内部振荡电路的输入端,XTAL2 为其输出端
标准内部时钟
在 XTAL1 和 XTAL2 上面接定时原件,内部振荡电路实现自激振荡
外部时钟方式?
下图展示了 HMOS 型芯片的外部时钟连接方式
单片机复位
计算机启动,系统默认进入复位状态;
复位状态下 CPU 和其余转筒寄存器均设置默认值;
在单片机的 RESET 引脚上出现 24 个时钟振荡脉冲(两个机器周期)以上的高电平,单片机就能实现复位
下图表示内部复位的典型格式,RESET 接外部复位电路,而施密特触发器可以用来进行整形操作
简单复位电路有上电复位和手动复位两种
不管是哪一种复位电路都要保证在 RESET 引脚上提供 10ms 以上稳定的高电平
低功耗
目前存在两种低功耗模式
- 空闲方式
- 掉电保护方式
空闲方式中,仅 CPU 停止工作,但振荡器仍然运行,中断控制器等仍然在时钟控制下进行。
掉电保护方式中,片内振荡器停止工作,片内所有功能全部停止工作,而 RAM 等寄存器内容可维持不变
低功耗工作方式是通过 电源控制寄存器PCON
来确定的
PCON.0=1 进入空闲方式
可以使用中断、硬件复位两种方式退出空闲方式
PCON.1=1 进入掉电保护方式
只能使用硬件复位的方式退出掉电保护方式
不建议通过降低 VCC 电压使得其“不自然的”进入掉电保护状态!
定时器计数器原理
重点关注以下图形,C51 和 STM32 的定时器和计数器对应寄存器名称和布局都差不多,学会了就直接融会贯通即可
T0 由 TH0 和 TL0 构成,T1 由 TH1 和 TL1 构成
TMOD
用于控制和确定各个定时器/计数器的功能和工作模式
TCON
用于控制定时器/计数器 T0、T1 的启动和停止计数,同时包含定时器/计数器的状态
下图为定时器与计数器的工作原理图
- 计数脉冲有两个源:一个是片内振荡器输出经 12 分频得到;一个是外部脉冲 TX
- C/T 用于设置使用内部振荡(0)还是外部振荡(1)
- 控制信号有效时(闭合),开始计数
- 计数开始,每获得一个脉冲则让加 1 计数器给计数器加 1
- 当计数器全 1 时,发生溢出,计数器归零,置位 TCON 表示定时时间到或者计数值满
控制寄存器 TCON 可以设置以下几个主要的位
- TF1:定时器 1 溢出标志位,当定时器/计数器 1 计满溢出时,由硬件置 1
- TR1:定时器 1 运行控制位,置位时,启动定时器/计数器工作;清零时,停止工作
- TF0:定时器 0 溢出标志位
- TR0:定时器 0 运行控制位
定时器与计数器工作模式
定时器/计数器的初始化流程
- 确定定时器的工作模式,设置 TMOD
- 写入定时初值到 TH0、TL0 或 TH1、TL1 中;
- 设置 IE,开放定时器中断;
- 将 TR0 或 TR1 置位,启动定时器/计数器工作。
串行通讯
串行口基本结构
- 收发缓冲器 SBUF 可同时收发数据
- 发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入
- SBUF 的作用是设置针对接收缓存区操作还是发送缓冲器操作
串行口控制寄存器 SCON
设置串行通信接口的工作方式及收发方式
电源控制寄存器 PCON
波特率解释
- 波特率指串行口每秒发送(或接收)的位数
- 工作方式 0 中,波特率为时钟频率的 1/12,即 fosc/12
- 工作方式 2 中,波特率取决于 PCON 中的 SMOD 值
中断系统
下图展示了中断系统的程序框图
下面介绍当设置对应寄存器的值后对应含义
IT0=1
设置 INT0 为脉冲触发,下降沿有效IT0=0
设置 INT0 为电平触发,低电平有效IE0
INT0 请求标志位TF0
T0 定时计数溢出标志位EA=1
CPU 开放所有中断EX0=0
禁止 INT0 中断ET0=0
禁止 T0 中断PX0
外部中断 0 优先级设定位PT0
定时器 T0 中断优先级设定位PX1
外部中断 1 优先级设定位PT1
定时器 T1 中断优先级设定位PS
串行口中断优先级设定位。
外部中断 0:对应引脚 INT0
外部中断 1:对应引脚 INT1
外部中断有两种触发方式
- 低电平有效:即 CPU 时刻监测 INT 输入电平,若为低电平则触发中断
- 边沿触发:连续监测 INT 两次输入电平,若前一次为高电平,后一次为低电平,则触发中断
低电平或高电平的宽度至少要保持一个机器周期,即 12 个振荡周期以上
PX PT PS 可以设置中断的优先级,设置为 0 为低优先级,设置为 1 为高优先级
中断规则
- 低优先级中断请求不能打断高优先级的中断服务
- 高优先级中断请求可以打断低优先级的中断服务
- 一个中断一旦得到响应,与它同级的中断请求不能中断它
- 如果同级的多个中断请求同时出现,则按 CPU 查询次序确定哪个中断请求被响应
单片机的中断处理流程
分为 3 个阶段,即中断响应、中断处理和中断返回
中断响应
- 中断响应条件满足,且不存在中断阻断的情况,开始触发中断响应
- 中断系统通过硬件生成长调用指令(LCALL),其把断点地址压入堆栈保护起来
- 将对应的中断入口地址装入程序计数器 PC,使程序转向该中断入口地址,执行中断服务程序
中断处理
- 从入口地址开始执行,直至遇到指令 “RETI” 为止
- 过程包括:一是保护现场;二是处理中断源的请求
中断返回
- 由专门的中断返回指令 RETI 来实现的
- RETI 把断点地址取出,送回到程序计数器 PC 中去
- 通知中断系统已完成中断处理,将清除优先级状态触发器
PS:中断请求撤销(对于某些中断,如果不及时清除就会触发下一次中断)
- 定时器溢出中断 TF0 或 TF1 是自动清除的,不用管
- 边沿触发 IE0 或 IE1 也是自动清除
- 串行口中断需要手动清除