PT2262是红外遥控编码器,PT2272是其接收解码器,两者常常配对使用,现已广泛用于汽车门控、遥控门锁、门禁管理等领域,也可用于传送数字信息。PT2262具有19位二进制编码功能;PT2272的解码只有4-6位,这就限制了数据传输的应用。在此从PT2262接收的信号特征入手,利用8051F330单片机直接对接收到的信号进行解码,解释出PT2262发出的全部19位数据,从而使其应用于数字通信、智能化控制等领域。
2.硬件电路 图1是发射装置的原理图,PT2262作为编码器,当按下按键时,设定的地址码和数据码从17引脚串行输出,经红外发射元件IRED发出信号。通过电阻Rosc调节发射频率,适当提高PT2262工作电压(2.6V-15V),以增大发射距离。其中A0-A12可设置为高电平、低电平、悬空三种状态,因此可以发送531441种编码组合。完全满足设计需求。 接收装置采用集红外线接收、放大、整形与一体的集成电路TL0038,无需任何外接元件,就能完成从红外线接收带输出与TTL电平信号兼容的所有工作,故适用于各种红外线遥控和红外线数据传输。译码采用8051F330D单片机,11.0592MHz晶体振荡器,接收信号送至I/O断口P1.0进行软件解码。接收和译码电路如图2所示。
3.解码原理 编码器PT2262发送的编码信号是由:地址码、数据码、同步码组成的一个完整码字,最多可以有12位(A0-A11)三态地址端引脚(悬空、高电平、低电平),任意组合可提供531441个地址码。将编码器PT2262的A8位拉高,D3拉高,D0拉高,D1拉低,其余悬空。截取一段接收信号输出波形如图3所示,PT2262每发射一次,至少发送4组相同编码字码。每组字码间隔(低电平)约14ms。 将其截获波形每组字码放大,如图4所示,一组字码有12位A/D码,每个A/D位是由2个脉冲表示:2个窄脉冲则表示“0”;2个宽脉冲表示“1”;1个窄脉冲和一个宽脉冲表示“F”,即地址码“悬空”;除此之外,每组字码之间还有一个同步码隔开,所以每组字码共计有25个宽度不同的脉冲。窄脉冲宽为200μs;宽脉冲宽为1200μs;两个窄脉冲之间宽1200μs;两个宽脉冲间宽200μs;宽窄脉冲间宽为200μs;在4组字码中,每组的字码间隔为4000μs。因此,采用单片机软件解码时,只要判断出起始码,并且识别起后面的字码脉冲宽度即可。
4.抗干扰措施 常用抗干扰措施,是在硬件电路中采用电源滤波、电源稳压、数字地与模拟地隔离。在设计中,除采用上诉方法外,还根据干扰信号与有效信号波形特征异同点,采用软件识别干扰信号和有效信号,从而实现“抗干扰”目的。 当遥控器不发射时,由于空气中各杂波干扰,接收模块的信号输出端仍然会有干扰信号,截获波形如图5所示。 观察其特征,低电平最长为3000μs,最短数十微秒;高电平最长500μs,最短数微秒。与发射时接收到的规则波形(即非有效信号)相比较,低电平为1400μs的信号,是有效信号,而不是干扰信号。并将A0-A34个地址焊接到高电平上作为发射编码信号的帧前码,可解决误码率和干扰问题。
5.软件解码 步骤1:单片机循环记录接收模块信号电平脉冲的长度,高低电平都记录。 步骤2:从记录高低电平组成的波形中,找出连续8个1200μs时长的脉冲信号为特征波形段,即帧前码。 步骤3:确认帧前码之间是否存在一个时长为14000μs的低电平,如果有(则说明不是干扰码),将解码并储存结果,然后根据指令码执行相应控制功能。如没有,则放弃记录的数据,重复步骤1,直到满足条件为止。 以下给出了相关软件解码的程序代码: #include<c8051f330。h> unsigned int k,k1,k2,i=0,j; idata unsigned int bite[50] //存高电平,至少接收2组 idata unsigned int bote1[40];//存低电平 idata unsigned char jieguo[4];//解码结果 long int result; sbit P01=P0? 1;//无限信号接收端 sbit P07=P0? 7;//驱动LED void IOdingyi()//单片机配置 { XBRO="0X01"; XBR1= 0X40 ; P0MDIN=0XF3; P0MDOUT= 0X00; P0SKIP=0X0C; P1MDIN=0XFF; P1MDOUT=0X00;P1SKIP=0X00; } void oscillator() //单片机配置 {OSCXCN =0X67; //开启外部振荡器 12 MHz while((OSCXCN& 0X80)= =0X00){} CLKSEL =0x01; //切换到外部晶体振荡器 } void bianma() //记录高低电平脉宽 {for(j=0;j<50;j++) { bite[j]=0;bite1[j]=0;} //归零 for(j=0;j<50;j++) //用计数方式记录脉宽 {while(P01= =0) {bite1[j]++;} {while(P01= =1) {bite[j]++;} } } void yima() //把高电平脉宽解码成十六进制字码 { int s="500"; //大于500脉宽为高电平,反之为低 unsigned char r1=0x80,r2=0x80; unsigned char r0=0x80,r=0x80; idata unsigned char bite2[32];//解码用 for(j=0;j<8;j++) //将高电平转换为十六进制代码 { if(bite[j+k2]>s) {bite2[j]=r;} else {bite2[j]=0x00;} r=(r>>1); jieguo[0]=jieguo[0]+bite2[j];} for(j=8;j<16;j++) //将高电平转换为十六进制代码 { if(bite[j+k2]>s) {bite2[j]=r0;} else {bite2[j]=0x00;} r0=(r0>>1); jieguo[1]=jieguo[1]+bite2[j];} for(j=16;j<24;j++) //将高电平转换为十六进制代码 { if(bite[j+k2]>s) {bite2[j]=r1;} else {bite2[j]=0x00;} r1=(r1>>1); jieguo[2]=jieguo[2]+bite2[j];} for(j=24;j<32;j++) //将高电平转换为十六进制代码 { if(bite[j+k2]>s) {bite2[j]=r2;} else {bite2[j]=0x00;} r2=(r2>>1); jieguo[3]=jieguo[3]+bite2[j];} } void PT2262-72() { bianma();k2=0; yima(); result="jieguo" [0]*0x1000000+jieguo [1]*0x10000+jieguo[2] *0x100+jieguo[3]; k1=0; while ((result&0xff000000)! =0xff000000) //找出帧前码 { result=(result<<1);k1++; //移位 result,直到帧前码出现最高位 if(k1>25) {k1=0; break;} //找寻超过25次,退出找寻 } k2=k1; yima();//ka存储帧前码,并将电平值从帧前码开始 转换为十六进制代码 } main() { PCA0MD=0x00;EA=0;//关中断,看门狗 IOdingyi();oscillator();//初始化 while(1) { PT2262-72();//软件解码程序 //判断帧前码是否正确,排除干扰信号(帧前码前面是否有14000μs低电平) if((jieguo[0]= =255)&&(bite1[k2]>6000)){;} //存储,认为结果[0-2]有效 else jieguo [0]=0;jieguo [1]=0;jieguo [2]=0;} //认为jieguo无效,清零 //根据指令码,执行控制功能 if((jieguo[0]= =255)&&(jieguo[1]= =0x55)&&(jieguo[2]= =0x55)) {P07=0;} //执行控制程序这里让p07驱动数码管发光 else P07=1;//不正确,LED熄灭警示*/ } )
6.结束语 该软件解码部分已在8051F330D单片机(11.0592MHz晶体振荡器)上通过现场测试,设计方案可应用与门禁管理系统。实践表明,应用方便、可靠性好、代码识别准确。 |
文章评论(0条评论)
登录后参与讨论