51单片机入门:独立按键(02)

news/2024/11/28 21:20:09/文章来源:https://www.cnblogs.com/arciab/p/18570741

标题:

​ 51单片机入门:独立按键(02)

一、独立按键的基本结构和功能

image-20241126151245755

二、独立按键在单片机的位置

image-20241126151350021

三、初次使用独立按键

设计第1个程序,使用按键K1控制D1的亮灭

#include<regx52.h>void main()
{while(1){if(P3_1 == 0)  // 按下按钮相当于接地 P3_1 == 0; {P2_0 = 0;  // 亮}else{P2_0 = 1;  // 灭}}	
}

解释一下为什么是P3_1==0,看原理图可以发现按下后P3_1接地,此时为低电平,且此时P3_1为读取值,所以等于零表示按下独立按键

image-20241126181304080

实现现象:

需要指出的是,由于Proteus软件是在最理想的情况下仿真,完全消除了按键抖动的影响,所以这段简单的代码无法有效实现单次点击后LED常亮或熄灭,关于按键抖动下面会介绍到。

动画

四、新的知识点也是重点:抖动

在我们按下或松开“独立按键”时,由于材料原因金属弹片就会在极短的时间内上下波动,造成整个电路的频繁开关。这段抖动时间极短,大约只有10ms(不会察觉到),但由于单片机运行频率都在兆赫兹,所以这种抖动可以被单片机检测到并做出反应,所以如果不消除抖动的影响就会造成按键“失灵”的现象。

img

抖动的消除:可以分成硬件消抖和软件消抖(这些图片都是在网上找到的,对于原作者在这里表示感谢。)

硬件消抖原理:利用电容充/放电需要时间起到延时的作用消抖,这种方式也可以使用软件来实现,下面将会介绍到。

image-20241126152752647

当按下按钮K1后电容开始放电,此时引脚KeyIn1检测到的依然是高电平1,当电容放电结束「在这段时间中按键抖动已消除」KeyIn1接地导通检测到低电平0;当松开按钮K1后电容开始充电,此时引脚keyIn1检测到的依然是低电平0,当电容充电结束「在这段时间中按键抖动已消除」KeyIn1接地导通检测到高电平1。

软件消抖原理:添加延时函数,在按键按下后延时一段时间(一般为20ms)跳过抖动。(重点)

这也是第2个程序:独立按键控制LED状态

#include<regx52.h>  // 头文件void Delay(unsigned int n) //设置延时函数,实现软件消抖,这个函数执行依次大约延时1ms
{unsigned char j;while(n--){for(j = 0; j < 113; j++);}
}void main()
{while(1){	if(P3_1 == 0){Delay(20);					//按下按键延时20ms消抖while(P3_1 == 0);			//如果按键持续按下,就进入这个循环直到松开,进入下面的延时函数Delay(20);					//松开按键延时20ms消抖P2_0 = ~P2_0;				//取反,实现按键控制LED状态}}
}

实验现象:

动画

五、独立按键控制LED灯显示二进制

第3个程序:

#include<regx52.h>void Delay(unsigned int n)  // 延时函数
{unsigned char j;while(n--){for(j = 0; j < 113; j++);}
}void main()
{unsigned char NUM = 0;  //0000 0000 定义初始值while(1){if(P3_1 == 0){Delay(20);while(P3_1 == 0);Delay(20);NUM++;		 //举例: 0000 0001  每次加1 实现二进制  如下次为 0000 0010P2 = ~NUM;   //举例: 1111 1110  将NUM取反变成 1111 1101 只点亮特定的LED	}}
}

感觉上面说的不明白,在下面详细解释下:

// 首先定义无符号字符型变量NUM
// 将 NUM 赋初值为 0  换算为二进制就为 0000 0000 
// 进入 while 循环// 按键按下 NUM + 1  此时NUM等于1 二进制表示 0000 0001   取反  1111 1110  点亮D1// 按键按下 NUM + 1  此时NUM等于2 二进制表示 0000 0010   取反  1111 1101  点亮D2// 按键按下 NUM + 1  此时NUM等于3 二进制表示 0000 0011   取反  1111 1100  点亮D1、D2// 依次类推……// 按键按下 NUM + 1  此时NUM等于15 二进制表示 1111 1111   取反  0000 0000  点亮D1、D2、D3、D4、D5、D6、D7、D8// 按下按键 NUM + 1  此时NUM等于16 数据溢出 NUM等于0 开始重新计数

实验现象:

动画

六、独立按键控制LED灯左右移动

这个部分需要重点介绍移位运算符,第4个程序:

#include<regx52.h>void Delay(unsigned int n)  // 延时函数
{unsigned char j;while(n--){for(j = 0; j < 113; j++);}
}unsigned char LEDNum = 0; // 定义无符号字符型变量 LEDNumvoid main()
{P2_0 = 0; // 初始化,点亮第一个LEDwhile(1){if(P3_0 == 0){Delay(20);while(P3_0 == 0); // 这部分都是按键操作,下面不再注释Delay(20);LEDNum++;  // 设置移位数if(LEDNum >= 8) // 由于是从D1(不是D0)开始移位 LEDNum 等于 7 就是D8点亮,所以当LEDNum等于8时要使其制0归位LEDNum = 0; // LEDNum 置0P2 = ~(0X01 << LEDNum); // << 左移位运算符 举例: 0000 0001  <<  2 就成为 0000 0100 取反 1111 1011}if(P3_1 == 0){Delay(20);while(P3_1 == 0); // 按键Delay(20);if(LEDNum == 0) // 由于LEDNum是无符合字符型,小于0时LEDNum会从1111 1111倒数,所以要防止其小于0置7,使D8点亮LEDNum = 7;elseLEDNum--;   // LEDNum依次递减P2 = ~(0X01 << LEDNum); // << 左移位运算符 举例: 0000 0001  <<  7 就成为 1000 0000 取反 0111 1111}		}
}

实验现象:

动画

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

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

相关文章

【cesium】打造科技感建筑泛光效果

一些智慧城市项目经常需要加载建筑白膜数据(3dtiles),并制作炫酷的炫光效果,在cesium中可以使用自定义着色器修改白膜建筑的外观。 1.首先,加载3Dtiles格式的建筑白膜数据,这里我们使用一个免费的数据链接: data.mars3d.cn/3dtiles/jzw… 这是mars3D提供的一个链接,发送…

k8s容器中的Java进程经常自动被杀

故事背景 主角:低代码项目agile-bpm 时间:2023-08-29 背景:项目通过jenkins部署k8s容器到虚拟机,在一次部署之后,服务发生无限重启的现象,springboot项目起来后没多久(甚至有几次还没启动)就会被杀掉进程,服务宕机了一个晚上。 排查过程 查看日志 通过 kubelet logs 命…

从零开始:苹果手机免越狱群控系统的快速入门指南

对于初次接触苹果手机免越狱群控系统的用户来说,可能会感到有些困惑和不知所措。本章将提供一个详细的快速入门指南,帮助你从零开始,轻松掌握如何设置和使用这项强大的技术。免越狱群控系统概述 苹果手机免越狱群控系统是一种通过合法合规的技术手段,在不破坏iOS系统安全性…

网站模板文字内容修改,如何在网站后台或代码编辑器中修改模板文字内容

修改模板文字内容可以提升网站的信息传达效果。以下是具体步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单栏中的“模板”或“主题”。 选择“模板管理”或…

网站模板文字内容修改,如何在网站后台或代码编辑器中准确修改模板文字内容

修改模板文字内容可以提升网站的信息传达效果。以下是如何准确在网站后台或代码编辑器中修改模板文字内容的步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单…

本地git分支如何关联远程分支

背景 本文记录一下本地的git仓库如何与远程仓库同步,参考了网友的办法和官方的文档 如果对某些命令有疑惑,可以在命令行输入 git {command} --help 查看git的文档,例如 git remote --help ,会打开本地的帮助文件 操作步骤 首先切到本地仓库所在路径,如果git还没有初始化,…

多校A层冲刺NOIP2024模拟赛26

多校A层冲刺NOIP2024模拟赛26\(T1\) A. 随机游走 \(100pts/100pts\)在树上做临项交换即可。点击查看代码 struct node {ll nxt,to,w; }e[500010]; ll head[500010],v[500010],siz[500010],sum[500010],cnt=0,ans=0,tim=0; struct quality {ll sumt,siz,to,w; }; vector<qual…

支持4种类型的jQuery轮播图插件EasySlides

EasySlides是一款支持4种类型的jQuery轮播图插件。该jquery轮播图采用响应式设计,支持移动设备,内置有大图轮播,多图轮播,封面轮播和圆形轮播四种轮播图模式可供选择。在线演示 下载使用方法 在页面中引入jquery和jquery.easy_slides.js文件,以及样式文件jquery.easy_sl…

Avalonia 中使用 CEF 在 Ubuntu 运行崩溃分析

在 Linux 上使用 Avalonia 和 CefGlue:崩溃分析 介绍 本文主要记录了在 Avalonia 中使用 CefGlue(基于 .NET 的 Chrome 嵌入内核的封装库)时遇到的问题,目的是测试 Avalonia 的 Chrome 内核在 Linux 系统中的兼容性。然而在实际运行时,我们意外地遇到了运行崩溃的问题。环…

视频智能分析助力城市管理革新

在智慧城市建设的大潮中,视频智能分析技术正成为城市管理革新的重要推手。这项技术通过深度学习和人工智能算法,对视频数据进行实时分析和处理,为城市管理提供了前所未有的智能支持。本文将探讨视频智能分析技术在城市管理中的应用内容,以及它如何助力城市治理向更高效、更…

diffusion Policy学习

diffusion model原理 https://segmentfault.com/a/1190000043744225#item-4 https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 变分自编码器:把某图像变成向量,再用该向量生成图像。 扩散模型是一种特殊的VAE,其灵感来自于热力学:一个分布可以通过不断地添…

js写飞机大战小游戏

第一步,写一个html页面<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>飞机大战</title> <style>body { margin: 0; }canvas { display: block; background-color: #000; } </sty…