MCU-51:独立按键控制LED灯的动作
目录
- 一、独立按键
- 二、独立按键控制LED亮灭
- 二、消除按键抖动
- 2.1 按键的抖动
- 2.2 控制LED灯状态-消除按键抖动
- 三、独立按键控制LED显示二进制
- 四、独立按键控制LED灯移位
一、独立按键
轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开
独立按键原理图
这里总共有四个独立按键,它们公共的一段都接到了GND电源的负极,另一端引出了四个编号是连接到单片机板子中的MCU上面,还有一段是接到了IO口上。
那我们就知道了单片机上电的时候所有的IO口默认都是高电平,那么就是当是如果按键没有按下的时候那么这个IO口保证的就是高电平,按下的话那么这个IO口就变成低电平了。寄存器会检测IO口的电平,然后在读回来这个寄存器当中。如果按键松开去读取这个寄存器那么它其实就是一个高电平默认为1的一个高电平,反之。那么根据这个现象我们可以得知我们的独立按键是不是被按下了。
二、独立按键控制LED亮灭
通过查询原理图得知:K1=P3_1,则代码如下
#include <REGX52.H>
sbit led1=P2^0;
sbit key1=P3^1;
void main()
{
while(1)
{
if(key1==0)
{
led1=0;
}
else
{
led1=1;
}
}
}
如果通过独立1键或独立2键都能控制亮灭该怎么写,这里就用到C语言的逻辑符号
回顾一下
那么代码应该如下
#include <REGX52.H>
sbit led1=P2^0;
sbit key1=P3^1;
sbit key2=P3^0;
void main()
{
while(1)
{
if(key1==0||key2==0)
{
led1=0;
}
else
{
led1=1;
}
}
}
二、消除按键抖动
2.1 按键的抖动
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
在按键闭合的时候会产生一些抖动,没有按键按下的话它就是一个高电平(1)(单片机上电的时候所有的IO口默认都是高电平)。在我们按下按键的时候它就会变成(0),并且由于它的是机械触电会弹开,然后上下抖动几下,然后才会稳定的变成(0)。抖动的时间上面图中也表示的是(510)ms。当抖动消失的时候进入了一个稳定的低电平(0),这个持续时间是看你手什么时候松开这个按键。在松手的时候也会产生抖动,它也不会突然变成高电平(1),也会抖动产生时间为(510)ms。最后,松手。
按键的消抖有两种方法:
加个线,把这个线通过这些电路里面进行一些触发器等等,通过一些电路来进行操作,把这个抖动进行一些过冲,然后再给我们单片机进行点上。比较麻烦!
通过软件来进行一个延迟函数,把这个消抖进行操作!
2.2 控制LED灯状态-消除按键抖动
根据上面的叙述转换成代码
#include <REGX52.H>
sbit led1=P2^0;
sbit key1=P3^1;
void delay(int i)
{
while(i--);
}
void main()
{
while(1)
{
if(key1==0)
{
delay(20);
while(key1==0);
delay(20);
led1=~led1;
}
}
}
三、独立按键控制LED显示二进制
直接上代码
#include <REGX52.H>
sbit key1=P3^1;
void Delay(int i)
{
while(i--);
}
int main(void)
{
unsigned char LEDNum = 0;
while(1)
{
if(key1==0)
{
Delay(20);
while(key1==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>
sbit key1=P3^1;
sbit key2=P3^0;
void Delay(int i)
{
while(i--);
}
int main(void)
{
unsigned char LEDNum = 0;
P2=0xFE;
while(1)
{
if(key1==0)
{
Delay(20);
while(key1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
{
LEDNum=0;
}
P2=~(0x01<<LEDNum);
}
if(key2==0)
{
Delay(20);
while(key2==0);
Delay(20);
LEDNum--;
if(LEDNum==0)
{
LEDNum=7;
}
P2=~(0x01<<LEDNum);
}
}
}
P2口当中的P一定是要大写的,标识符一定要严格区分大小写!
当你在定义一个局部变量的时候一定要注意赋值初始值,在全局变量定义的话默认为0!