新手自学嵌入式|学习日记:从C语言到51单片机基础(GPIO、中断、定时器与PWM篇)

作为一名嵌入式新手,学习单片机(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. 测水温

  2. 测油温

  3. 测转速

  4. 调节安全座椅

  5. 刹车制动

二、 中断系统:处理紧急事件的机制

1. 中断的核心概念

  • 中断:当CPU执行某个任务时,被外部紧急事件所打断,要求CPU暂停当前任务,转而去执行更为紧急的事件,把紧急事件处理完后再回到之前被打断的地方继续向下执行。

  • 中断源:能够打断CPU执行当前任务的事件/源头。

  • 51单片机中断源:外部中断0(P3_2)、外部中断1(P3_3)、定时器0、定时器1、串口(共5个)。

  • 外部中断:引脚电平变化所引发的中断(P3.2 P3.3)。

  • 中断优先级:CPU去处理多个中断任务时,会去比较中断源的优先级,优先去处理优先级高的中断。

  • 中断嵌套:CPU再去处理一个中断时,再去嵌套另外的中断(最多允许嵌套两层)。

2. 中断处理流程(6步)

  1. 中断源发起中断请求

  2. 检查CPU是否允许中断及该中断源是否被屏蔽(CPU中断总开关 + 中断源子开关)

  3. 比较中断优先级

  4. 保护现场

  5. 执行中断服务函数(回调函数)

  6. 恢复现场

新手提示:这里的"保护现场"和"恢复现场"与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语言 是我们操作寄存器、编写回调函数、实现逻辑控制的核心工具。

相关推荐
凤年徐1 小时前
C++ 仿 muduo 高并发服务器:日志模块
linux·服务器
陈年老古董1 小时前
微博情感分析项目学习笔记
笔记·python·学习·机器学习·项目
Linux-lucky1 小时前
39-41-Linux学习之旅之redis缓存基础与NFS基础
linux·运维·mysql·ubuntu
2601_960631231 小时前
如何用公开数据接口查询制药企业资质信息
笔记
小刘在重生~1 小时前
Oracle_day2 单行函数|组函数|分组|伪列|子查询|分页|多表连接
笔记·oracle·面试
老当益壮梁奶奶1 小时前
ARM汇编学习笔记(六):【i.MX6ULL】时钟系统与定时器(EPIT & GPT)
c语言·arm开发·嵌入式硬件·学习·51单片机
明德扬1 小时前
机器人多摄像头如何做FPGA多路视频聚合?
学习·fpga开发·fpga
whyutianict_vv2 小时前
云计算运维培训课程技术栈拆解:从 Linux 网络到 AI 推理的五层能力分层
linux·云计算
曼巴UE52 小时前
UE5 客户端 需要的网络同步概念总结(3 )-事件同步 RPC 以及三种调用方式
网络·c++·网络协议·学习·rpc·ue5