HC-SR04超声波测距 - 树莓派3B

一、前期准备

单片机:STC89C52RC
开发环境:树莓派3B
HC-SR04模块:淘宝有售
在这里插入图片描述

基本工作原理:

(1)采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

2.实现思路:

  • 给Trig一个持续10us的高电平,然后读取ECHO引脚是否为高电平,若为高电平,则开获取此时时间(start),然后继续检测等待其为低电平的时候,获取此时时间值(stop),然后带入公式进行计算距离:

    distance=(stop-start)/1000000/34000/2;

3.获取时间:

学会用 man !

//头文件 
<sys/time.h>
 
//结构
timeval
{
    time_t tv_sec;  //秒 [long int]
    suseconds_t tv_usec;  //微秒 [long int]
};

//获取时间函数
 int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
// RETURN VALUE
The gettimeofday() function shall  return  0  and  no  value  shall  be
reserved to indicate an error.

#include<wiringPi.h>
#include<stdio.h>
#include<sys/time.h>
#define Trig 0
#define Echo 2
void CSBinit()
{
    pinMode(Trig,OUTPUT);
    pinMode(Echo,INPUT);
}
float distance()
{
    struct timeval t1;
    struct timeval t2;

    long start;
    long stop;
    float dis;

    digitalWrite(Trig,LOW);
    delayMicroseconds(2);

    digitalWrite(Trig,HIGH);
    delayMicroseconds(10);
    digitalWrite(Trig,LOW);

    while(digitalRead(Echo)==0);
    gettimeofday(&t1,NULL);

    while(digitalRead(Echo)==1);
    gettimeofday(&t2,NULL);

    start=t1.tv_sec*1000000+t1.tv_usec;
    stop=t2.tv_sec*1000000+t2.tv_usec;

    dis=(float)(stop-start)/1000000*34000/2;

    return dis;
}
int main()
{
    float dis;

    if(wiringPiSetup()==-1)
    {
        printf("wiringPiSetup failed\n");
        return 1;
    }

    CSBinit();

    while(1)
    {
        dis=distance();
        printf("distance=%0.2fcm\n",dis);
        delay(1000);
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值