久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1548|回復: 1
打印 上一主題 下一主題
收起左側

315/433M無線模塊解碼程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:1012383 發表于 2024-7-30 08:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
現在這種接收模塊一般用PRO480R/SYN480R,外圍再加一些簡單的典型電路,性價比高,1塊多就可以買到,可實現燈光、門禁、汽車、安防監控系統和智能家居產品的無線遙控功能。

2、315/433無線模塊解碼

       上圖是接收模塊接收到的發送模塊按鍵一次發來的信息波形,可以分為5個階段來分析,分別是:1、開始無接收信號,輸出的是雜波;2、引導碼;3、鍵碼;4、相同連續的引導碼和鍵碼,如果長按發送會一直輸出這樣的波形;5、松開發送鍵,接收輸出一個比較明顯的結束碼;

      接收模塊在無信號狀態下接收引腳是不斷輸出雜波,在接到信號時,才會輸出信息碼,所以寫程序的難點在解碼。

      網上找不到比較好的方案,這里是有類似的討論:"最精間的PT2262解碼程序與大家共享"

      像在程序中延時解碼的方式,如果其他程序需要快速的循環執行的話,會有影響,再有就是移植性不高。

      我們可以設定一個較快的定時中斷(下面設定24us),然后在中調用接收解碼函數,每次中斷只判斷相應的標志,不會造成中斷執行時間過長的問題。

      比如其中一對收發模塊,同步碼為10ms低電平,之后是25位數據,只取24位3個字節,"1"是1.1ms高+0.2ms低, "0"是0.45高+0.9低,所以可以只通過高電平判斷,下面是具體的程序,需要注意的是各回調函數中不能執行太久,最好是設置標志就好了:



  1. /******************H頭文件*********************************/



  2. #ifndef RF433MDecode_H_



  3. #define RF433MDecode_H_



  4. /***************************************************/



  5. //Define I/O Register



  6. #define PORT_RF_REC     pa



  7. #define P_RF_REC         pa.7



  8. #define PC_RF_REC         pac.7



  9. #define PPH_RF_REC     paph.7







  10. //**************************************************//



  11. //Define Constant



  12. //在24us定時中斷中調用433M接收解碼函數







  13. //同步碼,10ms低電平



  14. #define C_RF_START_L_MAX        500        //12MS //10MS--10000/24=416



  15. #define C_RF_START_L_MIN     250        //6MS







  16. //之后是25位數據,只取24位3個字節



  17. #define C_RF_REC_BIT_LEN    24   



  18. //"1"是1.1ms高+0.2ms低, "0"是0.45高+0.9低



  19. //所以可以只通過高電平判斷



  20. #define C_RF_DATA1_MAX        54        //1.3ms



  21. #define C_RF_DATA1_MIN        37        //0.9ms



  22. #define C_RF_DATA0_MAX        25        //0.6ms



  23. #define C_RF_DATA0_MIN        13        //0.3ms







  24. //結束碼,短按:130ms低電平,長按:500ms,這里取大于70ms



  25. //#define C_RF_END_L_MAX        500        //140MS



  26. #define C_RF_END_L_MIN     2916        //70MS











  27. #define C_RF_DATA_CLENT_1     0xAD        //客戶碼1



  28. #define C_RF_DATA_CLENT_2     0x2F        //客戶碼2



  29. #define C_RF_DATA_1_KEY          0x01        //A鍵值



  30. #define C_RF_DATA_2_KEY     0x02        //B鍵值



  31. #define C_RF_DATA_3_KEY     0x04        //C鍵值



  32. #define C_RF_DATA_4_KEY     0x08        //D鍵值







  33. #define C_DELAY_KEY_PRESS_SHORT        500        //1000*1MS



  34. #define C_DELAY_KEY_PRESS_LONG        2000    //3000*1MS



  35. /****************************************************/



  36. // Define General Register







  37. //**************************************************



  38. //Define FUNCTION



  39. void RF433M_Init(void);



  40. void RF433M_RecevieDecode(void);







  41. #endif



  42. /******************C文件*********************************/



  43. //***************************************************



  44. //CUSTOMER:



  45. //OBJECT:433M解碼程序



  46. //AUTHOR:TJY



  47. //DESCRIPTION:



  48. //        在24us定時中斷中調用433M接收解碼函數



  49. /*************************************************************************

  50. /*************************************************************************/



  51. #include    "extern.h"



  52. #include    "Rf433MDecode.h"







  53. byte    gb_RfRxStep;                //IR接收步驟



  54. word    gw_RfRxCnt;                //接收計數器







  55. eword    gew_RfRxData;            //接收數據暫存,//同步碼之后是25位數據,只取24位3個字節



  56. byte    gb_RfRxData1;                //接收數據--//客戶代碼1



  57. byte    gb_RfRxData2;                //客戶代碼2



  58. byte    gb_RfRxData3;                //數據碼











  59. byte    gb_RfRxLevel;



  60. byte    gb_RfRxBitCnt;                //接收數據位



  61. bit     gbit_RfRecOkFlag;            //收到完整的24位數據置1,相當于g_bitKeyDownFlag



  62. bit     gbit_RfRecEndCodeFlag;        //收到結束碼



  63. byte g_bTimerCount



  64. word    gw_RfRxKeeppingMsCnt;        //接收第一個數據后開始的計數器



  65. word    gw_RfRxKeeppingIntervalCount;







  66. bit        gbit_ResetFlag;



  67. /***************************************************

  68. 接收初始化函數

  69. ***************************************************/



  70. void RF433M_Init(void)



  71. {



  72.     $ P_RF_REC     High;



  73.     $ P_RF_REC     In, NoPull;        //設置為輸入模式







  74.     gb_RfRxStep = 0;



  75.     gbit_RfRecOkFlag = 0;



  76.     gbit_RfRecEndCodeFlag = 0;



  77. bTimerCount = 0;



  78. }   







  79. /***************************************************

  80. 第一次收到完整的24位數據的回調函數



  81. 相當于按鍵按下調用函數 -- OnkeyDown()

  82. 只在開始的時候進一次

  83. ***************************************************/



  84. void RF433M_OnRecevieFirstData(void)



  85. {



  86.     gw_RfRxKeeppingMsCnt = 0;



  87. }







  88. /***************************************************

  89. 收到完整的24位數據后的回調函數



  90. 相當于按鍵按下調用函數 -- OnkeyPressing()

  91. 在按下期間,會不斷進入

  92. ***************************************************/



  93. void RF433M_OnRecevieData(void)



  94. {



  95.     if(gw_RfRxKeeppingMsCnt >= C_DELAY_KEY_PRESS_LONG)



  96.     {



  97.         //長按



  98.         if(gb_RfRxData3 == C_RF_DATA_1_KEY)



  99.         {



  100.                     



  101.         }



  102.     }



  103. }







  104. /***************************************************

  105. 收到24位數據后,再接收到結束碼的回調函數



  106. 相當于按鍵按下松開時調用函數 -- OnkeyUp()

  107. ***************************************************/



  108. void RF433M_OnRecevieEndCode(void)



  109. {







  110.     if( gw_RfRxKeeppingMsCnt <= C_DELAY_KEY_PRESS_SHORT)



  111.     {



  112.         //短按



  113.         switch(gb_RfRxData3)



  114.         {



  115.             case C_RF_DATA_1_KEY:



  116.             {



  117.                 break;



  118.             }



  119.             case C_RF_DATA_2_KEY:



  120.             {



  121.                 break;



  122.             }



  123.             case C_RF_DATA_3_KEY:



  124.             {   



  125.                 break;



  126.             }



  127.             case C_RF_DATA_4_KEY:



  128.             {



  129.                 break;



  130.             }



  131.         }



  132.     }







  133. }







  134. /***************************************************

  135. 433接收解碼函數



  136. 在24us定時中斷中調用433M接收解碼函數

  137. 同步碼,10ms低電平

  138. 之后是25位數據,只取24位3個字節

  139. "1"是1.1ms高+0.2ms低, "0"是0.45高+0.9低

  140. 所以可以只通過高電平判斷

  141. ***************************************************/



  142. void RF433M_RecevieDecode(void)



  143. {



  144. g_bTimerCount++;



  145.     if(g_bTimerCount == 42) //1ms=42*24us



  146.     {



  147.         g_bTimerCount = 0;



  148.         gw_RfRxKeeppingMsCnt++;



  149.     }







  150.     switch(gb_RfRxStep)



  151.     {



  152.         case    0:



  153.             if(!P_RF_REC)



  154.             {



  155.                 //1-1.開始檢測引導碼10ms低電平或結束碼100ms低電平



  156.                 gw_RfRxCnt = 0;



  157.                 gb_RfRxStep = 1;



  158.             }   



  159.             break;







  160.         case    1:



  161.             if(!P_RF_REC)



  162.             {



  163.                 //1-2.引導碼10ms或結束碼100ms低電平計時



  164.                 gw_RfRxCnt++;



  165.             }



  166.             else



  167.             {   



  168.                 //1-3.判斷引導碼9ms低電平或結束碼100ms低電平



  169.                 if(gw_RfRxCnt > C_RF_END_L_MIN && gbit_RfRecOkFlag)



  170.                 {



  171.                     //結束碼



  172.                     gbit_RfRecOkFlag = 0;



  173.                     //相當于按鍵按下松開時調用函數 -- OnkeyUp()



  174.                     RF433M_OnRecevieEndCode();



  175.                     return ;



  176.                 }



  177.                 else if((gw_RfRxCnt > C_RF_START_L_MAX) || (gw_RfRxCnt < C_RF_START_L_MIN))



  178.                 {



  179.                     goto F_RfRxError;            



  180.                 }







  181.                 //引導碼            



  182.                 //gbit_RfRecOkFlag = 0;







  183.                 //2-1.開始接收數據,檢測引導碼4.5ms高電平   



  184.                 gb_RfRxLevel = PORT_RF_REC & _field(P_RF_REC);



  185.                 gw_RfRxCnt = 0;



  186.                 gb_RfRxBitCnt = 0;



  187.                 gb_RfRxStep = 2;



  188.                 //gew_RfRxData = 0;



  189.         



  190.             }



  191.             break;







  192.         case    2://check level change



  193.             a = PORT_RF_REC & _field(P_RF_REC);



  194.             if(a == gb_RfRxLevel)



  195.             {



  196.                 //電平保持不變



  197.                 gw_RfRxCnt++;



  198.             }



  199.             else



  200.             {    //level change,check current level



  201.                 gb_RfRxLevel = a;



  202.                 if(!P_RF_REC)



  203.                 {   



  204.                     //數據0、1是通過高電平時間判斷,所以電平跳變為低的時候,



  205.                     //也就獲取到高電平的時間了,



  206.                     //就可以判斷有效數據0,1



  207.                     



  208.                     gew_RfRxData = gew_RfRxData << 1;



  209.                     //slc    gew_RfRxData $ 2;







  210.                     //"1"是1.1ms高+0.2ms低, "0"是0.45高+0.9低



  211.                     //所以可以只通過高電平判斷,當然用低電平判斷也一樣類似



  212.                     if((gw_RfRxCnt < C_RF_DATA1_MAX) && (gw_RfRxCnt > C_RF_DATA1_MIN))



  213.                     {//data 1



  214.                         set1 gew_RfRxData.0;



  215.                         goto F_RfRxCheckBit;



  216.                     }   



  217.                     else if((gw_RfRxCnt < C_RF_DATA0_MAX) && (gw_RfRxCnt > C_RF_DATA0_MIN))



  218.                     {//data 0



  219.                         set0 gew_RfRxData.0;



  220.                         goto F_RfRxCheckBit;                    



  221.                     }



  222.                     else



  223.                     {



  224.                         goto F_RfRxError;



  225.                     }







  226. F_RfRxError:



  227.                     gb_RfRxStep = 0;               



  228.                     return;







  229. F_RfRxCheckBit:



  230.                     gb_RfRxBitCnt++;



  231.                     if(gb_RfRxBitCnt >= C_RF_REC_BIT_LEN)



  232.                     {   



  233.                         //接收完成,設置收到數據標志



  234.                         gb_RfRxData3 = gew_RfRxData $ 0;    //數據碼



  235.                         gb_RfRxData2 = gew_RfRxData $ 1;    //客戶代碼



  236.                         gb_RfRxData1 = gew_RfRxData $ 2;    //客戶代碼



  237.                         



  238.                         gbit_RfRecEndCodeFlag = 0;



  239.                         gb_RfRxStep = 0;



  240.                         gb_RfRxBitCnt=0;







  241.                         if(!gbit_RfRecOkFlag)



  242.                         {



  243.                             gbit_RfRecOkFlag = 1;



  244.                             //這時候相當于按鍵的OnkeyDown()



  245.                             RF433M_OnRecevieFirstData();



  246.                         }



  247.                         //這時候相當于按鍵的OnkeyPressing()



  248.                         RF433M_OnRecevieData();



  249.                     }



  250.                 }



  251.                 gw_RfRxCnt = 0;



  252.             }



  253.             break;



  254.     }



  255. }


  256. ————————————————
  257.                     
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1091035 發表于 2025-3-7 23:46 | 只看該作者
大佬可以發一下完整的代碼學習一下嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区www | 久久亚洲国产 | 精品视频在线免费观看 | 国产一区二区在线视频 | 国内精品久久久久久影视8 最新黄色在线观看 | 国产一级黄色网 | 国产探花在线精品一区二区 | 精品国产乱码久久久久久88av | 在线观看中文字幕 | 在线看片国产精品 | 中文字幕二区 | 日本在线一二 | 免费观看一级视频 | 狠狠爱综合网 | 国产精品亚洲视频 | 成年免费大片黄在线观看岛国 | 四虎影院新地址 | 久久精品久久久久久 | 久久一区 | 国产一区在线免费观看 | 亚洲精品视频一区二区三区 | 91精品国产色综合久久 | 国产日韩欧美一区二区 | 99国产精品久久久 | 国产黄色麻豆视频 | 亚洲视频免费在线观看 | 高清一区二区三区 | 在线视频一区二区三区 | 久久久久亚洲精品 | 91麻豆久久久 | 美女毛片免费看 | 日日草夜夜草 | 日韩一区二区在线视频 | 国产精品久久欧美久久一区 | 亚洲一区二区三区在线播放 | 国产麻豆一区二区三区 | 精品国产精品一区二区夜夜嗨 | 最近中文字幕在线视频1 | 91精品亚洲 | 国产一区二区三区四区三区四 | 日韩美香港a一级毛片免费 国产综合av |