新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2019-8-13
- 在线时间
- 9 小时
|
3金钱
C文件开头定义:unsigned int distance_cm = 0;//当前距离
其中一个c文件中函数如下:
void Distance(void)
{
ultick_5ms++;
if(ultick_5ms >= 15) //15次以后读取距离值
{
ultick_5ms = 0;
GetDistanceDelay();
}
}
//延时的方式读取距离值
void GetDistanceDelay(void)
{
//发送触发信号,给Trig至少10us的高电平信号
Trig_SET;
status = 1;
TIM_SetCounter(TIM4, 0); //清空定时器值
TIM_Cmd(TIM4, ENABLE);//打开定时器
while(TIM_GetCounter(TIM4) < 11); //延时超过10us,跳出while循环
status = 2;
Trig_RESET;
TIM_SetCounter(TIM4, 0);
while(Echo == 0)//等待Echo高电平输出
{
if(TIM_GetCounter(TIM4) > 60000)//回应时间超出正常范围60ms
{
status = 0;
distance_cm = 0;//失败后就后退
TIM_Cmd(TIM4, DISABLE);//关闭定时器
return;//本次失败
}
}
TIM_SetCounter(TIM4, 0);
while(Echo == 1) //检测到有信号返回
{
//当Echo输出高电平的时候,循环检测高电平的持续时间,防止超出正常范围
int count = TIM_GetCounter(TIM4); //获取定时器的计数值
//建议测量周期在60ms以上,以防止发射信号对回响信号的影响
if(count > 60000)//回应时间超出正常范围
{
status = 0;
distance_cm = 0;//失败后就后退
TIM_Cmd(TIM4, DISABLE);//关闭定时器
return;//本次失败
}
}
//定时器计算Echo电平的持续时间即可算出超声波往返的距离
//ECho=0时,跳出循环检测,即可获得高电平的持续时间
dis_count = TIM_GetCounter(TIM4); //获取定时器的定时时间
TIM_Cmd(TIM4, DISABLE);//关闭定时器
distance_cm = (unsigned int)(((long)(dis_count) * 340)/200);//声速340m/s
status = 0;//准备下次发送
}
另一个C文件中函数如下:
void BarrierProc() //避障,获取左、右、正前方三个方向的距离后决定小车的运动方向
{
if(distance_cm < 10)//前方10cm内有障碍物
{
unsigned int dis_left;//左边距离
unsigned int dis_right;//右边距离
unsigned int dis_direct;//前方距离
if(distance_cm < 8)
{
CarBack();
Delayms(400);
}
。。。。。
为什么distance_cm 可以被另一个C文件使用,它不是上一个C文件函数中的临时变量吗???????
|
|