模拟红外协议接收程序
/*********************************************简介:
本程序为模拟红外协议的接收程序 包含起始码和数据码
本程序现固定一次性接收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 易做图1: 1 ; uint8 易做图2: 1 ; uint8 易做图3: 1 ; uint8 易做图4: 1 ; uint8 易做图5: 1 ; uint8 易做图6: 1 ; uint8 易做图7: 1 ; uint8 易做图8: 1 ; }t易做图 ; //====结构体声明==== t易做图 F1; //=====F1========= #define F_10MS F1.易做图1 #define F_IrRecOk F1.易做图2 //单线接收数据成功 #define F_IrStatus F1.易做图3 //单线接收数据状态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 ;//可以取数据 } } } } }
补充:软件开发 , C++ ,