我是靠谱客的博主 坚强花卷,最近开发中收集的这篇文章主要介绍51单片机-独立按键控制LED灯,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

1.硬件设计

2.软件设计

2.1.独立按键控制LED闪烁

2.2.独立按键控制LED状态

2.3.独立按键控制LED显示二进制

2.4.独立按键控制LED移位

3.知识点

3.1.if语句的运用

3.2.常用运算符


1.硬件设计

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

2.软件设计

2.1.独立按键控制LED闪烁

功能需求:按下按键,LED点亮;松开按键,LED熄灭;可单个按键控制,也可多个按键控制

程序设计:分析原理图,确定要通过控制哪个按键去决定LED亮灭;单个按键K1,控制LED亮灭的程序如下:

#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0)//通过控制K1按键,去控制LED闪烁
//P3_0==0,即是控制K2
{
P2_0=0;
}
else
{
P2_0=1;
}
}
}

逻辑与的应用:多个按键同时按下,LED灯才能点亮(逻辑与“&&”);如K1,k2同时按下,LED点亮

#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0 && P3_0==0)// 逻辑与&&
{
P2_0=0;
}
{
P2_0=1;
}
}
}

逻辑或的应用:多个按键,只要有一个按下,LED点亮(逻辑或“||”);如K1,k2,k3,k4四个按键,只要有一个按下,LED点亮

#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0 || P3_0==0 || P3_2==0 || P3_3==0) // 逻辑或||
{
P2_0=0;
}
{
P2_0=1;
}
}
}

2.2.独立按键控制LED状态

功能需求:按位取反~,按一下LED点亮,再按一下LED熄灭

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

程序设计:分析原理图,选择按键,考虑消抖,检测松手;如单个按键K1,控制LED的程序如下:

#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);//按键消抖 延时20ms
while(P3_1==0);//如果松手,P3_1==1,while循环就不成立
Delay(20);//松手消抖 延时20ms
P2_0=~P2_0;
};
/*------------------------------------------------
如果把if语句的逻辑表达式换成4个按键的逻辑或运算,那就相当于是个4控开关
if(P3_0==0 || P3_1==0 || P3_2==0 || P3_3==0)
{
Delay(20);
while(P3_0==0 || P3_1==0 || P3_2==0 || P3_3==0);
Delay(20);
P2_0=~P2_0;
};
------------------------------------------------*/
}
}

2.3.独立按键控制LED显示二进制

功能需求:独立按键控制LED显示二进制,从0000 0000-->1111 1111;按一次,进一位

程序设计:在2.2基础上优化,保留按键消抖的延时代码,增加无符号字符LEDNum的定义,因要考虑按一次,进一位,所以需增加算数运算符“+”的使用

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

注意:在后面定义的函数,如果要调用,必须在main函数前面进行申明,如下程序中的Delay函数

#include <REGX52.H>
void Delay(unsigned int xms);
/*Delay函数申明*/
void main()
{
unsigned char LEDNum=0;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;//LEDNum++等同于LEDNum=LEDNum+1
P2=~LEDNum;
}
}
}
/*Delay函数定义*/
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}

2.4.独立按键控制LED移位

功能需求1:独立按键按下一次,LED点亮移动一位

程序设计:在2.3迭代,保留按键消抖的延时代码,增加无符号字符LEDNum的定义,因要考虑独立按键按下一次,LED点亮移动一位,所以需增加位运算的应用(按位左移“<<”)

#include <REGX52.H>
unsigned char LEDNum;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
P2=~0x01;//P2口初始化;0000 0001取反就是1111 1110
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum);//按位左移“<<”
}
}
}

功能需求2:那么如果要通过多个按键来控制呢,如按下按键1左移,按下按键2右移动

程序设计:算数运算符中的+/-运算,都要考虑最高和最低位的溢出问题,我们选用的这款51单片机,P2口是个8位寄存器,所以从0-7,最高位不能大于7,最低位不能小于0;

#include <REGX52.H>
unsigned char LEDNum;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main()
{
P2=~0x01;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)//如果当最高位大于7的时候,为防止LEDNum++的益处问题
LEDNum=0;//P2口跳转到最低位的P2_0口
P2=~(0x01<<LEDNum);
}
if(P3_0==0)
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0)//如果当最低位等于0的时候,为防止LEDNum--的益处问题
LEDNum=7;//P2口跳转到最高位的P2_7口
else
LEDNum--;
P2=~(0x01<<LEDNum);
}
}
}

3.知识点

3.1.if语句的运用

/*------------------------------------------------
如果逻辑表达式成立
执行语句体1
否则
执行语句体2
------------------------------------------------*/
if(逻辑表达式)
{
语句体1;
}
else//可以不写
{
语句体2;
}

3.2.常用运算符

最后

以上就是坚强花卷为你收集整理的51单片机-独立按键控制LED灯的全部内容,希望文章能够帮你解决51单片机-独立按键控制LED灯所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部