⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irrxd.c

📁 51单片机的
💻 C
字号:
#include<at89x52.h>

#define IRRXD P3_3//INT1口

unsigned char IrRxdBack=0;//中断返回的数据//
bdata unsigned char IrRxd=0;
sbit  IrRxdOk1=IrRxd^0;//有否中断的状态标志//  





 unsigned char IrRxdReceive(void);
 void IrRxdInilital(void);




//红外线接受初始化函数//设置为定时器1在门控GATE下工作//外部中段1工作//
void IrRxdInilital(void)
{TMOD=(TMOD & 0x0f)|0x80;
 IE=IE|0x84;
}


//中断处理模块//
IrRxdIrq()  interrupt 2
{unsigned char IrRxdCmpH=0,IrRxdCmpL=0;
////////////////////////////////////////////////////////////////////////
P3_5=0;
////////////////////////////////////////////////////////////////////////
EX1=0;//关中断
TR1=1;//启动定时器1//
P3_0=0;
IrRxdCmpL=IrRxdReceive();//接受低八位的红外线信号//
IrRxdCmpH=IrRxdReceive();//接受高八位的红外线信号//
TR1=0;//关定时器//
while(~IRRXD);//等待中断INT1恢复为高电平//
if(IrRxdCmpL==0x47)  //如如果用户码正确进入代码转化//
      {switch(IrRxdCmpH)
              {case 0x04:IrRxdBack='0';break;//0按键//
             case 0x00:IrRxdBack='1';break;//1
                 case 0x08:IrRxdBack='2';break;//2
                 case 0x10:IrRxdBack='3';break;//3
                 case 0x18:IrRxdBack='4';break;//4
                 case 0x20:IrRxdBack='5';break;//5
                 case 0x28:IrRxdBack='6';break;//6
                 case 0x30:IrRxdBack='7';break;//7
                 case 0x38:IrRxdBack='8';break;//8
                 case 0x01:IrRxdBack='9';break;//9
                 case 0x11:IrRxdBack='a';break;//--/-按键//
                 case 0x22:IrRxdBack='c';break;//音量+//
                 case 0x2a:IrRxdBack='d';break;//音量-//
                 case 0x32:IrRxdBack='e';break;//静音//
                 case 0x0a:IrRxdBack='f';break;//频道+//
                 case 0x12:IrRxdBack='g';break;//频道-//
                 default :IrRxdBack=0x00;break;
        		}
        IrRxdOk1=1;//置中断标志为1//
      }
else IrRxdBack=0x00;//如果用户码错则置空//
EX1=1;//开中断//
////////////////////////////////////////////////////////////////////////
P3_5=1;
////////////////////////////////////////////////////////////////////////
}


//红外线接受八位数据模块//
unsigned char IrRxdReceive(void)
{unsigned char IrRxdMunber=0,IrRxdCmp1=0,IrRxdCmp2=0,IrRxdCmp=0;
  for(;IrRxdMunber<=7;IrRxdMunber++)
     {while(~IRRXD);//如果INT1为低电平则等待//直到高电平
       while(IRRXD);//如果INT1为高电平则等待//直到低电平
      IrRxdCmp1=TH1;
      IrRxdCmp2=TL1;
          if(IrRxdCmp1==0){TH1=0;TL1=0;IrRxdMunber--;continue;}//如果时间太短则判为误码,再进入循环//
          else {if(IrRxdCmp1>=0x28) //如果接受的高电平时间长则置一//
                   {IrRxdCmp=(IrRxdCmp>>1)|0x80;
                       TH1=0;TL1=0;
            	      }
                  else {IrRxdCmp=IrRxdCmp>>1;TH1=0;TL1=0;}//否则置0
               }
      }
return(IrRxdCmp);//返回接受的数据
}


main()
{unsigned char KingsRight=0,KingsRightBuf[8]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77};
long delaytime=0;
IrRxdInilital();
while(1)
   {delaytime++;
    if(IrRxdOk1)
      {P1=IrRxdBack;}
    if(delaytime==100000)
        {delaytime=0;
         KingsRight++;
         if(KingsRight==7)KingsRight=0;
         P2=KingsRightBuf[KingsRight];
    	 }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -