彩灯花样变换的快慢节拍可以手动和自动方式控制,手动控制按钮按一次转换一次;自动控制方式每15秒变换一次,1分钟循环一遍
时间: 2023-08-18 20:07:04 浏览: 125
按键控制彩灯
这个功能可以通过C51单片机的定时器和外部中断来实现。下面是一个简单的程序示例,可以实现手动和自动两种控制方式:
```C
#include <reg52.h> // C51单片机头文件
#define LED_NUM 10 // 发光管数量
#define LED_PATTERN_NUM 4 // 花样数量
unsigned char code led_pattern[LED_PATTERN_NUM][LED_NUM] = {
{0x3C, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00}, // 花样1
{0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // 花样2
{0x7E, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x7E, 0x00, 0x00, 0x00}, // 花样3
{0x3C, 0x24, 0x3C, 0x24, 0x24, 0x24, 0x3C, 0x00, 0x00, 0x00} // 花样4
};
unsigned char led_state[LED_NUM] = {0}; // 发光管状态
unsigned char pattern_index = 0; // 当前花样索引
unsigned char auto_flag = 0; // 自动控制标志
unsigned long auto_count = 0; // 自动控制计数器
void timer0_isr() interrupt 1 // 定时器中断服务程序
{
static unsigned char led_index = 0; // 当前发光管索引
P1 = led_state[led_index]; // 输出当前发光管状态
led_index++; // 切换到下一个发光管
if (led_index >= LED_NUM)
{
led_index = 0; // 循环回到第一个发光管
if (auto_flag)
{
auto_count++; // 自动控制计数器加1
if (auto_count >= 15000) // 每15秒变换一次
{
pattern_index++; // 切换到下一个花样
if (pattern_index >= LED_PATTERN_NUM)
{
pattern_index = 0; // 循环回到第一个花样
}
for (unsigned char i = 0; i < LED_NUM; i++)
{
led_state[i] = led_pattern[pattern_index][i]; // 更新发光管状态
}
auto_count = 0; // 重置自动控制计数器
}
}
}
}
void button_isr() interrupt 0 // 外部中断服务程序
{
auto_flag = 0; // 关闭自动控制标志
pattern_index++; // 切换到下一个花样
if (pattern_index >= LED_PATTERN_NUM)
{
pattern_index = 0; // 循环回到第一个花样
}
for (unsigned char i = 0; i < LED_NUM; i++)
{
led_state[i] = led_pattern[pattern_index][i]; // 更新发光管状态
}
}
void main()
{
TMOD |= 0x01; // 设置定时器0为模式1,计数器值加1
TH0 = 0xFC; // 设置计时初值,定时1ms
TL0 = 0x66;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
IT0 = 1; // 设置外部中断0为下降沿触发
EX0 = 1; // 允许外部中断0
EA = 1; // 开启总中断
for (unsigned char i = 0; i < LED_NUM; i++)
{
led_state[i] = led_pattern[0][i]; // 初始化发光管状态
}
while (1)
{
if (!auto_flag)
{
if (!P3_2) // 检测手动控制按钮是否按下
{
auto_flag = 1; // 手动控制模式结束,开启自动控制模式
auto_count = 0; // 重置自动控制计数器
}
}
}
}
```
在程序中,使用了一个标志变量 `auto_flag` 和一个计数器 `auto_count` 来实现自动控制功能。当手动控制按钮被按下时,程序会进入手动控制模式,每次按下按钮都会切换到下一个花样。当手动控制按钮松开后,程序会进入自动控制模式,每15秒自动切换到下一个花样。如果在自动控制模式下再次按下手动控制按钮,程序会返回手动控制模式。
阅读全文