STM8_無線315&433通用解碼
單片機源程序如下:
- /*
- *********************************************************************************************************
- *
- * 模塊名稱 : EV1527遙控解碼
- *
- 上升沿觸發 觸發中斷后延時一段時間后檢測引腳電平從而判斷0 1
- 采集上升沿觸發后第6 10 14 個振蕩周期時的引腳電平 RF98
- PT2262 連續觸發是每個周期的間隔在15MS左右
- EV1527 寬電平時間 500US 窄 250us 同步碼 5.7MS
- *********************************************************************************************************
- */
- #include "EV1527.h"
- #include "led.h"
- #include "tim1.h"
- u8 EV1527_Status=0; //接收處理狀態
- u8 EV1527_Receive_Count=0; //接收數據位計數
- Receive_Data EV1527_Receive_Data[48]; //24位的脈沖
- u8 EV1527_receive_ok=0; //接收完成標志
- //u8 EV1527_gather_count=3; //每個碼位采集3次
- //u8 EV1527_code[3]; //用來暫時存儲采集3次得到的值
- //u8 EV1527_repeat; //重復觸發計數
- u8 EV1527_check_level_bit; //外部中斷觸發(上升沿)標志。有外部中斷觸發后則開始檢測引腳電平是否有變化。
- u16 Interval_tim_high=0; //上升沿觸發后高電平時間
- u16 Interval_tim_low=0; //上升沿觸發后低電平時間
- u8 EV1527_pin_state_buf; //引腳定義緩存
- u16 EV1527_time_out_buf; //定時器超時時間緩存
- u16 TongBuMa_low=0;
- u16 a_count=0;
- bool LearningModel=FALSE; //學習模式
- bool INT_bit=FALSE;
- // 定時器2配置函數
- void EV1527_TIM1_Config(void)
- {
- TIM1_TimeBaseInit(8,TIM1_COUNTERMODE_UP,50000,0); //8分頻,定時50MS,1uS的分辨率
- TIM1_ARRPreloadConfig(ENABLE);
- TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);
- TIM1_Cmd(ENABLE);//DISABLE
- }
- /*
- 初始化
- */
- void EV1527_Init()
- {
- /* 輸入模式 */
- GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //配置浮空輸入。
- /* 將GPIOD端口設置為下降沿觸發中斷-*/
- EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿觸發。
- GPIO_Init(LED_PORTD, (LED_2|LED_3), GPIO_MODE_OUT_PP_HIGH_FAST );
- EV1527_TIM1_Config();
- }
- /*
- ********************************************************************************
- 定時器溢出中斷內處理
- ********************************************************************************
- */
- void EV1527_TIM_IT_Updata_Handdle(void)
- {
- TIM1_SetCounter(0);
- EV1527_Status=0;
- EV1527_Receive_Count=0;
- //EV1527_repeat=0;
- //EV1527_Receive_Data=0;
- Interval_tim_low=0;
- EV1527_time_out_buf=0;
- // TIM1_Cmd(DISABLE);
- TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
-
- }
- /*
- 外部中斷觸發函數
- 開始接收地址碼跟數據碼
- */
- void EV1527_ChuLi(void)
- {
- //for(EV1527_Receive_Count=0;EV1527_Receive_Count<48;EV1527_Receive_Count++)
- EV1527_Receive_Count=0;
- while(EV1527_Receive_Count<48)
- {
- while((EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1)); //如果是高電平就等待
- Interval_tim_high=TIM1_GetCounter(); //記錄高電平時間
- TIM1_SetCounter(0);
- EV1527_Receive_Data[EV1527_Receive_Count].Width=Interval_tim_high;
- EV1527_Receive_Data[EV1527_Receive_Count].Level=1; //保存到數組中
- EV1527_Receive_Count++;
- while(!(EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1)); //如果是低電平就等待
- Interval_tim_low=TIM1_GetCounter(); //記錄高電平時間
- TIM1_SetCounter(0);
- EV1527_Receive_Data[EV1527_Receive_Count].Width=Interval_tim_low;
- EV1527_Receive_Data[EV1527_Receive_Count].Level=0; //保存到數組中
- EV1527_Receive_Count++;
- if(EV1527_Status==0)
- {
- EV1527_Receive_Count=49;//超時退出
- }
- }
- if(EV1527_Status==0)
- {
- EV1527_receive_ok=0;
- EV1527_Receive_Count=0;
- GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);//配置上啦輸入。
- EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿觸發。
- TIM1_SetCounter(0);
- }
- else
- {
- EV1527_receive_ok=1;
- }
- }
- void EV1527_Receive_Handle(void)
- {
- if(INT_bit==TRUE)
- {
- INT_bit=FALSE;
- /* 開啟定時器 0 記錄低電平持續的時間,并檢測是否為同步碼 */
- a_count=0;
- TongBuMa_low=0;
- EV1527_Status=1;
- while(!(EV1527_port->IDR &EV1527_pin)&&(EV1527_Status==1)); //如果是低電平就等待
- if(EV1527_Status==TRUE) TongBuMa_low=TIM1_GetCounter(); //記錄低電平時間
- TIM1_SetCounter(0); //從新計時。
- /* 檢測是否為同步碼*/
- if((TongBuMa_low>=5000)&&(TongBuMa_low<=38000)) //檢測前一個低電平時間,是否符合同步碼標
- //是同步碼 關閉外部中斷,并開始接收地址碼跟數據碼
- {
- EV1527_ChuLi();
- }
- else //不是,則重新打開中斷,繼續檢測同步碼
- {
- EV1527_Status=0;
- EV1527_Receive_Count=0;
- GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //配置上啦輸入。
- EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿觸發。
- TIM1_SetCounter(0); //定時器計數值清零
- }
- }
-
- }
- /*
- 數據處理
- */
- u8 EV1527_Process()
- {
- u8 EV1527_Data=0;
-
- if(EV1527_receive_ok>=1)
- {
- u8 i=0;
- u8 beishu=0;
- u8 EV1527_DataTemp[24]={0};
- u8 EV1527_addTemp_high=0;
- u8 EV1527_addTemp_low=0;
- // High_Low Level_0,Level_1; //電平
- u16 Width_0,Width_1; //寬度
- while(i<48)
- {
- // Level_0= EV1527_Receive_Data[i].Level;
- Width_0=EV1527_Receive_Data[i].Width;
- i++;
- // Level_1= EV1527_Receive_Data[i].Level;
- Width_1=EV1527_Receive_Data[i].Width;
- beishu=(Width_0>Width_1)?(Width_0/Width_1):(Width_1/Width_0);
- if(beishu>=2)//如果兩個寬度的倍數大于等于2說明是有效電平
- {
- EV1527_DataTemp[i/2]= (Width_0>Width_1)?1:0;
- }
- else
- {
- i=50;
- }
- i++;
- // if(i>=46)
- // {
- // Level_0= EV1527_Receive_Data[i].Level;
- // }
- }
- if(i<49)
- {
- //解析地址
- for(i=0;i<20;i++)
- {
- if(i<10)//解析高位 EV1527_address_high
- {
- if(EV1527_DataTemp[i]==1) // 置一
- {
- EV1527_addTemp_high<<=1;
- EV1527_addTemp_high=EV1527_addTemp_high|0x01;
- }
- else if(EV1527_DataTemp[i]==0) //置零
- {
- EV1527_addTemp_high<<=1;
- }
- }
- else //解析低位
- {
- if(EV1527_DataTemp[i]==1) // 置一
- {
- EV1527_addTemp_low<<=1;
- EV1527_addTemp_low=EV1527_addTemp_low|0x01;
- }
- else if(EV1527_DataTemp[i]==0) //置零
- {
- EV1527_addTemp_low<<=1;
- }
- }
- }
- //解析數據
- for(i=20;i<24;i++)
- {
- if(EV1527_DataTemp[i]==1) // 置一
- {
- EV1527_Data<<=1;
- EV1527_Data=EV1527_Data|0x01;
- }
- else if(EV1527_DataTemp[i]==0) //置零
- {
- EV1527_Data<<=1;
- }
- }
- }
- EV1527_receive_ok=0;
- EV1527_Status=0;
- EV1527_Receive_Count=0;
- GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);//配置上啦輸入。
- EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);//下降沿觸發。
- TIM1_SetCounter(0);
- }
- return EV1527_Data;
- }
- /*
- 解碼處理后的執行函數
- */
- void EV1527_Action()
- {
- EV1527_Receive_Handle();
- u8 EV1527_buf=0;
- EV1527_buf=EV1527_Process();
- if(EV1527_buf)
- {
- GPIO_WriteReverse(GPIOD, GPIO_PIN_2);
- for(u8 i=0;i<EV1527_buf;i++)
- {
- LED_Operation(GPIO_PIN_3,ON );
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- LED_Operation(GPIO_PIN_3,OFF );
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
-
- }
- //GPIO_WriteReverse(GPIOD, GPIO_PIN_3);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- Delay(6000);
- }
- }
復制代碼
所有資料51hei提供下載:
STM8解碼EV1527.7z
(397.25 KB, 下載次數: 68)
2021-7-18 14:47 上傳
點擊文件名下載附件
STM8_無線315&433通用解碼 下載積分: 黑幣 -5
|