超声波避障1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#define uint unsigned int

#define uchar unsigned char

/*制作联系//*/ QQ 274108610

sbit EN1=P2^0;
sbit IN1=P2^1;
sbit IN2=P2^2;

sbit EN2=P2^3;
sbit IN3=P2^4;
sbit IN4=P2^5;

void faward()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void turn_left()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
void turn_right()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}

void left()
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
EN1=1;
EN2=1;
}
void right()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}

void backward()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
void stop()
{
EN1=0;
EN2=0;
}
sbit RX=P3^2;//超声波发射端口

sbit TX=P3^7;//超声波接收端口(外部中断0)

/*sbit d1=P0^4;//定义电机端口

sbit d2=P0^5;

sbit d3=P0^6;

sbit d4=P0^7;*/


//uchar step_table[]={0x40,0x20,0x10,0x08,

//0x08,0x10,0x20,0x40}; //步进电机一相励磁驱动、正反转I/O口高低电平对应表



uint x,y,z,distance_data,d,g,num;




uchar outcomeL,flag,outcomeH,m,s,i,h,j,

l,e,r,t,o,p,q;




void delay3(uint k) //小车车头转动延时函数,步进电机物理延时

{

while(k--);

}




void delay() //延时子函数用于产生波形

{

for(s=0;s<10;s++);

}




void delay1(uint z)//延时子函数用于转向延时

{

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}



void main() //主函数

{

TMOD=0x11;//确定1时器工作方式

EA=1; //开总中断

ET1=1; //开定时器1中断

ET0=1; //开定时器0中断

TH0=(65536-50000)/256;

TL0=(65536-50000)%256; //定时器0装初值

TR0=1; // 启动定时器0

EX0=0; //开外部0中断

IT0=0; //外部中断低电平触发

TX=0; //超声波发射端初始为低电平

flag=0; //计算距离标志位

/* d1=0; //小车开始向前直走

d2=1;

d3=0;

d4=1;*/

faward();

while(1)//进入中断循环

{

EA=0; //关闭定时器

TX=1; //产生波形

delay();

TX=0;






while(RX==0);//当接收端为低电平时产生中断

flag=0;

EX0=1;

TH1=0;

TL1=0; //定时器1赋值

TR1=1; // 启动定时器1

EA=1; //开总中断

while(TH1<30);//延时计算距离

EX0=0;//关闭外部中断

TR1=0; //关闭定时器




if(flag==1)

{

distance_data=outcomeH; //测量结果的高8位

distance_data<<=8; //放入16位的高8位

distance_data=distance_data|outcomeL; //与低8位合并成为16位结果数据

distance_data*=12; //因为定时器默认为12分频

distance_data/=58; //微秒的单位除以58等于毫米

if((distance_data>=70)&(distance_data<=150)) //

障碍物距离小于5cm

{

if((num<100)|(num>350)&(num<=500))

{

/*d1=1; //转弯

d2=0;

d3=0;

d4=1;*/
left();

delay1(650);//刚好转45度

flag=0;

/* d1=0; //小车直走

d2=1;

d3=0;

d4=1;*/
fawrad();

}




if((num>=100)&(num<=350))

{

/* d1=0; //转弯

d2=1;

d3=1;

d4=0;*/
right();

delay1(650);//刚好转45度

flag=0;


/*
d1=0; //小车直走

d2=1;

d3=0;

d4=1; */
faward();

}




}









if(distance_data<70)

{

if((num<100)|(num>350)&(num<=500))

{

/* d1=1; //小车倒车

d2=0;

d3=1;

d4=0;*/
backward();

delay1(300);

/* d1=1; //转弯

d2=0;

d3=0;

d4=1;

*/
left();

delay1(650);//刚好转45度

flag=0;
/*

d1=0; //小车直走

d2=1;

d3=0;

d4=1;*/
faward();

}







if((num>=100)&(num<=350))

{

/* d1=1; //小车倒车

d2=0;

d3=1;

d4=0;*/
backward();

delay1(300);

left();

delay1(650);//刚好转45度

flag=0;

faward();

}




}

}

}





}

void INTO_() interrupt 0 // 外部中断是0号

{

outcomeH =TH1; //取出定时器的值

outcomeL =TL1; //取出定时器的值

flag=1; //至成功测量的标志

EX0=0; //关闭外部中断

}







void timer1() interrupt 3 // 定时器1中断是3号

{

TH1=0; //赋初值

TL1=0;

}







void timer0() interrupt 1 //定时器0中断号是1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256; //重装初值

num++;




if(num==50) //2.5秒是步进电机转动45度及超声波模块转动45度

{

// stop();

while(h--)

{



for(i=0;i<4;i++)

{

//P3=step_table[i];

delay3(320);



}

}

faward();
}







if(num==100)//5秒是步进电机转动45度及超声波模块转动45度

{

// stop();

g=70;

while(g--)

{

for(i=0;i<4;i++)

{

//P3=step_table[i];

delay3(320);



}

}

faward();

}







if(num==200) //10秒是步进电机转动45度及超声波模块转动45度

{

//stop();

e=70;

while(e--) //步进电机转动下面几个程序同此

不在标注

{

for(i=0;i<4;i++)

{

// P3=step_table[i];

delay3(320);



}

}

faward();

}







if(num==250)

{

// stop();

o=70;

while(o--)

{

for(i=0;i<4;i++)

{

//P3=step_table[i];

delay3(320);



}

}

faward();

}







if(num==300)

{
//
// stop();

r=70;

while(r--)

{

for(i=4;i<8;i++)

{

//P3=step_table[i];

delay3(320);



}

}

faward();

}







if(num==350)

{

// stop();
t=70;

while(t--)

{

for(i=4;i<8;i++)

{

// P3=step_table[i];

delay3(320);



}

}

faward();

}







if(num==450)

{

// stop();
//
p=70;

while(p--)

{

for(i=4;i<8;i++)

{

// P3=step_table[i];

delay3(320);



}

}

faward();

}







if(num==500)

{

// stop();

num=0;

q=70;

while(q--)

{

for(i=4;i<8;i++)

{

// P3=step_table[i];

delay3(320);



}

}

faward();

}

}

相关文档
最新文档