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

//====红外接收相关定义=============================
#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<= TDAT_LOW_L) && (TconIr <= TDAT_LOW_H)){IrDatRce[ByteNum] |= (1< 7){BitNum = 0 ;ByteNum ++ ;if(ByteNum >= IrDatLong){ByteNum = 0 ;RMIR = MIR_RST ;//结束完成 退出F_IrRecOk = 1 ;//可以取数据}}}}}
}



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部