概述
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
433小结记录
- 记录
- 一、433小功率无线射频代码模块
- 二、使用步骤
- 1.433发射( 主循环阻塞发射 中断发射)
- 2.433接收数据 中断接收
- 总结
记录
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、433小功率无线射频代码模块
示例:一个通用的 433 发射接收 代码模块
二、使用步骤
1.433发射( 主循环阻塞发射 中断发射)
主循环阻塞发射码如下(示例):
//头文件声明
#define RF_DATA_L() Gpio_SetIO(3,3,0)
#define RF_DATA_H() Gpio_SetIO(3,3,1)
#define RF433_DATA_MORE_TIME 1000 //数据位多占空比
#define RF433_DATA_LESS_TIME 300 //数据位少占空比
#define RF433_SYNC_MORE_TIME 10000 //同步头多占空比
#define RF433_SYNC_LESS_TIME 300 //同步头少占空比
typedef enum
{
SyncLessLevel=0x01,
SyncMoreLevel,
DataHLevel,
DataLLevel
}_RFDataState;
extern unsigned int SyncMoreTickTime; //同步时间
extern unsigned int SyncLessTickTime;
extern unsigned int DataLTickTime; //主时间
extern unsigned int DataHTickTime; //次时间
extern unsigned char Count;
extern unsigned char SendRFDataEndFlg;
//初始化
unsigned char RFDataState=SyncLessLevel;
unsigned int SyncMoreTickTime=0; //同步时间
unsigned int SyncLessTickTime=0;
unsigned int DataLTickTime=0; //主时间
unsigned int DataHTickTime=0; //次时间
unsigned char Count=0;
unsigned char SendRFDataEndFlg=FALSE;
unsigned char DataEndFlg=FALSE;
//发送RF码核心 主循环阻塞发射
void RF_Send(void)
{
switch(RFDataState)
{
case SyncLessLevel:
if(SyncLessTickTime==0)
{
SyncLessTickTime=RF433_SYNC_LESS_TIME;//Send_RF_Time.RF_H_Time[0];
RF_DATA_H();
LED_ON;
while(SyncLessTickTime!=0)
{
SyncLessTickTime--;
}
RFDataState=SyncMoreLevel;
}
break;
case SyncMoreLevel:
if(SyncMoreTickTime==0)
{
SyncMoreTickTime=RF433_SYNC_MORE_TIME;//Send_RF_Time.RF_L_Time[0];
RF_DATA_L();
LED_OFF;
while(SyncMoreTickTime!=0)
{
SyncMoreTickTime--;
}
RFDataState=DataHLevel;
}
break;
case DataHLevel:
if(DataHTickTime==0)
{
RF_DATA_H();
LED_ON;
if(TxServerData[Count/8]&(0x01<<(7-Count%8)))
{
DataHTickTime=RF433_DATA_MORE_TIME;//Send_RF_Time.RF_H_Time[Count+1];
}
else
{
DataHTickTime=RF433_DATA_LESS_TIME;//Send_RF_Time.RF_H_Time[Count+1];
}
while(DataHTickTime!=0)
{
DataHTickTime--;
}
RFDataState=DataLLevel;
}
break;
case DataLLevel:
if(DataLTickTime==0)
{
RF_DATA_L();
LED_OFF;
if(TxServerData[Count/8]&(0x01<<(7-Count%8)))
{
DataLTickTime=RF433_DATA_LESS_TIME;//Send_RF_Time.RF_H_Time[Count+1];
}
else
{
DataLTickTime=RF433_DATA_MORE_TIME;//Send_RF_Time.RF_H_Time[Count+1];
}
while(DataLTickTime!=0)
{
DataLTickTime--;
}
Count++;
if(Count>=24)
{
Count=0;
DataEndFlg=TRUE;
SendRFDataEndFlg=TRUE;
RFDataState=SyncLessLevel;
}
else
RFDataState=DataHLevel;
}
break;
}
}
//发射一次 多发几帧数据 防止接收不到
void RFTransmit(void)
{
unsigned char Cnt;
Cnt=RF_SEND_COUNT;
while(Cnt)
{
RF_Send();
if(SendRFDataEndFlg)
{
SendRFDataEndFlg=FALSE;
Cnt--;
}
}
//printf("rnRFTransmit OK");
}
中断发射代码如下(示例):
//Timer1配置初始化
void Timer1Cfg(uint16_t u16Period)
{
uint16_t u16ArrValue;
uint16_t u16CntValue;
stc_bt_mode0_cfg_t stcBtBaseCfg;
DDL_ZERO_STRUCT(stcBtBaseCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralBaseTim, TRUE); //Base Timer外设时钟使能
stcBtBaseCfg.enWorkMode = BtWorkMode0; //定时器模式
stcBtBaseCfg.enCT = BtTimer; //定时器功能,计数时钟为内部PCLK
stcBtBaseCfg.enPRS = BtPCLKDiv1; //PCLK/256
stcBtBaseCfg.enCntMode = Bt16bitArrMode; //自动重载16位计数器/定时器
stcBtBaseCfg.bEnTog = FALSE;
stcBtBaseCfg.bEnGate = FALSE;
stcBtBaseCfg.enGateP = BtGatePositive;
Bt_Mode0_Init(TIM1, &stcBtBaseCfg); //TIM0 的模式0功能初始化
u16ArrValue = 0x10000 - u16Period;
Bt_M0_ARRSet(TIM1, u16ArrValue); //设置重载值(ARR = 0x10000 - 周期)
u16CntValue = 0x10000 - u16Period;
Bt_M0_Cnt16Set(TIM1, u16CntValue); //设置计数初值
Bt_ClearIntFlag(TIM1,BtUevIrq); //清中断标志
Bt_Mode0_EnableIrq(TIM1); //使能TIM0中断(模式0时只有一个中断)
EnableNvic(TIM1_IRQn, IrqLevel3, TRUE); //TIM0中断使能
}
void RFTransmit(void) //发射
{
static unsigned char clock=0;
if(DataEndFlg==TRUE&&clock==0)
{
clock=1;
Bt_M0_Run(TIM1); //TIM0 运行。
}
if(DataEndFlg == FALSE)
{
clock=0;
}
}
/**
*******************************************************************************
** brief TIM1 中断处理函数
**
** retval
******************************************************************************/
void TIM1_IRQHandler(void)
{
static unsigned char SendCnt=50;
//Timer0 模式0 溢出中断
if(TRUE == Bt_GetIntFlag(TIM1, BtUevIrq))
{
Bt_ClearIntFlag(TIM1,BtUevIrq); //中断标志清零
switch(RFDataState)
{
case SyncLessLevel:
if(SyncLessTickTime==0)
SyncLessTickTime=RF433_SYNC_LESS_TIME;//
if(SyncLessTickTime>=1)
{
RF_DATA_H();
SyncLessTickTime--;
if(SyncLessTickTime==0)
RFDataState=SyncMoreLevel;
}
break;
case SyncMoreLevel:
if(SyncMoreTickTime==0)
SyncMoreTickTime=RF433_SYNC_MORE_TIME;
if(SyncMoreTickTime>=1)
{
RF_DATA_L();
//LED_OFF; //闪灯
SyncMoreTickTime--;
if(SyncMoreTickTime==0)
RFDataState=DataHLevel;
}
break;
case DataHLevel:
if(DataHTickTime==0)
{
if(TxServerData[Bit433Count/8]&(0x01<<(7-Bit433Count%8)))
{
DataHTickTime=RF433_DATA_MORE_TIME;//Send_RF_Time.RF_H_Time[Count+1];
}
else
{
DataHTickTime=RF433_DATA_LESS_TIME;//Send_RF_Time.RF_H_Time[Count+1];
}
}
if(DataHTickTime>=1)
{
RF_DATA_H();
//LED_ON; //闪灯
DataHTickTime--;
if(DataHTickTime==0)
RFDataState=DataLLevel;
}
break;
case DataLLevel:
if(DataLTickTime==0)
{
if(TxServerData[Bit433Count/8]&(0x01<<(7-Bit433Count%8)))
{
DataLTickTime=RF433_DATA_LESS_TIME;//Send_RF_Time.RF_H_Time[Count+1];
}
else
{
DataLTickTime=RF433_DATA_MORE_TIME;//Send_RF_Time.RF_H_Time[Count+1];
}
}
if(DataLTickTime>=1)
{
RF_DATA_L();
//LED_OFF; //闪灯
DataLTickTime--;
if(DataLTickTime == 0)
{
Bit433Count++;
RFDataState=DataHLevel;
}
}
if(Bit433Count>=24)
{
Bit433Count=0;
RFDataState=SyncLessLevel;
SendCnt--;
if(SendCnt==0)
{
SendCnt=50;
DataEndFlg=FALSE;
Bt_M0_Stop(TIM1); //TIM0 运行。
}
}
break;
}
}
}
2.433接收数据 中断接收
代码如下(示例):
/**
*******************************************************************************
** brief GPIO Port3 中断处理函数
**
** retval
******************************************************************************/
void PORT3_IRQHandler(void)
{
// 清标志 //P32 接收脚
Gpio_ClearIrq( 3, 2);
rx433_count1 = TickTim1-rx433_count0;
rx433_count0 = TickTim1;
if(Gpio_GetIO( 3, 2) == 1)
{
RX433_L_Time=rx433_count1;
RF_Read();
}
else
RX433_H_Time=rx433_count1;
}
//每一Bit接收处理
unsigned char RF_Read1BitData(void) //输出0=正确码L 输出1=正确码H 输出2=同步码 输出3 错误码
{
if(RX433_H_Time>RX433_L_Time)
{
if((RX433_L_Time<RX433_H_Time/10*8)&&(RX433_H_Time<RX433_L_Time*6))return 1; //占空比为55%--85% 之间则判断为正确码 1
else return 3;
}
else
{
if((RX433_H_Time<RX433_L_Time/10*8)&&(RX433_L_Time<RX433_H_Time*6))return 0; //占空比为15%--45% 之间则判断为正确码 0
else if((RX433_L_Time>RX433_H_Time*9)&&(RX433_L_Time<RX433_H_Time*50)) return 2; //占空比小于10% 则视为同步码
else return 3;
}
}
//解码核心程序
void RF_Read(void) //解码:以同步码开始
{
unsigned char Data;
unsigned char Ram_Addr;
switch(RF_Count)
{
case 24:
Data=RF_Read1BitData();
if(Data==2) //第24位为同步码 则解码成功
{
if((RF_BufRam[0]==RF_DataRam[0])&&(RF_BufRam[1]==RF_DataRam[1])&&(RF_BufRam[2]==RF_DataRam[2]))
{
if(Decod_cnt<10)Decod_cnt++;
}
else
{
Decod_cnt=0;
}
RF_BufRam[0]=RF_DataRam[0];
RF_BufRam[1]=RF_DataRam[1];
RF_BufRam[2]=RF_DataRam[2];
if(Decod_cnt==2)
{
Decod_RF=1;
Decod_cnt=0;
DecodeTimeCnt=RF_READ_OFFTIME;
TxServerData[0]=RF_DataRam[0];
TxServerData[1]=RF_DataRam[1];
TxServerData[2]=RF_DataRam[2];
}
Decod_time=0;
RF_Count=0;//结束解码
RF_DataRam[0]=0;
RF_DataRam[1]=0;
RF_DataRam[2]=0;
}
else
{ //收到错误码和同步码 则清0计数
RF_Count=0;
RF_DataRam[0]=0;
RF_DataRam[1]=0;
RF_DataRam[2]=0;
}
break;
default:
Data=RF_Read1BitData();
if(Data==0)
{
Ram_Addr=RF_Count/8;
RF_DataRam[Ram_Addr]=RF_DataRam[Ram_Addr]<<1;
RF_DataRam[Ram_Addr]=RF_DataRam[Ram_Addr]&0xfe; //最低位=0
RF_Count++;
}
else if(Data==1)
{
Ram_Addr=RF_Count/8;
RF_DataRam[Ram_Addr]=RF_DataRam[Ram_Addr]<<1;
RF_DataRam[Ram_Addr]=RF_DataRam[Ram_Addr]|0x01; //最低位=1
RF_Count++;
}
else
{ //收到错误码和同步码 则清0计数
RF_Count=0;
RF_DataRam[0]=0;
RF_DataRam[1]=0;
RF_DataRam[2]=0;
}
break;
}
}
void RFStatusProc(void)
{
if(Decod_RF&& DecodeTimeCnt==0) //RF解码成功标志且超过500ms未解码成功才开始转发
{
Decod_RF=0;
}
}
总结
提示:这里对文章进行总结:
最后
以上就是淡定煎饼为你收集整理的【433 发射接收源码】记录一、433小功率无线射频代码模块二、使用步骤总结的全部内容,希望文章能够帮你解决【433 发射接收源码】记录一、433小功率无线射频代码模块二、使用步骤总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复