产品选型

单片机流水灯 按键 51单片机实例讲解,由按钮控制流水灯程序

小编 2024-11-25 产品选型 23 0

51单片机实例讲解,由按钮控制流水灯程序

由按钮控制流水灯控制要求:在单片机的PP3.0口和P3.1口线上分别接上一个按钮SB1和SB2,P0口上接8只发光二极管LED1~LED8。当按下SB1时,8只发光二极管按方式一从LED1~LED8间隔1s交替正向流水点亮一次,即LED1亮→LED2亮→LED3亮→LED4亮→LED5亮→LED6亮→LED7亮→LED8亮。

当按下SB2时,8只发光二极管按方式二从LED1~LED8间隔1s依次点亮一次,即LED1亮→LED1+LED2亮→LED1+LED2+LED3亮→LED1+LED2+LED3+LED4亮→LED1+ LED2+LED3+LED4+LED5亮→LED1 +LED2 +LED3 +LED4 +LED5 +LED6亮→LED1 +LED2 + LED3 +LED4 +LED5 +LED6+LED7亮→LED1+LED2+LED3+LED4+LED5+LED6+LED7+ LED8亮。

(1)由按钮控制流水灯硬件电路(见图36)。

图36 由按钮控制流水灯接线原理图

(2)由按钮控制流水灯硬件电路元器件(见表14)。

表14 由按钮控制流水灯硬件电路元器件表

(3)由按钮控制流水灯程序流程图(见图37)。

图37 由按钮控制流水灯程序流程图 (a)主程序;(b)显示子程序

(4)由按钮控制流水灯程序。

进阶教程:单片机独立按键,分别控制不同的LED点亮流水 代码详解

大家好,小伙伴们通过以上几篇文章的学习,我相信已经对于单片机控制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,实验成功!

最后如果有什么问题或者建议请给我留言或者私信啊,看到一定第一时间回复,如果你喜欢我的文章,欢迎关注转发评论哦,我们下期再见!

专注基础,从软硬件两个维度,从零开始带你探寻单片机的神秘世界!

相关问答

单片机 汇编语言 按键 控制 流水灯 ,两个开关k1,k2。实现功能按下k1, 流水灯 左移动,按下k2, 流水灯 右移动?

假设P0.0接k1,P0.1接k2,k1或k2闭合时,P0.0或P0.1为低电平0,断开时为高电平1;P2口的8位接8个发光二极管的阳极,发光二极管的阴极通过下拉电阻接地,要点亮相...

51 单片机 c语言,如何用4个 按键 控制4个 流水灯 ?

这个要使用外部中断,你在程序里面改一下,加入中断,可以用你的连接矩阵键盘的io口的最高位与最低位做一个与非门作为中断信号就可以了。附上一段以前写的,你看...

【用51 单片机 控制16个 流水灯 ,依次左移点亮,.高分用51 单片机 ...

[最佳回答]低电平点亮START:MOVR0,#8MOVR1,#8SETBCMOVA,#0FEHMOVP1,AS1:RLCACALLDELAYMOVP1,ADJNZR0,S1SETBCMOV...

如何设计一个 单片机 可控的循环 流水灯 ?

首先在硬件方面,我们使用了最经典的选型用AT89S51单片机作为主控芯片,LED电路选用共阳极接法:8路红色LED灯正极接5V电源、各路串联一个限流电阻,保护发光二...

单片机流水灯 程序怎么编?

编写单片机流水灯程序的步骤如下:1.确定使用的单片机型号和开发环境,选择合适的编程语言和开发工具。2.根据硬件电路设计,确定流水灯LED灯的接口引脚和控...

单片机 八个 流水灯 左右依次点亮?

1.首先,打开proteus,可以看到界面上方有"库",点开,在库里选择做实验需要的元件。2.如图所示,我们做流水灯实验所需要的元件,就是红色方框里面的元件,一定...1...

用PIC16C57C怎么做 流水灯 ?

用什么单片机做流水灯,原理都是一样的。首先你先熟悉下这个PIC16C57C的资源、和语言吧。熟悉了,你就会了。用什么单片机做流水灯,原理都是一样的。首先你...

52 单片机 的题目,本人刚学一个月,实在有点搞不定,求助啊.有注...

[最佳回答]首先你的键盘扫面,当扫面到有键按下时进入按键处理程序,一般是case语句选择,在确定的case中调用确定键处理函数,函数判断显示的数字(送显示时先将数...

单片机 改变 流水灯 闪烁频率的方法是?

1.掌握单片机与常见的显示器件的接口设计与软件编程。2.实现流水灯从上至下闪烁,闪三次。3.实现流水灯从下至上闪烁,闪三次。#defineucharunsignedintv...

单片机 开发板上的p0口和p1口实现 流水灯 控制?

当然只能一个一个的移了,51单片机一次只能操作一个8位端口的寄存器用C语言编程虽然可以实现16位数据的左移和右移,但控制LED时还是要分两个端口写入例如:uinta...

猜你喜欢