【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("\r\nRFTransmit 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;

	}	
}

总结

提示:这里对文章进行总结:

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值