智能车制作
标题:
循迹壁障小车的问题
[打印本页]
作者:
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://111.231.132.190/)
Powered by Discuz! X3.2