作为一名嵌入式新手,学习单片机(MCU)是绕不开的一环。今天整理了单片机学习笔记(Day 02)的内容,主要涵盖GPIO、中断系统、定时器以及PWM与蜂鸣器的应用。对于初学者来说,嵌入式开发与C语言密不可分,C语言是操控硬件寄存器的工具,而理解硬件的工作原理(如寄存器配置、中断响应)则是写出高效C代码的前提。下面是我对这部分内容的梳理。
一、 GPIO:单片机与外界交互的最基本方式
GPIO全称为 General Purpose Input/Output(通用目的输入输出),是51单片机与外界交互最基本的方式。
1. GPIO的工作模式
GPIO主要分为输入模式和输出模式,它们在不同平台(51单片机与STM32)下的定义有所区别:
| 模式分类 | 51单片机应用场景 | STM32模式细分 |
|---|---|---|
| 输入模式 | 检测引脚电平变化,用于检测外部电平信号(按键、检测ADC信号) | 上拉输入、下拉输入、浮空输入、模拟输入(ADC) |
| 输出模式 | 给定单片机引脚电平,控制引脚输出高/低电平(传感器、LED、数码管) | 推挽输出、开漏输出、复用推挽输出、复用开漏输出 |
2. 按键原理与C语言初始化代码
硬件原理:
-
按键未被按下时:引脚为高电平。
-
按键被按下时:引脚会和GND短路到一起,此时引脚会呈现低电平。
C语言代码实现(按键初始化) :
在C语言中,我们通过位操作(移位和或运算)来配置寄存器:
c
void key_init(void)
{
P1 |= (0x0F << 4);
P3 |= (1 << 5);
}
3. GPIO的实际应用场景:车载中控系统
了解了GPIO和按键,我们可以看看它在实际项目中的应用。例如车载中控系统就可以通过GPIO实现以下功能:
-
测水温
-
测油温
-
测转速
-
调节安全座椅
-
刹车制动
二、 中断系统:处理紧急事件的机制
1. 中断的核心概念
-
中断:当CPU执行某个任务时,被外部紧急事件所打断,要求CPU暂停当前任务,转而去执行更为紧急的事件,把紧急事件处理完后再回到之前被打断的地方继续向下执行。
-
中断源:能够打断CPU执行当前任务的事件/源头。
-
51单片机中断源:外部中断0(P3_2)、外部中断1(P3_3)、定时器0、定时器1、串口(共5个)。
-
外部中断:引脚电平变化所引发的中断(P3.2 P3.3)。
-
中断优先级:CPU去处理多个中断任务时,会去比较中断源的优先级,优先去处理优先级高的中断。
-
中断嵌套:CPU再去处理一个中断时,再去嵌套另外的中断(最多允许嵌套两层)。
2. 中断处理流程(6步)
-
中断源发起中断请求
-
检查CPU是否允许中断及该中断源是否被屏蔽(CPU中断总开关 + 中断源子开关)
-
比较中断优先级
-
保护现场
-
执行中断服务函数(回调函数)
-
恢复现场
新手提示:这里的"保护现场"和"恢复现场"与C语言函数调用时的栈操作密切相关,是嵌入式C语言底层机制的重要体现。
3. 外部中断0的初始化配置
C语言函数声明:
c
void int0_init(void)
{
// 配置代码
}
初始化流程(图文解析) :
(注:外部中断0触发后,会去执行外部中断0对应的函数,即回调函数)
4. 中断向量表
-
中断向量表:本质是一个数组,数组中存放中断服务函数的入口地址。
-
中断向量:本质是数组的下标/标号,CPU通过中断向量寻找对应的中断服务函数。
三、 定时器:实现精准的定时/延时
不同设备对时序要求比较高,定时器可以实现精准的定时/延时。
- 时序:以时间先后次序描述引脚电平变化。51单片机内部有16位自增型定时器。
1. 定时器工作原理
以Timer0(16位计数器)为例,其核心逻辑是:赋初值 -> 打开定时器开始计数 -> 按固定速率向上++ -> 计数溢出 -> 向CPU发起中断请求。
"初值 -> 溢出"所经历的时间,取决于速率 和初值大小。
C语言变量声明:
c
unsigned short cnt = 0;
2. 定时器初值计算(以1ms定时为例)
-
51单片机实际工作频率:12MHZ / 12 = 1MHZ;11.0592MHZ / 12 = 0.9MHZ。
-
时间:1 / 1MHZ = 1us;1 / 0.9MHZ = 1.1us。
-
定时器实现1ms定时:1ms = 1000us。
-
计数次数:1000us / 1us = 1000;1000us / 1.1us = 909。
-
初值:65535 - 1000 = 64535;65535 - 909 = 64626。
关于8位自动重装:在串口波特率设置中,常使用8位自动重装模式(0 - 255)。例如TL0和TH0均赋值230。
3. 定时器0初始化配置
C语言函数声明:
c
void timer0_init(void)
{
// 配置代码
}
初始化流程(图文解析) :
四、 PWM与蜂鸣器:定时器的进阶应用
1. PWM基础
-
PWM(脉冲宽度调制):能够让引脚产生一个方波,周期性的让引脚的电平发生翻转。
-
PWM周期:一个方波所经历的周期(上升沿/下降沿到下一个上升沿/下降沿所经历的时间)。
-
PWM占空比:在一个周期内高电平所占的比例。
-
应用:背光调节。
2. 蜂鸣器
-
声音 -> 声波 -> 音调 -> 频率。
-
有源蜂鸣器:存在震荡源,通电后蜂鸣器会发出持续固定频率的声音。
-
无源蜂鸣器:不存在震荡源,通电后蜂鸣器不会发出声音,需要给定蜂鸣器一个震荡。
3. 定时器 + PWM占空比 + 蜂鸣器(指定频率发声)
通过定时器控制PWM的占空比,可以驱动无源蜂鸣器发出指定频率的声音。
计算示例 1:频率200HZ,占空比50%
-
时间:1 / 200HZ = 0.005s / 2 = 0.0025s
-
51单片机工作频率:12MHZ / 12 = 1MHZ = 1000000HZ
-
51单片机+1所需时间(s):1 / 1000000HZ = 0.000001s
-
计数次数:0.0025s / 0.000001s = 2500
-
初值:65535 - 2500 = 63035
计算示例 2:频率400HZ,占空比50%
-
时间:1 / 400HZ = 0.0025s / 2 = 0.00125s
-
51单片机工作频率:12MHZ / 12 = 1MHZ = 1000000HZ
-
51单片机+1所需时间(s):1 / 1000000HZ = 0.000001s
-
计数次数:0.00125s / 0.000001s = 1250
-
初值:65535 - 1250 = 64285
五、 学习总结与思维导图
今天的单片机学习从GPIO 的基础输入输出出发,了解了按键原理和车载中控系统的应用。随后深入到了中断系统 ,明白了CPU如何处理紧急事件、优先级与嵌套的概念,以及外部中断0的C语言初始化流程。接着攻克了定时器 ,掌握了初值计算的数学逻辑。最后将定时器与PWM 结合,实现了对蜂鸣器频率的控制。整个过程,C语言 是我们操作寄存器、编写回调函数、实现逻辑控制的核心工具。