51红外遥控控制流水灯的程序
时间: 2024-03-26 10:41:50 浏览: 265
好的,这里是一个简单的51单片机红外遥控控制流水灯的程序示例,你可以参考一下:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
// 红外遥控器按键码定义
#define KEY_STOP 0x45
#define KEY_UP 0x46
#define KEY_DOWN 0x47
#define KEY_LEFT 0x44
#define KEY_RIGHT 0x43
sbit LED1 = P2^0; // 流水灯LED1
sbit LED2 = P2^1; // 流水灯LED2
sbit LED3 = P2^2; // 流水灯LED3
sbit LED4 = P2^3; // 流水灯LED4
uchar IR_value; // 红外遥控器接收到的按键码
// 初始化定时器0,用于控制LED流水灯的闪烁速度
void Init_Timer0()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xB8;
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
}
// 定时器0中断服务函数,用于控制LED流水灯的闪烁
void Timer0_ISR() interrupt 1
{
static uchar count = 0;
count ++;
if(count == 4) // 控制LED流水灯的闪烁速度
{
LED1 = ~LED1;
LED2 = ~LED2;
LED3 = ~LED3;
LED4 = ~LED4;
count = 0;
}
}
// 初始化红外遥控器
void Init_IR()
{
IT0 = 1; // 外部中断0下降沿触发
EX0 = 1; // 开启外部中断0
EA = 1; // 开启总中断
}
// 红外遥控器中断服务函数,用于处理接收到的按键码
void IR_ISR() interrupt 0
{
uchar IR_data[4];
uint count, i;
// 等待红外信号开始
while(!IR_IN);
// 记录红外遥控器发射的4个字节数据
for(i = 0; i < 4; i ++)
{
count = 0;
while(IR_IN && count++ < 200); // 等待高电平结束
count = 0;
while(!IR_IN && count++ < 40); // 等待低电平结束
count = 0;
while(IR_IN && count++ < 80); // 统计高电平持续时间
IR_data[i] = count;
}
// 验证接收到的红外信号是否正确
if(IR_data[0] + IR_data[1] == 255 && IR_data[2] + IR_data[3] == 255)
{
IR_value = IR_data[2]; // 获取红外遥控器按键码
}
// 清除中断标志位
IR_flag = 0;
}
// 主函数
void main()
{
Init_Timer0(); // 初始化定时器0
Init_IR(); // 初始化红外遥控器
while(1)
{
// 根据接收到的红外遥控器按键码执行不同的操作
switch(IR_value)
{
case KEY_STOP: // 关闭LED流水灯
LED1 = LED2 = LED3 = LED4 = 0;
break;
case KEY_UP: // 控制LED流水灯往前流动
LED1 = 1;
LED2 = 0;
LED3 = 0;
LED4 = 0;
break;
case KEY_DOWN: // 控制LED流水灯往后流动
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 1;
break;
case KEY_LEFT: // 控制LED流水灯速度加快
TH0 = 0xB8;
TL0 = 0x00;
break;
case KEY_RIGHT: // 控制LED流水灯速度减慢
TH0 = 0xFF;
TL0 = 0xFF;
break;
}
IR_value = 0; // 清空按键码
}
}
```
这是一个简单的示例程序,你可以根据自己的需求进行修改和优化。希望能对你有所帮助!
阅读全文