• 用定时中断来接收红外遥控信号


    //====红外接收相关定义=============================
    #define		IrDatHigh	(P_IrRec == 1) //接收数据高
    #define		IrDatLow	(P_IrRec == 0) //接收数据低
    #define		Ir_EdgeDown	((RStatus_IR&0x03) == 0x02)//IR下降沿 1--0
    #define		Ir_EdgeUp		((RStatus_IR&0x03) == 0x01) //IR上升沿 0--1
    
    //红外数据长度 N个字节 可自定义
    #define		IrDatLong     (uint8)20  
    
    //--------------起始
    #define		TST_LOW				(uint8)107 //起始低脉宽 5.35MS
    #define		TST_LOW_L			(TST_LOW - 20) //起始低判断范围
    #define		TST_LOW_H			(TST_LOW + 20) //12
    #define		TST_HIGH			(uint8)145 //起始高脉宽 7.25MS
    #define		TST_HIGH_L		(TST_HIGH - 20) //起始高判断范围
    #define		TST_HIGH_H		(TST_HIGH + 20) //
    //---------------数据
    #define		TDAT_LOW			(uint8)28  //数据低脉宽 1.4MS
    #define		TDAT_LOW_L		(TDAT_LOW - 19) //数据
    #define		TDAT_LOW_H		(TDAT_LOW + 19) //10
    #define		TDAT_HIGH			(uint8)66  //数据高脉宽 3.3MS
    #define		TDAT_HIGH_L		(TDAT_HIGH - 19) //数据
    #define		TDAT_HIGH_H		(TDAT_HIGH + 19) //
    
    
    
    void interrupt ser(void)//中断服务程序 
    {
    	static 	uint8 PIR = 0 ;
    	static 	uint8 RStatus_IR = 0 ;
    	static uint8 ByteNum=0,BitNum=0;
    	
    	TIM6_SR1 = 0x00;  // 清除更新标志		50u 中断一 次
    	
    
    	TconIr ++ ; //脉冲计数
    	if(TconIr == 0) //溢出
    	{
    		RMIR = MIR_RST ; //退出接收状态	
    	}
    		
    	PIR <<= 1 ;
    	if(IrDatHigh) //读IR接收管脚的状态
    	{
    		PIR |= 0x01 ;
    	}
    	
    	//对接收管脚的数据进行滤波处理
    	RStatus_IR <<= 1 ;
    	if((PIR & 0x07) == 0x07)//111
    	{	
    		RStatus_IR |= 0X01 ;
    	}
    	else if((PIR & 0x07) == 0X00)//000
    	{
    		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 ;//可以取数据
    					}
    				}
    			}
    		}
    	}
    }


  • 相关阅读:
    HTTP代理简介
    解决键盘Alt+Win键功能反了的问题
    设置锁屏后关闭显示器时间
    通过ffmpeg下载在线HTTP Live Stream视频
    一款好用的磁盘占用分析工具——WizTree
    vite2 打包的时候vendorxxx.js文件过大的解决方法
    nfPress —— 在线文档也可以加载组件和编写代码
    通过UI库深入了解Vue的插槽的使用技巧
    基于 vite2 + Vue3 写一个在线帮助文档工具
    【mysql】sql查看mysql 数据库 数据表 容量大小
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3212396.html
Copyright © 2020-2023  润新知