jack86 发表于 2024-3-25 19:13:10

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);
}


梁工 发表于 2024-3-25 21:28:17

单单发个程序是看不懂的,完全不知道你的编码,是没人可以猜测的。
发下你的编码波形吧。
315M、433M这种收发模块,做好使用朝外差的(带晶振,便宜、可靠、省电),
编码最好使用曼彻斯特编码(归0码,最合适无线电收发)。

小坤 发表于 2024-3-30 08:40:13

梁工 发表于 2024-3-25 21:28
单单发个程序是看不懂的,完全不知道你的编码,是没人可以猜测的。发下你的编码波形吧。
315M、433M这种收 ...

之前写过一个,我回家找找看能不能找到,找到我再上传给你

小坤 发表于 2024-3-30 08:40:58

之前写过一个,我回家找找看能不能找到,找到我再上传给你

小坤 发表于 2024-3-30 08:45:58

本帖最后由 国学芯用 于 2024-3-30 08:59 编辑

找到了改下头文件

梁工 发表于 2024-3-30 10:53:32

小坤 发表于 2024-3-30 08:45
找到了改下头文件
我要的是你现在的编码波形,才能知道解码方式,不是要你以前的某个程序。
这种简单编码类似红外遥控的处理方式即可。

小坤 发表于 2024-3-30 20:53:31

小坤 发表于 2024-3-30 08:45
找到了改下头文件

编码芯片EV1527

梁工 发表于 2024-3-30 22:47:21

小坤 发表于 2024-3-30 20:53
编码芯片EV1527

EV1527这种简单不归0编码,收发都很容易实现。下面是接收:
上升沿捕获低电平时间,下降沿捕获高电平时间,也可以用定时器中断采样计数方式。
H4+L128:同步头。
H4+L12:数据0
H12+L4:数据1

简单处理即可,比曼彻斯特编码简单得多,但效果没有曼彻斯特编码好。

小坤 发表于 2024-3-31 15:29:41

梁工 发表于 2024-3-30 22:47
EV1527这种简单不归0编码,收发都很容易实现。下面是接收:
上升沿捕获低电平时间,下降沿捕获高电平时间 ...

现在这种简单的4键 315MHZ/433MHZ 基本采用EV1527发送,然后接收使用个单片机解码

梁工 发表于 2024-3-31 16:21:51

小坤 发表于 2024-3-31 15:29
现在这种简单的4键 315MHZ/433MHZ 基本采用EV1527发送,然后接收使用个单片机解码 ...

可以使用8脚的MCU,STC8G1K08-SOP8,一个IO输入信号,一个IO接解码指示灯,4个IO输出,刚好够。
页: [1] 2
查看完整版本: 433M无线解码程序