久久久久久久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í)行太久,最好是設置標志就好了:
/******************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定時中斷中調(diào)用433M接收解碼函數(shù)
//同步碼,10ms低電平
#define C_RF_START_L_MAX 500 //12MS //10MS--10000/24=416
#define C_RF_START_L_MIN 250 //6MS
//之后是25位數(shù)據(jù),只取24位3個字節(jié)
#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定時中斷中調(diào)用433M接收解碼函數(shù)
/*************************************************************************
/*************************************************************************/
#include "extern.h"
#include "Rf433MDecode.h"
byte gb_RfRxStep; //IR接收步驟
word gw_RfRxCnt; //接收計數(shù)器
eword gew_RfRxData; //接收數(shù)據(jù)暫存,//同步碼之后是25位數(shù)據(jù),只取24位3個字節(jié)
byte gb_RfRxData1; //接收數(shù)據(jù)--//客戶代碼1
byte gb_RfRxData2; //客戶代碼2
byte gb_RfRxData3; //數(shù)據(jù)碼
byte gb_RfRxLevel;
byte gb_RfRxBitCnt; //接收數(shù)據(jù)位
bit gbit_RfRecOkFlag; //收到完整的24位數(shù)據(jù)置1,相當于g_bitKeyDownFlag
bit gbit_RfRecEndCodeFlag; //收到結束碼
byte g_bTimerCount
word gw_RfRxKeeppingMsCnt; //接收第一個數(shù)據(jù)后開始的計數(shù)器
word gw_RfRxKeeppingIntervalCount;
bit gbit_ResetFlag;
/***************************************************
接收初始化函數(shù)
***************************************************/
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位數(shù)據(jù)的回調(diào)函數(shù)
相當于按鍵按下調(diào)用函數(shù) -- OnkeyDown()
只在開始的時候進一次
***************************************************/
void RF433M_OnRecevieFirstData(void)
{
gw_RfRxKeeppingMsCnt = 0;
}
/***************************************************
收到完整的24位數(shù)據(jù)后的回調(diào)函數(shù)
相當于按鍵按下調(diào)用函數(shù) -- OnkeyPressing()
在按下期間,會不斷進入
***************************************************/
void RF433M_OnRecevieData(void)
{
if(gw_RfRxKeeppingMsCnt >= C_DELAY_KEY_PRESS_LONG)
{
//長按
if(gb_RfRxData3 == C_RF_DATA_1_KEY)
{
}
}
}
/***************************************************
收到24位數(shù)據(jù)后,再接收到結束碼的回調(diào)函數(shù)
相當于按鍵按下松開時調(diào)用函數(shù) -- 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接收解碼函數(shù)
在24us定時中斷中調(diào)用433M接收解碼函數(shù)
同步碼,10ms低電平
之后是25位數(shù)據(jù),只取24位3個字節(jié)
"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;
//相當于按鍵按下松開時調(diào)用函數(shù) -- 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.開始接收數(shù)據(jù),檢測引導碼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)
{
//數(shù)據(jù)0、1是通過高電平時間判斷,所以電平跳變?yōu)榈偷臅r候,
//也就獲取到高電平的時間了,
//就可以判斷有效數(shù)據(jù)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)
{
//接收完成,設置收到數(shù)據(jù)標志
gb_RfRxData3 = gew_RfRxData $ 0; //數(shù)據(jù)碼
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
大佬可以發(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在线播放不卡
|
午夜精品视频
|