/******************************************************************************/ /* 项目名称 : TX-1C 红外遥控器控制继电器 */ /* 主控芯片 : STC89C52 */ /* 文件名称 : Inf_Relay */ /* 文件功能 : 主函数 */ /* 文件版权 : 天祥电子 */ /* 文件版本 : */ /******************************************************************************/ /**********************************包含头文件**********************************/ #include /************************************宏定义************************************/ sfr P2M0 = 0X96; sfr P2M1 = 0X95; #define uchar unsigned char #define Imax 14000 //此处为晶振为11.0592时的取值, #define Imin 8000 //如用其它频率的晶振时, #define Inum1 1450 //要改变相应的取值。 #define Inum2 700 #define Inum3 3000 /************************************位定义************************************/ sbit dula = P2^6; sbit wela = P2^7; sbit Relay = P2^0 ; //继电器信号输出 /********************************定义变量和数组********************************/ uchar Im[4] = {0x00,0x00,0x00,0x00}; uchar f; uchar IrOK; unsigned long m,Tc; /******************************************************************************/ /* 函数名称 : intersvr1 */ /* 函数描述 : 外部中断解码程序 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void intersvr1(void) interrupt 2 using 1 { Tc = TH0 * 256 + TL0; //提取中断时间间隔时长 TH0 = 0; TL0 = 0; //定时中断重新置零 if((Tc > Imin) && (Tc < Imax)) { m = 0; f = 1; return; } //找到启始码 if(f == 1) { if(Tc > Inum1 && Tc < Inum3) { Im[m / 8] = Im[m / 8] >> 1 | 0x80; m++; } if(Tc > Inum2 && Tc < Inum1) { Im[m / 8] = Im[m / 8] >> 1; m++; //取码 } if(m == 32) { m = 0; f = 0; if(Im[2] ==~ Im[3]) { IrOK =1 ; } else { IrOK = 0; //取码完成后判断读码是否正确 } } } } /******************************************************************************/ /* 函数名称 : Inf_Dispose */ /* 函数描述 : 红外接收处理函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void Inf_Dispose(void) { if(IrOK == 1) { if(Im[2] == 0x44) //遥控器OK键按下 控制继电器开关 { Relay =~ Relay; } IrOK = 0; } } /******************************************************************************/ /* 函数名称 : main */ /* 函数描述 : 主函数 */ /* 输入参数 : 无 */ /* 参数描述 : 无 */ /* 返回值 : 无 */ /******************************************************************************/ void main(void) { m = 0; f = 0; EA = 1; IT1 = 1; EX1 = 1; TMOD = 0x11; TH0 = 0; TL0 = 0; TR0 = 1; P2M0 = 0x01; //P2.0设置为推挽输出 89系列单片机无效 P2M1 = 0X00; Relay = 1; while(1) { Inf_Dispose(); //红外接收处理 } } /******************************************************************************/