超声波避障1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();
}
}