亿加合和智能车制作

标题: 循迹壁障小车的问题 [打印本页]

作者: ljp19930728    时间: 2016-3-28 23:35
标题: 循迹壁障小车的问题
正在做毕设,计划把循迹和壁障综合到一起,用独立键盘触发,但是现在循迹放在键盘里可以,但是壁障在键盘里总是出问题。超声波壁障的测距程序只执行一次,然后小车就一直只按照这次获取的障碍物距离行驶。如果不放到键盘的程序里,就不会出现问题。我把程序贴上求指点。
    /*    if(P3^7==0)
        {
             Delay5Ms();
             if(P3^7==0)
              {
             while(1)
                 {
            ultrasonic_round();
                }
              }
        }      */
这个是我的键盘程序。



      



作者: ljp19930728    时间: 2016-3-28 23:36
void ultrasonic_round()        //超声波避障模式程序
{
        bit a;       
        if(range_now>range_set)  //现在到障碍物的距离大于设定距离时
        {                
                goorback(go_on,speed_go);
        }
        else if(range_now<=range_set)
        {
                rotate_stop(a);
                a=~a;
                Delay400Ms();Delay400Ms();        //左右转弯轮流进行  并转动一段时间
                goorback(go_back,speed_back);
                Delay400Ms();Delay400Ms();        //后退一段时间
        }
}
壁障模块的
作者: ljp19930728    时间: 2016-3-28 23:37
#include "ultrasonic.h"

/*超声波测距  不考虑温度的影响 20度时 344m/s  0度时332m/s  
计算距离时假定温度恒温20度,速度以344m/s带入 */



unsigned int  time=0;
unsigned long S=0;
bit  flag =0;
/*超声波距离计算函数 计算消耗的时间  带入公式计算1.7是声速
344m/s换算后1us行走的距离*/
unsigned long Conut()                       
{
        time=TH0*256+TL0;
        TH0=0;
        TL0=0;       
        S=(time*1.7)/10+10;     //10是修正值
        if((S>=7000)||flag==1) //超出测量范围
        {        flag=0;return 0xfffffff;        }         
        else return S;
}
//T0中断用来计数器溢出,超过测距范围
void timer() interrupt 1                  
{
        flag=1;                         //中断溢出标志
        RX=0;
}
//给超声波的TRIG  超声波触发控制输入信号  一个大于10us的脉冲   启动一次模块
void  StartModule()                         
{
        uchar a=2;
        TX=1;                                            
        while(a--);
        TX=0;
}
/*超声波高电平脉冲宽度计算函数   开启计时 等待RX为低电平时 关闭计时  
TH0和TL0的16位计数器里的值就是声波返回的时间  以us计*/
unsigned long Timer_Count()                          
{
        TR0=1;                            //开启计数
        while(RX);                        //当RX为1计数并等待
        TR0=0;                                //关闭计数
        return Conut();       
}
unsigned long get_range()
{
        int valA=0;
        RX=1;
        StartModule();                 //启动模块
        for(valA=751;valA>0;valA--)
        {
                if(RX==1)
                return Timer_Count();                 //超声波高电平脉冲宽度计算函数
        }
        return 0;
}

作者: ljp19930728    时间: 2016-3-28 23:38
#ifndef _ULTRASONICH_H_
#define _ULTRASONICH__H_
#include<AT89X52.H>
#include "1602.h"
#include "delay.h"

sbit  RX=  P2^0;  //TRIG  超声波触发控制输入信号
sbit  TX=  P2^1;  //ECHO  回响输出信号

unsigned long Conut();
void  StartModule() ;
unsigned long Timer_Count();
unsigned long get_range();

#endif
这个是超声波的头文件,求指点。。。




欢迎光临 亿加合和智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2