大家好,小伙伴们通过以上几篇文章的学习,我相信已经对于单片机控制LED流水的项目已经很熟悉了吧,其实还可以尝试着改一些代码实现花样流水地效果,感兴趣的小伙伴可以试一下,此处不再赘述。
我们言归正传继续说回我们今天的实验项目,单片机的独立按键控制流水灯点亮,其实这个只比上一个实验复杂一点点,就是在流水灯的基础上添加了按键独立控制。及有0~7八个按键及0~7八个LED,当按下按键对应的LED即被点亮。当有规律的不停按下按键时,就会呈现LED花样流水的效果。和上面几篇文章一样,我们同样从软件和硬件的两个角度来为大家讲解一下。
硬件方面
LED的原理已经说了很多次了,此处不再赘述。
按键的种类其实有很多,但是都大同小异,基本功能是不变的,下面先说一下最简单的也是今天实验中需要的点动开关按键:这种按键工作原理就是你一按下去,就会通电(或实现相应功能),像计算机键盘一样,汽车按键,电话按键一样,一松开就会自动弹起断电。如果一直按下去则会一直生效,直到按键再次弹起。
单片机关于控制方式和工作原理都不再重复,不明白的小伙伴请自行爬楼或者私信。
有一点我还是要说一下,既然是按键,那就要有人按,这里就涉及到一个误操作的问题,因为误操作往往不是我们想要的,往往会给我们带来损失或者麻烦,为了避免这种情况防止我们误操作,我们需要添加防止误操作的代码,我们单片机上通常叫做消抖,即消除按键抖动。好了,了解完了硬件以后那么我们下面开始讲解软件代码部分。
C语言参考源代码如下:
#include<reg52.h>
#define uint int //定义类型变量
#define uchar char //宏定义字符型变量
sbit S1 = P3^7; //用P3.7来检测按键是否被按下
sbit S2 = P3^6; sbit S3 = P3^5; sbit S4 = P3^4; sbit S5 = P3^3; sbit S6 = P3^2;
sbit LED1 = P2^0; sbit LED2 = P2^1; sbit LED3 = P2^2; sbit LED4 = P2^3;
sbit LED5 = P2^4; sbit LED6 = P2^5; sbit LED7 = P2^6; sbit LED8 = P2^7;
void delay(uint z);
void main()
{ uchar i;
uint k;
if(S1 == 0) //第一次检测按键被按下
{ delay(8); //延时8ms进行消抖
if(S1 == 0) //再次检测按键被按下,说明确实被按下了
{ for(i=0;i<3;i ) //for循环控制蜂鸣器响3声
{ for(k=0;k<5000;k );//延时500ms
bell = 0; //输出低电平,使蜂鸣器鸣叫
for(k=0;k<10000;k ); //延时500ms
bell = 1; //输出高电平,使蜂鸣器停止 } } }
if(S2 == 0) //第一次检测按键被按下
{ delay(8); //延时8ms进行消抖
if(S2 == 0) //再次检测按键被按下,说明确实被按下了
{ LED1 = 0; //正向流动
delay(500); LED1 = 1; LED2 = 0;
delay(500); LED2 = 1; LED3 = 0;
delay(500); LED3 = 1; LED4 = 0;
delay(500); LED4 = 1; LED5 = 0;
delay(500); LED5 = 1; LED6 = 0;
delay(500); LED6 = 1; LED7 = 0;
delay(500); LED7 = 1; LED8 = 0;
delay(500);LED8 = 1; } }
if(S3 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖
if(S3 == 0) //再次检测按键被按下,说明确实被按下了
{ LED8 = 0; //反向流动 delay(500);
LED8 = 1; LED7 = 0;
delay(500); LED7 = 1; LED6 = 0; delay(500); LED6 = 1; LED5 = 0;
delay(500); LED5 = 1;LED4 = 0; delay(500); LED4 = 1; LED3 = 0;
delay(500); LED3 = 1; LED2 = 0; delay(500); LED2 = 1; LED1 = 0;
delay(500); LED1 = 1; } }
if(S4 == 0) //第一次检测按键被按下
{ delay(8); //延时8ms进行消抖
if(S4 == 0) //再次检测按键被按下,说明确实被按下了
{ LED1 = 0; //1、3、5、7亮
LED2 = 1; LED3 = 0; LED4 = 1; LED5 = 0; LED6 = 1; LED7 = 0; LED8 = 1; } }
if(S5 == 0) //第一次检测按键被按下
{ delay(8); //延时8ms进行消抖 if(S5 == 0) //再次检测按键被按下,说明确实被按下了
{ LED1 = 1; //2、4、6、8亮
LED2 = 0; LED3 = 1; LED4 = 0; LED5 = 1; LED6 = 0; LED7 = 1; LED8 = 0; } }
if(S6 == 0) //第一次检测按键被按下 { delay(8); //延时8ms进行消抖
if(S6 == 0) //再次检测按键被按下,说明确实被按下了
{ LED1 = 1; //全部灯灭
LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7 = 1; LED8 = 1; } } }
void delay(uint z)
{ uint x,y; //定义循环变量
for(x=z;x>0;x--) //执行FOR循环语句
for(y=120;y>0;y--); //执行FOR循环语句
}
上述功能是用最基础的编程方法实现的,聪明的你想一想还有其他办法实现吗?通过以上代码,我用PROTEUS仿真图如下:结果8个按键可以分别控制8个LED,实验成功!
最后如果有什么问题或者建议请给我留言或者私信啊,看到一定第一时间回复,如果你喜欢我的文章,欢迎关注转发评论哦,我们下期再见!
专注基础,从软硬件两个维度,从零开始带你探寻单片机的神秘世界!
,