单片机交流
登录
直播中
陈燕
7年用户
1099经验值
私信
关注
[问答]
如何使用超声波模块实现测距功能?
开启该帖子的消息推送
超声波
超声波测距原理是什么?
如何使用超声波模块实现测距功能?
回帖
(1)
张海宝
2021-10-27 10:54:08
使用超声波模块实现测距功能,测量结果显示在LCD1602上、并通过串口发送给电脑,测量距离大于或小于5~400cm,LCD1602显示“Waring!”同时蜂鸣器报警、串口发送“Waring”。
超声波测距原理
超声波测距的方法有很多种,最常用的是脉冲回波法。原理框图如图,
超声波传感器发射超声波,在空气中传播至被测目标,经反射后由超声波传感器接收反射脉冲,测量出超声波脉冲从发射到接收的时间,经过计算 S=1/2vt 可以得到距离。h较小时,S≈d ,所以通过测量超声波往返时间,就可以计算出距离长短。
HC-SR04模块
工作原理:采用IO触发测距,给trig至少10us的高电平信号;
模块自动发送8个40khz的方波,自动检测是否有信号返回;有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。
时序图如下图所示:
具体实现,控制口发一个10us以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当接收口变为低电平时就可以读定时器的值,此时就为此次测距的时间,从而算出距离。如此不断地周期测量,就可以达到移动测量的值。
代码
#include
#include
***it trig=P1^1; //控制端口定义
***it echo=P1^0; //接收端口定义
***it RS=P3^5; //lcd1602数据/命令端
***it EN=P3^4; //使能端
***it U1=P2^6; //数码管段选
***it U2=P2^7; //数码管位选
***it bi=P2^3; //buzz
unsigned char str[]={"Distance:"}; //lcd显示字符串
unsigned char juli[]={"0000cm"}; //lcd距离显示字符串
unsigned char change[]={"rn"}; //串口打印换行符
unsigned char jg[]={"Waring"}; //串口打印
unsigned int time; //时间
unsigned long s; //距离
bit flag=0; //标志位(定时器)
bit flag1=0; //标志位(串口打印)
void delayms(unsigned int xms); //延时
void buzz(); //蜂鸣器
void wcmd(unsigned char cmd) //写命令
{
RS = 0;
P0 = cmd;
delayms(5);
EN = 1;
delayms(5);
EN = 0;
}
void wdat(unsigned char dat) //写数据
{
RS = 1;
P0 = dat;
delayms(5);
EN = 1;
delayms(5);
EN = 0;
}
void Init() //1602初始化
{ U1=0;
U2=0;
EN=0;
wcmd(0x38); //功能设置:8位,2行,5*7
wcmd(0x0c); //显示控制:显示,有光标,闪烁
wcmd(0x06); //输入模式:光标右移,屏不移位
wcmd(0x01); //清屏
}
void wstr(unsigned char addr,unsigned char *p)
{
wcmd(addr);
while(*p!='