红外接收部分: 红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038,它接收红外信号频率为38kHz,周期约26us) 接收红外信号,它同时对信号进行放大、检波、整形得到 TTL电平的编码信号,再送给单片机,经单片机解码并执行去控制相关对象。 #include"reg52.h" #define uchar unsigned char #define uint unsigned int #include"reg52.h" #define uchar unsigned char #define uint unsigned int uchar ram[4]={0,0,0,0};//存放接受到的4个数据 地址码16位+按键码8位+按键码取反的8位 void delaytime(uint time) //延迟90uS { uchar a,b; for(a=time;a>0;a--) { for(b=40;b>0;b--); } } void rem()interrupt 0 //中断函数 { uchar ramc=0; //定义接收了4个字节的变量 uchar count=0; //定义现在接收第几位变量 uint i=0; //此处变量用来在下面配合连续监测9MS 内是否有高电平 prem=1; for(i=0;i<1100;i++) //以下FOR语句执行时间为8MS左右 { if(prem) //进入遥控接收程序首先进入引导码的前半部判断,即:是否有9MS左右的低电平 return; //引导码错误则退出 ,注意与break语句的区别 } while(prem!=1); //等待引导码的后半部 4.5 MS 高电平开始的到来。 delaytime(50); //延时大于4.5MS时间,跨过引导码的后半部分,来到真正遥控数据32位中 //第一位数据的0.56MS开始脉冲 for(ramc=0;ramc<4;ramc++)//循环4次接收4个字节 { for(count=0;count<8;count++) //循环8次接收8位(一个字节) { while(prem!=1); //开始判断现在接收到的数据是0或者1 ,首先在这行本句话时, //保已经进入数据的0.56MS 低电平阶段 //等待本次接受数据的高电平的到来。 delaytime(9);//高电平到来后,数据0 高电平最多延续0.56MS,而数据1,高电平可延续1.66MS大于0.8MS 后我们可以再判断遥控接收脚的电平。 if(prem) //如果这时高电平仍然在继续那么接收到的数据是1的编码 {ram[ramc]=(ram[ramc]<<1)+1;//将目前接收到的数据位1放到对应的字节中 delaytime(11); //如果本次接受到的数据是1,那么要继续延迟1MS,这样才能跨 //下个位编码的低电平中(即是开始的0.56MS中) } else //否则目前接收到的是数据0的编码 ram[ramc]=ram[ramc]<<1; //将目前接收到的数据位0放到对应的字节中 } //本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收 } if(ram[2]!=(~(ram[3]&0x7f))) //本次接收码的判断 { for(i=0;i<4;i++) //没有此对应关系则表明接收失败,清除接受到的数据 ram=0; returned;} main() { IT0=1; //设定INT0为边沿触发 EX0=1; //打开外部中断0 EA=1; //全局中断开关打开 while(1) { switch(dis_num) { case 0x81: num=0; break; case 0xcf: num=1; break; case 0x92: num=2; break; case 0x86: num=3; break; case 0xcc: num=4; break; case 0xa4: num=5; break; case 0xa0: num=6; break; case 0x8f: num=7; break; case 0x80: num=8; break; case 0x84: num=9; break; case 0x88: num=10;break; case 0xe0: num=11;break; case 0xb1: num=12;break; case 0xc2: num=13;break; case 0xb0: num=14;break; case 0xb8: num=15;break; } P2=table[num]; P1=0x01; delaytime(5); } }
|