#define _1_HighCap
#define _1_LowFroor
#define _0_HighCap
#define _0_LowFroor
#define Head_Cap
#define Head_Froor
#define IRDA_Read() //读出IRDA引脚的电平的方法
// 当高电平的时间在 _1_LowFroor和_1_HighCap之间时认为接收到 1
//当高电平时间在 _0_LowFroor 和 _0_HighCap 之间时认为就收到 0
uint16_t Get_LowTime(void)
{
//实现一个获取高电平的时间的函数
}
uint16_t Get_HighTime(void)
{
//实现一个回去低电平时间的函数
}
void Test(void)
{
uint8_t HeadCode=0; //第七位为 1表示接收到头码 [6:0]位 用来存储 接收到的电平个数
uint8_t Irad_Buff[4]; //0-7 地址码 8-15 地址码反码 16-23 数据码 24-31 数据码反码
uint8_t Byte,Bit;
uint16_t HighTime;
while(1)
{
if(!IRDA_Read())//出现了低电平
{
if(!(HeadCode&0x80))//如果没有接受到头码
{
Get_LowTime();//过滤低电平
HighTime=Get_HighTime();
if(HighTime>Head_Froor&&HighTime<Head_Cap) //如果高电平的时间在这两个数之间 就
认为头码来了 {
HeadCode|=0x80;//标记头码来了
}
}
else
{
for(Byte=0;Byte<4;Byte++)
{
for(Bit=0;Bit<8;Bit++)
{
Get_LowTime();//过滤低电平
HighTime=Get_HighTime();
if(HighTime>_1_LowFroor&&HighTime<_1_HighCap)
{
Irad_Buff[Byte]>>=1;
Irad_Buff[Byte]|=0x80;
HeadCode++;
}
if(HighTime>_0_LowFroor&&HighTime<_0_HighCap)
{
Irad_Buff[Byte]>>=1;
Irad_Buff[Byte]&=0x7f;
HeadCode++;
}
}
}
HeadCode&=0x7f;
if(HeadCode==32&&Irad_Buff[0]+Irad_Buff[1]==0xff&&Irad_Buff[2]+Irad_Buff[3]==0xff)
{
HeadCode=0;
//解码正确 得到的编码就是Irad_Buff[2]
}
else
{
//错误
HeadCode=0;
}
}
}
}
}
|