久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
433M無線STC單片機解碼程序,外部中斷方式
[打印本頁]
作者:
haxiny
時間:
2023-2-13 11:22
標題:
433M無線STC單片機解碼程序,外部中斷方式
最近需要用到433M的單片機解碼,上網搜了一下。大部分的程序都是基于定時器定時檢測。感覺邏輯不夠嚴謹。對于新手理解起來也比較困難。
我首先開了一個us級的定時器,持續計數。不需要打開中斷。
然后配置好對應的接收芯片的管腳。配置為外部中斷。觸發方式為上升沿,下降沿都觸發。
在外部中斷函數里面,記錄當前定時器的計數值,然后清零計數器。
定義一個狀態機
state = 0時:默認狀態,檢測是否為高電平。如果為高電平代表為上升沿,判斷同步信號。
state = 1時:檢測是否為低電平,如果為低電平,表示為下降沿,此時記錄的時間為高電平的持續時間。判斷是否符合同步信號的高電平時間要求。符合進入下一狀態
state = 2時:檢測管腳是否為高電平,如果為高電平,表示為上升沿,此時記錄的時間為低電平持續時間。判斷是否符合同步信號的低電平時間要求。符合進入接收狀態。不符合,回到初始狀態。
以此類推....具體可以看單片機程序
#define SYNC_H_MIN 0 //同步信號高電平持續時間 最低范圍
#define SYNC_H_MAX 600 //同步信號高電平持續時間 最高范圍
#define SYNC_L_MIN 8000 //同步信號低電平持續時間的最小值
#define SYNC_L_MAX 10997 //同步信號高電平持續時間的最大值,符合這個范圍都判定有效。
#define DAT1_H_MIN 800 //數據1的高電平持續時間最小值
#define DAT1_H_MAX 1063 //數據1的高電平持續時間最大值
#define DAT1_L_MIN 220 //數據1的低電平持續時間最小值
#define DAT1_L_MAX 400 //數據1的低電平持續時間最大值
#define DAT0_H_MIN 220
#define DAT0_H_MAX 400
#define DAT0_L_MIN 800
#define DAT0_L_MAX 1063
復制代碼
uint32_t bitNums = 0; //已經接收的位數。
uint32_t valueTmp = 0; //接收的數據。
uint32_t value = 0;
void Ext_INT1 (void) interrupt INT1_VECTOR //進中斷時已經清除標志
{
uint8_t de = 0; //管腳的狀態
uint32_t holdTime = 0; //持續的時間
Timer1_Stop();
holdTime = (TH1<<8) | TL1;
TH1= 0;TL1 =0;
de = P33; //讀取IO口狀態
Timer1_Run();
switch(state)
{
case 0:
if(de == 1) //如果是高電平,那么是上升沿
state= 1;
break;
case 1: //同步頭高電平時間結束的時候
if( de == 0 //檢測到下降沿,并判斷持續的時間
&& holdTime >= SYNC_H_MIN
&& holdTime <= SYNC_H_MAX)
{
state = 2;
}
else
{
state = 1;
}
break;
case 2: //同步信號低電平時間結束時,上升沿
{
if( de == 1
&& holdTime >= SYNC_L_MIN
&& holdTime <= SYNC_L_MAX) //判斷同步低電平時間是否符合要求
{
//符合要求,清0接收到的位數和數據。準備開始接收
bitNums = 0;
valueTmp= 0;
state = 3;
}
else
{
//不符合要求直接回到狀態1,不用回到狀態0,因為不需要判斷同步信號的高電平
//持續時間,低電平滿足需求即可
state = 1;
}
}
break;
case 3: //信號高電平結束時
if(de == 0)
{
valueTmp <<= 1;
if(holdTime >= DAT1_H_MIN && holdTime <= DAT1_H_MAX)
{
valueTmp += 1; //符合數據1的高部分
state = 4;
}
else if(holdTime >= DAT0_H_MIN && holdTime <= DAT0_H_MAX)
{
//符合數據0的高部分
state = 5;
}
else
{
state = 1;
break;
}
bitNums += 1;
if(bitNums >= 24)
{
value = valueTmp; //保存接收到的數據。
state = 1;
}
}
else
{
state = 1;
}
break;
case 4: //判斷數據1的低電平時間是否符合要求
{
if( de == 1
&& holdTime >= DAT1_L_MIN
&& holdTime <= DAT1_L_MAX)
{
//符合數據1的低電平時間要求,回到3重新接收下一個數據。
state = 3;
}
else
{
state = 1;
}
}
break;
case 5: //判斷數據0的低電平時間是否符合要求
{
if( de == 1
&& holdTime >= DAT0_L_MIN
&& holdTime <= DAT0_L_MAX)
{
//符合要求,接收下一個數據。
state = 3;
}
else
{
state = 1;
}
}
break;
default:
state = 0;
break;
}
}
復制代碼
作者:
yinds5092
時間:
2023-2-13 21:05
好使嗎?我看了好多的這個例子315一樣用嗎
作者:
haxiny
時間:
2023-2-14 09:22
315的沒有試過。433的可以
作者:
kissdb
時間:
2023-2-14 16:24
一般原因是外界的干擾太多了,使用中斷后,單片機根本就沒法做其他任務了
作者:
grb7906
時間:
2023-2-14 21:16
超再生等模塊,全是噪聲,能正常解碼???
作者:
haxiny
時間:
2023-2-16 09:21
grb7906 發表于 2023-2-14 21:16
超再生等模塊,全是噪聲,能正常解碼???
可以的。 沒有接收到是正常數據時,全是噪聲的
作者:
lzwwry
時間:
2023-12-5 11:09
holdtime是100us增加一嗎
作者:
昨天的明天
時間:
2023-12-12 14:16
yinds5092 發表于 2023-2-13 21:05
好使嗎?我看了好多的這個例子315一樣用嗎
433,315跟軟件沒有關系的
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲欧美在线观看
|
黄色网免费
|
成人国产精品久久久网站
|
怡红院亚洲
|
狠狠干婷婷
|
亚洲黄色精品
|
亚洲天堂一区二区三区
|
在线观看福利影院
|
中文在线观看视频
|
国产91在线看
|
可以看毛片的网站
|
日韩成人精品一区二区
|
九九视频在线
|
国产亚洲欧美日韩高清
|
午夜视频一区
|
精品福利在线观看
|
亚洲激情综合网
|
日韩av在线网站
|
www一级片
|
国产aaaaaa
|
www.youjizz.com日本
|
国产精品www
|
午夜成人在线视频
|
中国美女乱淫免费看视频
|
日本特黄特色aaa大片免费
|
成人免费福利
|
欧美日韩在线不卡
|
久久精品一区
|
永久免费看片在线播放
|
午夜影院黄
|
欧美日韩精品一区二区
|
日韩黄色一级视频
|
中文字幕免费在线观看
|
国产男女无遮挡猛进猛出
|
成人黄色大片
|
成人高潮片免费网站
|
一区二区水蜜桃
|
亚洲黄色在线视频
|
婷婷在线视频
|
综合久久久久
|
日韩黄色一级视频
|