嵌入式从0到精通——51单片机(二)

一、GPIO(通用输入输出口)

GPIO 全称 General Purpose Input/Output,是 51 单片机和外部设备交互的最基础方式。

  1. 输入模式 :检测引脚电平变化;典型用途:按键检测、ADC 信号采集。51 为上拉输入
  2. STM32 类 GPIO 模式拓展
    • 输入模式:上拉输入、下拉输入、浮空输入、模拟输入
    • 输出模式:推挽输出、开漏输出、复用推挽输出、复用开漏输出

二、中断

1. 中断概念

CPU 正在执行任务,被外部紧急事件打断;CPU 暂停当前工作,执行紧急事件,处理完毕后回到断点继续原来程序。

  • 中断源:可以打断 CPU 运行的事件来源。
  • 51 单片机 5 个中断源:外部中断 0 (P3_2)、外部中断 1 (P3_3)、定时器 0、定时器 1、串口。
  • 外部中断:由引脚电平变化触发,对应引脚 P3.2、P3.3。

2. 中断优先级与中断嵌套

  • 中断优先级:多个中断同时到来,CPU 优先处理优先级高的中断。
  • 中断嵌套:处理某个中断过程中,响应另一个新中断;51 最多支持两层嵌套。

3. 完整中断处理流程

  1. 中断源发出中断请求
  2. 判断:CPU 总中断开关、对应中断源子开关是否开启(是否屏蔽)
  3. 对比中断优先级
  4. 保护现场
  5. 运行中断服务函数(回调函数)
  6. 恢复现场,返回原来程序继续执行

补充概念:中断向量 ,相当于下标 / 标号,CPU 依靠中断向量找到对应的中断服务函数。 代码片段:外部中断 0 初始化框架void int0_init(void);IE 寄存器:bit7、bit1 置 1,用于中断开关配置。

三、定时器

定时器主要用于精准定时、延时,用于对时序要求高的场景。

  1. 51 的 Timer0 为16 位自增型定时器 / 计数器 ,由TH0高 8 位、TL0低 8 位两个 1 字节寄存器组成。
  2. 工作过程:
    1. 设置定时器初值(TH0、TL0 赋值)
    2. 开启定时器,计数器开始自增cnt++
    3. 计数器计满:65535+1 产生溢出,定时器向 CPU 申请中断。
    4. 从初值计数到溢出的时间,由计数速率、初值共同决定。
  3. 51 系统时钟说明
    • 常用晶振:12MHZ11.0592MHZ;51 定时器机器周期 = 晶振频率 / 12
      • 12MHZ:机器周期 = 1MHZ,每计数一次耗时1μs
      • 11.0592MHZ:机器周期≈0.9MHZ,计数一次≈1.1μs
  4. 定时器初值计算公式

计数次数 = 需要定时的时间 ÷ 单次计数耗时 16 位定时器初值 = 65535 − 计数次数

示例:

  • 12M 晶振实现 1ms 定时:定时 1000μs,计数次数 1000,初值 = 65535‑1000=64535
  • 11.0592M 晶振实现 1ms 定时:计数次数 909,初值 = 65535‑909=64626

补充:还有 8 位自动重装定时器模式,多用于串口波特率配置。

四、PWM 脉冲宽度调制

PWM 让引脚输出周期性方波,电平周期性翻转。

  1. PWM 周期:完整一个方波的时间,从上升沿 / 下降沿到下一次同一边沿的时长。
  2. 占空比:一个 PWM 周期内,高电平时间占整个周期的百分比;应用场景:屏幕背光亮度调节。
  3. PWM 结合定时器计算案例(12M 晶振,机器周期 1μs)
    • 例 1:200Hz,占空比 50% 周期 = 1/200=0.005s;高低电平各占一半 0.0025s;计数 2500 次;初值 = 65535‑2500 =63035
    • 例 2:400Hz,占空比 50% 周期 = 1/400=0.0025s;半周期 0.00125s;计数 1250 次;初值 = 65535‑1250=64285

五、蜂鸣器原理

声音来自声波,音调由频率决定,分两类:

  1. 有源蜂鸣器:自带震荡源,通电直接输出固定频率声音。
  2. 无源蜂鸣器:无内部震荡源,通电不会发声,需要外部提供频率方波驱动。

实现方式:定时器产生 PWM 信号,修改 PWM 频率、占空比,控制无源蜂鸣器发出不同音调。

六、按键原理

按键按下后引脚被短路,引脚电平拉低为低电平;可以用 GPIO 输入模式或者外部中断检测按键动作。 附带代码片段示例:P1 |= (0x0F << 4); P3 |= (1 << 5);

七、工程举例:车载中控系统功能

  1. 水温测量
  2. 油温测量
  3. 安全座椅调节
  4. 刹车制动

八、重要寄存器与配置小结

  1. TH0TL0:定时器 0 高、低 8 位,存放定时初值。
  2. IE中断允许寄存器:配置总中断、子中断开关。
  3. 定时器 0 可配置为 16 位定时器模式。
  4. 外部中断 0 对应引脚 P3_2,可编写int0_init()做初始化。

九、关键公式汇总

  1. 机器周期 = 晶振频率 / 12
  2. 单次计数时间 = 1 / 机器周期
  3. 需要计数次数 = 定时时间 ÷ 单次计数时间
  4. 16 位定时器初值 = 65535 − 计数次数
  5. PWM 周期 = 1 / PWM 频率
相关推荐
云泽8081 小时前
STM32 USART 详解(七):超时设置、非阻塞发送与 ReadLine 实现
stm32·单片机·嵌入式硬件
2401_862880822 小时前
UART 通信协议
单片机·51单片机
一条破秋裤3 小时前
24_MPU6050结构参数与寄存器基础
stm32·嵌入式硬件·学习
ZLG_zhiyuan3 小时前
低空测试“升维”:ZUS系列示波器如何破解复杂信号的“测与析”难点?
单片机·嵌入式硬件
..Dauntless..4 小时前
【stm32】GPIO(下篇)——统一编址、源码理解和输入模式
stm32·单片机·嵌入式硬件
白搞电子6 小时前
ESP-Mosaico 桌宠为什么会误睡?AS312 PIR 原理、休眠逻辑与排错方法
单片机·嵌入式硬件·动画
Brilliantwxx8 小时前
【STM32】 I2C协议和设备主从( 图解 + 面试题 )
stm32·单片机·嵌入式硬件·架构
威嵌神州8 小时前
星载计算机产品方案:商业卫星国产化平台
嵌入式硬件
老当益壮梁奶奶8 小时前
51单片机中断系统详解
c语言·单片机·嵌入式硬件·学习·51单片机