这是315M无线2262的解码程序,有时候能解码成功,有时不能,距离也很短,用的超再生无线模块接收的
bit receive_2262()//解2262数据位
{
uchar a,b;
uint time;
for(a=0;a<3;a++)
{
for(b=0;b<8;b++)
{
TL0=0;
TH0=0;
TR0=1;
arrest=0;
while(IR==0)
{
arrest++;
if(arrest>=7000)
return 0;
}
TR0=0;
time=TL0+TH0*256;
if(time<300)
return 0;
key[a]=key[a]>>1;
if(time>400&&time<700)
key[a]=key[a]&0x7f;
else
if(time>700&&time<1900)
key[a]=key[a]|0x80;
else
return 0;
arrest=0;
while(IR==1)
{
arrest++;
if(arrest>=10000)
return 0;
}
}
}
impulse_disposal(); //合成数据
ashion_flag=1; //规定编码方式为1
return 1; //解码成功
}
incept() //无线接收起始位
{
TL0=0;
TH0=0;
TR0=1;
arrest=0;
while(IR==0)
{
arrest++;
if(arrest>=40000)
return ;
}
TR0=0;
LowTime=TH0*256+TL0;
if(LowTime<10000&&LowTime>17000)
return ;
TH0=0;
TL0=0;
TR0=1;
arrest=0;
while(IR==1)
{
arrest++;
if(arrest>=10000)
return ;
}
TR0=0;
HighTime=TH0*256+TL0;
if((LowTime>15000)&&(LowTime<17000)) //检测同步码
{
if(receive_2262()==1)
{
succeed_flag=1;
}
}
else
if((LowTime>10000)&&(LowTime<12000)) //起始位解码成功
{
lamp2=!lamp2;
if(receive_1527()==1) //数据解码成功
{
lamp1=!lamp1;
succeed_flag=1; //成功标志置一
}
else
lamp3=!lamp3;
}
}
int0()interrupt 0
{
incept();
if(succeed_flag==1)
{
succeed_flag=0;
Delay_ms(20);
}
} |