一、前期准备
单片机: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;
}