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
相关推荐
Jason_zhao_MR5 小时前
米尔电子参展预告_中国工博会2026-外发版
嵌入式硬件·机器人·工业控制
FPGA小徐9 小时前
STM32五路气敏传感器阵列电路详解:从HHC1000分压到AD8606跟随器和ADC采样
stm32·单片机·嵌入式硬件
Horn Still Sounds11 小时前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
智感子11 小时前
无人值守称重:地磅系统架构与流程
嵌入式硬件
新晨单片机设计13 小时前
S011C-基于STM32智能灯光控制系统(光强、声音、人体)【Proteus仿真+Keil程序+原理图】
stm32·嵌入式硬件·proteus·智能灯光控制系统
女神下凡15 小时前
芯参谋(26):DDR4_软件设计规范
arm开发·单片机·嵌入式硬件
zd84510150016 小时前
DSLogic逻辑分析仪连接失败
嵌入式硬件
国科安芯16 小时前
星载通信载荷信号处理中抗辐射微控制器的选型与适应性分析
人工智能·嵌入式硬件·mcu·信号处理·risc-v·抗辐射·空间信息
AOI小白新手上路17 小时前
韦东山 3-5 I.MX6ULL 的 LED 编程 · 学习笔记
arm开发·笔记·单片机·学习·架构·硬件架构
测试学习test18 小时前
SPI读取W25Q64硬件驱动(HAL库)
数据库·stm32·嵌入式硬件·算法