#include
#define uint unsigned int
#define uchar unsigned char
uint time;
float distance;
sbit right=P2^0;
sbit left=P2^1;
sbit Trig=P1^2;
sbit Echo=P3^2;
sbit Trig_R=P1^3;
sbit Echo_R=P3^2;
sbit Trig_L=P1^4;
sbit Echo_L=P3^2;
void delayms(uint x)
{
uint i;
for(x;x>0;x--)
for(i=124;i>0;i--);
}
void md_front() //前进
{
left=1;
delayms(1);
left=0;
right=1;
delayms(2);
right=0;
}
void turn_left() //左转
{
right=1;
delayms(2);
right=0;
}
void turn_right()
{
left=1;
delayms(1);
left=0;
}
void delay20us() //延时20US
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
void USM()
{
Trig=1;
delay20us();
Trig=0;
delay20us();
EX0=1;
while(!Echo); // 等待高电平
TR0=1;
while(TR0); //等待定时器关闭
EX0=0;
}
void USR()
{
Trig_R=1;
delay20us();
Trig_R=0;
delay20us();
EX0=1;
while(!Echo_R); // 等待高电平
TR0=1;
while(TR0); //等待定时器关闭
EX0=0;
}
void USL()
{
Trig_L=1;
delay20us();
Trig_L=0;
delay20us();
EX0=1;
while(!Echo_L); // 等待高电平
TR0=1;
while(TR0); //等待定时器关闭
EX0=0;
}
float getdistance(uchar ch)
{
float T=0;
uchar i;
for(i=0;i<10;i++)
{
if(ch==0)
USM();
else if(ch==1)
USR();
else if(ch==2)
USL();
T+=time;
delayms(400);
}
T/=10;
distance=0.17*T; //计算距离
return distance;
}
void main()
{
TMOD=0x01;
EA=1; //开总中断
EX0=1; //关外部中断0
IT0=1; //下降沿中断
TR0=0; //关闭定时器0
Trig=0;
Trig_R=0;
Trig_L=0;
while(1)
{
if(getdistance(0))
{
if(distance<40)
{
if(getdistance(1))
{
if(distance<40)
turn_left();
}
if(getdistance(2))
{
if(distance<40)
turn_right();
}
else
md_front();
}
}
if(getdistance(1))
{
if(distance<40)
turn_left();
else
md_front();
}
if(getdistance(2))
{
if(distance<40)
turn_right();
else
md_front();
}
}
}
void Exter() interrupt 0 //回响输出端高电平宽度测量(上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时)
{
TR0=0;
time=(TH0*256+TL0); //计算定时器内的测量值
TH0=0; //定时器清0
TL0=0;
}
电机为VEX三线电机,超声波是HC-SR04