提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
以下普通IO口不用IO口中断的红外线接收程序。
提示:以下是本篇文章正文内容,下面案例可供参考
一、红外检测程序
#define IR P01 //接收脚位定义
u8 IR_Sign;
u8 IR_Mode;
u8 Time_100us;
u8 Time_20ms;
u8 Reload_T16;
u32 IR_Data;
u8 i;
u32 data;
void IR_Receive(void)
{
switch(IR_Mode)
{
case 0://初始等待起始码到来
if(!IR)
{
IR_Mode = 1;
IR_Sign = 1;
}
else
{
IR_Mode = 0;
}
Time_20ms = 0;
Time_100us = 0;
break;
case 1://判断起始码是否成立
if(IR_Sign)
{
if(IR)//等待高电平出现准备进入低电平检测
{
IR_Sign = 0;
}
}
else
{
if(!IR)
{
if(Time_100us >= 130 && Time_100us <= 140)//判断起始码的时间是否在(9ms+4.5ms)左右
{
IR_Mode = 2;//起始码正确,进入下个模式
IR_Sign = 1;
Time_20ms = 0;
Time_100us = 0;
i = 0;
}
else
{
IR_Mode = 0;//起始码错误,重新判断起始码
}
}
}
break;
case 2://判断数据码0或1,并记录
if(IR_Sign)
{
if(IR)//等待高电平出现准备进入低电平检测
{
IR_Sign = 0;
}
}
else
{
if(!IR)
{
if(Time_100us >= 15)//判断数据码是1
{
IR_Mode = 2;
IR_Sign = 1;
data <<= 1;
data++;
Time_20ms = 0;
Time_100us = 0;
}
else//判断数据码是0
{
IR_Mode = 2;
IR_Sign = 1;
data <<= 1;
nop;
Time_20ms = 0;
Time_100us = 0;
}
i++;
if(i==32)//数据全部接受完毕,进入下一个模式
{
IR_Mode = 3;
}
}
}
break;
case 3:
IR_Data = data;
Uart0_Printf("IR_Data = %x.\n",IR_Data);
IR_Mode = 0;
break;
}
}
总结
以上就是普通IO口红外线接收的程序。