51单片机红外遥控控制LED灯代码
时间: 2023-11-09 09:05:38 浏览: 42
下面是51单片机红外遥控控制LED灯的代码,可以根据需要进行修改:
```c
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit IRIN=P3^2;
sbit LED=P1^0;
u16 time; //用于计时的变量
void delay_us(u16 us) //微秒级延时函数
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(u16 ms) //毫秒级延时函数
{
while(ms--)
{
delay_us(1000);
}
}
void init() //初始化函数,设置定时器和外部中断
{
EA=1; //开总中断
EX0=1; //开外部中断0
IT0=1; //设置外部中断0下降沿触发
TMOD=0x01; //设置定时器0为模式1
TH0=0x00; //设置定时器0的初值
TL0=0x00;
TR0=0; //关闭定时器0
}
u8 get_IR() //获取红外信号函数
{
u8 i, j;
u8 data=0;
while(IRIN); //等待低电平
time=0; //计时器清零
while(!IRIN) //等待高电平
{
delay_us(1); //延时1us
time++;
if(time>1000) //超时退出
{
return 0;
}
}
time=0; //计时器清零
while(IRIN) //等待低电平
{
delay_us(1); //延时1us
time++;
if(time>1000) //超时退出
{
return 0;
}
}
for(i=0;i<8;i++) //读取8位数据
{
time=0; //计时器清零
while(!IRIN) //等待高电平
{
delay_us(1); //延时1us
time++;
if(time>1000) //超时退出
{
return 0;
}
}
time=0; //计时器清零
while(IRIN) //等待低电平
{
delay_us(1); //延时1us
time++;
if(time>1000) //超时退出
{
return 0;
}
}
j=time;
if(j>50) //判断高电平的时间长度,如果是1,则j>50us,否则j<50us
{
data|=(1<<i);
}
}
return data;
}
void main()
{
init(); //初始化
while(1)
{
if(get_IR()==0x18) //如果接收到红外代码为0x18,即遥控器上的数字键1
{
LED=!LED; //LED翻转
}
}
}
void ISR_EXT0() interrupt 0 //外部中断0的中断服务程序
{
TH0=0x00; //定时器0初值
TL0=0x00;
TR0=1; //启动定时器0
while(!IRIN) //等待高电平到来
{
if(time>20000) //如果超时,退出中断服务程序
{
TR0=0;
time=0;
return;
}
}
time=0; //计时器清零
while(IRIN) //等待低电平到来
{
if(time>20000) //如果超时,退出中断服务程序
{
TR0=0;
time=0;
return;
}
}
TR0=0; //关闭定时器0
if(time>1000&&time<2000) //判断时间长度,如果是1,则time>1000us,否则time<1000us
{
IE=0; //关闭总中断
if(get_IR()==0x18) //如果接收到红外代码为0x18,即遥控器上的数字键1
{
LED=!LED; //LED翻转
}
IE=1; //开总中断
}
time=0; //计时器清零
}
```
这段代码实现了通过红外遥控器控制LED灯的功能,当接收到红外代码为0x18时,即遥控器上的数字键1时,LED灯会翻转。需要注意的是,这里用到了定时器和外部中断来获取红外信号,并且在获取红外信号时需要进行延时操作。