/ 亲,此程序以经过测试,可直接使用!!!/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uchar x);
sbit IRIN = P3^2;
uchar IRCOM[4];
void main()
{ IE = 0x81;
TCON = 0x01;
IRIN=1;
/* 此处可以根据按键码自由编写程序
/以下为3*7遥控按键码/
/(也可以应用与其他类型遥控,本程序只以3*7遥控为例)/ / 0x45 0x46 0x47 /
/ 0x44 0x40 0x43 /
/ 0x07 0x15 0x09 /
/ 0x16 0x19 0x0d /
/ 0x0c 0x18 0x5e /
/ 0x08 0x1c 0x5a /
/ 0x42 0x52 0x4a /
例如:
while(1)
{switch(IRCOM[2])
{case 0x45: P2=0x7f; break;
case 0x44: P2=0xbf; break;
case 0x07: P2=0xdf; break;
case 0x16: P2=0xef; break;
case 0x0c: P2=0xf7; break;
case 0x08: P2=0xfb; break;
case 0x42: P2=0xfd; break;
case 0x52: P2=0xfe; break;
case 0x4a: P2=0xff; break;
case 0x5a: P2=0x00; break;}
} */
while(1);
} //end main
/**********************************************************/ void IR_IN(void) interrupt 0 //外部中断服务程序
{unsigned char j,k,N=0;
EX0 = 0;
delay(15);
if (IRIN==1)
{ EX0 =1;
return;}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay(1);}
for (j=0;j<4;j++) //收集四组数据
{ for (k=0;k<8;k++) //每组数据有8位
{while (IRIN) //等IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay(1);}
while (!IRIN) //等IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{delay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return; }
EX0 = 1;
}
/**********************************************************/
void delay(unsigned char x) //x*0.14MS
{ unsigned char i;
while(x--)
{for (i = 0; i<13; i++) {}}
}。