一、項(xiàng)目介紹
花樣流水燈是一種常見的LED燈效果,被廣泛應(yīng)用于舞臺表演、節(jié)日慶典、晚會演出等場合。在現(xiàn)代智能家居、電子產(chǎn)品中,花樣流水燈也被廣泛使用,通過調(diào)整亮滅順序和時(shí)間,可以實(shí)現(xiàn)各種炫酷的燈光效果,增強(qiáng)用戶體驗(yàn)。而51單片機(jī)作為一種常見的嵌入式開發(fā)平臺,具有體積小、功耗低、可編程性強(qiáng)等優(yōu)點(diǎn),非常適合用于開發(fā)花樣流水燈及其他嵌入式應(yīng)用。
以下場景中流水燈得到了廣泛的應(yīng)用:
- 舞臺表演:花樣流水燈可用于舞臺背景、音樂MV等場合,配合音樂和舞蹈,營造出炫酷、動感的視覺效果。
- 節(jié)日慶典:在傳統(tǒng)節(jié)日如春節(jié)、中秋節(jié)等場合,花樣流水燈可以用于燈籠、彩燈等裝飾,為節(jié)日增添喜慶氛圍。
- 晚會演出:在各種晚會、派對、聚會等場合,花樣流水燈可以用于舞臺效果、音樂燈光秀等,增強(qiáng)整個(gè)活動的氛圍和趣味性。
- 智能家居:花樣流水燈可以使用在居家燈光控制中,實(shí)現(xiàn)遠(yuǎn)程控制、定時(shí)開關(guān)、自動調(diào)節(jié)等功能,提升居住環(huán)境的科技感和人性化。
二、設(shè)計(jì)原理
2.1 基本原理
花樣流水燈是一種常見的LED燈效果,通常由多個(gè)LED燈組成,通過控制每個(gè)LED燈的亮滅順序和時(shí)間,實(shí)現(xiàn)花樣流水燈的效果。在51單片機(jī)中,可以使用定時(shí)器和端口控制來實(shí)現(xiàn)這一效果。
2.2 硬件搭建
為了實(shí)現(xiàn)花樣流水燈,需要將多個(gè)LED燈按照一定的順序連接到51單片機(jī)的IO引腳上。電路設(shè)計(jì)上,為每個(gè)LED燈配備一個(gè)電阻,并將它們連接到5V電源引腳和地線上。
具體硬件搭建方法如下:
(1)將多個(gè)LED燈依次連接起來組成一個(gè)電路鏈,將第一個(gè)LED的正極接到P1.0口,第二個(gè)LED的正極接到P1.1口,第三個(gè)LED的正極接到P1.2口,以此類推,一共連接7個(gè)LED燈。
(2)為每個(gè)LED燈配備一個(gè)適當(dāng)?shù)碾娮瑁脕硐拗?a href="http://www.1cnz.cn/tags/電流/" target="_blank">電流,防止損壞LED。
(3)將每個(gè)LED的負(fù)極連接到5V電源引腳附近的地線上,形成一個(gè)完整的電路。
2.3 軟件實(shí)現(xiàn)
在軟件實(shí)現(xiàn)上,使用51單片機(jī)的定時(shí)器和端口控制來控制LED燈的亮滅順序和時(shí)間。
具體方法如下:
(1)設(shè)置一個(gè)計(jì)數(shù)器變量count,用來保存當(dāng)前亮起的LED燈的編號(從0開始)。
(2)在定時(shí)器中斷處理函數(shù)中,每次計(jì)數(shù)器溢出時(shí),將當(dāng)前亮起的LED燈熄滅,并將count加1;當(dāng)count等于LED燈總數(shù)時(shí),將count重置為0。
(3)然后,再將下一個(gè)LED燈亮起,以此類推。
(4)通過控制定時(shí)器的計(jì)數(shù)周期和每個(gè)燈亮起的時(shí)間,可以調(diào)整花樣流水燈的效果。
三、代碼實(shí)現(xiàn)
3.1 流水燈代碼實(shí)現(xiàn)1
#include < reg52.h >
?
#define LED_NUM 8 // LED燈總數(shù)
#define TIMER_TICK 500 // 定時(shí)器計(jì)數(shù)初值,控制亮滅時(shí)間
#define HIGH 0 // 高電平
#define LOW 1 // 低電平
?
unsigned int count = 0;
?
// 定時(shí)器中斷處理函數(shù)
void TimerInterrupt() interrupt 1
{
static unsigned long tick = 0;
?
tick++;
?
if (tick >= TIMER_TICK)
{
P1 &= ~(1 < < count); // 熄滅當(dāng)前LED
count++; // 切換到下一個(gè)LED
?
if (count >= LED_NUM)
{
count = 0; // 重置計(jì)數(shù)器
}
?
P1 |= (1 < < count); // 亮起下一個(gè)LED
tick = 0; // 重置計(jì)時(shí)器
}
}
?
// 主函數(shù)
void main()
{
unsigned int i;
?
P1 = 0xFF; // 所有IO口初始化為高電平
TMOD |= 0x01; // 定時(shí)器0,模式1,16位自動重載
TH0 = (65536 - TIMER_TICK) / 256;
TL0 = (65536 - TIMER_TICK) % 256;
ET0 = 1; // 定時(shí)器中斷允許
EA = 1; // 總中斷允許
TR0 = 1; // 定時(shí)器開始計(jì)數(shù)
?
while (1)
{
// 等待中斷事件
}
}
3.2 流水燈實(shí)現(xiàn)效果2
【1】逐個(gè)點(diǎn)亮
#include < reg52.h >
?
void Delay(unsigned int t) // 延時(shí)函數(shù)
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
?
void main()
{
while (1)
{
unsigned char i; // 定義計(jì)數(shù)器i
for (i = 0; i < 8; i++) // 循環(huán)8次,依次點(diǎn)亮LED燈
{
P0 = ~(1 < < i); // 通過位運(yùn)算生成控制信號,輸出到P0口,控制LED燈點(diǎn)亮
Delay(500); // 延時(shí)500ms
}
}
}
【2】逐個(gè)熄滅
#include < reg52.h >
?
void Delay(unsigned int t) // 延時(shí)函數(shù)
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
?
void main()
{
while (1)
{
unsigned char i; // 定義計(jì)數(shù)器i
for (i = 7; i < 8; i--) // 循環(huán)8次,依次熄滅LED燈
{
P0 = ~(1 < < i); // 通過位運(yùn)算生成控制信號,輸出到P0口,控制LED燈熄滅
Delay(500); // 延時(shí)500ms
}
}
}
【3】來回流動
#include < reg52.h >
?
void Delay(unsigned int t) // 延時(shí)函數(shù)
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
?
void main()
{
while (1)
{
unsigned char i; // 定義計(jì)數(shù)器i
for (i = 0; i < 8; i++) // 循環(huán)8次,依次點(diǎn)亮LED燈
{
P0 = ~(1 < < i); // 通過位運(yùn)算生成控制信號,輸出到P0口,控制LED燈點(diǎn)亮
Delay(500); // 延時(shí)500ms
}
for (i = 6; i > 0; i--) // 循環(huán)6次,依次熄滅LED燈
{
P0 = ~(1 < < i); // 通過位運(yùn)算生成控制信號,輸出到P0口,控制LED燈熄滅
Delay(500); // 延時(shí)500ms
}
}
}
3.3 閃光燈的實(shí)現(xiàn)
下面是三個(gè)不同的閃光燈效果的代碼,分別為常亮、快閃和慢閃。
【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); // 延時(shí)一段時(shí)間
LED = 1; // LED滅
delay(50000); // 延時(shí)一段時(shí)間
}
}
【2】慢閃閃光燈
#include < reg52.h >
?
sbit LED = P1 ^ 0;
?
void delay(unsigned int i) {
while (i--);
}
?
void main() {
while (1) {
LED = 0; // LED亮
delay(100000); // 延時(shí)一段時(shí)間
LED = 1; // LED滅
delay(100000); // 延時(shí)一段時(shí)間
}
}
以上三個(gè)代碼中,都使用了P1口的第0位來控制LED燈的亮滅。其中,第一個(gè)代碼是常亮閃光燈,只需要將LED置為0。第二個(gè)代碼是快閃閃光燈,使用了一個(gè)delay函數(shù)來實(shí)現(xiàn)延時(shí),每次延時(shí)50000個(gè)時(shí)鐘周期,即約為500ms。第三個(gè)代碼是慢閃閃光燈,與第二個(gè)代碼類似,只是將延時(shí)時(shí)間改為了100000個(gè)時(shí)鐘周期,即約為1s。
-
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
107950 -
51單片機(jī)
+關(guān)注
關(guān)注
274文章
5702瀏覽量
123491 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94477 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3246瀏覽量
114719 -
流水燈
+關(guān)注
關(guān)注
21文章
432瀏覽量
59692
發(fā)布評論請先 登錄
相關(guān)推薦
評論