学习STC51单片机05(芯片为STC89C52RC)
紧接上文学习了仅用程序持续点灯
好了今天我们学习按键点灯,虽然也是程序,但是可以通过按键来灭灯
按键点灯
这边可以得知key1 是 p2组1口
key2是p2组0口
GND表示地面
我们要知道这个sw1(switch)也就是开关,按下去的时候5v接地,key的值就会为低电平等于0
- 当开关(SW1)按下接地时,单片机引脚通过按键直接连接到 GND(地),电压接近 0V,属于低电平(逻辑0)。
遵循习惯和规范
- 用和原理图一致的名字(如原理图是 KEY1,代码也用 KEY1 ),方便在硬件和软件间建立对应关系,利于团队协作、代码维护和他人理解。大家看到代码里的 KEY1 就知道对应原理图中标识为 KEY1 的按键 。
然后这个可以按复位灭灯
复位就是让单片机从新开始工作,程序重新运行
按两个键控制灯
按键的软件消除抖动:(面试的时候可能会问)
软件消抖是在嵌入式系统中,针对传感器输入(如按钮、开关等)时,减小或消除因机械震动或电气干扰造成抖动信号的一种方法,通过编程实现。原理及常见方法如下:
产生抖动原因
机械按键在按下或释放瞬间,因机械触点弹性作用,不会立即稳定接通或断开,会伴随一连串抖动 。比如按下按键,触点实际会短时间内多次接触、断开,产生不稳定电平信号,若不处理,单片机可能误判按键操作次数。
这边主要就是先去获取一下你想要的延时时间 我感觉10ms差不多,这边给的50ms(数据不唯一)
主要就是这样理解的:先判断如果key1=0的话那么可以得知只有按键按下的时候才会=0因为接地了,然后给个50ms的延时,超过50ms说明是人按的,如果没有超过50ms,那么可能是抖动造成的。
IO口状态翻转
先给初始化一个状态这里是1,就是高电平,不亮
说白了就是给他取反 就是 将led = ! led
每次循环会将led的值切换,0的相反值就是1,那么就实现了一个键控制灯
记录状态位来控制LED
这边的#define 是预处理,我记得也叫宏定义,让无意义的东西变得有意义,且有数值,很好用。
Tips:记录状态位控制LED的作用
代码可读性与可维护性提升
- 逻辑清晰:状态位能直观反映 LED 的工作状态,如定义#define ON_STATUS 1 、#define OFF_STATUS 0 ,用变量记录状态,通过判断状态位决定 LED 亮灭,代码逻辑一目了然。例如在复杂的多按键控制多 LED 场景中,每个 LED 对应一个状态位,可快速理清控制关系。
- 便于修改调试:代码量较大或功能复杂时,若出现问题,基于状态位的控制方式能快速定位和修改。比如要改变 LED 闪烁逻辑,只需在记录状态位及相关判断逻辑处调整,无需全面排查代码。
实现复杂控制逻辑
- 状态管理有序:可方便构建状态机模型。以交通信号灯控制为例,通过状态位记录 “红灯”“绿灯”“黄灯” 状态,结合不同事件(如计时结束 )进行状态迁移,实现有序的信号灯切换控制。
- 支持多种操作组合:能轻松实现多种按键操作对 LED 的不同控制。比如单击按键切换 LED 亮灭,长按按键让 LED 快闪,通过状态位记录单击、长按状态,配合相应逻辑实现多样化功能。
资源利用与效率优化
- 减少硬件依赖:相较于纯硬件电路实现复杂逻辑(如用大量逻辑门 ),软件记录状态位更灵活,无需改动硬件即可修改控制逻辑,节省硬件成本和空间。
- 提高 CPU 利用率:软件消抖等操作结合状态位控制,能减少 CPU 在无效检测上的资源消耗。比如在按键消抖过程中,状态位记录按键稳定状态,避免 CPU 频繁检测抖动信号,使 CPU 能处理其他任务。