紅外模塊:
#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;}
}
}
}
|