红外通信小车
红外通信遥控器按下按键后,会发射响应的高低电平变化的波,按响应的规律解码这些波,可以读出每个按键发射的波对应的数据,小车可以根据这些数据进行运动
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit en1=P2^0;
sbit en2=P2^1;
sbit IRIN=P3^2;
u8 value[4];
u8 Time;
void ycl()
{
IT0=1;
EX0=1;
EA=1;
IRIN=1;
en1=1;
en2=1;
}
void delay(u16 t)
{
while(t--);
}
void tingzhi()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void zhixing()
{
IN2=1;
IN4=1;
IN1=0;
IN3=0;
}
void zuozhuan()
{
IN1=0;
IN3=0;
IN4=0;
IN2=1;
}
void youzhuan()
{
IN1=0;
IN2=0;
IN3=0;
IN4=1;
}
void houtui()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void main()
{
ycl();
while(1)
{
if(value[2]==0x18)
{zhixing();}
if(value[2]==0x1c)
{tingzhi();}
if(value[2]==0x52)
{houtui();}
if(value[2]==0x08)
{youzhuan();
zhixing();}
if(value[2]==0x5a)
{zuozhuan();
zhixing();}
}
}
void read() interrupt 0
{
u8 j,k;
u16 err;
Time=0;
delay(700); //7ms
if(IRIN==0) //确认是否真的接收到正确的信号
{
err=1000; //1000*10us=10ms,超过说明接收到错误的信号
while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去
{
delay(1);
err--;//2ms
}
if(IRIN==1) //如果正确等到9ms低电平
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
{
delay(1);
err--;
}
for(k=0;k<4;k++) //共有4组数据
{
for(j=0;j<8;j++) //接收一组数据
{
err=60;
while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
{
delay(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
{
delay(10); //0.1ms
Time++;
err--;
if(Time>30)
{
return;
}
}
value[k]>>=1; //k表示第几组数据
if(Time>=8) //如果高电平出现大于565us,那么是1
{
value[k]|=0x80;//最左边添加1,移动7次到末尾
}
Time=0;
}
}
}
if(value[2]!=~value[3])
{
return;
}
}
}