zoukankan      html  css  js  c++  java
  • 模拟红外协议接收程序

    /*********************************************
    简介:
    本程序为模拟红外协议的接收程序 包含起始码和数据码
    本程序现固定一次性接收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 ;//可以取数据
    									}
    							}
    					}
    			}	
    
    }


  • 相关阅读:
    附加数据库对于服务器失败5120
    c#程序调试没有问题,Ctrl+F5运行就挂
    c#让某个窗体一直显示于桌面最上方
    c#调用GrADS
    备份对于服务器“”失败,加载的介质已格式化为支持1个介质簇,但根据指定的备份设备,应支持2个介质簇
    Assembly.Load()出错
    对控件部分的截图和录像
    创建oracle本地数据库步骤详解
    基于windows的resin配置
    oracle 插入记录,字段自动获取当前系统时间(YYYY-MM-DD HH24:MI:SS)
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3318176.html
Copyright © 2011-2022 走看看