写点什么

基于 51 单片机设计的花样流水灯设计

作者:DS小龙哥
  • 2024-08-01
    重庆
  • 本文字数:2754 字

    阅读完需:约 9 分钟

一、项目介绍

花样流水灯是一种常见的 LED 灯效果,被广泛应用于舞台表演、节日庆典、晚会演出等场合。在现代智能家居、电子产品中,花样流水灯也被广泛使用,通过调整亮灭顺序和时间,可以实现各种炫酷的灯光效果,增强用户体验。而 51 单片机作为一种常见的嵌入式开发平台,具有体积小、功耗低、可编程性强等优点,非常适合用于开发花样流水灯及其他嵌入式应用。


以下场景中流水灯得到了广泛的应用:


  • 舞台表演:花样流水灯可用于舞台背景、音乐 MV 等场合,配合音乐和舞蹈,营造出炫酷、动感的视觉效果。

  • 节日庆典:在传统节日如春节、中秋节等场合,花样流水灯可以用于灯笼、彩灯等装饰,为节日增添喜庆氛围。

  • 晚会演出:在各种晚会、派对、聚会等场合,花样流水灯可以用于舞台效果、音乐灯光秀等,增强整个活动的氛围和趣味性。

  • 智能家居:花样流水灯可以使用在居家灯光控制中,实现远程控制、定时开关、自动调节等功能,提升居住环境的科技感和人性化。


二、设计原理

2.1 基本原理

花样流水灯是一种常见的 LED 灯效果,通常由多个 LED 灯组成,通过控制每个 LED 灯的亮灭顺序和时间,实现花样流水灯的效果。在 51 单片机中,可以使用定时器和端口控制来实现这一效果。

2.2 硬件搭建

为了实现花样流水灯,需要将多个 LED 灯按照一定的顺序连接到 51 单片机的 IO 引脚上。电路设计上,为每个 LED 灯配备一个电阻,并将它们连接到 5V 电源引脚和地线上。


具体硬件搭建方法如下:


(1)将多个 LED 灯依次连接起来组成一个电路链,将第一个 LED 的正极接到 P1.0 口,第二个 LED 的正极接到 P1.1 口,第三个 LED 的正极接到 P1.2 口,以此类推,一共连接 7 个 LED 灯。


(2)为每个 LED 灯配备一个适当的电阻,用来限制电流,防止损坏 LED。


(3)将每个 LED 的负极连接到 5V 电源引脚附近的地线上,形成一个完整的电路。

2.3 软件实现

在软件实现上,使用 51 单片机的定时器和端口控制来控制 LED 灯的亮灭顺序和时间。


具体方法如下:


(1)设置一个计数器变量 count,用来保存当前亮起的 LED 灯的编号(从 0 开始)。


(2)在定时器中断处理函数中,每次计数器溢出时,将当前亮起的 LED 灯熄灭,并将 count 加 1;当 count 等于 LED 灯总数时,将 count 重置为 0。


(3)然后,再将下一个 LED 灯亮起,以此类推。


(4)通过控制定时器的计数周期和每个灯亮起的时间,可以调整花样流水灯的效果。

三、代码实现

3.1 流水灯代码实现 1

#include <reg52.h>
#define LED_NUM 8 // LED灯总数#define TIMER_TICK 500 // 定时器计数初值,控制亮灭时间#define HIGH 0 // 高电平#define LOW 1 // 低电平
unsigned int count = 0;
// 定时器中断处理函数void TimerInterrupt() interrupt 1{ static unsigned long tick = 0;
tick++;
if (tick >= TIMER_TICK) { P1 &= ~(1 << count); // 熄灭当前LED count++; // 切换到下一个LED
if (count >= LED_NUM) { count = 0; // 重置计数器 }
P1 |= (1 << count); // 亮起下一个LED tick = 0; // 重置计时器 }}
// 主函数void main(){ unsigned int i;
P1 = 0xFF; // 所有IO口初始化为高电平 TMOD |= 0x01; // 定时器0,模式1,16位自动重载 TH0 = (65536 - TIMER_TICK) / 256; TL0 = (65536 - TIMER_TICK) % 256; ET0 = 1; // 定时器中断允许 EA = 1; // 总中断允许 TR0 = 1; // 定时器开始计数
while (1) { // 等待中断事件 }}
复制代码

3.2 流水灯实现效果 2

【1】逐个点亮

#include <reg52.h>
void Delay(unsigned int t) // 延时函数{ unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++);}
void main(){ while (1) { unsigned char i; // 定义计数器i for (i = 0; i < 8; i++) // 循环8次,依次点亮LED灯 { P0 = ~(1 << i); // 通过位运算生成控制信号,输出到P0口,控制LED灯点亮 Delay(500); // 延时500ms } }}
复制代码

【2】逐个熄灭

#include <reg52.h>
void Delay(unsigned int t) // 延时函数{ unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++);}
void main(){ while (1) { unsigned char i; // 定义计数器i for (i = 7; i < 8; i--) // 循环8次,依次熄灭LED灯 { P0 = ~(1 << i); // 通过位运算生成控制信号,输出到P0口,控制LED灯熄灭 Delay(500); // 延时500ms } }}
复制代码

【3】来回流动

#include <reg52.h>
void Delay(unsigned int t) // 延时函数{ unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 125; j++);}
void main(){ while (1) { unsigned char i; // 定义计数器i for (i = 0; i < 8; i++) // 循环8次,依次点亮LED灯 { P0 = ~(1 << i); // 通过位运算生成控制信号,输出到P0口,控制LED灯点亮 Delay(500); // 延时500ms } for (i = 6; i > 0; i--) // 循环6次,依次熄灭LED灯 { P0 = ~(1 << i); // 通过位运算生成控制信号,输出到P0口,控制LED灯熄灭 Delay(500); // 延时500ms } }}
复制代码

3.3 闪光灯的实现

下面是三个不同的闪光灯效果的代码,分别为常亮、快闪和慢闪。

【1】常亮闪光灯

#include <reg52.h>
sbit LED = P1 ^ 0;
void main() { while (1) { LED = 0; // LED常亮 }}
复制代码

【2】快闪闪光灯

#include <reg52.h>
sbit LED = P1 ^ 0;
void delay(unsigned int i) { while (i--);}
void main() { while (1) { LED = 0; // LED亮 delay(50000); // 延时一段时间 LED = 1; // LED灭 delay(50000); // 延时一段时间 }}
复制代码

【2】慢闪闪光灯

#include <reg52.h>
sbit LED = P1 ^ 0;
void delay(unsigned int i) { while (i--);}
void main() { while (1) { LED = 0; // LED亮 delay(100000); // 延时一段时间 LED = 1; // LED灭 delay(100000); // 延时一段时间 }}
复制代码


以上三个代码中,都使用了 P1 口的第 0 位来控制 LED 灯的亮灭。其中,第一个代码是常亮闪光灯,只需要将 LED 置为 0。第二个代码是快闪闪光灯,使用了一个 delay 函数来实现延时,每次延时 50000 个时钟周期,即约为 500ms。第三个代码是慢闪闪光灯,与第二个代码类似,只是将延时时间改为了 100000 个时钟周期,即约为 1s。

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

DS小龙哥

关注

微信公众号:DS小龙哥嵌入式技术资讯 2022-01-06 加入

所有项目文章对应的工程源码,都可以在我的微信公众号:《DS小龙哥嵌入式技术资讯》 里下载。

评论

发布
暂无评论
基于51单片机设计的花样流水灯设计_8月月更_DS小龙哥_InfoQ写作社区