我的智能避障小车
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit trig=P3^3; //触发控制信号输入
sbit echo=P3^2; //回响信号输出
sbit pwm=P3^4;//输出PWM信号
sbit P2_0=P1^0;
sbit P2_1=P1^1;
sbit P2_2=P1^2;
sbit P2_3=P1^3;
uchar count,jd;
uint time=0,timer=0;
bit flag =0;
unsigned long s=0,zs=0,ys=0;
/********************************************************/
void delay(uint x)
{uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);}
/********************************************************/
void tingzhi()//停止
{P2_0=0;P2_2=0;P2_1=0;P2_3=0;}
void qianjin()//前进
{P2_0=0;P2_2=0;P2_1=1;P2_3=1;}
void houtui()//后退
{P2_0=1;P2_2=1;P2_1=0;P2_3=0;delay(100);delay(100);delay(100);;tingzhi();}
void zuozhuan()//左转
{P2_0=1;P2_2=0;P2_1=1;P2_3=1;delay(100);delay(100);delay(100);;tingzhi();}
void youzhuan()//右转
{P2_0=0;P2_2=1;P2_1=1;P2_3=1;delay(100);delay(100);delay(100);;tingzhi();}
/********************************************************/
void ceju(void)
{
while(!echo);//当echo为零时等待
TR0=1;//开启计数
while(echo);//当echo为1计数并等待
TR0=0;//关闭计数
time=TH0*256+TL0;
TH0=0;
TL0=0;
s=(time*2)/100;//算出来是CM
}
/********************************************************/
void qingling()
{
timer=0;
TH1=65036/256;
TL1=65036%256;
count=0;}
/********************************************************/
void zd0() interrupt 1//T0中断用来计数器溢出,超过测距范围
{flag=1;}//中断溢出标志/********************************************************/
void zd1() interrupt 3
{
TH1=65036/256;
TL1=65036%256;
if(count<jd)
pwm=1;
else
pwm=0;
count++;
count=count%40;
timer++;
if(timer>=800) //一直直行每隔0.4S 就发出一个超声波
{timer=0;
trig=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //18us
trig=0;}
}
/*********************************************************/
void main(void)
{
//jd=3;
//count=0;
TMOD=0x11;//设T0,T1为方式1,
TH0=0;
TL0=0;
TH1=65036/256;//计数器1定时0.5ms
TL1=65036%256;
IE=0x8a;//总中断开,允许计数器0,1中断开
while(1)
{TR1=1;
ceju();
if(s<=20)
{
tingzhi();//停止
jd=1;
count=0;
delay(20); //舵机转到0°,关定时器再清零。
TR1=0;
qingling();
TR1=1; //可以在下一行写,在这里写 为了保证20ms 一定有40次中断
ceju();
ys=s;
jd=5;
count=0;
delay(20);
TR1=0;
qingling();
TR1=1;
ceju();
zs=s;
jd=3;
count=0;
delay(20);
TR1=0;
qingling();
if((zs>=ys)&&(zs>20))
{zuozhuan();}//左转
else if((ys>=zs)&&(ys>20)) {youzhuan();}//右转
else {houtui();}//后退
}
else if((s>20)||(flag==1))
{qianjin();}//前进
}
}
为什么开始的时候是 舵机先转动啊? 我看的主程序 先是测距,距离小于20cm 舵机才转向,但是我用小车实验的时候 超声波模块的正前方没有障碍物啊 这是怎么一个情况?
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit trig=P3^3; //触发控制信号输入
sbit echo=P3^2; //回响信号输出
sbit pwm=P3^4;//输出PWM信号
sbit P2_0=P1^0;
sbit P2_1=P1^1;
sbit P2_2=P1^2;
sbit P2_3=P1^3;
uchar count,jd;
uint time=0,timer=0;
bit flag =0;
unsigned long s=0,zs=0,ys=0;
/********************************************************/
void delay(uint x)
{uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);}
/********************************************************/
void tingzhi()//停止
{P2_0=0;P2_2=0;P2_1=0;P2_3=0;}
void qianjin()//前进
{P2_0=0;P2_2=0;P2_1=1;P2_3=1;}
void houtui()//后退
{P2_0=1;P2_2=1;P2_1=0;P2_3=0;delay(100);delay(100);delay(100);;tingzhi();}
void zuozhuan()//左转
{P2_0=1;P2_2=0;P2_1=1;P2_3=1;delay(100);delay(100);delay(100);;tingzhi();}
void youzhuan()//右转
{P2_0=0;P2_2=1;P2_1=1;P2_3=1;delay(100);delay(100);delay(100);;tingzhi();}
/********************************************************/
void ceju(void)
{
while(!echo);//当echo为零时等待
TR0=1;//开启计数
while(echo);//当echo为1计数并等待
TR0=0;//关闭计数
time=TH0*256+TL0;
TH0=0;
TL0=0;
s=(time*2)/100;//算出来是CM
}
/********************************************************/
void qingling()
{
timer=0;
TH1=65036/256;
TL1=65036%256;
count=0;}
/********************************************************/
void zd0() interrupt 1//T0中断用来计数器溢出,超过测距范围
{flag=1;}//中断溢出标志/********************************************************/
void zd1() interrupt 3
{
TH1=65036/256;
TL1=65036%256;
if(count<jd)
pwm=1;
else
pwm=0;
count++;
count=count%40;
timer++;
if(timer>=800) //一直直行每隔0.4S 就发出一个超声波
{timer=0;
trig=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //18us
trig=0;}
}
/*********************************************************/
void main(void)
{
//jd=3;
//count=0;
TMOD=0x11;//设T0,T1为方式1,
TH0=0;
TL0=0;
TH1=65036/256;//计数器1定时0.5ms
TL1=65036%256;
IE=0x8a;//总中断开,允许计数器0,1中断开
while(1)
{TR1=1;
ceju();
if(s<=20)
{
tingzhi();//停止
jd=1;
count=0;
delay(20); //舵机转到0°,关定时器再清零。
TR1=0;
qingling();
TR1=1; //可以在下一行写,在这里写 为了保证20ms 一定有40次中断
ceju();
ys=s;
jd=5;
count=0;
delay(20);
TR1=0;
qingling();
TR1=1;
ceju();
zs=s;
jd=3;
count=0;
delay(20);
TR1=0;
qingling();
if((zs>=ys)&&(zs>20))
{zuozhuan();}//左转
else if((ys>=zs)&&(ys>20)) {youzhuan();}//右转
else {houtui();}//后退
}
else if((s>20)||(flag==1))
{qianjin();}//前进
}
}
为什么开始的时候是 舵机先转动啊? 我看的主程序 先是测距,距离小于20cm 舵机才转向,但是我用小车实验的时候 超声波模块的正前方没有障碍物啊 这是怎么一个情况?
我似乎明白了 因为刚开始 超声波模块是没有触发的 所以s=0 进入if 语句
感觉不错\
下面呢?
我个人认为。测距的时间还没完全建立,建议第一次开机延时等待一会。或许会有好的结果