一、GPIO 基础
GPIO(General Purpose Input/Output,通用目的输入输出)是 51 单片机与外界交互的最基本方式。
1. 输入模式
检测引脚电平变化,用于检测外部电平信号,典型应用包括按键检测、ADC 信号检测。
2. 输出模式
给定单片机引脚电平,控制引脚输出高/低电平,典型应用包括传感器控制、LED 控制、数码管显示。
3. STM32 的 GPIO 模式
- 输入模式:上拉输入、下拉输入、浮空输入、模拟输入(ADC)
- 输出模式:推挽输出、开漏输出、复用推挽输出、复用开漏输出
4. 按键原理
- 按键未被按下时:引脚为高电平
- 按键被按下时:引脚会和 GND 短路到一起,此时引脚呈现低电平
c
void key_init(void)
{
P1 |= (0x0F << 4); //普中51-MS
P3 |= (1 << 5); //HC6800
}
5. 车载中控系统应用
- 测水温
- 测油温
- 测转速
- 调节安全座椅
- 刹车制动
二、中断系统
1. 中断概念
当 CPU 执行某个任务时,被外部紧急事件所打断,要求 CPU 暂停当前任务,转而去执行更为紧急的事件,把紧急事件处理完后再回到之前被打断的地方继续向下执行。
2. 中断源
能够打断 CPU 执行当前任务的事件/源头。
3. 51 单片机中断源(共 5 个)
- 外部中断 0(P3_2)
- 外部中断 1(P3_3)
- 定时器 0
- 定时器 1
- 串口
4. 外部中断
引脚电平变化所引发的中断(P32、P33)。
5. 中断优先级
CPU 去处理多个中断任务时,会去比较中断源的优先级,优先去处理优先级高的中断。


6. 中断嵌套
CPU 在处理一个中断时,再去嵌套另外的中断(最多允许嵌套两层)。
7. 中断处理流程
- 中断源发起中断请求
- 检查 CPU 是否允许中断及该中断源是否被屏蔽(CPU 中断总开关 + 中断源子开关)
- 比较中断优先级
- 保护现场
- 执行中断服务函数(回调函数)
- 恢复现场

8. 外部中断 0 初始化
- 将 P3_2 引脚拉为高电平
- 将 CPU 中断总开关打开 + 外部中断 0 子开关打开(IE 寄存器:bit0 和 bit7 置 1)
- 设置外部中断 0 引脚触发方式:下降沿触发(TCON 寄存器:bit0 置 1)
9. 中断向量表与中断向量
- 中断向量表:本质是一个数组,数组中存放中断服务函数的入口地址
- 中断向量:本质是数组的下标/标号,CPU 通过中断向量寻找对应的中断服务函数
三、定时器
1. 定时器作用
实现精准的定时/延时,不同设备对时序要求比较高。

2. 时序概念
以时间先后次序描述引脚电平变化。
3. 16 位自增型定时器
Timer0、Timer1 均为 16 位计数器。
c
unsigned short cnt = 0;
- 赋初值:cnt = 64535
- 打开定时器,开始计数
- 按照固定速率向上 ++,cnt++
- 计数器加到 65535 + 1 溢出,定时器向 CPU 发起中断请求
4. 定时计算原理
从初值到溢出所经历的时间,取决于计数速率和初值大小。
- 51 单片机实际工作频率:12MHz 或 11.0592MHz
- 12MHz / 12 = 1MHz,时间:1 / 1MHz = 1us
- 11.0592MHz / 12 = 0.9MHz,时间:1 / 0.9MHz = 1.1us
5. 定时器实现 1ms 定时
- 1ms = 1000us
- 计数次数:1000us / 1us = 1000(12MHz);1000us / 1.1us = 909(11.0592MHz)
- 初值:65535 - 1000 = 64535;65535 - 909 = 64626
6. 初值拆分(TL0 与 TH0)
- TL0(1 字节):64535 的低 8 位
- TH0(1 字节):64535 >> 8
- 8 位自动重装(用于串口波特率)


7. 定时器 0 初始化
c
void timer0_init(void)
{
//1
TMOD &= ~(0x0F << 0);
TMOD |= (1 << 0);
//2
TL0 = 64626;
TH0 = 64626 >> 8;
//3
TCON |= (1 << 4);
//4
IE |= (1 << 1) | (1 << 7);
}
- 配置定时器 0 模式:16 位定时器(TMOD 寄存器低 4 位:低 4 位清零,bit0 置 1)
- 设置定时器 0 初值(TL0 和 TH0 寄存器)
- 开启定时器 0,开始计数(1us)(TCON 寄存器:bit4 置 1)
- 开启定时器 0 中断子开关 + CPU 中断总开关(IE 寄存器:bit7 和 bit1 置 1)
四、PWM 脉冲宽度调制
1. PWM 概念
脉冲宽度调制,能够让引脚产生一个方波,周期性地让引脚的电平发生翻转。
2. PWM 周期
一个方波所经历的周期(上升沿/下降沿到下一个上升沿/下降沿所经历的时间)。
3. PWM 占空比
在一个周期内高电平所占的比例。
4. 典型应用
背光调节、蜂鸣器控制。
五、蜂鸣器
1. 声音原理
声音 → 声波 → 音调 → 频率。
2. 有源蜂鸣器
存在震荡源,通电后蜂鸣器会发出持续固定频率的声音。
3. 无源蜂鸣器
不存在震荡源,通电后蜂鸣器不会发出声音,需要给定蜂鸣器一个震荡信号。
4. 定时器 + PWM 占空比 + 蜂鸣器(指定频率发声)
频率 200Hz,占空比 50%:
- 时间:1 / 200Hz = 0.005s / 2 = 0.0025s
- 51 单片机工作频率:12MHz / 12 = 1MHz = 1000000Hz
- 51 单片机 +1 所需时间:1 / 1000000Hz = 0.000001s
- 计数次数:0.0025s / 0.000001s = 2500
- 初值:65535 - 2500 = 63035
频率 400Hz,占空比 50%:
- 时间:1 / 400Hz = 0.0025s / 2 = 0.00125s
- 51 单片机工作频率:12MHz / 12 = 1MHz = 1000000Hz
- 51 单片机 +1 所需时间:1 / 1000000Hz = 0.000001s
- 计数次数:0.00125s / 0.000001s = 1250
- 初值:65535 - 1250 = 64285