一、GPIO(通用输入输出口)
GPIO 全称 General Purpose Input/Output,是 51 单片机和外部设备交互的最基础方式。
- 输入模式 :检测引脚电平变化;典型用途:按键检测、ADC 信号采集。51 为上拉输入。
- STM32 类 GPIO 模式拓展
- 输入模式:上拉输入、下拉输入、浮空输入、模拟输入
- 输出模式:推挽输出、开漏输出、复用推挽输出、复用开漏输出
二、中断
1. 中断概念
CPU 正在执行任务,被外部紧急事件打断;CPU 暂停当前工作,执行紧急事件,处理完毕后回到断点继续原来程序。
- 中断源:可以打断 CPU 运行的事件来源。
- 51 单片机 5 个中断源:外部中断 0 (P3_2)、外部中断 1 (P3_3)、定时器 0、定时器 1、串口。
- 外部中断:由引脚电平变化触发,对应引脚 P3.2、P3.3。
2. 中断优先级与中断嵌套
- 中断优先级:多个中断同时到来,CPU 优先处理优先级高的中断。
- 中断嵌套:处理某个中断过程中,响应另一个新中断;51 最多支持两层嵌套。
3. 完整中断处理流程
- 中断源发出中断请求
- 判断:CPU 总中断开关、对应中断源子开关是否开启(是否屏蔽)
- 对比中断优先级
- 保护现场
- 运行中断服务函数(回调函数)
- 恢复现场,返回原来程序继续执行
补充概念:中断向量 ,相当于下标 / 标号,CPU 依靠中断向量找到对应的中断服务函数。 代码片段:外部中断 0 初始化框架
void int0_init(void);IE 寄存器:bit7、bit1 置 1,用于中断开关配置。
三、定时器
定时器主要用于精准定时、延时,用于对时序要求高的场景。
- 51 的 Timer0 为16 位自增型定时器 / 计数器 ,由
TH0高 8 位、TL0低 8 位两个 1 字节寄存器组成。 - 工作过程:
- 设置定时器初值(TH0、TL0 赋值)
- 开启定时器,计数器开始自增
cnt++ - 计数器计满:65535+1 产生溢出,定时器向 CPU 申请中断。
- 从初值计数到溢出的时间,由计数速率、初值共同决定。
- 51 系统时钟说明
- 常用晶振:
12MHZ、11.0592MHZ;51 定时器机器周期 = 晶振频率 / 12- 12MHZ:机器周期 = 1MHZ,每计数一次耗时1μs
- 11.0592MHZ:机器周期≈0.9MHZ,计数一次≈1.1μs
- 常用晶振:
- 定时器初值计算公式
计数次数 = 需要定时的时间 ÷ 单次计数耗时 16 位定时器初值 = 65535 − 计数次数
示例:
- 12M 晶振实现 1ms 定时:定时 1000μs,计数次数 1000,初值 = 65535‑1000=64535
- 11.0592M 晶振实现 1ms 定时:计数次数 909,初值 = 65535‑909=64626
补充:还有 8 位自动重装定时器模式,多用于串口波特率配置。
四、PWM 脉冲宽度调制
PWM 让引脚输出周期性方波,电平周期性翻转。
- PWM 周期:完整一个方波的时间,从上升沿 / 下降沿到下一次同一边沿的时长。
- 占空比:一个 PWM 周期内,高电平时间占整个周期的百分比;应用场景:屏幕背光亮度调节。
- PWM 结合定时器计算案例(12M 晶振,机器周期 1μs)
- 例 1:200Hz,占空比 50% 周期 = 1/200=0.005s;高低电平各占一半 0.0025s;计数 2500 次;初值 = 65535‑2500 =63035
- 例 2:400Hz,占空比 50% 周期 = 1/400=0.0025s;半周期 0.00125s;计数 1250 次;初值 = 65535‑1250=64285
五、蜂鸣器原理
声音来自声波,音调由频率决定,分两类:
- 有源蜂鸣器:自带震荡源,通电直接输出固定频率声音。
- 无源蜂鸣器:无内部震荡源,通电不会发声,需要外部提供频率方波驱动。
实现方式:定时器产生 PWM 信号,修改 PWM 频率、占空比,控制无源蜂鸣器发出不同音调。
六、按键原理
按键按下后引脚被短路,引脚电平拉低为低电平;可以用 GPIO 输入模式或者外部中断检测按键动作。 附带代码片段示例:P1 |= (0x0F << 4); P3 |= (1 << 5);
七、工程举例:车载中控系统功能
- 水温测量
- 油温测量
- 安全座椅调节
- 刹车制动
八、重要寄存器与配置小结
TH0、TL0:定时器 0 高、低 8 位,存放定时初值。IE中断允许寄存器:配置总中断、子中断开关。- 定时器 0 可配置为 16 位定时器模式。
- 外部中断 0 对应引脚 P3_2,可编写
int0_init()做初始化。
九、关键公式汇总
- 机器周期 = 晶振频率 / 12
- 单次计数时间 = 1 / 机器周期
- 需要计数次数 = 定时时间 ÷ 单次计数时间
- 16 位定时器初值 = 65535 − 计数次数
- PWM 周期 = 1 / PWM 频率