红外模块:
#include <Define.h>
bit IR_on(void);
uchar IR_Value[4];
bit b_IR_ok;
void IR_DeCode(void)
{
if(IRIN == 0)
{
TH1 = 0; //定时器T0的高8位清0
TL1 = 0; //定时器T0的低8位清0
TR1 = 1;
while(IRIN == 0); //如果是低电平就等待,给引导码低电平计时
TR1 = 0; //关闭定时器T1
LowTime = TH1*256+TL1; //保存低电平时间
TH1 = 0; //定时器T0的高8位清0
TL1 = 0; //定时器T0的低8位清0
TR1 = 1; //开启定时器T1
while(IRIN == 1); //如果是高电平就等待,给引导码高电平计时
TR1 = 0; //关闭定时器T1
HighTime = TH1*256+TL1; //保存引导码的高电平长度
if((LowTime >= 8000)&&(LowTime <= 8500)&&(HighTime >= 3847)&&(HighTime <= 4447)) //如果是引导码,就开始解码,否则放弃
{
if(IR_on() == 1) // 执行遥控解码功能
{
display();
}
}
}
}
bit IR_on(void)
{
uchar i,j;
uchar temp;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 8;j++)
{
TH1 = 0; //定时器清0
TL1 = 0; //定时器清0
TR1 = 1; //开启定时器T0
while(IRIN == 0); //如果是低电平就等待 低电平计时
TR1 = 0; //关闭定时器T0
LowTime=TH1*256+TL1; //保存低电平宽度
temp = temp >> 1; //temp中的各数据位右移一位,因为先读出的是低位数据
TH1 = 0; //定时器清0
TL1 = 0; //定时器清0
TR1 = 1; //开启定时器T0
while(IRIN == 1); //如果是高电平就等待
TR1 = 0; //关闭定时器T0
HighTime = TH1*256+TL1; //保存高电平宽度
if((LowTime < 416)||(LowTime > 616))
{return 0;} //如果低电平长度不在合理范围,则认为出错,停止解码
if((HighTime > 420)&&(HighTime < 620)) //如果高电平时间在565微秒左右,即计数565/1.085=520次
{temp=temp&0x7f;} //(520-100=420, 520+100=620),则该位是0
if((HighTime > 1447)&&(HighTime < 1657)) //如果高电平时间在1690微秒左右,即计数1690/1.085=1557次
{temp=temp|0x80;} //(1560-260=1300,1560+260=1820),则该位是1
}
IR_Value[i]=temp; //将解码出的字节值储存在a[i]
}
if(IR_Value[2] != ~IR_Value[3])
{b_IR_ok = 1;}
else
{b_IR_ok = 0;}
return 1;
}
流水灯模块:
void led(void)
{
if(b_IR_ok == 0)
{
r_led_timer++;
if(r_led_timer >= 1000)
{
r_led_timer = 0;
r_led_timer1++;
if(r_led_timer1 == 10)
{r_led_timer1 = 0;}
if(r_led_timer1 == 1)
{P1 = 0x7f;}
if(r_led_timer1 == 2)
{P1 = 0xbf;}
if(r_led_timer1 == 3)
{P1 = 0xdf;}
if(r_led_timer1 == 4)
{P1 = 0xef;}
if(r_led_timer1 == 5)
{P1 = 0xf7;}
if(r_led_timer1 == 6)
{P1 = 0xfb;}
if(r_led_timer1 == 7)
{P1 = 0xfd;}
if(r_led_timer1 == 8)
{P1 = 0xfe;}
if(r_led_timer1 == 9)
{P1 = 0xff;}
}
}
}
|