超声波模块时序图
#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#define Echo 5
#define Trig 4
void ulrtaInit(void)
{
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT)
}
float disMeasure(void)
{
struct timeval tv1,tv2;
long start, stop;
float dis;
digitalWrite(Trig,LOW);
delayMicroseconds(3);//让Trig处于低电平,等待触发信号
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW); // 触发信号完成发送,内部可以开始发送8个40KHz脉冲
//8个脉冲发送完毕 等待Echo变为高电平,通过Echo维持高电平的时间判断所用的时间
while( !digitalRead(Echo) == 1);
//开始计时,获取初始时间
gettimeofday(&tv_1,NULL);
//等待Echo变为低电平
while(!digitalRead(Echo) == 0);
//gettimeofday(&tv_2,NULL);
star = tv1.tc_sec * 1000000 + tv1.tc_usec; 微秒级别的时间
end = tv2.tc_sec * 1000000 + tv2.tc_usec;
dis = (float)(stop - start) / 1000000 * 34000 / 2; //计算时间差求出距离
return dis;
}
int main()
{
float dis;
if(wiringPiSet() == -1){
printf("Set error\n");
return -1;
}
ulrtaInit(); 配置IO口
while(1){
dis = disMeasure();
printf("distance = %0.2f cm\n",dis);
delay(1000);
}
return 0;
}
IO口高低电平读取
struct timeval结构体
一个面向时间的结构体
struct timeval {
long tv_sec; // seconds
long tv_usec; // microseconds
};
该结构体有两个成员,tv_sec表示秒,tv_usec表示微秒.
使用struct timeval 来计算时间差
#include <stdio.h>
#include <sys/time.h>
int main() {
struct timeval start, end;
int duration;
gettimeofday(&start, NULL);//开始计时
gettimeofday(&end, NULL);// 计时结束
duration = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
printf("程序的执行时间为:%d 微秒\n", duration);
return 0;
}
gettimeofday函数
C语言中可以使用函数gettimeofday()函数来得到精确时间,是C标准库的函数。
#include<sys/time.h>
int gettimeofday(struct timeval*tv,struct timezone *tz )
//目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
//函数执行成功后返回0,失败后返回-1