找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1701|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

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

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

2、315/433無線模塊解碼

       上圖是接收模塊接收到的發(fā)送模塊按鍵一次發(fā)來的信息波形,可以分為5個(gè)階段來分析,分別是:1、開始無接收信號(hào),輸出的是雜波;2、引導(dǎo)碼;3、鍵碼;4、相同連續(xù)的引導(dǎo)碼和鍵碼,如果長按發(fā)送會(huì)一直輸出這樣的波形;5、松開發(fā)送鍵,接收輸出一個(gè)比較明顯的結(jié)束碼;

      接收模塊在無信號(hào)狀態(tài)下接收引腳是不斷輸出雜波,在接到信號(hào)時(shí),才會(huì)輸出信息碼,所以寫程序的難點(diǎn)在解碼。

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

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

      我們可以設(shè)定一個(gè)較快的定時(shí)中斷(下面設(shè)定24us),然后在中調(diào)用接收解碼函數(shù),每次中斷只判斷相應(yīng)的標(biāo)志,不會(huì)造成中斷執(zhí)行時(shí)間過長的問題。

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



  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定時(shí)中斷中調(diào)用433M接收解碼函數(shù)







  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位數(shù)據(jù),只取24位3個(gè)字節(jié)



  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. //結(jié)束碼,短按: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定時(shí)中斷中調(diào)用433M接收解碼函數(shù)



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

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



  51. #include    "extern.h"



  52. #include    "Rf433MDecode.h"







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



  54. word    gw_RfRxCnt;                //接收計(jì)數(shù)器







  55. eword    gew_RfRxData;            //接收數(shù)據(jù)暫存,//同步碼之后是25位數(shù)據(jù),只取24位3個(gè)字節(jié)



  56. byte    gb_RfRxData1;                //接收數(shù)據(jù)--//客戶代碼1



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



  58. byte    gb_RfRxData3;                //數(shù)據(jù)碼











  59. byte    gb_RfRxLevel;



  60. byte    gb_RfRxBitCnt;                //接收數(shù)據(jù)位



  61. bit     gbit_RfRecOkFlag;            //收到完整的24位數(shù)據(jù)置1,相當(dāng)于g_bitKeyDownFlag



  62. bit     gbit_RfRecEndCodeFlag;        //收到結(jié)束碼



  63. byte g_bTimerCount



  64. word    gw_RfRxKeeppingMsCnt;        //接收第一個(gè)數(shù)據(jù)后開始的計(jì)數(shù)器



  65. word    gw_RfRxKeeppingIntervalCount;







  66. bit        gbit_ResetFlag;



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

  68. 接收初始化函數(shù)

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



  70. void RF433M_Init(void)



  71. {



  72.     $ P_RF_REC     High;



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







  74.     gb_RfRxStep = 0;



  75.     gbit_RfRecOkFlag = 0;



  76.     gbit_RfRecEndCodeFlag = 0;



  77. bTimerCount = 0;



  78. }   







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

  80. 第一次收到完整的24位數(shù)據(jù)的回調(diào)函數(shù)



  81. 相當(dāng)于按鍵按下調(diào)用函數(shù) -- OnkeyDown()

  82. 只在開始的時(shí)候進(jìn)一次

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



  84. void RF433M_OnRecevieFirstData(void)



  85. {



  86.     gw_RfRxKeeppingMsCnt = 0;



  87. }







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

  89. 收到完整的24位數(shù)據(jù)后的回調(diào)函數(shù)



  90. 相當(dāng)于按鍵按下調(diào)用函數(shù) -- OnkeyPressing()

  91. 在按下期間,會(huì)不斷進(jìn)入

  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位數(shù)據(jù)后,再接收到結(jié)束碼的回調(diào)函數(shù)



  106. 相當(dāng)于按鍵按下松開時(shí)調(diào)用函數(shù) -- 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接收解碼函數(shù)



  136. 在24us定時(shí)中斷中調(diào)用433M接收解碼函數(shù)

  137. 同步碼,10ms低電平

  138. 之后是25位數(shù)據(jù),只取24位3個(gè)字節(jié)

  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.開始檢測引導(dǎo)碼10ms低電平或結(jié)束碼100ms低電平



  156.                 gw_RfRxCnt = 0;



  157.                 gb_RfRxStep = 1;



  158.             }   



  159.             break;







  160.         case    1:



  161.             if(!P_RF_REC)



  162.             {



  163.                 //1-2.引導(dǎo)碼10ms或結(jié)束碼100ms低電平計(jì)時(shí)



  164.                 gw_RfRxCnt++;



  165.             }



  166.             else



  167.             {   



  168.                 //1-3.判斷引導(dǎo)碼9ms低電平或結(jié)束碼100ms低電平



  169.                 if(gw_RfRxCnt > C_RF_END_L_MIN && gbit_RfRecOkFlag)



  170.                 {



  171.                     //結(jié)束碼



  172.                     gbit_RfRecOkFlag = 0;



  173.                     //相當(dāng)于按鍵按下松開時(shí)調(diào)用函數(shù) -- 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.                 //引導(dǎo)碼            



  182.                 //gbit_RfRecOkFlag = 0;







  183.                 //2-1.開始接收數(shù)據(jù),檢測引導(dǎo)碼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.                     //數(shù)據(jù)0、1是通過高電平時(shí)間判斷,所以電平跳變?yōu)榈偷臅r(shí)候,



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



  206.                     //就可以判斷有效數(shù)據(jù)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.                     //所以可以只通過高電平判斷,當(dāng)然用低電平判斷也一樣類似



  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.                         //接收完成,設(shè)置收到數(shù)據(jù)標(biāo)志



  234.                         gb_RfRxData3 = gew_RfRxData $ 0;    //數(shù)據(jù)碼



  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.                             //這時(shí)候相當(dāng)于按鍵的OnkeyDown()



  245.                             RF433M_OnRecevieFirstData();



  246.                         }



  247.                         //這時(shí)候相當(dāng)于按鍵的OnkeyPressing()



  248.                         RF433M_OnRecevieData();



  249.                     }



  250.                 }



  251.                 gw_RfRxCnt = 0;



  252.             }



  253.             break;



  254.     }



  255. }


  256. ————————————————
  257.                     
復(fù)制代碼




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

使用道具 舉報(bào)

沙發(fā)
ID:1091035 發(fā)表于 2025-3-7 23:46 | 只看該作者
大佬可以發(fā)一下完整的代碼學(xué)習(xí)一下嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:220055 發(fā)表于 2025-5-5 19:59 | 只看該作者
能內(nèi)部掃描喚醒嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表