//====红外接收相关定义=============================
#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 ;//可以取数据}}}}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!