技术热线: 4007-888-234

PIC单片机的无线、红外解码程序

更新时间: 2019-03-26
阅读量:2443

void Decoder() {unsigned char SignalW,CodeTotal; SignalW=0; do { //9+66=75us delay(20);//delay 66us SignalW++; if(SignalW>120) return; // 如果引导码长度超出范围则退出程序 }while(IRin);//判断引导码是否正确 if(SignalW<60) return;//若引导码长度太短同样退出程序 CodeTotal=12; //一共解码12次,因为510412bitdo{ //delay 11+21=32us SignalW=0; do{ delay(5);//delay 21us SignalW++; 

if(SignalW>makuan) return; //如果低电平时间超过1bit的长度则认为是干扰 }while(!IRin); if(SignalW<6) return;//如果宽度低于6*32=192us,则认为是干扰 SignalW=SignalW-fenjie;//宽度大于800US时为1,否则为0 asm("RLF _CodeBuff,F"); asm("RLF _CodeBuff+1,F");//将解得的码移入存储器 //CODE_TOTAL++; asm("CLRWDT"); SignalW=0; //对高电平进行监视 do{ delay(5); SignalW++; if(SignalW>makuan) break; //请注意,因为最后一位是高电平。所以此出用break//如果该为return的话则解码错误 }while(IRin); CodeTotal--; }while(CodeTotal); //12bit全部解完后进行处理 

if((IRData[0]==CodeBuff[0])&&(IRData[1]==CodeBuff[1])) if(bFirstIR) //判断是否连续2次解得同一码 { Timer=0; bFirstIR=0; if(bHaveKey) return; asm("RLF _IRData,f"); asm("RLF _IRData+1,f"); asm("RRF _IRData,f"); IRData[0]&=0x7f; IRData[1]&=0x1b; if(IRData[1]==IRAddress) { if(IRData[0]==Key1) PortBuff^=Key1; if(IRData[0]==Key2) PortBuff^=Key2; if(IRData[0]==Key3) PortBuff^=Key3; if(IRData[0]==Key4) PortBuff^=Key4; if(IRData[0]==Key5) PortBuff^=Key5; if(IRData[0]==Key6) PortBuff=0; bHaveKey=1; } return; } bFirstIR=1; //否则保存当前的码值 IRData[0]=CodeBuff[0]; IRData[1]=CodeBuff[1]; }