首页 > 代码库 > 「51单片机」收发一体超声波测距模块分析+代码
「51单片机」收发一体超声波测距模块分析+代码
我用的超声波型号是US-020,四个接口的超声波用法基本相同。
一、概述
US-020超声波模块测距范围:2cm~7m
供电电压5V,静态功耗低于3mA
二、实物图
尺寸:45mm*20mm*1.6mm
三、接口
1.VCC 电源,直流5V
2.Trig 向此管脚输入10us以上高电平,可触发模块测距
3.Echo 测距结束时会输出高电平,电平时长为超声波信号往返时间之和
4.GND 接地
四、测距工作原理
只要在Trig管脚输入10us以上高电平,系统会自动发出8个40KHz的超声波脉冲,然后检测回波信号。检测到后通过Echo管脚输出。
计算方式:(Echo高电平时间*340m/s)/2
[注]:利用计数器检测Echo高电平时间。计时器计数频率为晶振的1/12。设晶振频率XMHz,计数值t(方式1下t=TH0*256+TL0)。
距离L=(t*12/(X*10^6))*340000/2 (mm)
=0.17*t (X=12)
=(2.04/11.0592)*t (X=11.0592)
五、代码分析
1.初始化程序,需要设置计时器,计算Echo高电平时间
TMOD = 0x01; //设T0为方式1; TH0 = 0; TL0 = 0; TR0 = 1; ET0 = 1; //允许T0中断 EA = 1; //开启总中断 Tr = 0;
2.发送10us以上高电平给Trig
Tr = 1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Tr = 0;
3.等待Echo的高电平并计算时间
while(!Ec); //等待高电平 TR0 = 1; //打开计时器 while(Ec); //等待低电平 TR0 = 0; //关闭计时器 time = TH0*256 + TL0; //计算时间 L = 0.18446*time; TH0 = 0; //重置计时器 TL0 = 0;
六、总代码(包括数码管显示部分)
#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int //管脚定义sbit Tr = P2^0; //超声波触发sbit Ec = P2^1; //超声波输出sbit key = P2^4; //按键sbit encC = P2^5; //38译码器sbit encB = P2^6;sbit encA = P2^7;//P0口接数码管//定义变量float L = 0; //距离长度(mm)unsigned char code LED[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//函数申明void ultInit(); //超声波初始化void ultStart(); //超声波触发void count(); //计算距离void show(); //显示距离于屏幕void delay(); //延时函数//---------------//超声波初始化//---------------void ultInit(){ TMOD = 0x01; //设T0为方式1; TH0 = 0; TL0 = 0; TR0 = 1; ET0 = 1; //允许T0中断 EA = 1; //开启总中断 Tr = 0;}//---------------//超声波触发//---------------void ultStart(){ Tr = 1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Tr = 0; }//---------------//计算距离//---------------void count(){ uint time = 0; while(!Ec); //等待高电平 TR0 = 1; //打开计时器 while(Ec); //等待低电平 TR0 = 0; //关闭计时器 time = TH0*256 + TL0; //计算时间 L = 0.18446*time; TH0 = 0; //重置计时器 TL0 = 0;}//---------------//显示距离于屏幕//---------------void show(){ P0 = LED[(int)L%10]; encC = 0; encB = 1; encA = 1; P0 = LED[(int)L/10%10]; encC = 0; encB = 1; encA = 0; P0 = LED[(int)L/100%10]; encC = 0; encB = 0; encA = 1; P0 = LED[(int)L/1000%10]; encC = 0; encB = 0; encA = 0;}//---------------//延时函数//---------------void delay(){ _nop_();_nop_();_nop_();_nop_();_nop_();}//---------------//主函数//---------------void main(){ ultInit(); key = 1; while(1) { if(0==key) { delay(); if(0==key) { ultStart(); count(); key = 1; } } show(); } }
「51单片机」收发一体超声波测距模块分析+代码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。