欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32定時器中斷解碼433M無線遙控的源程序
[打印本頁]
作者:
359790754
時間:
2019-1-9 15:34
標題:
STM32定時器中斷解碼433M無線遙控的源程序
stm32定時器中斷解碼433m無線信號,測試過可用直接用
0.png
(34.99 KB, 下載次數: 68)
下載附件
2019-1-10 03:30 上傳
單片機源程序如下:
#include "rf433.h"
#include "usart.h"
#include "includes.h"
#include "stm32f10x_tim.h"
/* USER CODE BEGIN 0 */
uint8_t rf_data[3] = {0};
uint8_t RF;
uint8_t decode_ok; //解碼成功
uint8_t hh_w,ll_w; //高,低電平寬度
uint8_t ma_x; //接收到第幾位編碼了
uint8_t bma1,bma2,bma3,bma4; //用于接收過程存放遙控編碼,編碼比較兩次,這是第一次
uint8_t mma1,mma2,mma3,mma4;
uint8_t mmb1,mmb2,mmb3,mmb4; // 用于接收過程存放遙控編碼,第二次
//extern uint8_t mmb1,mmb2,mmb3,mmb4;
uint8_t rf_ok1,rf_ok2,rf_ok; //解碼過程中的臨時接收成功標志,接收到一個完整的遙控命令后置1,通知解碼程序可以解碼了
uint8_t old_rc5; //保存上一次查詢到的電平狀態
uint8_t tb_ok; //接收到同步的馬時置1
uint8_t D0,D1,D2,D3 ;
uint16_t s ,s1;
uint8_t bt_auto; //自動設置遙控接收波特率標志
/* 存放學習數據 即存儲在flash里的 */
//u8 rf433_save_data[3] = { 0x6d, 0xab, 0x26 };
u8 rf433_save_data[3] = {0};
/* 433數據接收成功標志位 */
u8 rf433_msg_rev_success = NO;
/* 是否剛剛解析完數據 用于給應用層提供一次輸出 濾除掉發送端多次發送數據 */
u8 isJustParser = NO;
/* 學習狀態 */
u8 isLearnStatus = NO;
/* 433初始化 */
void RF433_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// EXTI_InitTypeDef EXTI_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 開啟時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);
/* RF433引腳功能定義 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = RF433_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉輸入
GPIO_Init(RF433_PORT, &GPIO_InitStructure);
/* learnKey引腳功能定義 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 上拉輸入
GPIO_Init(GPIOC, &GPIO_InitStructure);
#if 0
/* EXTI line mode config */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中斷;
//EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //中斷
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
#endif
/* ??TIM2CLK ? 72MHZ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
//TIM_DeInit(TIM2);
/* ????????????(???) */
TIM_TimeBaseStructure.TIM_Period=49;
/* ?? TIM_Period?????????????? */
/* ???????72 */
TIM_TimeBaseStructure.TIM_Prescaler= 71;
/* ??????????????,?????? */
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //ê1?ü°′?üWK_UP?ù?úμ?ía2??D??í¨μà
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03; //?à??ó??è??2£?
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04; //×óó??è??3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ê1?üía2??D??í¨μà
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /*???????*/
}
/* 50us中斷 */
void TIM2_IRQHandler(void)
{
/* 用于濾除 */
static u16 cnt = 0x0;
static u32 decode_ok_cnt = 0;
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
/* 剛解析成功一次數據 則延時一定時間 再進行數據接收 */
if( isJustParser == YES )
{
/* 用于濾除 */
decode_ok_cnt++;
if( decode_ok_cnt < 18000 ) // 900ms
{
/* 900ms之后 再進行判斷 */
TIM_ClearITPendingBit( TIM2, TIM_FLAG_Update );
return;
}
}
isJustParser = NO;
decode_ok_cnt = 0;
/* 讀取電平 */
RF = RF433_DATA;
/* 硬件電路 三極管反向 */
if( RF == 1 )
{
ll_w++;
old_rc5=0;
} // 檢測到低電平 低電平時間加1,記錄本次電平狀態old_rc5
else // 檢測到高電平
{
hh_w++;
if (!old_rc5) // 檢測到從低到高的跳變,已檢測到一個完整(高-低)電平周期
{
//if (((hh_w>=2)&&(hh_w<=5))&&((ll_w>=60)&&(ll_w<=180))) //判同步碼 2/5 100/130
if (((hh_w>=1)&&(hh_w<=20))&&((ll_w>=50)&&(ll_w<=190))) //判同步碼 2/5 100/130
{
tb_ok = 1 ;
ma_x = 0;
bma1=0; bma2=0; bma3=0; bma4=0;
}
else if ((tb_ok)&&((ll_w>=12)&&(ll_w<=18))) // 8/13
{
ma_x++; //已經接收到同步碼,判0 // 800us
if(ma_x>23)
{
if(!rf_ok1) //rf_ok1 臨時接收成功
{
mma1=bma1;
mma2=bma2;
mma3=bma3;
mma4=bma4; //將接收到的編碼復制到解碼寄存器中
rf_ok1=1; // 通知解碼子程序可以解碼了
tb_ok=0;
// bt_auto=0;
s=800;
}
else
{
mmb1=bma1;
mmb2=bma2;
mmb3=bma3;
mmb4=bma4; //將接收到的編碼復制到解碼寄存器中
rf_ok2=1; // 通知解碼子程序可以解碼了
tb_ok=0;
// bt_auto=0;
}
}
}
else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=7))) // 2/7
{
/* 1 */ /* 200us */
switch (ma_x)
{
/* 合成數據位 */
/* 同步頭1 */
case 0 : { bma1=bma1 | 0x80; break; }
case 1 : { bma1=bma1 | 0x40; break; }
case 2 : { bma1=bma1 | 0x20; break; }
case 3 : { bma1=bma1 | 0x10; break; }
case 4 : { bma1=bma1 | 0x08; break; }
case 5 : { bma1=bma1 | 0x04; break; }
case 6 : { bma1=bma1 | 0x02; break; }
case 7 : { bma1=bma1 | 0x01; break; }
/* 同步頭2 */
case 8 : { bma2=bma2 | 0x80; break; }
case 9 : { bma2=bma2 | 0x40; break; }
case 10: { bma2=bma2 | 0x20; break; }
case 11: { bma2=bma2 | 0x10; break; }
case 12: { bma2=bma2 | 0x08; break; }
case 13: { bma2=bma2 | 0x04; break; }
case 14: { bma2=bma2 | 0x02; break; }
case 15: { bma2=bma2 | 0x01; break; }
/* 同步頭3 */
case 16: { bma3=bma3 | 0x80; break; }
case 17: { bma3=bma3 | 0x40; break; }
case 18: { bma3=bma3 | 0x20; break; }
case 19: { bma3=bma3 | 0x10; break; }
case 20: { bma3=bma3 | 0x08; break; }
case 21: { bma3=bma3 | 0x04; break; }
case 22: { bma3=bma3 | 0x02; break; }
case 23: { bma3=bma3 | 0x01;
if(!rf_ok1)
{
mma1=bma1;
mma2=bma2;
mma3=bma3;
rf_ok1=1; // 通知解碼子程序可以解碼了
tb_ok=0;
// bt_auto=0;
s=1000;
break;
}
else
{
mmb1=bma1;
mmb2=bma2;
mmb3=bma3;
rf_ok2=1; // 通知解碼子程序可以解碼了
tb_ok=0;
break;
}
}
}
ma_x++;
}
else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; hh_w=1;ll_w=0;} //接收到不符合的高-低電平序列
ll_w=0;hh_w=1;
}
old_rc5=1; // 記錄本次電平狀態
}
if(rf_ok1) //規定時間內接受到2幀相同的編碼數據才有效
{
s--;
if(!s) rf_ok1=0;
if(rf_ok2)
{
if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3))
{
rf_ok=1;
rf_ok1=0;
rf_ok2=0;
}
else
{
rf_ok=0;
rf_ok1=0;
rf_ok2=0;
}
}
}
#if 1
if((rf_ok)) //判斷是否接收成功
{
/* 關閉定時器 取出數據 */
TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
rf_ok = 0;
rf_data[0] = mma1;
rf_data[1] = mma2;
rf_data[2] = mma3;
/* 接收433數據成功 */
rf433_msg_rev_success = YES;
/* 開啟定時器 */
TIM_ITConfig(TIM2 , TIM_IT_Update, ENABLE);
}
#endif
/* 清除標志位 */
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
}
#if SYSTEM_SUPPORT_OS //??SYSTEM_SUPPORT_OS??,?????OS.
OSIntExit();
#endif
}
/* 內存塊比較 */
u8 memCompare( u8 *src, u8 *dsc, u8 length )
{
while( length > 0 )
{
if( *src == *dsc )
{
length--;
src++;
dsc++;
continue;
}
return NO;
}
return YES;
}
/* 433數據解析 報警返回YES 1 否則 NO 0 */
/* 調用這個函數時 如果是學習狀態 這不是報警 在此之前 需定義一個學習狀態 */
u8 RF433_Data_Parser(void)
{
/* 433數據接收成功 */
if( rf433_msg_rev_success == YES )
{
/* 清除標志位 */
rf433_msg_rev_success = NO;
isJustParser = YES;
printf("------> Have 433 msg!!!\n");
printf("------> rf_data[0] = 0x%2x\n",rf_data[0]);
printf("------> rf_data[1] = 0x%2x\n",rf_data[1]);
printf("------> rf_data[2] = 0x%2x\n",rf_data[2]);
printf("\n");
if( isLearnStatus == YES )
{
/* 學習狀態 存儲數據 */
printf("-------> Is learn status,please save data!!\n");
/* 此處調用flash存放函數 存儲成功 需 isLearnStatus 清除 */
/* 學習狀態 非報警 */
return 2;
}
/* 解析數據 */
if( (rf433_save_data[0]==rf_data[0]) && \
(rf433_save_data[1]==rf_data[1]) && \
(rf433_save_data[2]==rf_data[2]) )
{
/* 煙感同步頭與學習到存儲的數據一致 */
/* 即使煙感報警 */
printf("------> The smoker sensor is alarming!!!!!!\n\n");
return YES;
}else
{
printf("------> The another smoker sensor's data!\n\n");
}
}
return NO;
}
/*********************************************END OF FILE**********************/
復制代碼
所有資料51hei提供下載:
433定時器中斷解碼.rar
(4.66 KB, 下載次數: 185)
2019-1-9 15:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
uhh
時間:
2019-4-28 14:37
正好需要,謝謝
作者:
JunoFly
時間:
2019-4-29 00:38
謝謝樓主分享~
作者:
small_tiger09
時間:
2020-1-6 14:51
不錯,感謝分享!
作者:
herohuang
時間:
2023-6-9 06:31
這能用嗎?
作者:
herohuang
時間:
2023-7-19 06:14
這個能解所有433碼嗎?滾碼的例子有沒有
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1