描述:
            #include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar IRCOM[7];
uchar j,k,N=0;
uchar zf=0;	//正反转标志位
uchar m=0;
sbit IRIN = P3^3;         //红外接收器数据线
void delay(uchar x);  //x*0.14MS
void delay2(uint i);
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void delay2(uint i)
{
	uchar x,j;
	for(j=0;j<i;j++)
	for(x=0;x<=148;x++);	
}
/*********************************************************************/
void delay(unsigned char x)    //x*0.14MS
{
 unsigned char i;
 while(x--)
 {
  for (i = 0; i<13; i++) {}
 }
}
/**********************************************************************/
void Outside_IRIN()	 //初始化
{
	EX1 = 1; //开外部中断0
	IT1 = 1; //负边沿触发
	EA = 1;   //开总中断
}
/**********************************************************/
 
void IR_IN() interrupt 2 using 0
{
  
     EX1 = 0;   
	 delay(15);
	 if (IRIN==1) 
	  {	
			EX1=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)
	 			{
	 		 		EX1=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])
   { 
   		EX1=1;
     	return; 
   }
   if(IRCOM[2]==0x0C)//正转 1  
    {
		P0=0xfe;
    }
   else if(IRCOM[2]==0x18)//反转 2
    {
	   P0=0xfd;
	   zf=~zf;
    }
   else if(IRCOM[2]==0x16)//停止 0
    {	
	   P0=0xaa;
	   P1=0xff;
    }
   EX1 = 1; 
}
  
/*******************************************************************/
main()
{  
	char code zz[8]={0x70,0x60,0x68,0x48,0x58,0x18,0x28,0x20}; 
	char code fz[8]={0x20,0x28,0x18,0x58,0x48,0x68,0x60,0x70}; 
 	P0=0x00;
    Outside_IRIN();//初始化
while(1)
	{
	 if(IRCOM[2]==0x0C)
		{
			for(;;)
			{
				P1=zf==0?zz[m]:fz[m]; //zf=0时,正传。zf=1时,反转
			    delay(10);
				m++;
				if(m>7)
				m=0;
				if(IRCOM[2]==0x16)
			     {
				  break;
				}
				  			
			}		
		}	
	}
} //end main

