/*********************************************
简介:
本程序为模拟红外协议的接收程序 包含起始码和数据码
本程序现固定一次性接收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 Flg1: 1 ;
uint8 Flg2: 1 ;
uint8 Flg3: 1 ;
uint8 Flg4: 1 ;
uint8 Flg5: 1 ;
uint8 Flg6: 1 ;
uint8 Flg7: 1 ;
uint8 Flg8: 1 ;
}tFlg ;
//====结构体声明====
tFlg F1;
//=====F1=========
#define F_10MS F1.Flg1
#define F_IrRecOk F1.Flg2 //单线接收数据成功
#define F_IrStatus F1.Flg3 //单线接收数据状态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 ;//可以取数据
}
}
}
}
}

浙公网安备 33010602011771号