51单片机之LED篇(二)独立按键

devtools/2024/11/8 19:14:44/

一、独立按键的介绍

1.1 独立按键的基本原理

相当于一种电子开关,按下时开关接通,松开时开关断开。

开关功能:独立按键内部通常包含一个有弹性的金属片,当按键被按下时,金属片与触点接触,电路连通;当按键松开时,金属片恢复原状,电路断开。

电平变化:在单片机>51单片机系统中,独立按键通常一端接地(GND),另一端连接到单片机的I/O口上。当按键未按下时,I/O口通过内部上拉电阻保持高电平;当按键按下时,I/O口与地相连,变为低电平。

1.2 按键的消抖处理

抖动现象:由于按键内部机械触点的弹性作用,在按键按下和松开的瞬间会伴随一连串的抖动。这种抖动会导致单片机在短时间内多次检测到电平变化,从而产生误操作。

  • 消抖方法:为了消除抖动的影响,需要对按键进行消抖处理。消抖方法主要有两种:硬件消抖和软件消抖。
  • 硬件消抖:通过滤波电路或其他电路实现消抖功能,但这种方法会增加电路的复杂性和成本。
  • 软件消抖:在程序中通过延时函数来实现消抖。当检测到按键电平变化后,延时一段时间(通常为10ms左右)再次检测电平状态。如果电平状态仍然未变,则认为按键已经稳定按下或松开。

二、原理

总共有四个独立按键,它们公共的一端都接到了GND电源的负极,另一端引出了四个编号是连接到单片机板子中的MCU的IO口上。

单片机上电的时候所有的IO口默认都是高电平,按键没有按下的时候这个IO口保证的是高电平,按下的话这个IO口就变成了低电平。寄存器会检测IO口的电平,然后再读回来新的状态到寄存器当中。

开发板独立按键的位置如下图所示:

三、独立按键控制LED亮灭

3.1 代码示例

按下K1或者K2点亮D1

#include <REGX52.H>void main()
{while(1){if(P3_1==0 || P3_0==0) //按下按键K1或K2{P2_0=0;  //D1点亮}else{P2_0=1;  //D1熄灭}}
}

要实现其他独立按键控制别的LED灯也是相同的道理,主要就是if语句的使用。明白按下按键P3对应的某I/O口由1变为0。

3.2 实验现象

独立按键控制led亮灭

四、独立按键控制LED状态

4.1 代码示例

按下按键D1不亮,松开才亮

#include <REGX52.H>void Delay(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void main()
{while(1){if(P3_1==0)  //按下K1{Delay(20);  //延时消抖while(P3_1==0);  //松手检测,如果未松手则一直循环Delay(20);  //松手消抖P2_0=~P2_0; //取反,与上次状态相反}}
}

4.2 实验现象

独立按键控制led

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

5.1 代码示例

用K1控制8个LED,显示二进制,每按下一次K1按键就加1。

#include <REGX52.H>void Delay(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void main()
{unsigned char LEDnum=0;while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDnum++;P2=~LEDnum;}}
}

 5.2 实验现象

独立按键控制led显示二进制

六、独立按键控制LED移位

6.1 代码示例

用K1和K2控制LED灯,K1实现右移,K2实现左移。

#include <REGX52.H>
unsigned char LEDnum;void Delay(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void main()
{P2=~0x01;while(1){Delay(20);if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDnum++;if(LEDnum>=8)LEDnum=0;P2=~(0x01<<LEDnum);}if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);if(LEDnum==0)LEDnum=7;else LEDnum--;P2=~(0x01<<LEDnum);}}
}

6.2 实验现象

独立按键控制led移位


http://www.ppmy.cn/devtools/91308.html

相关文章

Vue分析脚手架结构

1.分析结构 <!DOCTYPE html> <html lang""><head><meta charset"utf-8"><!-- 针对IE浏览器 得一个特殊配置&#xff0c;含义是让IE浏览器以最高得渲染级别渲染页面 --><meta http-equiv"X-UA-Compatible" cont…

2024懒人精灵七天从入门到精通实战课程(付源码)

写在开始&#xff1a;对于想学习自动化技术的同学&#xff0c;给你们一些建议&#xff1b;如果你已经选择开始&#xff0c;还在坚持&#xff0c;我奉劝你坚持下去&#xff0c;水到渠成&#xff1b;如果你还没开始就选择放弃&#xff0c;我建议你就此放弃&#xff0c;老师也不鼓…

鸿蒙AI功能开发【hiai引擎框架-人脸比对】 基础视觉服务

hiai引擎框架-人脸比对 介绍 本示例展示了使用hiai引擎框架提供的人脸比对能力。 本示例模拟了在应用里&#xff0c;选择两张图片&#xff0c;计算两个图中最大人脸的相似度 需要使用hiai引擎框架人脸比对接口hms.ai.face.faceComparator。 效果预览 使用说明&#xff1a;…

HTML5+CSS3笔记(Xmind格式):第三天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; 过渡 transition: 过渡属性 过渡时间 运动曲线 何时开始 2D变形transform &#xff1a; 1.平移&#xff1a;translate(单位px) 2.缩放&#xff1a;scale(默认1&#xff0c;大于1放大&#xff0c;小于1缩小) 3…

Redis的回收策略(淘汰策略)

volatile-lru &#xff1a;从已设置过期时间的数据集&#xff08; server.db[i].expires &#xff09;中挑选最近最少使用的数据淘汰 volatile-ttl &#xff1a; 从已设置过期时间的数据集&#xff08; server.db[i].expires &#xff09; 中挑选将要过期的数据淘汰 volatile…

QML中的Date将时间戳和指定格式时间互转

在QML中&#xff0c;可以通过使用JavaScript来处理日期和时间的转换&#xff0c;其中包括将时间戳转换为指定格式的时间字符串&#xff0c;以及将时间字符串解析为时间戳的操作。 将时间戳转换为指定格式的时间字符串 在QML中&#xff0c;可以通过JavaScript的Date对象来处理…

连接投影仪/显示器只能扩展不能复制的解决方案

原文章&#xff1a;https://iknow.lenovo.com.cn/detail/121481 故障现象&#xff1a; 笔记本外接投影仪/显示器后&#xff0c;笔记本屏幕有显示&#xff0c;但投影仪却只有背景或没有显示&#xff1b; 原因分析&#xff1a; 此现象多发生在双显卡机型上&#xff0c;笔记本屏…

element-ui表格1.0.0.1,表格的属性

前言&#xff1a;基于vue2element-ui的理论转实践的使用 第一组&#xff1a;数据显示 利用v-bind:data在table绑定数据源&#xff0c;将数据利用prop的属性传入到table-column&#xff0c;渲染到表格中 正片开始 首先&#xff0c;常用的属性&#xff08;作者常用&#xff09…