【51单片机】独立按键快速上手

51单片机独立按键是单片机控制系统中常用的一种输入方式,它相当于一种电子开关,按下时开关接通,松开时开关断开。

开关功能‌:独立按键内部通常包含一个有弹性的金属片,当按键被按下时,金属片与触点接触,电路连通;当按键松开时,金属片恢复原状,电路断开。

电平变化‌:在51单片机系统中,独立按键通常一端接地(GND),另一端连接到单片机的I/O口上。当按键未按下时,I/O口通过内部上拉电阻保持高电平;当按键按下时,I/O口与地相连,变为低电平。

抖动现象‌:由于按键内部机械触点的弹性作用,在按键按下和松开的瞬间会伴随一连串的抖动。这种抖动会导致单片机在短时间内多次检测到电平变化,从而产生误操作。为了消除抖动的影响,需要对按键进行消抖处理。消抖方法主要有两种:硬件消抖和软件消抖。硬件消抖通过滤波电路或其他电路实现消抖功能,但会增加电路的复杂性和成本;软件消抖则在程序中通过延时函数来实现消抖。

硬件原理图

按下独立按键控制LED灯

SW1按下时,P4.2引脚会被拉低;SW2按下时,P4.3引脚会被拉低;SW3被按下时,P3.2引脚会被拉低;SW4按下时,P3.3引脚会被拉低。

因此只需检测上述引脚是否变为低电平即可,若检测到变为低电平,就执行控制LED的逻辑。需要注意的是,按键的检测需要持续进行,所以需要不停的检查上述引脚是否变为低电平。

由于按键的抖动,单片机引脚的信号切换并不像我们想象的那样干脆

当我们检测到信号为0时,不能莽撞的认为按键已经被按下了,而是要稍微等一段时间(约10ms),等按键稳定之后,再次检测,如果信号仍然为0,才可以确定按键确实被按下了。

cpp 复制代码
#include <STC89C5xRC.H>
#include "Util.h"
#define SW1  P42
#define SW2  P43
#define SW3  P32
#define SW4  P33
#define LED1 P00
#define LED2 P01
#define LED3 P02
#define LED4 P03

void main()
{
    while (1) { // 持续监测按键
        if (SW1 == 0) {
            Delay1ms(10); // 延时消抖
            if (SW1 == 0) {
                while (SW1 == 0); // 等待按键抬起
                LED1 = ~LED1;
            }
        }

        if (SW2 == 0) {
            Delay1ms(10);
            if (SW2 == 0) {
                while (SW2 == 0);
                LED2 = ~LED2;
            }
        }

        if (SW3 == 0) {
            Delay1ms(10);
            if (SW3 == 0) {
                while (SW3 == 0);
                LED3 = ~LED3;
            }
        }

        if (SW4 == 0) {
            Delay1ms(10);
            if (SW4 == 0) {
                while (SW4 == 0);
                LED4 = ~LED4;
            }
        }
    }
}
相关推荐
FellAveal10 小时前
【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)
笔记·学习·golang
xqqxqxxq10 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
龙仔72510 小时前
人大金仓OS_Core数据库自动备份实施笔记(银河麒麟Linux)
linux·数据库·笔记·备份·人大金仓
Freak嵌入式11 小时前
MCU 低功耗模式解析:时钟门控、电源门控、深度休眠
人工智能·python·单片机·嵌入式硬件·开源·依赖倒置原则·micropython
国科安芯11 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
躺不平的理查德12 小时前
STM32时钟树(Clock Tree)
stm32·单片机·嵌入式硬件
Z59981784112 小时前
c#软件开发学习笔记--Modbus-RTU通讯
笔记·学习·c#
Javenwww13 小时前
STM32中DMA的使用——串口数据的DMA传输
单片机
qq_4017004113 小时前
经典的电压基准源电路
单片机·嵌入式硬件
quanjui14 小时前
【医学尝试】基于Segment Anything Model的医学图像分割研究:眼底OCT与X线胸片微调实战
人工智能·笔记·学习