|
#include "reg51.h"
sbit IR_INPUT = P3^2; //红外接口标志
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
bit irflag = 0;
unsigned int ircode[4];
void InitInfrared();
unsigned int GetHighTime();
unsigned int GetLowTime();
void main()
{
InitInfrared();
while(1)
{
if(irflag) //如果接收到红外数据
{
irflag = 0; //清除标志
//根据接收到的键值控制LED
switch(ircode[2]) //通常键值在ircode[2]中
{
case 0x44:LED0 = ~LED0;break;
case 0x45:LED1 = ~LED1;break;
case 0x46:LED2 = ~LED2;break;
case 0x47:LED3 = ~LED3;break;
default:break;
}
}
}
}
void InitInfrared()
{
IR_INPUT = 1;
//TMOD &= 0xF0;
TMOD |= 0x01; //设置T0 工作方式1
EA = 1; //开总中断
ET0 = 1;
EX0 = 1;
IT0 = 1;
}
unsigned int GetHighTime()
{
TH0=0;
TL0=0;
TR0=1;
while(IR_INPUT) //12/11.0592*16384=18ms
{
if(TH0>=0x40)
{
break;
}
}
TR0=0;
return(TH0 * 256 + TL0); //高电平的时间us
}
unsigned int GetLowTime()
{
TH0=0;
TL0=0;
TR0=1;
while(!IR_INPUT) //12/11.0592*16384=18ms
{
if(TH0>=0x40)
{
break;
}
}
TR0=0;
return(TH0 * 256 + TL0); //低电平的时间us
}
void EXINT1_ISR() interrupt 0
{
unsigned char i,j;
unsigned int time;
unsigned char byt;
EX0 = 0;
time = GetLowTime();
if((time < 7833) || (time > 8755)) //8.5ms-9.5ms之间,12/11.0592*x=8500us,x=7833;
{
EX0 = 1;
return;
}
time = GetHighTime();
if((time < 3686) || (time > 4608)) //4.5ms-5.5ms之间,12/11.0592*x=8500us,x=3686;
{
EX0 = 1;
return;
}
for(i=0;i<4;i++) //接收4个字节的数据
{
for(j=0;j<8;j++) //接收一个字节 8bit
{
time = GetLowTime();
if((time < 313) || (time > 718))
{
EX0 = 1;
return;
}
time = GetHighTime();
if((time > 313) && (time < 718))
{
byt >>= 1;
}
else if((time > 1345) && (time < 1751))
{
byt >>= 1;
byt |= 0x80;
}
else
{
EX0 = 0;
return;
}
}
ircode[i] = byt;
}
irflag = 1;
EX0 = 0;
}
|
|