51单片机 --- GPIO、中断、定时器、PWM

一、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. 中断处理流程

  1. 中断源发起中断请求
  2. 检查 CPU 是否允许中断及该中断源是否被屏蔽(CPU 中断总开关 + 中断源子开关)
  3. 比较中断优先级
  4. 保护现场
  5. 执行中断服务函数(回调函数)
  6. 恢复现场

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;
  1. 赋初值:cnt = 64535
  2. 打开定时器,开始计数
  3. 按照固定速率向上 ++,cnt++
  4. 计数器加到 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
相关推荐
零依赖极客1 小时前
《30 天手搓 ARM 架构零依赖纯 C 推理引擎》课程介绍与大纲
c语言·开发语言·arm开发·人工智能·嵌入式硬件·ai编程
国科安芯1 小时前
基于ECC加固的抗辐射MCU在卫星载荷数据管理中的应用分析
单片机·嵌入式硬件·mcu·抗辐射·ecc加固·卫星数据管理
深圳市恒锐丰科技杨生1 小时前
EG3033 三相 P‑N MOS 栅极驱动芯片|屹晶 EGmicro
嵌入式硬件·硬件工程
linx2952 小时前
单元三 · 那 C 的底层知识怎么办
c语言·开发语言·数据结构·c++·嵌入式硬件
abc light2 小时前
单片机(1)
单片机·嵌入式硬件
云泽8083 小时前
STM32 USART 详解(四):数据帧及标志位的收发机制与寄存器深度剖析
stm32·单片机·嵌入式硬件
linx2953 小时前
单元四 · 对称认知·上:内存与指针
c语言·开发语言·数据结构·嵌入式硬件·算法
国科安芯3 小时前
ASM9048S(4 路高速 LVDS 接收器)在商业航天等场景中的应用研究
嵌入式硬件·电源模块·卫星通信·抗干扰·抗辐射
HUI-4744 小时前
EG11752|ESOP‑8 内置 200V‑2A 异步降压 DC‑DC,10‑200V 超宽压小功率辅助电源优选
嵌入式硬件·硬件工程