📄 irrxd.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 + -