|
stm32定時(shí)器中斷解碼433m無(wú)線信號(hào),測(cè)試過(guò)可用直接用
0.png (34.99 KB, 下載次數(shù): 68)
下載附件
2019-1-10 03:30 上傳
單片機(jī)源程序如下:
- #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; //用于接收過(guò)程存放遙控編碼,編碼比較兩次,這是第一次
- uint8_t mma1,mma2,mma3,mma4;
- uint8_t mmb1,mmb2,mmb3,mmb4; // 用于接收過(guò)程存放遙控編碼,第二次
- //extern uint8_t mmb1,mmb2,mmb3,mmb4;
- uint8_t rf_ok1,rf_ok2,rf_ok; //解碼過(guò)程中的臨時(shí)接收成功標(biāo)志,接收到一個(gè)完整的遙控命令后置1,通知解碼程序可以解碼了
- uint8_t old_rc5; //保存上一次查詢到的電平狀態(tài)
- uint8_t tb_ok; //接收到同步的馬時(shí)置1
- uint8_t D0,D1,D2,D3 ;
- uint16_t s ,s1;
- uint8_t bt_auto; //自動(dòng)設(shè)置遙控接收波特率標(biāo)志
- /* 存放學(xué)習(xí)數(shù)據(jù) 即存儲(chǔ)在flash里的 */
- //u8 rf433_save_data[3] = { 0x6d, 0xab, 0x26 };
- u8 rf433_save_data[3] = {0};
- /* 433數(shù)據(jù)接收成功標(biāo)志位 */
- u8 rf433_msg_rev_success = NO;
- /* 是否剛剛解析完數(shù)據(jù) 用于給應(yīng)用層提供一次輸出 濾除掉發(fā)送端多次發(fā)送數(shù)據(jù) */
- u8 isJustParser = NO;
- /* 學(xué)習(xí)狀態(tài) */
- u8 isLearnStatus = NO;
- /* 433初始化 */
- void RF433_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- // EXTI_InitTypeDef EXTI_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- /* 開啟時(shí)鐘*/
- 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 )
- {
- /* 剛解析成功一次數(shù)據(jù) 則延時(shí)一定時(shí)間 再進(jìn)行數(shù)據(jù)接收 */
- if( isJustParser == YES )
- {
- /* 用于濾除 */
- decode_ok_cnt++;
- if( decode_ok_cnt < 18000 ) // 900ms
- {
- /* 900ms之后 再進(jìn)行判斷 */
- TIM_ClearITPendingBit( TIM2, TIM_FLAG_Update );
- return;
- }
- }
- isJustParser = NO;
- decode_ok_cnt = 0;
- /* 讀取電平 */
- RF = RF433_DATA;
- /* 硬件電路 三極管反向 */
- if( RF == 1 )
- {
- ll_w++;
- old_rc5=0;
- } // 檢測(cè)到低電平 低電平時(shí)間加1,記錄本次電平狀態(tài)old_rc5
- else // 檢測(cè)到高電平
- {
- hh_w++;
- if (!old_rc5) // 檢測(cè)到從低到高的跳變,已檢測(cè)到一個(gè)完整(高-低)電平周期
- {
- //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++; //已經(jīng)接收到同步碼,判0 // 800us
- if(ma_x>23)
- {
- if(!rf_ok1) //rf_ok1 臨時(shí)接收成功
- {
- mma1=bma1;
- mma2=bma2;
- mma3=bma3;
- mma4=bma4; //將接收到的編碼復(fù)制到解碼寄存器中
- rf_ok1=1; // 通知解碼子程序可以解碼了
- tb_ok=0;
- // bt_auto=0;
- s=800;
-
- }
- else
- {
- mmb1=bma1;
- mmb2=bma2;
- mmb3=bma3;
- mmb4=bma4; //將接收到的編碼復(fù)制到解碼寄存器中
- 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)
- {
- /* 合成數(shù)據(jù)位 */
- /* 同步頭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; // 記錄本次電平狀態(tài)
- }
- if(rf_ok1) //規(guī)定時(shí)間內(nèi)接受到2幀相同的編碼數(shù)據(jù)才有效
- {
- 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)) //判斷是否接收成功
- {
- /* 關(guān)閉定時(shí)器 取出數(shù)據(jù) */
- TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
- rf_ok = 0;
- rf_data[0] = mma1;
- rf_data[1] = mma2;
- rf_data[2] = mma3;
-
- /* 接收433數(shù)據(jù)成功 */
- rf433_msg_rev_success = YES;
- /* 開啟定時(shí)器 */
- TIM_ITConfig(TIM2 , TIM_IT_Update, ENABLE);
- }
- #endif
- /* 清除標(biāo)志位 */
- TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
- }
- #if SYSTEM_SUPPORT_OS //??SYSTEM_SUPPORT_OS??,?????OS.
- OSIntExit();
- #endif
- }
- /* 內(nèi)存塊比較 */
- u8 memCompare( u8 *src, u8 *dsc, u8 length )
- {
- while( length > 0 )
- {
- if( *src == *dsc )
- {
- length--;
- src++;
- dsc++;
- continue;
- }
- return NO;
- }
- return YES;
- }
- /* 433數(shù)據(jù)解析 報(bào)警返回YES 1 否則 NO 0 */
- /* 調(diào)用這個(gè)函數(shù)時(shí) 如果是學(xué)習(xí)狀態(tài) 這不是報(bào)警 在此之前 需定義一個(gè)學(xué)習(xí)狀態(tài) */
- u8 RF433_Data_Parser(void)
- {
- /* 433數(shù)據(jù)接收成功 */
- if( rf433_msg_rev_success == YES )
- {
- /* 清除標(biāo)志位 */
- 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 )
- {
- /* 學(xué)習(xí)狀態(tài) 存儲(chǔ)數(shù)據(jù) */
- printf("-------> Is learn status,please save data!!\n");
- /* 此處調(diào)用flash存放函數(shù) 存儲(chǔ)成功 需 isLearnStatus 清除 */
-
- /* 學(xué)習(xí)狀態(tài) 非報(bào)警 */
- return 2;
- }
- /* 解析數(shù)據(jù) */
- if( (rf433_save_data[0]==rf_data[0]) && \
- (rf433_save_data[1]==rf_data[1]) && \
- (rf433_save_data[2]==rf_data[2]) )
- {
- /* 煙感同步頭與學(xué)習(xí)到存儲(chǔ)的數(shù)據(jù)一致 */
- /* 即使煙感報(bào)警 */
- 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**********************/
復(fù)制代碼
所有資料51hei提供下載:
433定時(shí)器中斷解碼.rar
(4.66 KB, 下載次數(shù): 185)
2019-1-9 15:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|