当前位置:编程学习 > C/C++ >>

模拟红外协议接收程序

/*********************************************
简介:
本程序为模拟红外协议的接收程序 包含起始码和数据码
本程序现固定一次性接收16BIT(2字节)的数据
起始码与数据码长度定义如下图(用户可自行更改):
 
**********************************************/
#define		P_IrRec			PF4_IN	//接收IO定义


//=====红外接收模式=====
#define		MIR_RST			(uint8)0  //空闲状态
#define		MIR_P1			(uint8)1 //正接收起始码
#define		MIR_P2			(uint8)2 //正接收数据


//====红外接收相关定义=============================
#define		IrDatHigh	(P_IrRec == 1) //接收数据高
#define		IrDatLow	(P_IrRec == 0) //接收数据低
#define		Ir_EdgeDown	((RStatus_IR&0x03) == 0x02)//IR下降沿
#define		Ir_EdgeUp		((RStatus_IR&0x03) == 0x01) //IR上升沿
//红外数据长度 N个字节
#define		IrDatLong     (uint8)2  
//--------------起始
#define		TST_LOW				(uint8)50 //起始低脉宽
#define		TST_LOW_L			(TST_LOW - 5) //起始低判断范围
#define		TST_LOW_H			(TST_LOW + 5) //12
#define		TST_HIGH			(uint8)100 //起始高脉宽 1字节
#define		TST_HIGH_L		(TST_HIGH - 5) //起始高判断范围
#define		TST_HIGH_H		(TST_HIGH + 5) //
//---------------数据
#define		TDAT_LOW			(uint8)25  //数据低脉宽
#define		TDAT_LOW_L		(TDAT_LOW - 5) //数据
#define		TDAT_LOW_H		(TDAT_LOW + 5) //10
#define		TDAT_HIGH			(uint8)50  //数据高脉宽
#define		TDAT_HIGH_L		(TDAT_HIGH - 5) //数据
#define		TDAT_HIGH_H		(TDAT_HIGH + 5) //



//====标志位定义====
typedef	struct Flag
{
		uint8 Flg1: 1 ;
		uint8 Flg2: 1 ;
		uint8 Flg3: 1 ;
		uint8 Flg4: 1 ;
		uint8 Flg5: 1 ;
		uint8 Flg6: 1 ;
		uint8 Flg7: 1 ;
		uint8 Flg8: 1 ;	
		
}tFlg ;
//====结构体声明====
tFlg F1;
//=====F1=========
#define		F_10MS				F1.Flg1
#define		F_IrRecOk			F1.Flg2 //单线接收数据成功
#define		F_IrStatus			F1.Flg3 //单线接收数据状态0 1


uint8 RMIR = 0 ; //单线接收模式

//--数据接收缓存区----------
uint8 IrDatRce[2] ;
uint8 R_RecDat[2] ;


//***************************************
// 函数名称:CmdRecData
// 函数功能:控制单线接收数据
// 入口参数:无
// 出口参数:无
//***************************************
void CmdRecData(void) 
{
		if(!F_IrRecOk)return ;
		F_IrRecOk = 0 ;

		R_RecDat[0] = IrDatRce[0] ;
		R_RecDat[1] = IrDatRce[1] ;

		//处理接收到的数据
}

//====主程序==========
void main(void)
{
	while(1)
	{
		while(!F_10MS) ; //10ms跑一次主程序
		F_10MS = 0 ;

		CmdRecData() ; //接收数据处理
	}
}

//中断服务程序   50u 中断一 次   
void interrupt ser(void) 
{
	static 	uint8 TconIr = 0 ;
	static 	uint8 PIR = 0 ;
	static 	uint8 RStatus_IR = 0 ;
	static uint8 ByteNum=0,BitNum=0;
	
    TIM6_SR1 = 0x00;  // 清除更新标志   

	TconIr ++ ; //脉冲计数
	if(TconIr == 0) //溢出
	{
			RMIR = MIR_RST ; //退出接收状态	
	}
		
	PIR <<= 1 ;
	if(IrDatHigh)
	{
			PIR |= 0x01 ;
	}
	
	RStatus_IR <<= 1 ;
	if((PIR & 0x03) == 0X03)//111
	{	
			RStatus_IR |= 0X01 ;
	}
	else if((PIR & 0x03) == 0X00)
	{
			RStatus_IR &= ~0X01 ;		
	}
	else 
	{
			if(RStatus_IR & 0x02)RStatus_IR |= 0x01 ;
	}
	
	if(F_IrRecOk) return ; //数据未取出 不再接收数据
	//--//上升沿----//下降沿-------------
	if(Ir_EdgeDown || Ir_EdgeUp) 
	{
		//-------1111--空闲--------------------
			if(RMIR == MIR_RST) //
			{
					if(Ir_EdgeUp) 
					{
							RMIR = MIR_RST ; //退出接收状态
					}
					else 
					{
							TconIr = 0 ;
							RMIR = MIR_P1 ;//接收起始
							F_IrStatus = 0 ;// 接收起始低
					}
			}
			//----22222--接收起始码-----------------
			else if(RMIR == MIR_P1)//
			{
					if(!F_IrStatus)//起始状态0 只收上升沿
					{
							if(Ir_EdgeUp)
							{ //接收起始码低电平脉宽
									if((TconIr >= TST_LOW_L) && (TconIr <= TST_LOW_H))
									{
											F_IrStatus = 1 ; //起始低验证成功
											TconIr = 0 ;
									}
									else 
									{
											RMIR = MIR_RST ; //退出接收状态
									}
							}
					}
					else //if(F_IrStatus)//起始状态1 只收下升沿
					{
							if(Ir_EdgeDown)
							{//接收起始码高电平脉宽
									if((TconIr >= TST_HIGH_L) && (TconIr <= TST_HIGH_H))
									{
											RMIR = MIR_P2 ; //起始高验证成功
											TconIr = 0 ;
											ByteNum = 0;
											BitNum = 0;
									}
									else 
									{
											RMIR = MIR_RST ; //退出接收状态
									}
							}	
					}
			}
			//----33333--接收数据码--------------
			else if(RMIR == MIR_P2) //
			{
					if(Ir_EdgeUp)//滤过低电平
					{
							TconIr = 0 ;
							return ;
					}
					else //if()
					{		//接收到数据低
							if((TconIr >= TDAT_LOW_L)&&(TconIr <= TDAT_LOW_H))
							{		
									IrDatRce[ByteNum] &= ~(1<<BitNum) ;		
							}//接收到数据高
							else//if((TconIr >= TDAT_LOW_L) && (TconIr <= TDAT_LOW_H))
							{
									IrDatRce[ByteNum] |= (1<<BitNum) ;
							}
							BitNum ++ ;
							if(BitNum > 7)
							{
									BitNum = 0 ;
									ByteNum ++ ;
									if(ByteNum >= IrDatLong)
									{
											ByteNum = 0 ;
											RMIR = MIR_RST ;//结束完成 退出
											F_IrRecOk = 1 ;//可以取数据
									}
							}
					}
			}	

}

 


补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,