1. 智能小车超声波避障问题 在if(判断1) else(判断2)在这个判断中 判断1是距离 明明没有到那个距离 到会自动
这是因为你程序里距离变量没改变,也就是说你上次进入if时距离变量一直保存着,所以程序自动一直进入if语句,改下程序,以前做小车也遇到过,就是只要进入设定距离,小车就一直停在那里没有动作,距离显示一直定格在当前距离,这个程序你用keil调试不了,因为你的超声波回波信号模拟不出来,那个一直停留在while(!echo)或者while(echo)里面,所以只有实践,调试,再实践
2. hc-sr04超声波测距模块中,他默认最远探测距离为4米,这个4米事有什么决定的,可以通过软件更改这个距离
HC-SR04这种模块,用来组装超声波测距板,可以省去好多事,这种模块的最远距离应该是4.5米,我在电子乐屋上看到过用这种模块制作的超声波测距板,显示有用LED的,也有用LCD1602的,最远测量距离可达5.5米,还配有仿真。
3. 超声波探头如何控制测量距离
看你测量的距离的大小,然后调节吧,保证精度就行
4. 怎样用超声波 在固定的距离中 测到障碍物,然后避开
我分为2个.c文件和2个.h文件,3辅1主
1.文件名:chaoshengbo.c
// 注 :需要用杜邦线把 超声波模块的 VCC----VCC TRIG---P1.0 ECHO---P1.1 GND----GND 相连
/**********************************包含头文件**********************************/
#include <reg52.h>
/************************************宏定义************************************/
#define VELOCITY_30C 3495 //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;
#define uchar unsigned char
#define uint unsigned int
/************************************位定义************************************/
sbit INPUT = P3^2; //RX P3^2是外部中断口,用来计算时间用的
sbit OUTPUT = P1^7; //TX output可以在P0、P1、P2的24个口
//sbit INPUT = P2^1; //回声接收端口
//sbit OUTPUT = P2^0; //超声触发端口
/********************************定义变量和数组********************************/
long int distance=0; //距离变量
uchar count;
/******************************************************************************/
/* 函数名称 : Init_MCU */
/* 函数描述 : 初始化单片机函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Init_MCU(void)
{
TMOD = 0x01; //定时器2初始化,设置为16位自动重装模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //开定时器2
EA = 1; //总中断使能
}
/******************************************************************************/
/* 函数名称 : Init_Parameter */
/* 函数描述 : 初始化参数和IO口函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Init_Parameter(void)
{
OUTPUT =1;
INPUT = 1;
count = 0;
distance = 0;
}
/******************************************************************************/
/* 函数名称 : Trig_SuperSonic */
/* 函数描述 : 发出声波函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Trig_SuperSonic(void)//出发声波
{
OUTPUT = 1;
delayms(1);
OUTPUT = 0;
}
/******************************************************************************/
/* 函数名称 : Measure_Distance */
/* 函数描述 : 计算距离函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void Measure_Distance(void)
{
uchar l;
uint h,y;
TR0 = 1;
while(INPUT)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//计算总时间
TL0 = 0x66;
TH0 = 0xfc;
delayms(30);
distance = VELOCITY_30C * distance / 20000;//4位数:xxxx毫米
}
/******************************************************************************/
/* 函数名称 : main */
/* 函数描述 : 主函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
long int Ceju(void)
{
while(1)
{
Init_Parameter(); // 参数重新初始化
Trig_SuperSonic(); //触发超声波发射
while(INPUT == 0) //等待回声
{
;
}
Measure_Distance(); //计算脉宽并转换为距离
if(distance != 0)
return distance;
}
}
/******************************************************************************/
/* 函数名称 : timer0 */
/* 函数描述 : T0中断处理函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
void timer0 (void) interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count == 18)//超声波回声脉宽最多18ms
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
/******************************************************************************/
2.文件名:delay.h
#ifndef __DELAY_H_
#define __DELAY_H_
/**********************************
包含头文件
**********************************/
//#include<reg51.h>
#define FOSC 11059200L //晶振设置,默认使用11.0592M Hz
/**********************************
定义延时函数
**********************************/
/*延时函数1,用于PWM高电平的时长,即用于定位*/
void delay10us(unsigned char us) //us增量为0.01193ms,范围为:43~208
{
unsigned char a, b;
for(b=us;b>0;b--)
for(a=1;a>0;a--);
}
/*延时函数2,用于PWM低电平的时长*/
void delay17ms489us(void) //误差 -0.935763888893us
{
unsigned char a,b,c;
for(c=14;c>0;c--)
for(b=164;b>0;b--)
for(a=2;a>0;a--);
}
/*延时函数3,用于ms级的延时*/
void delayms(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
#if FOSC == 11059200L
for(j=0;j<114;j++);
#elif FOSC == 12000000L
for(j=0;j<123;j++);
#elif FOSC == 24000000L
for(j=0;j<249;j++);
#else
for(j=0;j<114;j++);
#endif
}
#endif
3.文件名:IOdefine.h
#ifndef __IODEFINE_H_
#define __IODEFINE_H_
/**********************************
包含头文件
**********************************/
//#include<reg51.h>
/**********************************
定义IO口
**********************************/
/*反馈信号灯串口,用于检测故障*/
sbit Return_LED = P0^3;
sbit Left_LED = P0^0;
sbit Right_LED = P0^1;
sbit Front_LED = P0^2;
//sbit Left_Front_LED = P0^3;
//sbit Right_Front_LED = P0^4;
//sbit Slow_LED = P0^5;
//sbit Fast_LED = P0^6;
sbit Power_LED = P0^7;
/*红外感应器串口*/
sbit Left_IR = P1^1;
sbit Right_IR = P1^2;
sbit Front_IR = P1^3;
//sbit Left_Front_IR = P1^3;
//sbit Right_Front_IR = P1^4;
/*舵机MG90s串口*/
sbit Duoji = P1^5;
#endif
4.文件名:main.c
#include <reg52.h>
#include <IOdefine.h>
#include <Delay.h>
#include "Chaoshengbo.c"
/*位置数值宏定义*/
#define Limit_Left 34 //左极限
#define Limit_Right 199 //右极限
#define Half_Left 79 //左45度
#define Half_Right 159 //右45度
#define Mid 119 //中位
void Run(unsigned char time)
{
unsigned char i = 5;
Duoji = 0;
while(i--)
{
Duoji = 1;
delay10us(time);
Duoji = 0;
delay10us(199-time);
delay17ms489us();
}
}
void main(void)
{
long int S = 0;//距离
unsigned char i = Mid;
Init_MCU(); //超声波模块初始化
Run(i);
while(1)
{
S = Ceju();//超声波测到的距离
/*可修改代码段 *///用上之前设定的工具,按照逻辑
if(Left_IR == 0) //左障
{
// delayms(5);
if(Left_IR == 0)
{
while(1)
{
if(S > 320)
{
Run(Half_Right);
}
// if(i > Half_Right)
// i = Half_Right;
if(Left_IR == 1)
break;
}
}
}
else if(Right_IR == 0) //右障
{
// delayms(5);
if(Right_IR == 0)
{
while(1)
{
if(S > 320)
{
Run(Half_Left);
}
// if(i < Half_Left)
// i = Half_Left;
5. 用超声波检测车辆周围的障碍物距离车体的距离,需要在车体后面和左右侧布置多个超声波传感器,请教下如何
可以,这个没有问题。类似于倒车雷达。只是一个主要针对车动障碍物不动。另一个是车动障碍物也在动。估计你要布置更多的传感器,或者直接放置传感器阵列。这都不是问题,测量也不是问题。难题在于,如何分析采集到的数据。比如多个传感器数据如何分析能得到相对速度,或者计算障碍物接近速度,推算相撞时间等待。
6. 基于单片机的超声波测距怎么改距离
用超声波的。 超声波发出后,等待A时间收到回声,要据超声波的速度为340米每秒,从而计算出距离。
7. 怎样改超声波测距系统的仿真距离
测距仿真,还真有人做出来了,电子乐屋上就有相关的文章,还有实例。
8. 如何调节超声波传感器测试距离
超声波传感器测试距离采用超声波回波测距原理,运用精确的时差测量技术,检测传感器与目标物之间的距离,采用小角度,小盲区超声波传感器,具有测量准确,无接触,防水,防腐蚀, 低成本等优点,可应于液位,物位检测,特有的液位,料位检测方式,可保证在液面有泡沫或大的晃动,不易检测到回波的情况下有稳定的输出,应用行业:液位,物位,料位检测,工业过程控制等
9. 超声波避障小车可以不用测距壁障么就是直接壁障。壁障距离是多少呢
不行的,要避障就得首先知道障碍物有什么地方,距离多少,才能由单片机控制进行障碍。
10. 如何提高超声波测距距离
假如这套系统是个木桶,你闲它装的水不够多,实际上它的每一块木板都短,而不是一块两块。
从你描述的情况看,目前最大的瓶颈是驱动电压和探头。发射电压提高到50-150Vp-p,采用开放式探头,应该能测到5米左右。
如果要测到11米,我还不知道您希望测距的周期是多少,1秒一次?1秒10次?10秒1次?
1、如果测距的周期较长,可以进一步提高发射电压,应达到200~800Vp-p(视探头而定),建议用脉冲变压器,驱动不能用74HC04了,换成开关管吧,瞬间电流估计应在1A-30A之间。周期长的好处是“不怕检测失败”,您可以在一个检测周期内进行多次检测,而最终的检测结果,仅是你检测成功的那一次。
2、如果测距的周期较短,一般要求每次检测都要有较高的成功率,面对不同的环境和被测物体,测距系统对接收电路要求较高。在满足1的前提下,还要改进接收电路,在放大1万-100万倍的情况下,噪音峰值电平应低于1Vp-p,20106恐怕难以胜任;
3、如果需要在室外使用,在满足前两条的前提下,还要采用防水型探头,11米的检测距离需要直径50mm以上的超声波探头;
4、如果还需要全天候的高可靠运行,或者要较高灵敏度时,还要牺牲一些测距精度,把超声波发射频率从40KHz降低到25KHz~32KHz,以减少空气损耗。