51单片机入门Day02:从GPIO到PWM,手把手带你玩转基础外设

51单片机入门Day02:从GPIO到PWM,手把手带你玩转基础外设
本文是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个中断源优先级固定数字越小优先级越高中断源触发条件优先级外部中断0P3.2引脚电平变化0定时器0定时器0计数溢出1外部中断1P3.3引脚电平变化2定时器1定时器1计数溢出3串口中断串口收发数据完成42. 中断处理全流程中断源发出中断请求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/120.9216MHz机器周期约1.085μs1ms定时需要计数1000μs / 1.085μs ≈ 922次初值为65535 - 922 64613。四、PWM控制亮度和音量的神器PWM全称脉冲宽度调制可以让引脚周期性输出高低电平变化的方波核心参数是周期和占空比PWM周期一个完整方波的时间相邻两个上升沿/下降沿的间隔占空比一个周期内高电平持续时间占总周期的比例常用于LED亮度调节、LCD背光控制、直流电机调速等场景。 实战无源蜂鸣器播放不同音调无源蜂鸣器没有内置振荡源需要外部输入PWM信号才能发声不同频率对应不同音调频率周期半周期定时定时器初值12MHz晶振200Hz5ms2.5ms65535 - 2500 63035400Hz2.5ms1.25ms65535 - 1250 64285600Hz~1.67ms~0.83ms65535 - 830 64705800Hz1.25ms0.625ms65535 - 625 649101000Hz1ms0.5ms65535 - 500 65035实现思路定时器每隔半个周期翻转一次蜂鸣器引脚电平即可输出对应频率的PWM波。五、踩坑总结按键检测一定要加消抖否则会误触发中断服务函数要尽量短小不要做耗时操作避免影响其他任务定时器初值计算要注意晶振频率和分频系数算错会导致定时不准无源蜂鸣器必须给PWM信号才能响接高电平是不会出声的~以上就是51单片机Day02的核心知识点啦后续会更新更多外设实战比如串口通信、OLED显示感兴趣的同学可以点赞收藏关注哦如果有写错的地方欢迎在评论区指正~

最新新闻

日新闻

周新闻

月新闻