433M无线解码程序
各位大神,我有找了一个433M无线解码程序,解码不成功,都无法执行到取码,求赐教。!!!89C522RC的芯片
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned 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; //解码成功
bitdecode_ok; //解码成功标志
ucharhh_w,ll_w; //高低电平宽度
ucharma_x; //接收到第几位编码
ucharbma1,bma2,bma3,bma4; //四个字节存放编码 第一次的
uchar idata mmb1,mmb2,mmb3,mmb4; // 存放编码第二次当两次一样才算一次有效按键
bit rf_ok1,rf_ok2; //临时成功接收标志分别第一次和第二次
bit rf_ok; //接收成功 可以解码
bit old_rc5; //接收到24为码可以开始解码
bit tb_ok; //同步码接收成功标志
ucharmma1,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; }
case 12: { bma2=bma2 | 0x08; break; }
case 13: { bma2=bma2 | 0x04; break; }
case 14: { bma2=bma2 | 0x02; break; }
case 15: { bma2=bma2 | 0x01; break; }
case 16: { bma3=bma3 | 0x80; break; }
case 17: { bma3=bma3 | 0x40; break; }
case 18: { bma3=bma3 | 0x20; break; }
case 19: { bma3=bma3 | 0x10; break; }
case 20: { bma4=bma4 | 0x80; break; }//°′?ü×′ì?μú1??
case 21: { bma4=bma4 | 0x40; break; }
case 22: { bma4=bma4 | 0x20; break; }
case 23: { bma4=bma4 | 0x10;
if(!rf_ok1)
{ mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到寄存器中前面是最后一个键值为0这里是最后一个键值为1 (为1的第一次用于解码的寄存器)
rf_ok1=1; // 可以解码
tb_ok=0;
bt_auto=0;
s=1500;
break;
}
else
{
mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将接收到的编码复制到寄存器中前面是最后一个键值为0这里是最后一个键值为1 (为1的第二次用于解码的寄存器)
rf_ok2=1; // 可以解码
tb_ok=0;
bt_auto=0;
break;
}
}
}
ma_x++;
}
else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; bma4=0;hh_w=1;ll_w=0;} //没有接收到同步码
ll_w=0;hh_w=1;
}
old_rc5=1; // 记录本次电平
}
if(rf_ok1) //成功接收两次编码有效
{
s--;
if(!s) rf_ok1=0;
if(rf_ok2)
{
if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3)&&(mma4==mmb4))//两次编码相等为有效
{
rf_ok=1; //解码有效 接收成功的标志
rf_ok1=0;
rf_ok2=0;
}
else
{
rf_ok=0;
rf_ok1=0;
rf_ok2=0;
}
}
}
if((rf_ok)) //解码有效接收成功
{
EA=0;
rf_ok=0;
// D3=mma4 & 0x80; //取出键码
// D2=mma4 & 0x40;
// D1=mma4 & 0x20;
// D0=mma4 & 0x10;
//// D4=mma4 & 0xC0;
D0=1;
decode_ok=1;
VT=0;
s1=1500;
EA=1;
}
if(decode_ok) //接收成功标志
{
s1--;
if(!s1)
{
VT=1;//接收成功亮灯
decode_ok=0;//接收成功标志位置零 用于下一次
}
}
}
void system_start() //系统初始化
{
// AUXR=0xb5;
// P0M0=0x01;
// P0M1=0x20;
// P3M0=0xC0;
// P3M1=0x00;
// P4M0=0x06;
// P4M1=0x00;
P0=0xfe;
// P3=0x3f; //将LED灯拉低电平 判高电平亮
// P4=0xf9;
TMOD = 0x11; //T1/T0改为定时器方式1
TL0=0xb5;
TH0=0xfb;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
system_start();
D0=0;
while(1);
}
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned 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; //解码成功
bitdecode_ok; //解码成功标志
ucharhh_w,ll_w; //高低电平宽度
ucharma_x; //接收到第几位编码
ucharbma1,bma2,bma3,bma4; //四个字节存放编码 第一次的
uchar idata mmb1,mmb2,mmb3,mmb4; // 存放编码第二次当两次一样才算一次有效按键
bit rf_ok1,rf_ok2; //临时成功接收标志分别第一次和第二次
bit rf_ok; //接收成功 可以解码
bit old_rc5; //接收到24为码可以开始解码
bit tb_ok; //同步码接收成功标志
ucharmma1,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; }
case 12: { bma2=bma2 | 0x08; break; }
case 13: { bma2=bma2 | 0x04; break; }
case 14: { bma2=bma2 | 0x02; break; }
case 15: { bma2=bma2 | 0x01; break; }
case 16: { bma3=bma3 | 0x80; break; }
case 17: { bma3=bma3 | 0x40; break; }
case 18: { bma3=bma3 | 0x20; break; }
case 19: { bma3=bma3 | 0x10; break; }
case 20: { bma4=bma4 | 0x80; break; }//°′?ü×′ì?μú1??
case 21: { bma4=bma4 | 0x40; break; }
case 22: { bma4=bma4 | 0x20; break; }
case 23: { bma4=bma4 | 0x10;
if(!rf_ok1)
{ mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到寄存器中前面是最后一个键值为0这里是最后一个键值为1 (为1的第一次用于解码的寄存器)
rf_ok1=1; // 可以解码
tb_ok=0;
bt_auto=0;
s=1500;
break;
}
else
{
mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将接收到的编码复制到寄存器中前面是最后一个键值为0这里是最后一个键值为1 (为1的第二次用于解码的寄存器)
rf_ok2=1; // 可以解码
tb_ok=0;
bt_auto=0;
break;
}
}
}
ma_x++;
}
else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; bma4=0;hh_w=1;ll_w=0;} //没有接收到同步码
ll_w=0;hh_w=1;
}
old_rc5=1; // 记录本次电平
}
if(rf_ok1) //成功接收两次编码有效
{
s--;
if(!s) rf_ok1=0;
if(rf_ok2)
{
if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3)&&(mma4==mmb4))//两次编码相等为有效
{
rf_ok=1; //解码有效 接收成功的标志
rf_ok1=0;
rf_ok2=0;
}
else
{
rf_ok=0;
rf_ok1=0;
rf_ok2=0;
}
}
}
if((rf_ok)) //解码有效接收成功
{
EA=0;
rf_ok=0;
// D3=mma4 & 0x80; //取出键码
// D2=mma4 & 0x40;
// D1=mma4 & 0x20;
// D0=mma4 & 0x10;
//// D4=mma4 & 0xC0;
D0=1;
decode_ok=1;
VT=0;
s1=1500;
EA=1;
}
if(decode_ok) //接收成功标志
{
s1--;
if(!s1)
{
VT=1;//接收成功亮灯
decode_ok=0;//接收成功标志位置零 用于下一次
}
}
}
void system_start() //系统初始化
{
// AUXR=0xb5;
// P0M0=0x01;
// P0M1=0x20;
// P3M0=0xC0;
// P3M1=0x00;
// P4M0=0x06;
// P4M1=0x00;
P0=0xfe;
// P3=0x3f; //将LED灯拉低电平 判高电平亮
// P4=0xf9;
TMOD = 0x11; //T1/T0改为定时器方式1
TL0=0xb5;
TH0=0xfb;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
system_start();
D0=0;
while(1);
}
单单发个程序是看不懂的,完全不知道你的编码,是没人可以猜测的。
发下你的编码波形吧。
315M、433M这种收发模块,做好使用朝外差的(带晶振,便宜、可靠、省电),
编码最好使用曼彻斯特编码(归0码,最合适无线电收发)。
梁工 发表于 2024-3-25 21:28
单单发个程序是看不懂的,完全不知道你的编码,是没人可以猜测的。发下你的编码波形吧。
315M、433M这种收 ...
之前写过一个,我回家找找看能不能找到,找到我再上传给你 之前写过一个,我回家找找看能不能找到,找到我再上传给你 本帖最后由 国学芯用 于 2024-3-30 08:59 编辑
找到了改下头文件 小坤 发表于 2024-3-30 08:45
找到了改下头文件
我要的是你现在的编码波形,才能知道解码方式,不是要你以前的某个程序。
这种简单编码类似红外遥控的处理方式即可。
小坤 发表于 2024-3-30 08:45
找到了改下头文件
编码芯片EV1527 小坤 发表于 2024-3-30 20:53
编码芯片EV1527
EV1527这种简单不归0编码,收发都很容易实现。下面是接收:
上升沿捕获低电平时间,下降沿捕获高电平时间,也可以用定时器中断采样计数方式。
H4+L128:同步头。
H4+L12:数据0
H12+L4:数据1
简单处理即可,比曼彻斯特编码简单得多,但效果没有曼彻斯特编码好。
梁工 发表于 2024-3-30 22:47
EV1527这种简单不归0编码,收发都很容易实现。下面是接收:
上升沿捕获低电平时间,下降沿捕获高电平时间 ...
现在这种简单的4键 315MHZ/433MHZ 基本采用EV1527发送,然后接收使用个单片机解码 小坤 发表于 2024-3-31 15:29
现在这种简单的4键 315MHZ/433MHZ 基本采用EV1527发送,然后接收使用个单片机解码 ...
可以使用8脚的MCU,STC8G1K08-SOP8,一个IO输入信号,一个IO接解码指示灯,4个IO输出,刚好够。
页:
[1]
2