当前位置: 首页 > backend >正文

学习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 能处理其他任务。

http://www.xdnf.cn/news/7169.html

相关文章:

  • 发布时将多个bpl 打包成一个bpl的方法,或者说:不需要vcl60.bpl情况下 18.5K的exe 照常可以运行。
  • deepseek系列论文汇总(时至2025.5)
  • 2023 睿抗机器人开发者大赛CAIP-编程技能赛-高职组(省赛)解题报告 | 珂学家
  • AGI大模型(24):通过LangChain的接口来调用OpenAI对话
  • 【AWS入门】Amazon Bedrock简介
  • Compose笔记(二十四)--Canvas
  • 项目:在线音乐播放服务器——基于SSM框架和mybatis
  • redis持久化和数据淘汰方案
  • NB-IoT技术深度解析:部署模式与节能机制全指南
  • SONiC系统之高速数据遥测High Frequency Telemetry
  • Java中的伪共享(False Sharing):隐藏的性能杀手与高并发优化实战
  • Python训练营---Day29
  • 劳特巴赫trace32自定义调试界面
  • mysql的高可用
  • 基于MCP的AI Agent应用开发实践
  • 类的加载过程详解
  • 如何本地部署Qwen3系列的大小模型235B/32B并进行推理服务及并发测试?
  • 力扣1991:找到数组的中间位置(前缀和)
  • 三、关系数据库
  • leetcode报错原因总结需要背下来的程序片 [更新中]
  • MinIO:从入门到精通,解锁云原生存储的奥秘
  • 程序代码篇---python向http界面发送数据
  • Ubuntu搭建TFTP服务器的方法
  • OpenCL C++图像纹理处理
  • jvm安全点(四)openjdk17 c++源码垃圾回收之安全点轮询页内存设置不可访问
  • 前端图片上传组件实战:从动态销毁Input到全屏预览的全功能实现
  • 备份C#的两个类
  • 【DAY22】 复习日
  • 三、高级攻击工具与框架
  • React Flow 边的基础知识与示例:从基本属性到代码实例详解