微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我的智能避障小车

我的智能避障小车

时间: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 舵机才转向,但是我用小车实验的时候 超声波模块的正前方没有障碍物啊   这是怎么一个情况?



我似乎明白了 因为刚开始  超声波模块是没有触发的 所以s=0 进入if 语句

感觉不错\

下面呢?

我个人认为。测距的时间还没完全建立,建议第一次开机延时等待一会。或许会有好的结果

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top