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

標題: 315/433M無線模塊解碼程序 [打印本頁]

作者: z637300    時間: 2024-7-30 08:52
標題: 315/433M無線模塊解碼程序
現(xiàn)在這種接收模塊一般用PRO480R/SYN480R,外圍再加一些簡單的典型電路,性價比高,1塊多就可以買到,可實現(xiàn)燈光、門禁、汽車、安防監(jiān)控系統(tǒng)和智能家居產(chǎn)品的無線遙控功能。

2、315/433無線模塊解碼

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

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

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

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

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

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



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



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

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



  51. #include    "extern.h"



  52. #include    "Rf433MDecode.h"







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



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







  55. eword    gew_RfRxData;            //接收數(shù)據(jù)暫存,//同步碼之后是25位數(shù)據(jù),只取24位3個字節(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,相當于g_bitKeyDownFlag



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



  63. byte g_bTimerCount



  64. word    gw_RfRxKeeppingMsCnt;        //接收第一個數(shù)據(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;        //設置為輸入模式







  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. 相當于按鍵按下調(diào)用函數(shù) -- OnkeyDown()

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

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



  84. void RF433M_OnRecevieFirstData(void)



  85. {



  86.     gw_RfRxKeeppingMsCnt = 0;



  87. }







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

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



  90. 相當于按鍵按下調(diào)用函數(shù) -- 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位數(shù)據(jù)后,再接收到結束碼的回調(diào)函數(shù)



  106. 相當于按鍵按下松開時調(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定時中斷中調(diào)用433M接收解碼函數(shù)

  137. 同步碼,10ms低電平

  138. 之后是25位數(shù)據(jù),只取24位3個字節(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.開始檢測引導碼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.                     //相當于按鍵按下松開時調(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.                 //引導碼            



  182.                 //gbit_RfRecOkFlag = 0;







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



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



  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.                     //所以可以只通過高電平判斷,當然用低電平判斷也一樣類似



  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ù)據(jù)標志



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



  245.                             RF433M_OnRecevieFirstData();



  246.                         }



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



  248.                         RF433M_OnRecevieData();



  249.                     }



  250.                 }



  251.                 gw_RfRxCnt = 0;



  252.             }



  253.             break;



  254.     }



  255. }


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





作者: Mrjork    時間: 2025-3-7 23:46
大佬可以發(fā)一下完整的代碼學習一下嗎
作者: wyj191    時間: 2025-5-5 19:59
能內(nèi)部掃描喚醒嗎




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品免费观看 | 日韩欧美国产一区二区三区 | 国产精品3 | 成人做受黄大片 | 成年在线观看 | 亚洲视频在线免费观看 | 黄色一极片 | 日韩av在线不卡 | 日日干日日干 | 国产丝袜av | 成人不卡视频 | 一区二区三区影视 | 激情影院在线观看 | 一级黄色大片 | 成人久久网站 | 欧美一级淫片免费视频魅影视频 | 免费理论片 | 日韩精品在线一区二区 | 成年在线观看 | 国产免费黄色 | 午夜小视频在线观看 | 天天综合天天做天天综合 | 黄色片免费在线观看 | 免费看成人片 | 日韩av在线一区二区 | 欧美国产精品 | 中文字幕自拍偷拍 | 精品福利在线观看 | 久久久久国产精品夜夜夜夜夜 | 国产理论在线观看 | 欧美偷拍视频 | 成人免费毛片果冻 | www.日本高清| 噜噜噜在线 | 视频一区在线观看 | 久久精品在线 | 中国av在线播放 | 国产成人三级一区二区在线观看一 | 岛国av噜噜噜久久久狠狠av | av在线播放不卡 | 午夜精品视频 |