搜档网
当前位置:搜档网 › 红外控制小车前后走,左右转程序

红外控制小车前后走,左右转程序

#include "reg52.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
void delay(uchar x);
void delay1(uint t);
void beep();
sbit Beep=P1^5;
sbit ENA = P3^0;
sbit ENB = P3^1;
sbit IRIN=P3^2;
uchar IRCOM[4],m,zuozhuan,youzhuan,zhuanwa,shache,qj,dc,j=20;
uchar K,a,b;
void motor_ffw()
{
if(a==1)
{ a=0;j+=4;if(j==80){j=76;}}
if(b==1)
{ b=0;j-=4;if(j==0){j=4;}}
if(youzhuan==1)
{youzhuan=0;m+=4;if(m==80){m=76;}}
if(zuozhuan==1)
{zuozhuan=0;m-=4;if(m==0){m=4;}}
if(K==0){P2=0X00;zhuanwa=0;}
if(shache==1)
{ P2=0X0F;shache=0;delay1(1000);}
}
void motor_zd()
{
motor_ffw();
if(K==1)
{ P2=0x05&0x0f;delay(j);P2=0X00;delay(80-j);qj=1;dc=0;}
if(K==2)
{ P2=0x0a&0x0f;delay(j);P2=0X00;delay(80-j);dc=1;qj=0;}
}
void motor_zw()
{
while(zhuanwa==1)
{
if(qj==1)
{
motor_ffw();
P2=0X04;
delay(m);
P2=0X01;
delay(80-m);
P2=0X00;
delay(140-j);

}
if(dc==1)
{
motor_ffw();
P2=0X08;
delay(m);
P2=0x02;
delay(80-m);
P2=0X00;
delay(140-j);
}
}
}
void delay1(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=125;j>0;j--);
}
main()
{
bit t=0;
EA=1;
ENA=1;
ENB=1;
EX0=1;
TCON=0X01;
IRIN=1;
while(1)
{
motor_ffw();
motor_zd();
motor_zw();
}
}
void beep()
{
unsigned char i;
for (i=0;i<200;i++)
{
delay1(1);
Beep=!Beep; //BEEP取反
}
Beep=1; //关闭蜂鸣器
}
void IR_IN(void) interrupt 0 //外部中断服务程序
{
uchar j,k,N=0;
EX0 = 0;
delay(15);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay(1);}

for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j

if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return; }
switch(IRCOM[2])
{
case 0x45:K=0;break;
case 0x15:b=1;break;
case 0x09:a=1;break;
case 0x44:shache=1;break;
case 0x19:K=1;j=20;zhuanwa=0;break;
case 0x46:K=2;j=20;zhuanwa=0;break;
case 0x40:zuozhuan=1;

break;
case 0x43:youzhuan=1;break;
case 0x47:zhuanwa=1;K=3;j=40;m=44;break;
}
beep();
EX0 = 1;
}
void delay(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {;}
}
}

相关主题