单片机学习笔记---独立按键控制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就减1xms--;//直到减到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的时候没有反映

松手后的效果:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机智能电子秤

实物显示效果&#xff1a; https://www.bilibili.com/video/BV1Wb4y1A7Aw/?vd_source6ff7cd03af95cd504b60511ef9373a1d 功能介绍&#xff1a; &#xff08;1&#xff09;用键盘设计单价&#xff1b; &#xff08;2&#xff09;称重后同时显示该物品的重量、单价和总额&…

大创项目推荐 题目:基于大数据的用户画像分析系统 数据分析 开题

文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

VR漫游:赋予用户720度身临其境的沉浸式体验

如今&#xff0c;VR全景技术已经成为了千行百业中不可或缺的一部分&#xff0c;随着用户对交互式、沉浸式体验的需求不断加强&#xff0c;VR漫游逐渐取代了传统图片&#xff0c;为人们带来了流畅且完整的VR宣传观看体验。 VR实景漫游真实的展示了现场环境&#xff0c;不仅增加了…

硬编码和软编码

"硬编码"和"软编码"是在软件开发和编程中常用的两个术语&#xff0c;它们涉及到如何处理和组织代码中的常量或配置。 硬编码&#xff08;Hardcoding&#xff09;&#xff1a; 含义&#xff1a; 将常量、数值或配置直接嵌入到源代码中的做法。例子&#xff…

JavaEE 网络编程

JavaEE 网络编程 文章目录 JavaEE 网络编程引子1. 网络编程-相关概念1.1 基本概念1.2 发送端和接收端1.3 请求和响应1.4 客户端和服务端 2. Socket 套接字2.1 数据包套接字通信模型2.2 流套接字通信模型2.3 Socket编程注意事项 3. UDP数据报套接字编程3.1 DatagramSocket3.2 Da…

【C语言/数据结构】排序(直接插入排序|希尔排序)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 插入排序 直接插入排序&…

Fink CDC 1.0 至3.0的从古至今

本文主要分享Flink CDC 1.0 至3.0的发展历程,了解其背后的关键特性和发展趋势,探讨其在大数据领域的影响和价值。 一、CDC概述 CDC是一种用以掌控数据变化的软件架构(技术思路),用于捕获和传递数据库中发生的数据变化。当数据库中发生增(INSERT)/删(DELETE)/改(UPD…

Java实现数字化社区网格管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5.1 查询企事业单位5.2 查询流动人口5.3 查询精准扶贫5.4 查询案件5.5 查询人口 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数字化社区网格管理系统&#xf…

燃烧的指针(三)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

【AndroidStudio】2022.3Giraffe连接超时,更换下载源,使用本地gradle,版本对应问题

记录了使用AndroidStudio2022.3 Giraffe版本在搭建环境时遇到的问题&#xff0c;包括连接超时&#xff0c;gradle无法读取等。 如果只看如何正确的配置&#xff0c;直接跳转第3节 配置汇总 1 连接超时 项目一开始会自动下载gardle文件来加载项目 1.1 Connect timed out 基…

算法38:子数组的最小值之和(力扣907题)----单调栈

题目&#xff1a; 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 示例 1&#xff1a; 输入&#xff1a;arr [3,1,2,4] 输出&#xff1a;17 解释&#xff1a; 子数组为 [3]&#xff0c;[…

go语言(十八)---- goroutine

一、goroutine package mainimport ("fmt""time" )func main() {//用go创建承载一个形参为空&#xff0c;返回值为空的一个函数go func() {defer fmt.Println("A.defer")func() {defer fmt.Println("B.defer")//退出当前goroutinefmt…

Ubuntu添加AppImage到桌面及应用程序菜单

将AppImage添加到桌面&#xff0c;以PicGo为例 效果&#xff1a; 在桌面创建PicGo.desktop文件&#xff0c;输入以下内容&#xff1a; [Desktop Entry] EncodingUTF-8 TypeApplication #应用名称 NamePicGo #图标路径 Icon/usr/local/AppImage/icons/PicGo.png #启动是否开启…

arm-none-eabi 全局初始化的变量出现了不正确的值。

开发环境 主芯片:F1C100s 交叉编译器:arm-none-eabi IDE: VSCode 操作系统:Windows 问题描述 全局变量初始化后,打印调试时发现数据错误。 代码如下: /// @brief 通道设置 struct tagChannelSettings {/* Settings */uint8 enable; // 通道是否关闭。0:关闭;1…

MySQL复合索引

复合索引是指在数据库表上同时包含两个或更多列的索引。它们对于优化涉及这些列的查询非常有效&#xff0c;特别是当这些列常常在查询条件&#xff08;如WHERE子句&#xff09;、排序&#xff08;ORDER BY子句&#xff09;和连接&#xff08;JOIN条件&#xff09;中使用时。 复…

谁管谁叫爹

L1-8 谁管谁叫爹 分数 20 作者 陈越 单位 浙江大学 《咱俩谁管谁叫爹》是网上一首搞笑饶舌歌曲&#xff0c;来源于东北酒桌上的助兴游戏。现在我们把这个游戏的难度拔高一点&#xff0c;多耗一些智商。…

探索Pyecharts之美-绘制多彩旭日图的艺术与技巧【第37篇—python:旭日图】

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题&#xff1a;动态旭日图数据源扩展&#xff1a;外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色&#xff0c;而Pyecharts是Python中一个…

MySQL 导入数据

我们可以将已有的数据导入到MySQL数据库中&#xff0c;下面是几种方式&#xff1a; 1、mysql 命令导入 使用 mysql 命令导入语法格式为&#xff1a; mysql -u用户名 -p密码 < 要导入的数据库数据(shulanxt.sql) 实例&#xff1a; # mysql -uroot -p123456 < …

JAVA编程题之用户登录,用户信息存储在本地文件

实现用户登录&#xff1a;键盘输入要登录的用户名与密码 properties类型文件常在框架内用作配置文件. public static void main(String[] args) throws Exception {FileInputStream fis new FileInputStream("user.properties");Properties properties new Prope…

SpringMVC初始化源码学习

web.xml <web-app><!--Listener作用:加载并初始化Spring容器(也可以称为父容器)--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name…