嵌入式 - 硬件:51单片机(2)

本节重点:

  1. GPIO输入模式、输出模式

  2. 按键工作原理(GPIO输入)

  3. 中断概念

  4. 中断源概念、中断源个数、哪几个中断源

  5. 外部中断、定时器中断概念

  6. 中断处理流程:

  7. 51单片机中定时器的个数?类型

  8. 16位定时器和8位自动重装载定时器的区别

  9. PWM的概念、PWM周期、PWM占空比

10、有源蜂鸣器和无源蜂鸣器的区别

11、51单片机蜂鸣器实现原理

一、GPIO

GPIO(General Purpose Input/Output,通用输入输出口)是单片机与外部设备通信的最基本接口,相当于单片机的 "手"(输出控制)和 "眼"(输入检测)。

1. GPIO 的两种工作模式

  • 输出模式 :单片机主动给引脚赋值 "高电平(5V)" 或 "低电平(0V)",从而控制外部设备。比如给 LED 引脚送高电平,LED 点亮;送低电平,LED 熄灭。
    可以用 "水龙头" 比喻:输出模式就像 "控制水龙头开关"------ 单片机决定水流(电平)的通断。
  • 输入模式 :单片机被动检测引脚的电平变化,获取外部设备的状态。比如检测按键是否按下、传感器是否触发。
    对应 "水龙头" 的比喻:输入模式就像 "观察水龙头是否有水流出"------ 单片机只负责判断状态,不主动控制。

二、按键:GPIO 输入模式的典型应用

按键是单片机系统中最常见的 "人机交互部件",其工作原理本质是通过 GPIO 输入模式检测引脚电平。

1. 按键的硬件连接(以 K1 为例)

按键 K1 的两个引脚分别接 GND(地)和单片机的 P1_4 引脚:

  • 当 K1 未按下时,P1_4 引脚不受 GND 影响,默认是高电平;
  • 当 K1 按下时,P1_4 引脚与 GND 短路,引脚电平变为低电平。

2. 按键状态的判断逻辑

要判断 K1 是否按下,只需检测 P1_4 引脚是否为低电平。在代码中可通过 "位运算" 实现:
if((P1 & 0x10) == 0)

(注:0x10 是十六进制,对应二进制0001 0000,与 P1 做 "与运算" 后,只有 P1_4 引脚的电平会保留 ------ 结果为 0 时,说明 P1_4 是低电平,即按键按下)

3. 实际应用场景

比如车载中控系统中,刹车检测、安全座椅状态判断等,都可以通过类似的 "按键逻辑" 实现 ------ 用 GPIO 输入模式实时检测对应引脚的电平,确保数据的实时性。

练习:

实现按下按键(1--4),显示灯(1--4),第一个数码管显示数字(1--4),未按下显示"0"
main.c

digiter.c

LED.C

delay.c

三、中断:单片机的 "紧急响应机制"

单片机在执行常规任务时,若遇到更紧急的事件(如按键触发、定时器溢出),需要暂停当前任务,优先处理紧急事件,处理完后再回到原任务继续执行 ------ 这个过程就是 "中断"。

1. 中断的核心概念

  • 中断源 :触发中断的 "事件 / 源头"。51 单片机有5 个中断源,分别是:外部中断 0(INT0,对应 P3_2 引脚)、外部中断 1(INT1,对应 P3_3 引脚)、定时器 0 中断、定时器 1 中断、串口中断。


1.中断源分类 :外部中断0、外部中断1、定时器0、定时器1、串口
**2.外部中断:**单片机上的引脚电平变化所引发的中断(INTO(P3-2)、INT1(P3-3))

  • 中断优先级:多个中断同时触发时,CPU 会优先处理 "优先级高" 的中断(51 单片机可通过寄存器配置优先级)。
  • 中断嵌套:处理低优先级中断时,若有高优先级中断触发,会暂停当前中断,先处理高优先级中断 ------51 单片机最多支持 2 层嵌套。

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

  1. 中断源发出 "中断请求"(如外部中断 0 引脚电平变化);
  2. CPU 检查:是否开启 "总中断允许",该中断源是否被 "屏蔽"(未屏蔽才继续);

3.比较中断优先级:若当前无更高优先级中断,暂停当前任务;

4.保护现场:保存当前任务的寄存器数据(避免处理中断后数据丢失);

5.执行 "中断服务函数"(即中断触发后要执行的代码,如按键按下后的 LED 翻转); (回调函数)

6.恢复现场:恢复之前保存的寄存器数据,回到原任务继续执行。

3. 中断相关寄存器配置(关键!)

要让中断生效,必须配置对应的寄存器,以 "外部中断 0" 为例:

p3.2 要置1 产生下降沿

  • IE 寄存器(中断允许寄存器)
    • 先将 IE 的 bit7(EA,总中断允许位)置 1------ 开启 "总中断开关"(不开启的话,所有中断都无效);
    • 再将 IE 的 bit0(EX0,外部中断 0 允许位)置 1------ 允许外部中断 0 触发。
  • TCON 寄存器(定时器 / 计数器控制寄存器)
  • TCON 的 bit1(IE0,外部中断 0 请求标志位):中断触发时会自动置 1,CPU 响应后会 "硬件清 0"(无需手动处理)。 不用置位---- 自动置位
  • 将 TCON 的 bit0(IT0,外部中断 0 触发方式位)置 1------ 设置为 "下降沿触发"(即引脚电平从高变低时触发中断);

优先级

中断向量表


四、定时器:单片机的 "精准时钟"

很多场景需要 "精准定时"(如 1ms 刷新一次 LED、1s 读取一次传感器数据),此时就需要用到单片机的 "定时器"------ 它能根据时钟信号,产生精确的时间间隔。

1. 定时器的基础原理

  • 51 单片机定时器资源:内置 2 个 16 位自增型定时器 / 计数器(Timer0、Timer1),可工作在 "定时器模式"(用于定时)或 "计数器模式"(用于计数外部脉冲)。
  • 时钟与分频 :单片机的时钟由 "晶振" 提供,常见晶振频率为 12MHz 或 11.0592MHz。但 51 单片机会对晶振频率做 "12 分频"------ 比如 12MHz 晶振,分频后实际时钟频率为12MHz/12 = 1MHz,对应 "1 个时钟周期 = 1μs"(即单片机执行一条基本指令需要 1μs)。

2. 定时器初值计算(以 1ms 定时为例)

定时器是 "自增型" 的:从 "初值" 开始,每过 1 个时钟周期加 1,加到 "65535"(16 位定时器的最大值)后会 "溢出",触发定时器中断。

要实现 1ms(1000μs)定时,需计算 "初值":

  • 1ms 需要的时钟周期数:1000μs / 1μs = 1000
  • 定时器初值 = 最大值 - 所需周期数 = 65535 - 1000 = 64535(十六进制为 0xFC67)。
    只需将初值写入定时器的 TH0(高 8 位)和 TL0(低 8 位),即可实现 1ms 定时。

定时器:能够产生一个精准的定时,不同外设对时序的要求高(高电平和低电平时间是精准的)
51单片机内部有两个定时器,分别为timer0、timer1,所使用自增型定时器(计数器16位)

Clock,时钟,CPU运行节拍,频率(Intel 2.1GHZ)
频率单位:HZ
时间单位:S
频率和时间关系:1/2.1GHZs
51单片机:
晶振,晶体振荡器(12MHZ/11.059MHZ)


51单片机达不到12MHZ,将12MHZ进行12分频,12MHZ/12=1MHZ
51单片机完成一条指令运算:1/1MHZ=1us

通过定时器0实现1ms定时:
1ms |= 1000us
定时器初值:64535

3. 定时器相关寄存器配置(以 Timer0 为例)

8位自动重装载定时器:分为TLO和TH0两部分,1byte,实际参与计数的只有TLO,当TLO中的值加到255溢出后,再将THO中的值重新装入到TLO中

  • TCON 寄存器

(1)bit4置1,TMOD寄存器中的Gate位清0,代表允许定时器开始计数,

  • TMOD 寄存器(定时器 / 计数器模式控制寄存器)

(1)定时器0->低四位清0

(2)将TMOD寄存器中的M0,bit0置1,代表定时器0工作在16位定时器/计数器模式

​​​​​

  • IE 寄存器

(1)将IE寄存器中的bit7置1,代表CPU能够响应所有中断

(2)将IE寄存器中的bit1置1,代表允许定时器0产生中断

4. 定时器配置流程(5 步)

  1. 先配置TMOD模式选择寄存器,将低四位清0,再将bit0置1代表工作在16位定时器

  2. 向TH0和TL0中装入定时器的初值(1ms -> 64535)

  3. 将TCON寄存器中的bit6置1,代表允许定时器开始计数

  4. 将IE寄存器中的bit7和bit1置1,开启中断总开关和定时器0的子开关

  5. 编写定时器0的中断服务函数

五、PWM 与蜂鸣器:脉冲控制的应用

脉冲宽度调制,能够让引脚产生一个方波,周期性的让引脚的电平发生翻转

1. PWM 的核心概念

  • PWM 周期

一个方波所经历的周期(从上升沿到上升沿所经历的时间/从下降沿到下降沿所经历的时间)

  • PWM 占空比

在一个周期内,引脚处于 "高电平" 的时间占比(如占空比 50%,表示一个周期内高、低电平各占一半)。
通过调整周期和占空比,PWM 可实现 "模拟电压输出"(如控制 LED 亮度、电机转速)。

2. 蜂鸣器的工作原理

蜂鸣器的声音由 "震荡源" 决定:

  • 音调:由震荡频率决定 ------ 高频对应高音,低频对应低音;
  • 音量:由震荡信号的振幅决定 ------ 振幅越大,音量越大。

根据是否自带震荡源,蜂鸣器分为两类:

  • 有源蜂鸣器:内置震荡源,通电后会发出固定频率的声音(无需额外控制,只需给高低电平即可);
  • 无源蜂鸣器:无内置震荡源,通电后不发声,需通过 GPIO 输出 PWM 方波(提供震荡信号),才能发出不同音调的声音。

3. 51 单片机驱动蜂鸣器

对于无源蜂鸣器,需用定时器生成不同频率的 PWM 信号:

  • 比如要发出 "高音",就配置定时器产生高频 PWM(如 4kHz);
  • 要发出 "低音",则生成低频 PWM(如 1kHz);
  • 通过调整 PWM 的占空比,还能控制蜂鸣器的音量大小。

六、练习

通过中断实现低电平触发时数码管变化

实现隔1sLED翻转一次

通过按键控制蜂鸣器按照指定频率工作(Key1 --200HZ Key2 -- 400HZ Key3 -- 600HZ Key4 -- 800HZ Key5 -- 1000HZ)

相关推荐
蓝斯49714 小时前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
熙芯XiChip15 小时前
硬实时与软实时RTOS核心区别
嵌入式硬件
伟大的前程15 小时前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工15 小时前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip16 小时前
CAN与CANopen的本质区别
单片机
lilihewo17 小时前
Altium Designer 封装库的创建(分享pcb 3D封装库)
嵌入式硬件·51单片机
神罚天下ET18 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
碧海银沙音频科技研究院18 小时前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
Zevalin爱灰灰19 小时前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥20 小时前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5