本文是51单片机学习系列的第二篇,主要整理GPIO、中断、定时器、PWM这些核心外设的工作原理和实战代码。
一、GPIO:单片机的“手脚”
GPIO全称General Purpose Input/Output(通用目的输入输出),是所有单片机最基础的外设,本质就是控制引脚的电平状态,分为两种工作模式:
1. 输出模式
由单片机主动控制引脚输出高/低电平,比如点亮LED、驱动蜂鸣器等场景都会用到。
2. 输入模式
由单片机检测外部引脚的电平变化,常用于按键检测、ADC信号采集等场景。
📌 实战:独立按键检测
最常用的按键接法是一端接GND,另一端接GPIO引脚,未按下时引脚默认为高电平,按下后引脚与GND短路变为低电平,通过检测低电平即可判断按键状态。
// 按键初始化:将对应引脚拉高,等待按键按下 void key_init(void) { // 此处根据实际硬件填写引脚配置,通常为P3口的某一位 P3_1 = 1; } // 检测按键是否按下:返回1表示按下,0表示未按下 int key_press(void) { if(P3_1 == 0) // 检测到低电平 { // 实际项目中可加10~20ms消抖逻辑 return 1; } return 0; }二、中断:让CPU“一心多用”
中断的本质是:CPU正在处理当前任务时,被更紧急的事件打断,优先处理紧急事件,处理完成后再回到原任务继续执行。
1. 51单片机的中断源
51单片机共有5个中断源,优先级固定(数字越小优先级越高):
中断源 | 触发条件 | 优先级 |
|---|---|---|
外部中断0 | P3.2引脚电平变化 | 0 |
定时器0 | 定时器0计数溢出 | 1 |
外部中断1 | P3.3引脚电平变化 | 2 |
定时器1 | 定时器1计数溢出 | 3 |
串口中断 | 串口收发数据完成 | 4 |
2. 中断处理全流程
中断源发出中断请求
CPU检查总中断开关(EA)和对应中断源的开关是否开启
比较当前中断与其他挂起中断的优先级
保护现场:把当前程序执行的上下文(寄存器值等)压入栈中
执行中断服务函数(回调函数)
恢复现场:从栈中弹出之前保存的上下文,回到原程序继续执行
⚠️ 注意:51单片机最多支持两层中断嵌套,高优先级中断可以打断低优先级中断的执行。
三、定时器:精准定时的核心
定时器是单片机实现精准时序控制的核心外设,比如延时、PWM生成、串口波特率配置都离不开它。
1. 定时器工作原理
51单片机的定时器本质是加法计数器:
开启计数器后,每个机器周期计数器值+1
当计数到最大值65535后再加1,就会触发溢出,向CPU发送中断请求
从设置初值到溢出的时间,取决于两个参数:初值大小、计数频率
2. 1ms精准定时实战
我们以12MHz晶振为例计算:
51单片机12分频后实际工作频率:
12MHz / 12 = 1MHz单个机器周期时间:
1 / 1MHz = 1μs1ms = 1000μs,因此需要计数1000次
定时器初值 =
65535 - 1000 = 64535
如果是11.0592MHz晶振,分频后频率为11.0592MHz/12=0.9216MHz,机器周期约1.085μs,1ms定时需要计数1000μs / 1.085μs ≈ 922次,初值为65535 - 922 = 64613。
四、PWM:控制亮度和音量的神器
PWM全称脉冲宽度调制,可以让引脚周期性输出高低电平变化的方波,核心参数是周期和占空比:
PWM周期:一个完整方波的时间(相邻两个上升沿/下降沿的间隔)
占空比:一个周期内高电平持续时间占总周期的比例,常用于LED亮度调节、LCD背光控制、直流电机调速等场景。
📌 实战:无源蜂鸣器播放不同音调
无源蜂鸣器没有内置振荡源,需要外部输入PWM信号才能发声,不同频率对应不同音调:
频率 | 周期 | 半周期定时 | 定时器初值(12MHz晶振) |
|---|---|---|---|
200Hz | 5ms | 2.5ms | 65535 - 2500 = 63035 |
400Hz | 2.5ms | 1.25ms | 65535 - 1250 = 64285 |
600Hz | ~1.67ms | ~0.83ms | 65535 - 830 = 64705 |
800Hz | 1.25ms | 0.625ms | 65535 - 625 = 64910 |
1000Hz | 1ms | 0.5ms | 65535 - 500 = 65035 |
实现思路:定时器每隔半个周期翻转一次蜂鸣器引脚电平,即可输出对应频率的PWM波。
五、踩坑总结
按键检测一定要加消抖,否则会误触发
中断服务函数要尽量短小,不要做耗时操作,避免影响其他任务
定时器初值计算要注意晶振频率和分频系数,算错会导致定时不准
无源蜂鸣器必须给PWM信号才能响,接高电平是不会出声的~
以上就是51单片机Day02的核心知识点啦,后续会更新更多外设实战(比如串口通信、OLED显示),感兴趣的同学可以点赞收藏关注哦😉
如果有写错的地方,欢迎在评论区指正~