智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 10702|回复: 3
打印 上一主题 下一主题

循迹壁障小车的问题

[复制链接]

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
52
威望
41
贡献
9
兑换币
9
注册时间
2016-1-21
在线时间
1 小时
毕业学校
泰山学院
跳转到指定楼层
1#
发表于 2016-3-28 23:35:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
正在做毕设,计划把循迹和壁障综合到一起,用独立键盘触发,但是现在循迹放在键盘里可以,但是壁障在键盘里总是出问题。超声波壁障的测距程序只执行一次,然后小车就一直只按照这次获取的障碍物距离行驶。如果不放到键盘的程序里,就不会出现问题。我把程序贴上求指点。
    /*    if(P3^7==0)
        {
             Delay5Ms();
             if(P3^7==0)
              {
             while(1)
                 {
            ultrasonic_round();
                }
              }
        }      */
这个是我的键盘程序。



      


回复

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
52
威望
41
贡献
9
兑换币
9
注册时间
2016-1-21
在线时间
1 小时
毕业学校
泰山学院
2#
 楼主| 发表于 2016-3-28 23:36:04 | 只看该作者
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();        //后退一段时间
        }
}
壁障模块的
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
52
威望
41
贡献
9
兑换币
9
注册时间
2016-1-21
在线时间
1 小时
毕业学校
泰山学院
3#
 楼主| 发表于 2016-3-28 23:37:41 | 只看该作者
#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;
}
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
52
威望
41
贡献
9
兑换币
9
注册时间
2016-1-21
在线时间
1 小时
毕业学校
泰山学院
4#
 楼主| 发表于 2016-3-28 23:38:17 | 只看该作者
#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
这个是超声波的头文件,求指点。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 18:51 , Processed in 0.045963 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表