51单片机解码433M/315M摇控器程序代码

[复制链接]
查看10 | 回复0 | 2021-6-13 00:15:44 | 显示全部楼层 |阅读模式
最近需要使用的一个16按键433M摇控器方案,一时没有找到好的程序参考,于是自已设计了一个程序使用,效果很好。设计思想,首先通过示波器抓出接收板数据波形,分析波形特征。一般都是首先同步信号出现,约10MS左右低电平,之后跟着出现数据信号,一般来讲是地址+数据,其实我们不用管,只要程序能分析出同步信号之间的数据就行。数据0=0.4ms高电平+1.2ms低电平的组合,数据1=1.2ms高电平+0.4ms低电平的组合,数据25位。我们定义一个32位的变量,将数据一位一位的移进变量中,最后得出变量值,于是解码成功。连续解码出5组数据进行对比,如其中有2组以上的码相同,则认为相同的数据解码正确。解程序使用0.1mS定时器中断,用来检测数据电平。详见程序:
  1. bit F_TongBu_Flag=0;  //低电平同步头标志
  2. u8 Da_cont_HV=0;    //高电平计数
  3. u8 Da_cont_LV=0;    //低电平计数
  4. u8 MoveBit=0;              //移位
  5. bit starLVFlag=0; //高电平开始后才能使用的低电平检测标志
  6. u32 xdata DataBuf[5]={0};   //临时保存25位数据区
  7. u32 xdata T433M_data=0x00000000;
  8. u32 xdata T433M_Tem=0;

  9. void Init433M();  //初始化433M接收设置数据

  10. void Timer0Init(void)                //100微秒@24.000MHz
  11. {
  12.         AUXR |= 0x80;                //定时器时钟1T模式
  13.         TMOD &= 0xF0;                //设置定时器模式
  14.         TL0 = 0xA0;                //设置定时初值
  15.         TH0 = 0xF6;                //设置定时初值
  16.         TF0 = 0;                //清除TF0标志
  17.         TR0 = 1;                //定时器0开始计时
  18.         ET0=1;                             //打开中断
  19.         IP|=0X02; IPH|=0X02;  //最高优先级
  20. }



  21. void TM0_Isr() interrupt 1        //定时器0中断函数0.1mS
  22. {
  23.         if(!T_433M&&!F_TongBu_Flag)      //  数据脚低电平&&未检测到同步
  24.         {
  25.                 Da_cont_LV++; //开始计数,0.1ms累加
  26.                 if(Da_cont_LV>80) //大于8ms
  27.                 {
  28.                         F_TongBu_Flag=1;  //周步标志有效
  29.                 //        printf("0X%lX.\r\n",T433M_data);
  30.                         Init433M();  //初始化433M接收设置数据                    
  31.                 }
  32.         }
  33.         else
  34.         {
  35.                 Da_cont_LV=0;
  36.         }

  37.                 if(F_TongBu_Flag)  //同步标志有效且高电平
  38.                         {
  39.                                 if(T_433M)   //同步标志有效且高电平
  40.                                 {
  41.                                         starLVFlag=1;   //高电平开始后才能使用的低电平检测标志
  42.                                         Da_cont_HV++;         //高电平计数
  43.                                         if(Da_cont_HV>=250)  //电平计数异常,一般不会有这种情况
  44.                                         {
  45.                                                 F_TongBu_Flag=0; Da_cont_HV=0; Da_cont_LV=0;  return; //返回
  46.                                         }
  47.                                 }
  48.                                 else
  49.                                 {
  50.                                         if(starLVFlag)  //当高电平过后的低电平时,开始判断高电平的宽度
  51.                                         {
  52.                                                 starLVFlag=0;  
  53.                                                 if(Da_cont_HV>2&&Da_cont_HV<8) //如果高电平大于0.2小于0.6ms,
  54.                                                 {                                
  55.                                                        T433M_Tem=0;
  56.                                                         T433M_data|=T433M_Tem<<MoveBit;
  57.                                                         if(MoveBit>0)
  58.                                                                 { MoveBit--;}
  59.                                                         else
  60.                                                         {F_TongBu_Flag=0;}
  61.                                                                
  62.                                                 }
  63.                                                 else
  64.                                                 {
  65.                                                         if(Da_cont_HV>8&&Da_cont_HV<18)
  66.                                                         {
  67.                                                                 T433M_Tem=1;                                                               
  68.                                                                 T433M_data|=T433M_Tem<<MoveBit;
  69.                                                                 if(MoveBit>0)
  70.                                                                  { MoveBit--;}
  71.                                                          else
  72.                                                                 { F_TongBu_Flag=0;}
  73.                                                         }
  74.                                                         else
  75.                                                         {
  76.                                                              F_TongBu_Flag=0;Da_cont_LV=0;  //周步标志有效
  77.                                                         }
  78.                                                 }
  79.                                                 
  80.                                                 Da_cont_HV=0;         //判断完后高电平计数复位
  81.                                         }
  82.                                 }
  83.                         }
  84. }
  85.         

  86. /*100US中断,测量同步低电平连续约12mS,0数据为H:0.44ms+L:1.32ms,1数据为H:1.32ms+L:0.44mm,一串25位。
  87. 解码编程:首先检测同步头,>连续200次低电平,同步头出现,进入第一个高电平时间检测,若高电平检测次数
  88. 大于6,小于9,为0数据,若大于20小于26,为高。继续检测下一个高电平,如连续30个低电平,结束检测,重新检测同步头
  89. 在500MS内,进行一次数据比对,当有两组数据为相同时,可得出这个数据为一组正确的数据。
  90. */

  91. void Init433M()  //初始化433M接收设置数据
  92. {
  93.                 MoveBit=30;          //移位设置
  94.                 T433M_data=0x00000000; //数据复位
  95.                 T433M_Tem=0;
  96.           Da_cont_HV=0;
  97.           Da_cont_LV=0;
  98.           starLVFlag=0;
  99.           //高电平开始后才能使用的低电平检测标志
  100. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则