這是一個用軟件來解碼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; }