单片机学习笔记---独立按键控制LED状态

上一节学习的是独立按键控制LED亮灭

这一节我们先来讲一下按键的抖动:

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

看一下下面这个波形,按键没有按下的时候,它就是高电平1,然后突然按下按键,就变成低电平0并且由于机械触点,它会弹开,然后上下抖动一下,之后才稳定得变成0。这个抖动的时间大概是5-10ms,不同的开关抖动的时间是不一样的。

当抖动消失的时候,它就是进入一个稳定的低电平0状态。

松手的时候它也产生抖动,大概也是5-10ms。最后稳定地变成1。

那么我们知道这个抖动对按键的检测进行一些干扰,这就涉及一个东西,叫做消抖。

消抖有两种方法,一种是硬件的消抖,就是加个电路,把这些线通过这个电路里面经过一些触发器等等一些电路来进行操作,把这个抖动进行过滤,这个波形就变成直的,然后点亮LED。但是这种比较麻烦,需要硬件资源。

还有一种方法就是通过软件来处理,就是写程序。怎么办?

当检测到按键按下的时候,来个Delay,直接延时个20ms,而抖动产生的时间大概也才5-10ms,我们延时20ms,就足够覆盖这个抖动时间了。当抖动过去的时候,我们再继续操作,松手的时候我们也Delay 20ms,然后再继续操作。

那么这个程序怎么写呢?

我们要延时20ms的话,要先在STC生成一个延时1ms的程序

注意:系统频率和指令集一定要改成和自己的单片机一致的。

然后复制过来改造一下,完整的代码如下:

编译无错误后下载下来测试一下,重启板子看看效果

我们看到D1的确是在以1秒为周期在闪烁(500ms为半秒)。这就证明我们的Delay函数写的没有错。

那么我们继续往下写

接下来我们要写一个按键判断的程序,昨天我们学过了,是用if语句来判断按键

按键操作有3步:

  1. 按下按键要消抖
  2. 判断松手
  3. 松开按键要消抖

最后要记得LED的状态取反

完整代码如下:

#include <REGX52.H>

void Delay(unsigned int xms)
{
		unsigned char i, j;
    while(xms)
		{
			//以下这段代码是Delay1ms的代码
			i = 2;
			j = 239;
			do
			{
					while (--j);
			} while (--i);
			
			//每次延时1ms结束后,xms就减1
			xms--;
			//直到减到0的时候就会跳出while循环
			//如此就可以实现给xms传多少秒,Delay函数就延时了多少毫秒
		}
}
		
void main()
{
	while(1)
	{
		//判断按键有3步
		if(P3_1==0)//K1按键连接的是P3的1口
		{
			//1.按下按键消抖
			Delay(20);//延时20ms
			
			//2.判断松手
			//延时20ms后,到了稳定状态
			//接下来要检测是否松手
			//因为我们要实现的是当按下的时候,没有亮,只有当松手的时候才亮
			//用while语句判断并循环
			//如果K1还是按下的状态,它就一直循环
			//一旦松手即P3_1==1,就跳出循环
			while(P3_1==0);
			
			//3.松开按键消抖
			Delay(20);//延时20ms
			
			//LED状态取反:
			//为什么要取反?
			//是因为上面判断松手那一步,当P3_1==1时跳出循环了
			//此时P3_1==1,则P2_0也等于1,想要P2_0==0,就得取反,1变成0,灯就亮了
		    P2_0=~P2_0;
		}
	}
}

编译无错误,看看效果

按下K1的时候没有反映

松手后的效果:

只有检测到松手的时候才变亮了。

以上即这节要实现的效果!

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

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

相关文章

Leetcode刷题笔记题解(C++):1971. 寻找图中是否存在路径

思路&#xff1a; 1.建立图集&#xff0c;二维数组&#xff0c;path[0]里面存放的就是与0相连的节点集合 2.用布尔数组来记录当前节点是否被访问过&#xff0c;深度优先会使用到 3.遍历从起点开始能直接到达的点&#xff08;即与起点相邻的点&#xff09;&#xff0c;判断那…

判断给定的字符串s是否为Python的保留关键字keyword.iskeyword(s)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断给定的字符串s 是否为Python的保留关键字 keyword.iskeyword(s) [太阳]选择题 请问以下代码输出的结果是&#xff1f; import keyword print("【执行】keyword.iskeyword(for)"…

【蓝桥杯冲冲冲】[NOIP2000 提高组] 方格取数

蓝桥杯备赛 | 洛谷做题打卡day19 文章目录 蓝桥杯备赛 | 洛谷做题打卡day19[NOIP2000 提高组] 方格取数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 [NOIP2000 提高组] 方格取数 题目背景 NOIP 2000 提高组 T4 题目描述 设有 N N…

PBM模型学习(五)UDF生长模型

DEFINE_PB_GROWTH_RATE(name, cell, thread, d_i) 该UDF在每个时间步开始时执行,只有在时间步开始时,颗粒粒径才会更新,同时才会UDF才会向文件写入数据GR单位是m/sC_PHASE DIAMETER(c,ts):返回颗粒粒径???,ts为颗粒相的线程C_VOF(cell,thread):颗粒相总体积C_PB DISCI(c…

Kotlin快速入门系列2

Kotlin的基本数据类型 Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是&#xff0c;字符不属于数值类型&#xff0c;是一个独立的数据类型。 Java和kotlin数据类型对照如下&#xff1a; Java基本数据类型 Kotlin对象数据类型 数据类…

vue3+naiveUI二次封装的v-model 联动输入框

根据官网说明使用 源码 <template><div class"clw-input pt-3"><n-inputref"input":value"modelValue":type"type":title"title"clearable:disabled"disabled":size"size"placeholder&…

商家转账到零钱使用教程

商家转账到零钱是什么&#xff1f; 使用商家转账到零钱这个功能&#xff0c;可以让商户同时向多个用户的零钱转账。商户可以使用这个功能用于费用报销、员工福利发放、合作伙伴货款或分销返佣等场景&#xff0c;提高效率。 商家转账到零钱的使用场景有哪些&#xff1f; 商家…

(大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量

今天&#xff0c;面试了一家公司&#xff0c;什么也不说先来三道面试题做做&#xff0c;第一题。 那么&#xff0c;我们就开始做题吧&#xff0c;谁叫我们是打工人呢。 题目是这样的&#xff1a; 统计除豪车外&#xff0c;销售最差的车 车辆按批销售&#xff0c;每次销售若干…

IDC机房交换机核心技术与应用指南

IDC机房交换机核心技术与应用指南 ​ 在这个快速发展的数字时代&#xff0c;数据中心作为信息技术的心脏&#xff0c;不仅承载着海量数据的处理、存储和传输&#xff0c;更是支撑着全球企业运营和互联网服务的关键基础设施。在众多构成数据中心的组件中&#xff0c;IDC机房交换…

在autodl训练yolov8时卡在下载字体

1.问题 在autodl训练yolov8到这一步之后会卡住很久 2. 解决办法 Ctric中断后发现是下载Arial字体卡住了&#xff0c;这个字体需要从外网中下载 先手动从链接中下载https://ultralytics.com/assets/Arial.ttf &#xff0c;然后上传到autodl。然后将这个文件移动到/root/.config/…

RabbitMQ问题总结

:::info 使用场景 异步发送&#xff08;验证码、短信、邮件。。。&#xff09;MySQL 和 Redis、ES 之间的数据同步分布式事务削峰填谷… ::: 如何保证消息不丢失 上图是消息正常发送的一个过程&#xff0c;那在哪个环节中消息容易丢失&#xff1f;在哪一个环节都可能丢失 生…

Linux常见指令汇总

目录 pwd√ ls√ cd√ 对文件的理解√ which√ alias√ touch√ linux系统目录结构√ mkdir / tree √ rmdir / rm √ man√ nano√ cp√ mv√ cat√ echo√ linux设计理念和三种重定向总结√ more/less√ head/tail√ wc√ uniq√ date / cal√ find√…

【云原生】Docker私有仓库搭建以及四大容器重启策略

目录 一、registry私有仓库 步骤一&#xff1a;先拉取registry的镜像 步骤二&#xff1a;修改docker的配置文件重启 步骤三&#xff1a;基于registry镜像启动一个容器&#xff0c;可以设置为always重启策略 步骤四&#xff1a;修改想要上传的镜像的标签并上传验证 步骤五&…

83.网游逆向分析与插件开发-背包的获取-自动化助手显示装备数据

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;装备栏数据与算法的C还原-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;849fed846405438d222…

有没有游泳可以戴的耳机,盘点2024年最值得入手的游泳耳机

最近几年的天气越来越炎热&#xff0c;水中运动无疑成为大家喜爱的清凉方式。无论是游泳、浮潜还是冲浪&#xff0c;都能让我们在享受清凉的同时&#xff0c;还能锻炼身体。然而&#xff0c;如果是音乐爱好者&#xff0c;想在游泳时也享受到动人的旋律&#xff0c;却因为耳机无…

亚马逊测评,完善的自养号系统需要具备哪些要求

在亚马逊等跨境电商平台的严格审查下&#xff0c;许多卖家和买家都遭到了封号。这些封号事件对依赖线上销售的小型卖家造成了巨大的冲击。我们发现大部分账号被封的原因在于底层环境搭建不当。 无论是在亚马逊还是其他跨境电商平台&#xff0c;如ebay、速卖通、虾皮、Lazada等…

学习PyQt5

1、布局之后&#xff0c;无法移动对象到指定区域&#xff0c;无法改变对象大小。 原因&#xff1a;因为CtrlA选中了整个窗口&#xff0c;然后布局的时候就相当于整个窗口都按照这种布局&#xff0c;如选了水平布局&#xff0c;按钮一直在中间&#xff0c;无法拖到其它位置。 …

2024年【裂解(裂化)工艺】及裂解(裂化)工艺模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 裂解&#xff08;裂化&#xff09;工艺是安全生产模拟考试一点通总题库中生成的一套裂解&#xff08;裂化&#xff09;工艺模拟考试题库&#xff0c;安全生产模拟考试一点通上裂解&#xff08;裂化&#xff09;工艺作…

Pandas.Series.product() 乘积(累乘积) 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

dvwa靶场文件上传high

dvwa upload high 第一次尝试&#xff08;查看是否是前端验证&#xff09;第二次尝试我的上传思路最后发现是图片码上传修改配置文件尝试蚁&#x1f5e1;连接菜刀连接 第一次尝试&#xff08;查看是否是前端验证&#xff09; 因为我是初学者&#xff0c;所以无法从代码审计角度…