找回密码
 立即注册
×

00:00:00

您有一张0.1元限时体验卡,马上领取获得VIP尊享特权。

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

免责声明:

本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-8 10:44 , Processed in 0.077404 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部