433M无线解码程序
2024-3-25 19:13 来自 jack86 发布 @ 综合讨论
各位大神,我有找了一个433M无线解码程序,解码不成功,都无法执行到取码,求赐教。!!!
89C522RC的芯片
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RF = P0^5; //信号输入
sbit LED = P2^0; // P3^4;
sbit D0 = P2^1; //用于后面按位取键值 3^6;
sbit D1 = P2^2; // 3^7;
sbit D2 = P2^3; //P4^1;
sbit D3 = P2^4; // P4^2;
sbit VT = P3^5; //解码成功
bit decode_ok; //解码成功标志
uchar hh_w,ll_w; //高低电平宽度
uchar ma_x; //接收到第几位编码
uchar bma1,bma2,bma3,bma4; //四个字节存放编码 第一次的
uchar idata mmb1,mmb2,mmb3,mmb4; // 存放编码 第二次 当两次一样才算一次有效按键
bit rf_ok1,rf_ok2; //临时成功接收标志 分别第一次和第二次
bit rf_ok; //接收成功 可以解码
bit old_rc5; //接收到24为码可以开始解码
bit tb_ok; //同步码接收成功标志
uchar mma1,mma2,mma3,mma4; //四个字节用来存放编码
uchar temp_h;temp_l;
bit bt_auto; //自动设置遥控接收波特率标志 根据码不同的长度做不同的波特率
uint s,s1;//用于系统延迟 分别为留时间做第二次解码 和 留时间实现功能 目的保证系统稳定性
void timeint() interrupt 1 //定时器中断
{
// D0=0X80;
// TL0=0xb5;
// TH0=0xfb;
if(!bt_auto) //
{
TL0=0x70; // 90
TH0=0xfB; //fc 定时器100us
}
else
{
TL0=temp_l; //
TH0=temp_h;
}
TF0=0; //
if (!RF)
{ ll_w++;old_rc5=0; } //接收到低电平
else // 接收到高电平
{ //D0=1;
hh_w++;
if (!old_rc5) // 检测到从低到高的跳变 表示接收到一个完整的(高-低)电平周期
{
if (((hh_w>=2)&&(hh_w<=8))&&((ll_w>=50)&&(ll_w<=190))) // 满足同步码时长 H:0.4ms L:12ms
{ //D0=1;
if((ll_w>=110)&&(ll_w<=140)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=0;} //根据更精确的时长确定波特率和后面的定时器长度 保证精确
else
{
if((ll_w>140)&&(ll_w<=160))
{ ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0x6b; }
else
{
if((ll_w>160)&&(ll_w<=190))
{ ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfd;temp_l=0xdc; }
else
{
if((ll_w>70)&&(ll_w<=90))
{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x30; }
else
{
if((ll_w>90)&&(ll_w<=110))
{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x00; }
else
{
if((ll_w>=50)&&(ll_w<=70))
{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x7a; }
}
}
}
}
}
}
else if ((tb_ok)&&((ll_w>=10)&&(ll_w<=14))) // 已经接收到同步码 且下一个电平周期的低电平时长满足H:0.4ms L:1.2ms 判0
{
ma_x++; //取编码的数量 达到24表示接收到一个完整的码
if(ma_x>23)
{
if(!rf_ok1)//第一次接收到
{
mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的码放入解码寄存器 (第一次解码的寄存器)
rf_ok1=1; // 可以解码
tb_ok=0;
bt_auto=0;
s=1500;
}
else //第二次接收到
{
mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将接收到的码放入解码寄存器 (第二次解码的寄存器)
rf_ok2=1; //可以解码
tb_ok=0;
bt_auto=0;
}
}
}
else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=8))) // 已经接收到同步码 且下一个电平周期的低电平时长满足H:1.2ms L:0.4ms 判1
{ switch (ma_x) //判1 所以按位或等于取1
{
case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第一位
case 1 : { bma1=bma1 | 0x40; break; }
case 2 : { bma1=bma1 | 0x20; break; }
case 3 : { bma1=bma1 | 0x10; break; }
case 4 : { bma1=bma1 | 0x08; break; }
case 5 : { bma1=bma1 | 0x04; break; }
case 6 : { bma1=bma1 | 0x02; break; }
case 7 : { bma1=bma1 | 0x01; break; }
case 8 : { bma2=bma2 | 0x80; break; }
case 9 : { bma2=bma2 | 0x40; break; }
case 10: { bma2=bma2 | 0x20; break; }
case 11: { bma2=bma2 | 0x10; break; }
89C522RC的芯片
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RF = P0^5; //信号输入
sbit LED = P2^0; // P3^4;
sbit D0 = P2^1; //用于后面按位取键值 3^6;
sbit D1 = P2^2; // 3^7;
sbit D2 = P2^3; //P4^1;
sbit D3 = P2^4; // P4^2;
sbit VT = P3^5; //解码成功
bit decode_ok; //解码成功标志
uchar hh_w,ll_w; //高低电平宽度
uchar ma_x; //接收到第几位编码
uchar bma1,bma2,bma3,bma4; //四个字节存放编码 第一次的
uchar idata mmb1,mmb2,mmb3,mmb4; // 存放编码 第二次 当两次一样才算一次有效按键
bit rf_ok1,rf_ok2; //临时成功接收标志 分别第一次和第二次
bit rf_ok; //接收成功 可以解码
bit old_rc5; //接收到24为码可以开始解码
bit tb_ok; //同步码接收成功标志
uchar mma1,mma2,mma3,mma4; //四个字节用来存放编码
uchar temp_h;temp_l;
bit bt_auto; //自动设置遥控接收波特率标志 根据码不同的长度做不同的波特率
uint s,s1;//用于系统延迟 分别为留时间做第二次解码 和 留时间实现功能 目的保证系统稳定性
void timeint() interrupt 1 //定时器中断
{
// D0=0X80;
// TL0=0xb5;
// TH0=0xfb;
if(!bt_auto) //
{
TL0=0x70; // 90
TH0=0xfB; //fc 定时器100us
}
else
{
TL0=temp_l; //
TH0=temp_h;
}
TF0=0; //
if (!RF)
{ ll_w++;old_rc5=0; } //接收到低电平
else // 接收到高电平
{ //D0=1;
hh_w++;
if (!old_rc5) // 检测到从低到高的跳变 表示接收到一个完整的(高-低)电平周期
{
if (((hh_w>=2)&&(hh_w<=8))&&((ll_w>=50)&&(ll_w<=190))) // 满足同步码时长 H:0.4ms L:12ms
{ //D0=1;
if((ll_w>=110)&&(ll_w<=140)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=0;} //根据更精确的时长确定波特率和后面的定时器长度 保证精确
else
{
if((ll_w>140)&&(ll_w<=160))
{ ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0x6b; }
else
{
if((ll_w>160)&&(ll_w<=190))
{ ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfd;temp_l=0xdc; }
else
{
if((ll_w>70)&&(ll_w<=90))
{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x30; }
else
{
if((ll_w>90)&&(ll_w<=110))
{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x00; }
else
{
if((ll_w>=50)&&(ll_w<=70))
{ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x7a; }
}
}
}
}
}
}
else if ((tb_ok)&&((ll_w>=10)&&(ll_w<=14))) // 已经接收到同步码 且下一个电平周期的低电平时长满足H:0.4ms L:1.2ms 判0
{
ma_x++; //取编码的数量 达到24表示接收到一个完整的码
if(ma_x>23)
{
if(!rf_ok1)//第一次接收到
{
mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的码放入解码寄存器 (第一次解码的寄存器)
rf_ok1=1; // 可以解码
tb_ok=0;
bt_auto=0;
s=1500;
}
else //第二次接收到
{
mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将接收到的码放入解码寄存器 (第二次解码的寄存器)
rf_ok2=1; //可以解码
tb_ok=0;
bt_auto=0;
}
}
}
else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=8))) // 已经接收到同步码 且下一个电平周期的低电平时长满足H:1.2ms L:0.4ms 判1
{ switch (ma_x) //判1 所以按位或等于取1
{
case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第一位
case 1 : { bma1=bma1 | 0x40; break; }
case 2 : { bma1=bma1 | 0x20; break; }
case 3 : { bma1=bma1 | 0x10; break; }
case 4 : { bma1=bma1 | 0x08; break; }
case 5 : { bma1=bma1 | 0x04; break; }
case 6 : { bma1=bma1 | 0x02; break; }
case 7 : { bma1=bma1 | 0x01; break; }
case 8 : { bma2=bma2 | 0x80; break; }
case 9 : { bma2=bma2 | 0x40; break; }
case 10: { bma2=bma2 | 0x20; break; }
case 11: { bma2=bma2 | 0x10; break; }
免责声明:
本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;
上一篇: STC89和STC15W 指令时钟问题
下一篇: Stc15W可以使用12时钟模式吗?