315M443M无线遥控波形分析及STC单片机解码Word格式文档下载.docx
《315M443M无线遥控波形分析及STC单片机解码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《315M443M无线遥控波形分析及STC单片机解码Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
![315M443M无线遥控波形分析及STC单片机解码Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/21/878ae3dd-a418-4953-9ccb-a2d21ed63b8e/878ae3dd-a418-4953-9ccb-a2d21ed63b8e1.gif)
首先有一段比较长的波形,通过软件可以看出有多少ms(大概13ms),这就是同步码,后面有25短的波形,这就是PT2262的编码格式。
首先要识别出同步码,这个很关键,我们在做发射编码时也要做这个,一般为10-20ms,这是区别于乱码的标志。
下面说说我是怎样解码的,利用51单片机,接收信号接到P3.2,用下降沿外部中断。
检测每2次下降沿中断的时间,用T1计时;
每2次下降沿之间的高电平段的时间,用T0计时;
这是常用的PT2262的格式,
首先要检测到同步码,每两次中断的时间大于(T1计时)12ms;
检测到同步码后才开始解码,如果接收到的高电平在450us左右为“0”;
如果接收到的高电平在1300us左右为“1”;
这样我们就能解码了。
这是我的解码程序:
#include<
STC12C5A60S2.h>
intrins.h>
#include<
stdlib.h>
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
uintINT0_H_timer=0;
//两个下降沿之间的高电平宽度
uintINT0_L_timer=0;
//两个下降沿总宽度
bitDBM=0;
//同步码标志
longDATA=0;
//取得24位数据(暂存);
longDATAZ=0;
//取得24位数据(比较暂存);
longDATAX=0;
//取数据
ucharDATA_x=0;
//取数据次数;
//uintINT0_H[24]={0,};
ucharTY=0;
//连续取数标志
voidInitTimer0(void)//T0用于计两个下降沿之间的高电平宽度
{
TMOD|=0x09;
//T0加门控计高电平宽度
TH0=0x00;
TL0=0x00;
ET0=0;
//关T0定时中断
TR0=1;
TF0=0;
//溢出清0
}
voidInitTimer1(void)//T1用于计两个下降沿总宽度
TMOD|=0x10;
TH1=0x00;
TL1=0x00;
ET1=0;
//关T1定时中断
TR1=1;
TF1=0;
voidINT0_int()//外部中断初始化
IT0=1;
//下降沿
EX0=1;
EA=1;
voidmain(void)
ucharx=12,y=0;
//AUXR&
=0x7F;
//定时器时钟12T模式
InitTimer0();
InitTimer1();
INT0_int();
TH0=10;
TL0=10;
while
(1)
{
P0=DATAX;
}
voidINT0Interrupt(void)interrupt0
INT0_L_timer=TH1*256+TL1;
INT0_H_timer=TH0*256+TL0;
if(TF0)//有溢出不取值出错
INT0_L_timer=0;
INT0_H_timer=0;
TF0=0;
TF1=0;
DBM=0;
DATA_x=0;
//P0=0xfe;
//晶振22.1184、12分频,13~15ms为同步码
if(INT0_L_timer>
24000&
&
INT0_L_timer<
27000)//晶振22.1184、12分频
DBM=1;
//P0=0;
if(DBM)//取第3次同步码后的数据
if((INT0_H_timer>
600)&
(INT0_H_timer<
1000))//350~500us为0
{
DATA&
=0xfffffe;
if(DATA_x<
23)
{
DATA_x++;
DATA=DATA<
<
1;
}
else
if(TY>
=1)
{
TY=0;
if(DATAZ==DATA)//如果2次取数一致,读出数
{
DATAX=DATA;
}
else
INT0_L_timer=0;
INT0_H_timer=0;
TF0=0;
TF1=0;
DBM=0;
DATA_x=0;
}
else
DATAZ=DATA;
TY++;
DATA=0;
DBM=0;
DATA_x=0;
//P0=0x7f;
}
elseif((INT0_H_timer>
2200)&
2600))//1200~1400us为1
DATA|=0x000001;
else//出错
INT0_L_timer=0;
INT0_H_timer=0;
TF0=0;
TF1=0;
DBM=0;
DATA_x=0;
//P0=0xfd;