您的位置:首页 > 其它

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

2013-07-24 20:39 260 查看
//====红外接收相关定义=============================
#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 ;//可以取数据
}
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: