小车超声波出问题,时间很急,请大神帮忙。

2020-01-30 13:30发布

我们程序让小车离障碍物小于30cm时就向左转,现在的情况是:
小于30cm--左转(表示正常);
30cm~100cm--直走(表示正常);
>100cm--左转(不正常啊,应该是直走才对的。);

请大家帮帮忙,超声波程序在这里:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit trig=P1^0;//超声波发射端口
sbit Echo=P3^2;//超声波接收端口(外部中断0)
uint x,y,z,distance_data;
uchar outcomeL,flag,outcomeH;

void delay() //延时子函数用于产生波形
{
        for(x=0;x<20;x++);               
}

void main()        //主函数
{
        
        TMOD=0x10;    //确定1时器工作方式
        EA=1;         //开总中断
        ET1=1;        //开定时器1中断
        EX0=1;        //开外部0中断
        IT0=0;        //外部中断低电平触发
        trig=0;         //超声波发射端初始为低电平
        flag=0;       //计算距离标志位         
        while(1)//进入中断循环
        {        
                TR1=0;//关闭定时器
                trig=1;//产生波形
                delay();
                trig=0;
               
                while(Echo==0);//等待接收端变为高电?
                               
                flag=0;//清零成功标志
                EX0=1;
                TH1=0;
                TL1=0;//定时器1赋值
                TR1=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<=300)                          //障碍物距离小于30cm
                          {                                                                          
                         s1=20;                           //左转
                         s2=1;
                          }
                                                else
                                                {
                                             s1=20;                       //直走
                                             s2=20;
                                                        }                                                 
                }       

}


}
void INTO_() interrupt 0   // 外部中断是0号
{   
     outcomeH =TH1;    //取出定时器的值
     outcomeL =TL1;    //取出定时器的值
     flag=1;           //至成功测量的标志
     EX0=0;            //关闭外部中断
}
void timer1() interrupt 3  // 定时器1中断是3号
{
     TH1=0;        //赋初值
     TL1=0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。