国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: 51單片機解碼433M/315M搖控器程序代碼 [打印本頁]

作者: eng    時間: 2021-6-13 00:15
標題: 51單片機解碼433M/315M搖控器程序代碼
最近需要使用的一個16按鍵433M搖控器方案,一時沒有找到好的程序參考,于是自已設(shè)計了一個程序使用,效果很好。設(shè)計思想,首先通過示波器抓出接收板數(shù)據(jù)波形,分析波形特征。一般都是首先同步信號出現(xiàn),約10MS左右低電平,之后跟著出現(xiàn)數(shù)據(jù)信號,一般來講是地址+數(shù)據(jù),其實我們不用管,只要程序能分析出同步信號之間的數(shù)據(jù)就行。數(shù)據(jù)0=0.4ms高電平+1.2ms低電平的組合,數(shù)據(jù)1=1.2ms高電平+0.4ms低電平的組合,數(shù)據(jù)25位。我們定義一個32位的變量,將數(shù)據(jù)一位一位的移進變量中,最后得出變量值,于是解碼成功。連續(xù)解碼出5組數(shù)據(jù)進行對比,如其中有2組以上的碼相同,則認為相同的數(shù)據(jù)解碼正確。解程序使用0.1mS定時器中斷,用來檢測數(shù)據(jù)電平。詳見程序:
  1. bit F_TongBu_Flag=0;  //低電平同步頭標志
  2. u8 Da_cont_HV=0;    //高電平計數(shù)
  3. u8 Da_cont_LV=0;    //低電平計數(shù)
  4. u8 MoveBit=0;              //移位
  5. bit starLVFlag=0; //高電平開始后才能使用的低電平檢測標志
  6. u32 xdata DataBuf[5]={0};   //臨時保存25位數(shù)據(jù)區(qū)
  7. u32 xdata T433M_data=0x00000000;
  8. u32 xdata T433M_Tem=0;

  9. void Init433M();  //初始化433M接收設(shè)置數(shù)據(jù)

  10. void Timer0Init(void)                //100微秒@24.000MHz
  11. {
  12.         AUXR |= 0x80;                //定時器時鐘1T模式
  13.         TMOD &= 0xF0;                //設(shè)置定時器模式
  14.         TL0 = 0xA0;                //設(shè)置定時初值
  15.         TH0 = 0xF6;                //設(shè)置定時初值
  16.         TF0 = 0;                //清除TF0標志
  17.         TR0 = 1;                //定時器0開始計時
  18.         ET0=1;                             //打開中斷
  19.         IP|=0X02; IPH|=0X02;  //最高優(yōu)先級
  20. }



  21. void TM0_Isr() interrupt 1        //定時器0中斷函數(shù)0.1mS
  22. {
  23.         if(!T_433M&&!F_TongBu_Flag)      //  數(shù)據(jù)腳低電平&&未檢測到同步
  24.         {
  25.                 Da_cont_LV++; //開始計數(shù),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接收設(shè)置數(shù)據(jù)                    
  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++;         //高電平計數(shù)
  43.                                         if(Da_cont_HV>=250)  //電平計數(shù)異常,一般不會有這種情況
  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;         //判斷完后高電平計數(shù)復位
  81.                                         }
  82.                                 }
  83.                         }
  84. }
  85.         

  86. /*100US中斷,測量同步低電平連續(xù)約12mS,0數(shù)據(jù)為H:0.44ms+L:1.32ms,1數(shù)據(jù)為H:1.32ms+L:0.44mm,一串25位。
  87. 解碼編程:首先檢測同步頭,>連續(xù)200次低電平,同步頭出現(xiàn),進入第一個高電平時間檢測,若高電平檢測次數(shù)
  88. 大于6,小于9,為0數(shù)據(jù),若大于20小于26,為高。繼續(xù)檢測下一個高電平,如連續(xù)30個低電平,結(jié)束檢測,重新檢測同步頭
  89. 在500MS內(nèi),進行一次數(shù)據(jù)比對,當有兩組數(shù)據(jù)為相同時,可得出這個數(shù)據(jù)為一組正確的數(shù)據(jù)。
  90. */

  91. void Init433M()  //初始化433M接收設(shè)置數(shù)據(jù)
  92. {
  93.                 MoveBit=30;          //移位設(shè)置
  94.                 T433M_data=0x00000000; //數(shù)據(jù)復位
  95.                 T433M_Tem=0;
  96.           Da_cont_HV=0;
  97.           Da_cont_LV=0;
  98.           starLVFlag=0;
  99.           //高電平開始后才能使用的低電平檢測標志
  100. }
復制代碼







歡迎光臨 ELEOK (http://www.afoofa.cn/) Powered by Discuz! X5.0