标题:
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.51hei.com/bbs/)
Powered by Discuz! X3.1