这是一个用软件来解码pt2262信号的c51程序,经过测试是可以使用的,要注意接受模块要远离单片机的晶振 不然干扰太严重无法解码的 或者距离很近.
/*------------------------------------------------------------------------------ ; Copyright (C) 2006 WangChanghong INTEGRATED PRODUCTS, INC. ; All rights reserved. ; MCU:AT89s52 ,晶体频率:12MHz : 作者:汪长洪 : 时间:2006年08月01日 ; 地点:威海 ;----------------------------315M无线遥控解码程序------------------------------*/ #include <AT89X52.H> #define uchar unsigned char #define uint unsigned int /*---------------------------------变量列表------------------------------------*/ uchar ReadCode[3],GetCode; /*---------------------------------函数列表------------------------------------*/ void delay_200(void); //200us精确延时 void delay_250(void); //250us精确延时 void delay_131(void); //131ms精确延时 void init(void); //初始化子程序 void INT0_intrupt(); //中断处理子程序(解码程序) /*-----------------------------主程序入口--------------------------------------*/ main() { init(); while(1) { P2=~GetCode|0xf0; } } /*---------------------------------初始化子程序--------------------------------*/ void init(void) { EA=1; //打开CPU总中断请求 EX0=1; //打开INT0中断请求 IT0=1; //设定INT0的触发方式为脉冲负边沿触发 } /*-------------------------------200us精确延时---------------------------------*/ void delay_200(void) { uchar i,j; for(i=0x05;i>0;i--) for(j=0x12;j>0;j--); } /*-------------------------------250us精确延时---------------------------------*/ void delay_250(void) { uchar i,j; for(i=0x05;i>0;i--) for(j=0x17;j>0;j--); } /*-------------------------------131ms精确延时--------------------------------*/ void delay_131(void) { uchar i,j; for(i=0xfe;i>0;i--) for(j=0xfe;j>0;j--); } /*-------------------------外部中断0子程序(解码程序)---------------------------*/ void INT0_intrupt(void) interrupt 0 using 1 { uchar i,j; bit BitState_2; EX0=0; //////////////////////////////找起始位////////////////////////////////////////// for(i=0;i<50;i++); if(P3_2==1) goto kk; while(P3_2==0); for(i=0;i<50;i++); if(P3_2==0) goto kk; delay_200(); if(P3_2==1) goto kk; for(i=15;i>0;i--) //重复20次,检测在3750微秒内出现高电平就退出解码程序 { delay_200(); if(P3_2==1) goto kk; } while(P3_2==0); ///////////////////////////////接收数据/////////////////////////////////////////// for(j=0;j<3;j++) { for(i=0;i<8;i++) { delay_250(); BitState_2=P3_2; ReadCode[j]=ReadCode[j]<<1; ReadCode[j]=ReadCode[j]|BitState_2; if(P3_2==1) while(P3_2==1); while(P3_2==0); } } ////////////////////////////////校验及运算数据///////////////////////////////////// for(i=0;i<3;i++) { if((~(ReadCode[i]|0x55))&((ReadCode[i]&0x55)<<1)!=0x00) goto kk; //校验 } GetCode=0x00; for(i=0;i<8;i++) { GetCode |=((ReadCode[2]>>i)&(ReadCode[2]>>(i+1))&0x01<<i); //运算 } ////////////////////////////////////////////////////////////////////////////////// delay_131(); delay_131(); delay_131(); delay_131(); kk: EX0=1; }