写点什么

【51 单片机】独立按键控制 LED 灯 (四种形式)

作者:泽En
  • 2022 年 3 月 10 日
  • 本文字数:3209 字

    阅读完需:约 11 分钟

【51单片机】独立按键控制LED灯(四种形式)

🎃独立按键介绍

  • 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。

  • 英文:independent press button

  • 了解:独立按键具有四个"头",独立按键主要有四个部分:1、底座,2、金属弹片(这个金属弹片是鼓起来的,当你按下去的时候它会变平,松手的时候又会鼓起来的),3、就是按键的头,4、就是金属的盖子。那么在相同的两个引脚当中其实它就是内部连接起来的金属片,无论你按不按下去,它前后的两个引脚都是连接起来的。就是始终都是具有导通性质的,向外具有两个接触的点。按下的时候四个引脚全部都是连接的,松手的时候两边分别连接,之间是断开的。

  • 如下图实物所示:


🏓独立按键原理图


  • 这里总共有四个独立按键,它们公共的一段都接到了 GND 电源的负极,另一端引出了四个编号是连接到单片机板子中的 MCU 上面,还有一段是接到了 IO 口上。如下图所示:

  • 那我们就知道了单片机上电的时候所有的 IO 口默认都是高电平,那么就是当是如果按键没有按下的时候那么这个 IO 口保证的就是高电平,按下的话那么这个 IO 口就变成低电平了。寄存器会检测 IO 口的电平,然后在读回来这个寄存器当中。如果按键松开"我"因该去读取这个寄存器那么它其实就是一个高电平默认为 1 的一个高电平,反之。那么根据这个现象我们可以得知我们的独立按键是不是被按下了。

🎡独立按键控制 LED 灯亮灭

#include <REGX52.H>int main(void){  while(1)  {    if(P3_1==0 || P3_0==0)  //如果K1按键或K2按键按下    {      P2_0=0;    //LED1输出0,点亮    }    else    {      P2_0=1;    //LED1输出1,熄灭    }  }}
复制代码

注意:独立按键 K1 按键与 K2 按键按键网络编号是相反的,K1=P3_1、K2=P3_0。

🎉C51 数据运算

算术运算符:加减没什么好说的,乘法和除法注意一下符号!以及除法是取整的不是四舍五入按照数学的运算来的,比方举个例子:五除以二,按照数学的方式是:2.5,在 C 语言当中是 2 取最小整数,当然这是 int 数据类型当中是这个样子。也有单精度浮点型(float)和双精度浮点型(double)它们依旧是等于 2.5 的。那么取余(%)是什么意思呢?其实很简单就是还是以五除以二的话在小学当中是 2...1,那么这个其实就是 5%2=1 了。再比方说 102/10 = 10...2 那么 102%10 = 2,所以除号与取余就是这个意思了。赋值就是把右边得出的值或者说是结果赋值到你左边的这个变量。

判断运算符:这个没什么好说的,就是在表达式的值经常有判断表达式,如果你的表达式的值为真,那么就执行表达式里面大括号(作用域)里面的内容。在这里注意下等于的判断表达式的符号。

逻辑运算符:假设 a = 1,b = 0;

  • && 称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。

  • ||   称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真 (A || B) 为真。

  • !    称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。

位运算

  • 按位与操作,按二进制位进行"与"运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;

  • 按位或运算符,按二进制位进行"或"运算。运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;

  • 异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

  • 取反运算符,按二进制位进行"取反"运算。运算规则:~0001 = 1110;

  • << 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补 0)

  • 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补 0,负数左补 1,右边丢弃。

🎉C51 基本语句 C51 数 C51 数据运算 C51 数据运算据运算

​这些语句都是单片机以及变成语言比较重要的语句!像这个判断语句 if 以及 switch 语句,以及 while 和 for 的循环语句在单片机中都是很重要的。这些都是必须要掌握的知识点!大家可以多上手代码,熟练掌握这些判断语句和循环语句。任何复杂的程序都可以由顺序、选择、循环来进行程序代码的实现,上面的代码就是典型的 if—else 的语句。

🎄独立按键控制 LED 灯状态

#include <REGX52.H>void Delay(unsigned int xms){  unsigned char i, j;  while(xms)  {    i = 2;    j = 239;    do    {      while (--j);    } while (--i);    xms--;  }}int main(void){  while(1)  {    if(P3_1==0)      //如果K1按键按下    {      Delay(20);    //延时消抖      while(P3_1==0);  //松手检测      Delay(20);    //延时消抖            P2_0=~P2_0;    //LED1取反    }  }}
复制代码


🎋按键的抖动

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


在按键闭合的时候会产生一些抖动没有按键按下的话它就是一个高电平(1) (单片机上电的时候所有的 IO 口默认都是高电平)。在我们按下按键的时候它就会变成 (0), 并且由于它的是机械触电会弹开,然后上下抖动几下,然后才会稳定的变成(0) 。抖动的时间上面图中也表示的是 (5~10)ms。当抖动消失的时候进入了一个稳定的低电平(0) ,这个持续时间是看你手什么时候松开这个按键。在松手的时候也会产生抖动,它也不会突然变成高电平(1) ,也会抖动产生时间为(5~10)ms。最后,松手。

按键的消抖有两种方法:

  1. 加个线,把这个线通过这些电路里面进行一些触发器等等,通过一些电路来进行操作,把这个抖动进行一些过冲,然后再给我们单片机进行点上。比较麻烦!

  2. 通过软件来进行一个延迟函数,把这个消抖进行操作!

🏒独立按键控制 LED 显示二进制

#include <REGX52.H>void Delay(unsigned int xms){  unsigned char i, j;  while(xms--)  {    i = 2;    j = 239;    do    {      while (--j);    } while (--i);  }}int main(void){  unsigned char LEDNum = 0;  while(1)  {    if(P3_1==0)          {      Delay(20);          while(P3_1==0);      Delay(20);                        LEDNum++;        P2=~LEDNum;          }  }}
复制代码


  • 这里用 unsigned char 类型是因为:无符号字符型(所占 1 字节 = 8bit 位)刚好对应着 8 位二进制的数据,那这八位二进制的正好这个 P2 口和这个寄存器 51 单片机保持一致。

  • 注意:P2 口上电之后和单片机的 IO 上电一样都是默认的是高电平! 1111 1111

  • LEDNum 取反给 P2 的话,其实变量取反给 P2 的值上它是并不会改变这个变量的值。它的值还是没有取反的值。在等号右边的话,它并不会改变 LEDNum 的值。其实就是取反当中你取反的值是右值就不会被改变。

🥍独立按键控制 LED 灯移位

#include <REGX52.H>
void Delay(unsigned int xms){ unsigned char i, j; while(xms--) { i = 2; j = 239; do { while (--j); } while (--i); }}int main(void){ unsigned char LEDNum = 0;//进行初始化 P2 = 0xFE; while(1) { if(P3_1 == 0) //如果当独立按键K1按下的话 —— LED灯移位 { Delay(20); //按键消抖 while(P3_1 == 0); //检测松手 Delay(20); //按键消抖 LEDNum++; //自增++ if(LEDNum>=8) { LEDNum=0; } P2 = ~(0x01<<LEDNum); } if(P3_0 == 0) //第二种情况:如果当独立按键K2按下的话 —— LED灯移位 { Delay(20); //按键消抖 while(P3_0 == 0); //检测松手 Delay(20); //按键消抖 if(LEDNum == 0) { LEDNum=7; } else { LEDNum--;//自减-- } P2 = ~(0x01<<LEDNum); } }}
复制代码


  • P2 口当中的 P 一定是要大写的,标识符一定要严格区分大小写!

  • 当你在定义一个局部变量的时候一定要注意赋值初始值,在全局变量定义的话默认为 0!

  • 这里的 K1 和 K2 是接错了,K1 = P3_1;K2 = P3_0;K3 = P3_2;K4 = P3_3;


发布于: 刚刚阅读数: 2
用户头像

泽En

关注

好像没有😅 2022.01.29 加入

CSDN嵌入式领域新星创作者、2021年度博客之星物联网与嵌入式开发TOP5、2022博客之星TOP100 掘金创作者

评论

发布
暂无评论
【51单片机】独立按键控制LED灯(四种形式)_3月月更_泽En_InfoQ写作平台