【51单片机系列】独立按键介绍

本文是关于独立按键的介绍及使用。首先介绍了按键,包括什么是按键及使用按键时如何实现软件消抖。然后使用proteus仿真实现独立按键控制LED指示灯的操作。

之前的LED、蜂鸣器、数码管中IO口都是作为输出使用,这里通过独立按键实验介绍IO口作为输入的使用。

文章目录

  • 一、按键介绍
  • 二、独立按键检测原理
  • 三、硬件设计
  • 四、软件设计

一、按键介绍

按键是一种电子开关,使用时按开关按钮就可使开关接通,当松开手时,开关断开。简单的按键及内部简易图如下:

按键及内部简易图

按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态。

如果按键按下,初始导通状态变为断开,初始断开状态变为导通。

通常的按键使用的开关为机械弹性开关,当机械触电断开、闭合时,电压信号如下所示:

机械触点断开闭合时的电压信号

由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开。因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定,一般为5ms到10ms。

按键稳定闭合时间的长短由操作人员的按键动作决定,一般为零点几秒至数秒。按键抖动会引起按键被误读多次。为了确保CPU对按键的依次闭合仅作一次处理,必须及时进行消抖。

按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。为了使电路更加简单,通常采用软件消抖。

软件消抖一般来说一个简单的按键消抖就是先读取按键的状态,如果得到按键按下之后,延时10ms,再次读取按键状态,如果按键还是按下状态,那么说明按键已经按下。其中的延时10ms就是软件消抖处理。

常用的软件去抖动方法:

  1. 先设置IO口为高电平,由于开发板IO有上拉电阻,默认IO为高电平;
  2. 读取IO口电平确认是否有按键按下;
  3. 如果有IO电平为低电平后,延时几个毫秒;
  4. 再读取该IO电平,如果仍为低电平,说明按键按下;
  5. 执行相应按键的程序;

键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。靠软件编程来识别的键盘称为非编码键盘。

单片机系统中,用的较多的是非编码键盘。非编码键盘又分为独立键盘和行列式键盘(即常说的矩阵键盘)。

二、独立按键检测原理

独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其它引脚分别接到单片机IO口。

单片机的IO口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地,另一端与单片机的某个IO口相连,开始时先给IO口赋一高电平,然后让单片机不断检测该IO口是否变为低电平,当按键闭合时,相当于该IO口通过按键与地相连,变成低电平,程序一旦检测到IO口变为低电平则说明按键被按下,然后执行相应的指令。

三、硬件设计

要实现的功能是:通过开发板上的独立按键控制LED指示灯亮灭。使用到的硬件资源如下:

  • LED指示灯
  • K1按键

proteus中仿真如下:

独立按键硬件设计

从电路中可以知道,该电路是独立的,4个独立按键的控制管脚直接连接到单片机的P3^0 ~ P3^3 IO口上。

要想单片机能够检测按键是否按下,需要通过单片机管脚来控制独立按键。

四、软件设计

实现代码如下:

/*
	实现功能:使用独立按键控制指示灯的亮灭
	[2023-12-06] zoya
*/
#include "reg52.h"

typedef unsigned int u16;

sbit KEY1 = P3^0;  // 独立按键
 
#define GPIO_LED P2  // 指示灯

// 延时函数,i=1延时10us
void delay(u16 i)
{
	while(i--);
}

// 独立按键处理函数
void keypros()
{
	if(0 == KEY1){  // 2. 读取IO口是否为低电平确认按键是否按下
		delay(1000);  // 3. 延时10ms
		if(0 == KEY1) {  // 4. 在读取IO口判断是否为低电平,如果仍然是低电平,说明按键按下
			GPIO_LED = ~GPIO_LED;  // 5. 执行按键按下的操作
		}
		
		while(!KEY1);  // 6. 稳定闭合期间保持按键操作
	}
}


void main()
{
	KEY1 = 1;  // 1. 先设置IO口为高电平
	GPIO_LED = 0xFF;  // 默认指示灯为不亮状态
	while(1)
	{
		keypros();
	}
}

仿真结果:

独立按键控制指示灯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/233777.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPIO的使用--滴答定时器--pir人体红外传感器

目录 一、滴答定时器的使用与原理 1、定义 2、原理 (1)向上计数​编辑 (2)向下计数 (3) 代码流程 a、配置滴答时钟唤醒频率 b、滴答时钟中断函数 (4)结果 3、优化-->寄存…

CSK6环境搭建

前期准备 开发板测试 (1)根据这个视频教程来进行测试:示例工程快速上手 Ubuntu环境搭建 (1)聆思官方推荐使用Linux开发,因此我于是采用VMware搭建Ubuntu的方式进行开发。不清楚Ubuntu搭建的请看&#xff1…

用友U8 Cloud 多处反序列化RCE漏洞复现

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud存在多处(TableInputOperServlet、LoginServlet 、FileTransportServlet、CacheInvokeServlet、ActionHandlerServlet、Servle…

Spring AOP面向切面编程

AOP将通用的、与业务无关的功能抽象封装为切面类。 切面可配置在目标方法的执行前、后运行,真正做到即插即用。实现了在不修改源码的情况下对程序行为进行扩展。 Spring AOP与AspectJ的关系: Eclipse AspectJ 是基于Java平台的面向切面编程的语言。 Sp…

C //习题10.10 从第9题的“职工工资文件”中删除一个职工的数据,再存回原文件。

C程序设计 (第四版) 谭浩强 习题10.10 习题10.10 从第9题的“职工工资文件”中删除一个职工的数据,再存回原文件。 IDE工具:VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法:使用指针,函数…

PyQt下使用OpenCV实现人脸检测与识别

背景: 一 数字图像处理与识别警务应用模型 基于前期所学知识,与公安实践相结合,综合设计数字图像处理与识别警务应用模型,从下列4个研究课题中选择2个进行实验实现:图像增强与复原、人脸检测与识别、虹膜内外圆检测与分割、车牌…

PHP使用mkcert本地开发生成HTTPS证书 PhpEnv集成环境

PHP使用mkcert本地开发生成HTTPS证书 PhpEnv集成环境 前言一、介绍 mkcert二、安装/使用 mkcert1. 安装2. 使用 总结 前言 本地开发时有些功能只有在 https 证书的情况下才能使用, 例如一些 Web API 一、介绍 mkcert Github地址 mkcert 是一个制作本地可信开发证书的简单工具。…

【Docker】Docker Compose,yml 配置指令参考的详细讲解

作者简介: 辭七七,目前大二,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

fijkplayer flutter 直播流播放

fijkplayer flutter 直播流播放 fijkplayer 是 ijkplayer 的 Flutter 封装, 是一款支持 android 和 iOS 的 Flutter 媒体播放器插件, 由 ijkplayer 底层驱动。 通过纹理(Texture)接入播放器视频渲染到 Flutter 中。 前言 目前使用…

redis-学习笔记(string)

redis 中的字符串, 是按照二进制的方式存储和读取的, 即存啥取啥, 所以一般不会出现乱码问题 (乱码问题是因为存储和读取时使用的编码方式不一样, 但是 redis 没有编码转换) redis 限制了 string 的大小 : 512M, 因为 单线程模型 希望进行的操作能够比较快速, 越大越慢 set key…

一文读懂MySQL基础知识文集(8)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

python3安装lifelines

目录 一、环境 二、安装lifelines 出现问题 三、测试导入 一、环境: jupyter notebook中新建ipynb文件 二、安装lifelines pip install --upgrade --no-deps githttps://github.com/CamDavidsonPilon/lifelines.git出现问题: 缺少模块autograd、f…

1834_emacs_ivy以及counsel的常用功能

Grey 全部学习汇总: GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. emacs ivy以及counsel的常用功能 主要功能 ivy主要是实现一些emacs的minibuffer的操作增强功能的。如果不进行类似的增强扩展,在进行这方面相…

[文档级关系抽取|ACL论文]文档级关系抽取中语言理解的基础模型

Did the Models Understand Documents? Benchmarking Models for Language Understanding in Document-Level Relation Extraction School of Computer Science, Fudan University | ACL 2023.06 | 原文链接 Background 过去的工作大多数都是从单个句子中收获更多的关系&am…

1-2、Java环境搭建

语雀原文链接 文章目录 1、JDK安装2、Hello World2-1、Hello World示例2-2、类名和文件名2-3、注释2-4、javadoc 3、环境变量3-1、Path作用3-2、classpath3-3、JAVA_HOME 4、Java组成5、跨平台原理5-1、Java跨平台原理5-2、C语言的跨平台原理 1、JDK安装 下载地址&#xff1a…

(JAVA)-IDEA导第三方包

1.下载好第三方的包 2.将jar包复制,上图中的第一个数字jar包是我们要选择的 3.模块下新建外包文件 4.将复制的jar文件粘贴进去 . 5.右键jar包将文件与jar包关联 注意:第三方库中有些名字跟java包中重名,导包时候注意不要导错了。

数据结构算法-归并排序

引言 小明和小森是超市的货架管理人员,他们每天都要确保货架上的商品摆放整齐、有序。一天,他们发现一个货架上的商品有些混乱,需要尽快进行补货。由于该货架上的商品种类繁多,不同种类的商品之间还要考虑价格、销量等因素&#…

data_loader返回的每个batch的数据大小是怎么计算得到的?

data_loader是一个通用的术语,用于表示数据加载器或数据批次生成器。它是在机器学习和深度学习中常用的一个概念。 一、data loader 数据加载器(data loader)是一个用于加载和处理数据集的工具,它可以将数据集划分为小批次&#…

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 52页论文及代码

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 52页论文及代码 1 题目 C题蔬菜类商品的自动定价与补货决策 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就…

2023.12.10 homework

五年级一元一次方程