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

51单片机-驱动独立按键模块教程

本章概述思维导图:

51单片机驱动独立按键模块

按键简介

按键(Button/Switch)是电子设备中实现人机交互的核心元件,通过物理操作(按压、触摸)控制电路通断,完成指令输入。按键实物图如下:

按键在我们开发中又有哪几种呢?

1、 机械按键:金属触点 + 弹性结构(弹簧/弹片)。应用:遥控器、机械键盘、工业控制面板。

2、薄膜式按键:三层薄膜(上层电路 + 隔离层 + 下层电路)。应用:手机虚拟按键、家电控制面板、笔记本电脑键盘。

3、电容式触摸按键:触摸电极 + 电容检测电路。应用:智能手机触控、汽车中控屏、智能音箱。

特殊类型按键:

1、轻触开关:超薄型,用于电路板复位键。

2、编码器旋钮:结合旋转与按下功能,用于音量调节。

3、霍尔开关:非接触式,通过磁场控制通断,用于电动车刹车断电。

在以后我们开发中该如何选择适合的按键呢?

需明确手感,选择机械式;

需防尘防水,选择选薄膜式;

需隐藏式设计,选择电容式。

独立按键硬件电路原理图分析

独立按键硬件电路原理图:

在电路原理图中观察出一共有K1、K2、K3、K4四个独立按键。

        K1右侧连接低电平,左侧连接STC51芯片的P31引脚;

        K2右侧连接低电平,左侧连接STC51芯片的P30引脚;

        K3右侧连接低电平,左侧连接STC51芯片的P32引脚;

        K4右侧连接低电平,左侧连接STC51芯片的P33引脚;

K1、K2、K3、K4按键没有按下时,电路是没有导通。当K1、K2、K3、K4按下时,对应电路导通。要检测按键按下时的情况,STC51芯片的P30~P31引设置为输入模式,当K1、K2、K3、K4按键按下时可检测到低电平信号;

检测独立按键软件编程设计

检测按键是否按下,我们首先先使用sbit关键字声明STC51的4个引脚(P30~P33);

sbit KEY1=P3^1;//定义P30~P33引脚,用来检测按键是否按下
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

使用if条件判断语句对按键进行判断,当P30~P33为测到低电平时说明按键按下。在进行具体操作;这里对KEY1和KEY2进行判断,KEY1按下时点亮8个LED灯,KEY2按下时关闭8个LED灯;

代码示例:

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit KEY1=P3^1;//定义检测独立按键的各个引脚输入状态
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
int main()															 
{while(1){if(KEY1 == 0){P2=0x00;//驱动八个LED灯}else if(KEY2 == 0){P2=0xff;//关闭八个LED灯 }}
}

创建按键检测函数

在以后项目开发中,按键检测是并不可少的功能。这里详细创建按键检测函数,方便以后项目开发

按键检测函数示例代码:(函数返回值为:按键是否按下状态,函数形参为mode:mode为非零数代表连续检测,mode为零表达单次检测)

sbit KEY1=P3^1;//定义检测独立按键的各个引脚输入状态
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_return 1//定义检测独立按键函数检测的状态变量返回值,按键按下分别返回1,2,3,4;没有按键按下返回0;
#define KEY2_return 2
#define KEY3_return 3
#define KEY4_return 4
#define KEY_return 0
u8 KEY_detect(u8 mode)//按键检测函数,返回值为判断是否有按键按下:有按键按下返回值为1-4,无按键按下返回值为:0;形参mode为非零数代表连续检测,mode为零表达单次检测
{	static u8 flag=1;if(mode)//连续按键按下{flag=1;}if((!KEY1 || !KEY2 || !KEY3 || !KEY4) && flag==1)//一次判断是否有按键按下{flag=0;Delay_10us(1000);//延时消抖if(!KEY1)	return KEY1_return;//二次判断else if(!KEY2)	return KEY2_return;else if(!KEY3)	return KEY3_return;else if(!KEY4)	return KEY4_return;}else if(KEY1 && KEY2 && KEY3 && KEY4)//判断所有按键是否松开{flag=1;}return KEY_return;
}

主函数使用按键检测函数代码示例:

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void Delay_10us(u16 us)//延时函数:输入1大概延时时间为10us
{while(us--);
}
sbit KEY1=P3^1;//定义检测独立按键的各个引脚输入状态
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_return 1//定义检测独立按键函数检测的状态变量返回值,按键按下分别返回1,2,3,4;没有按键按下返回0;
#define KEY2_return 2
#define KEY3_return 3
#define KEY4_return 4
#define KEY_return 0
u8 KEY_detect(u8 mode)//按键检测函数,返回值为判断是否有按键按下:有按键按下返回值为1-4,无按键按下返回值为:0;
{	static u8 flag=1;if(mode){flag=1;}if((!KEY1 || !KEY2 || !KEY3 || !KEY4) && flag==1)//一次判断是否有按键按下{flag=0;Delay_10us(1000);//延时消抖if(!KEY1)	return KEY1_return;//二次判断else if(!KEY2)	return KEY2_return;else if(!KEY3)	return KEY3_return;else if(!KEY4)	return KEY4_return;}else if(KEY1 && KEY2 && KEY3 && KEY4)//判断所有按键是否松开{flag=1;}return KEY_return;
}
int main()															 
{u8 KEY_get=0;while(1){KEY_get=KEY_detect(0);//获取按键状态if(KEY_get == 1){P2=0x00;//驱动八个LED灯}else if(KEY_get == 2){P2=0xff;//关闭八个LED灯 }}
}

独立按键检测效果展示:

独立按键检测效果展示


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

http://www.dtcms.com/a/335531.html

相关文章:

  • 类的静态成员的定义、调用及继承详解【C++每日一学】
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月17日第163弹
  • 深度学习-计算机视觉-数据增广/图像增广
  • 《MATLAB绘图进阶教程》主要内容与专栏目录(持续更新中。。。)
  • GitHub 热榜项目 - 日榜(2025-08-17)
  • 智能体与MCP的核心流程和差异点(适合初学者)
  • IDEA飞算插件测评:重塑AI编码价值的实战体验
  • 【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
  • GEO(生成引擎优化)是什么?GEO优化怎么做
  • 在QML中使用Chart组件
  • Java Stream ForEach算子实现:ForEachOps
  • 半敏捷卫星观测调度系统的设计与实现
  • Git登录配置的详细方法
  • CSS中linear-gradient 的用法
  • Python字符串净化完全指南:专业级字符清理技术与实战
  • 开发者说 | EmbodiedGen:为具身智能打造可交互3D世界生成引擎
  • 区块链练手项目(持续更新)
  • Linux入门指南:基础开发工具---vim
  • 飞算AI 3.2.0实战评测:10分钟搭建企业级RBAC权限系统
  • ZKmall开源商城的移动商城搭建:Uni-app+Vue3 实现多端购物体验
  • PostgreSQL——用户管理
  • 轻松配置NAT模式让虚拟机上网
  • Go语言企业级权限管理系统设计与实现
  • Bootstrap4 轮播详解
  • Apollo 凭什么能 “干掉” 本地配置?
  • 使用Ansys Fluent进行倒装芯片封装Theta-JA热阻表征
  • Spring Cloud整合Eureka、ZooKeeper、原理分析
  • 牛客周赛 Round 104(小红的矩阵不动点/小红的不动点权值)
  • 【Netty核心解密】Channel与ChannelHandlerContext:网络编程的双子星
  • 适用监测农作物长势和病虫害的高光谱/多光谱相机有哪些?