本节重点:
GPIO输入模式、输出模式
按键工作原理(GPIO输入)
中断概念
中断源概念、中断源个数、哪几个中断源
外部中断、定时器中断概念
中断处理流程:
51单片机中定时器的个数?类型
16位定时器和8位自动重装载定时器的区别
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 步)
- 中断源发出 "中断请求"(如外部中断 0 引脚电平变化);
- 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 步)
-
先配置TMOD模式选择寄存器,将低四位清0,再将bit0置1代表工作在16位定时器
-
向TH0和TL0中装入定时器的初值(1ms -> 64535)
-
将TCON寄存器中的bit6置1,代表允许定时器开始计数
-
将IE寄存器中的bit7和bit1置1,开启中断总开关和定时器0的子开关
-
编写定时器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)



