亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
315/433M無線模塊解碼程序
[打印本頁]
作者:
z637300
時間:
2024-7-30 08:52
標題:
315/433M無線模塊解碼程序
現在這種接收模塊一般用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低,所以可以只通過高電平判斷,下面是具體的程序,需要注意的是各回調函數中不能執行太久,最好是設置標志就好了:
/******************H頭文件*********************************/
#ifndef RF433MDecode_H_
#define RF433MDecode_H_
/***************************************************/
//Define I/O Register
#define PORT_RF_REC pa
#define P_RF_REC pa.7
#define PC_RF_REC pac.7
#define PPH_RF_REC paph.7
//**************************************************//
//Define Constant
//在24us定時中斷中調用433M接收解碼函數
//同步碼,10ms低電平
#define C_RF_START_L_MAX 500 //12MS //10MS--10000/24=416
#define C_RF_START_L_MIN 250 //6MS
//之后是25位數據,只取24位3個字節
#define C_RF_REC_BIT_LEN 24
//"1"是1.1ms高+0.2ms低, "0"是0.45高+0.9低
//所以可以只通過高電平判斷
#define C_RF_DATA1_MAX 54 //1.3ms
#define C_RF_DATA1_MIN 37 //0.9ms
#define C_RF_DATA0_MAX 25 //0.6ms
#define C_RF_DATA0_MIN 13 //0.3ms
//結束碼,短按:130ms低電平,長按:500ms,這里取大于70ms
//#define C_RF_END_L_MAX 500 //140MS
#define C_RF_END_L_MIN 2916 //70MS
#define C_RF_DATA_CLENT_1 0xAD //客戶碼1
#define C_RF_DATA_CLENT_2 0x2F //客戶碼2
#define C_RF_DATA_1_KEY 0x01 //A鍵值
#define C_RF_DATA_2_KEY 0x02 //B鍵值
#define C_RF_DATA_3_KEY 0x04 //C鍵值
#define C_RF_DATA_4_KEY 0x08 //D鍵值
#define C_DELAY_KEY_PRESS_SHORT 500 //1000*1MS
#define C_DELAY_KEY_PRESS_LONG 2000 //3000*1MS
/****************************************************/
// Define General Register
//**************************************************
//Define FUNCTION
void RF433M_Init(void);
void RF433M_RecevieDecode(void);
#endif
/******************C文件*********************************/
//***************************************************
//CUSTOMER:
//OBJECT:433M解碼程序
//AUTHOR:TJY
//DESCRIPTION:
// 在24us定時中斷中調用433M接收解碼函數
/*************************************************************************
/*************************************************************************/
#include "extern.h"
#include "Rf433MDecode.h"
byte gb_RfRxStep; //IR接收步驟
word gw_RfRxCnt; //接收計數器
eword gew_RfRxData; //接收數據暫存,//同步碼之后是25位數據,只取24位3個字節
byte gb_RfRxData1; //接收數據--//客戶代碼1
byte gb_RfRxData2; //客戶代碼2
byte gb_RfRxData3; //數據碼
byte gb_RfRxLevel;
byte gb_RfRxBitCnt; //接收數據位
bit gbit_RfRecOkFlag; //收到完整的24位數據置1,相當于g_bitKeyDownFlag
bit gbit_RfRecEndCodeFlag; //收到結束碼
byte g_bTimerCount
word gw_RfRxKeeppingMsCnt; //接收第一個數據后開始的計數器
word gw_RfRxKeeppingIntervalCount;
bit gbit_ResetFlag;
/***************************************************
接收初始化函數
***************************************************/
void RF433M_Init(void)
{
$ P_RF_REC High;
$ P_RF_REC In, NoPull; //設置為輸入模式
gb_RfRxStep = 0;
gbit_RfRecOkFlag = 0;
gbit_RfRecEndCodeFlag = 0;
bTimerCount = 0;
}
/***************************************************
第一次收到完整的24位數據的回調函數
相當于按鍵按下調用函數 -- OnkeyDown()
只在開始的時候進一次
***************************************************/
void RF433M_OnRecevieFirstData(void)
{
gw_RfRxKeeppingMsCnt = 0;
}
/***************************************************
收到完整的24位數據后的回調函數
相當于按鍵按下調用函數 -- OnkeyPressing()
在按下期間,會不斷進入
***************************************************/
void RF433M_OnRecevieData(void)
{
if(gw_RfRxKeeppingMsCnt >= C_DELAY_KEY_PRESS_LONG)
{
//長按
if(gb_RfRxData3 == C_RF_DATA_1_KEY)
{
}
}
}
/***************************************************
收到24位數據后,再接收到結束碼的回調函數
相當于按鍵按下松開時調用函數 -- OnkeyUp()
***************************************************/
void RF433M_OnRecevieEndCode(void)
{
if( gw_RfRxKeeppingMsCnt <= C_DELAY_KEY_PRESS_SHORT)
{
//短按
switch(gb_RfRxData3)
{
case C_RF_DATA_1_KEY:
{
break;
}
case C_RF_DATA_2_KEY:
{
break;
}
case C_RF_DATA_3_KEY:
{
break;
}
case C_RF_DATA_4_KEY:
{
break;
}
}
}
}
/***************************************************
433接收解碼函數
在24us定時中斷中調用433M接收解碼函數
同步碼,10ms低電平
之后是25位數據,只取24位3個字節
"1"是1.1ms高+0.2ms低, "0"是0.45高+0.9低
所以可以只通過高電平判斷
***************************************************/
void RF433M_RecevieDecode(void)
{
g_bTimerCount++;
if(g_bTimerCount == 42) //1ms=42*24us
{
g_bTimerCount = 0;
gw_RfRxKeeppingMsCnt++;
}
switch(gb_RfRxStep)
{
case 0:
if(!P_RF_REC)
{
//1-1.開始檢測引導碼10ms低電平或結束碼100ms低電平
gw_RfRxCnt = 0;
gb_RfRxStep = 1;
}
break;
case 1:
if(!P_RF_REC)
{
//1-2.引導碼10ms或結束碼100ms低電平計時
gw_RfRxCnt++;
}
else
{
//1-3.判斷引導碼9ms低電平或結束碼100ms低電平
if(gw_RfRxCnt > C_RF_END_L_MIN && gbit_RfRecOkFlag)
{
//結束碼
gbit_RfRecOkFlag = 0;
//相當于按鍵按下松開時調用函數 -- OnkeyUp()
RF433M_OnRecevieEndCode();
return ;
}
else if((gw_RfRxCnt > C_RF_START_L_MAX) || (gw_RfRxCnt < C_RF_START_L_MIN))
{
goto F_RfRxError;
}
//引導碼
//gbit_RfRecOkFlag = 0;
//2-1.開始接收數據,檢測引導碼4.5ms高電平
gb_RfRxLevel = PORT_RF_REC & _field(P_RF_REC);
gw_RfRxCnt = 0;
gb_RfRxBitCnt = 0;
gb_RfRxStep = 2;
//gew_RfRxData = 0;
}
break;
case 2://check level change
a = PORT_RF_REC & _field(P_RF_REC);
if(a == gb_RfRxLevel)
{
//電平保持不變
gw_RfRxCnt++;
}
else
{ //level change,check current level
gb_RfRxLevel = a;
if(!P_RF_REC)
{
//數據0、1是通過高電平時間判斷,所以電平跳變為低的時候,
//也就獲取到高電平的時間了,
//就可以判斷有效數據0,1
gew_RfRxData = gew_RfRxData << 1;
//slc gew_RfRxData $ 2;
//"1"是1.1ms高+0.2ms低, "0"是0.45高+0.9低
//所以可以只通過高電平判斷,當然用低電平判斷也一樣類似
if((gw_RfRxCnt < C_RF_DATA1_MAX) && (gw_RfRxCnt > C_RF_DATA1_MIN))
{//data 1
set1 gew_RfRxData.0;
goto F_RfRxCheckBit;
}
else if((gw_RfRxCnt < C_RF_DATA0_MAX) && (gw_RfRxCnt > C_RF_DATA0_MIN))
{//data 0
set0 gew_RfRxData.0;
goto F_RfRxCheckBit;
}
else
{
goto F_RfRxError;
}
F_RfRxError:
gb_RfRxStep = 0;
return;
F_RfRxCheckBit:
gb_RfRxBitCnt++;
if(gb_RfRxBitCnt >= C_RF_REC_BIT_LEN)
{
//接收完成,設置收到數據標志
gb_RfRxData3 = gew_RfRxData $ 0; //數據碼
gb_RfRxData2 = gew_RfRxData $ 1; //客戶代碼
gb_RfRxData1 = gew_RfRxData $ 2; //客戶代碼
gbit_RfRecEndCodeFlag = 0;
gb_RfRxStep = 0;
gb_RfRxBitCnt=0;
if(!gbit_RfRecOkFlag)
{
gbit_RfRecOkFlag = 1;
//這時候相當于按鍵的OnkeyDown()
RF433M_OnRecevieFirstData();
}
//這時候相當于按鍵的OnkeyPressing()
RF433M_OnRecevieData();
}
}
gw_RfRxCnt = 0;
}
break;
}
}
————————————————
復制代碼
作者:
Mrjork
時間:
2025-3-7 23:46
大佬可以發一下完整的代碼學習一下嗎
作者:
wyj191
時間:
2025-5-5 19:59
能內部掃描喚醒嗎
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1