超声波模块怎样连接单片机超声波测距原理

用51单片机设计一个超声波测距的模块
[问题点数:40分]
用51单片机设计一个超声波测距的模块
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|查看: 126|回复: 0
单片机超声波测距的DIY与仿真深入研究与小结
就像学软件要了解些组成、编译等知识一样,玩硬件如果只用人家封装好的模块,而不了解它们的内部机制,感觉也有点不自在~其实,在很长时间以前就觉得该在模拟电路方面深入点了,可是总是找不到切入点,拿无线电的知识发现根本无法涉足,最近正好由于做一个软硬件结合的“玩具”而引发了必须自己设计传感器的需求,所以就趁势在模拟电路的海洋里遨游下吧,嘿嘿~下面是今天(不,是昨天)做的关于这方面的调查和研究,哈哈,课太多又要把最新版的Ubuntu想方法装进我的老掉牙的只有40G大小的移动硬盘里,结果就忙到了现在~
第一步、淘宝上看看有没有现成的超声波模块散件:
游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0
ps:比较便宜的一个,采用芯片,右边像排阻的东西!网上有人说这种芯片来做超声波接收芯片有点误人子弟~,不过想做成收发单独的东西,用他们的产品只能模仿学习一下电路!
PS:这几款和上面一款类似~还有比较坑的几款就是直接采用超声波测距模块~
游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0
PS:怎么像楼主在帮人家做广告呢~哈哈~
第二步、查阅相关资料,看看怎么DIY:
下面是从一个同学的毕业设计的论文中看到的,他没有采用上述淘宝卖家普遍采用的接收模块,而是用普通的模拟电路知识设计的。由于protues这个软件无法 模拟出超声波的真正的收发,所以下面的各个元件的参数我无法确是否正确,下图就先仅作框架参考~(一会要仔细分析那个同学毕业设计给的方法到底行不 行!),这里先大致说一下,左下部分为超声波发送模块,通过一根线和MCU的P3.6脚相连,想通过单片机在该脚产生40KHz的矩形波然后通过多个 74HC04进行放大从而驱动超声波发送模块,右下部分的接收模块包含接收、滤波、比较等运算,最后能根据接收到的超声波是否为40KHz而产生一个信号 从而引发单片机中断。
此外,我还发现,用80c52+12MHz的晶振,产生40KHz的矩形波在protues里模拟很不正常!这里for(a=0;a&200; a++){ P36=!P36;&&delays();}就是每隔一定时间让P36脚的电压翻转实现输出矩形波的效果,显然设这里的delays()的延时为t,那么产生的矩形波的周期就是 2*t,若果需要40Khz的矩形波则delay()延时t就大约为12.5us,而如下面代码中我采用的是delays()延时10次,结果产生的波形 如下图所示:以MCU的12Mhz来算,这10次i--应该不会占用那么多的机器周期吧!(这个确实很令人疑惑)
1 #include&reg51.h&
2 #define uchar unsigned char
3 #define ulong unsigned long
4 #define uint&&unsigned int
5 sbit P36=P3^6;
6 sbit P32=P3^2;
7 uchar data tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
9 void delays();
10 void main()
12& &&&//一次发送方波数
13& &&&TMOD=0x01;//T0计数方式1
14& &&&TH0=0;
15& &&&TL0=0;
16& &&&IT0=1;//INT0负脉冲触发
17& &&&EA=1;//开总中断
18& &&&EX0=1;//开外部INT0中断
20& &&&again=1;
21& &&&while(1)
23& && && &while(again==1)
24& && && &{
25& && && && & P36=0;
26& && && && & TR0=1;//T0开始计数
27& && && && & for(a=0;a&200;a++)//产生100个40Khz方波
28& && && && & {
29& && && && && &&&P36=!P36;
30& && && && && &&&delays();
31& && && && & }
32& && && && & //again=0;
33& && && &}
36 void intersvro(void)interrupt 0 using 1 //INT0中断服务程序
38& &&&uint bwei,swei,
39& &&&uchar DH,DL;
40& &&&ulong COUNT;
42& &&&TR0=0;//停止计数
43& &&&DH=TH0;
44& &&&DL=TL0;
45& &&&COUNT=TH0*256+TL0;
46& &&&num=(344*COUNT)/20000;
47& &&&bwei=num/100;
48& &&&swei=num%100/10;
49& &&&gwei=num%10;
50& &&&P1=tab[bwei];
51& &&&P0=tab[swei];
52& &&&P2=tab[gwei];
53& &&&TH0=0;
54& &&&TL0=0;
56 void delays()
58& &&&int i=10;
59& &&&while(i--);
鉴于上述的疑惑,我暂且把它归结为protues仿真效果不好,要实测!但是感觉还是不怎么甘心呢,于是就拿555做个多谐振荡器来试着产生40Khz的矩形波试试:结果发现结果还是挺接近的~那么看样还是80C52的问题了!在此过程中又萌发一个利用555产生这个40kHz的矩形波,然后MCU只是给出使能信号使555工作就行了,这样一方面可以减轻MCU的工作量,另一方面又会产生比较标准的40KHz的矩形波,哈哈,不错,不错!(这里T=(R1+2*R2)*C*Ln2& &占空比Q=(R1+R2)/(R1+2*R2)& &D1是为了产生对称的方波)。
最后,还是对那个接收部分不放心,于是还得拿出模拟电路的书仔细分析一下~这里我从LM741研究起,在网上找了些资料包括说明文档甚至是英文的说的都不是很好,于是往书里找资料,发现竟然是当时学的一个芯片!!!进而发现上述的接收部分的核心非常类似于有源滤波器,可是由于模拟电路知识差不多考完就忘了,当初那些复杂的公式还是强记的,所以上面那个电路虽不复杂但是还是牵连很多知识的!准备有空好好重学一下它了!
经过这些调查和学习发现,如果不用特殊的模块(淘宝上商家卖的那种采用红外线驱动芯片来驱动超声波)也能用简单的运放电路做出来,可能用运放做出来的简单的电路存在精度不是很高的问题吧~接下来准备再仔细研究一下芯片式的和普通运放式的,然后采购些元件,具体做了~
时间过得真是快,还没干点什么事它就没有了!有时候蓦然回首,会被它的无情吓到!今天就大致了解了下超声波模块,在产品方面千篇一律细分可分成两种阵营(直接模块上的二次开发与开发模块一体开发),还是如当初的想法,这些都不适合改造以满足自己的需求;在技术方面,发现有采用集成芯片的和采用普通运放的,客观来说他们各有利弊吧,而感觉自己的模电知识略显薄弱,要加把劲啦!
共享资料的黑币奖励!
Powered by拒绝访问 | www.ggdoc.com | 百度云加速
请打开cookies.
此网站 (www.ggdoc.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(410f1d250a9843d1-ua98).
重新安装浏览器,或使用别的浏览器查看: 2722|回复: 2
HC-SR04超声波测距模块接线图和程序
单片机程序:
#include &AT89X52.h&& && & //调用51单片机的头文件
#include &intrins.h&
#include &math.h&
//---------------------------------------
//1602液晶相关I/O设置
sbit E=P2^3;& && && && && &//1602液晶的E脚接在P2.3口上
sbit RW=P2^4;& && && && &&&//1602液晶的RW脚接在P2.4口上
sbit RS=P2^5;& && && && &&&//1602液晶的RS脚接在P2.5口上
//---------------------------------------
//---------------------------------------
//HC-SR04相关I/O设置
sbit TIRG=P3^4;& && && && && && & //定义IO口,具体可以去查看原理图
sbit ECHO=P3^2;& && && && && && & //定义IO口,具体可以去查看原理图& && &&&
//---------------------------------------& && && &
bit& && &flag =0;
//---------------------------------------
//名称:1602液晶用延时函数
//---------------------------------------
void Delay1602(unsigned int t)
{
& &&&& && &//定义一个16位寄存器用来做延时用
& &&&for(k=0;k&t;k++);& & //延时
//---------------------------------------
//名称:1602液晶忙检测函数
//---------------------------------------
void LCD1602_busy(void)
{
& &&&P0_7=1;& && && && &&&//将P0.7置1,为读状态做准备
& &&&RS=0;& && && && && & //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
& &&&RW=1;& && && && && & //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
& &&&E=1;& && && && && &&&//RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
& &&&while(P0_7==1);& && &//由P0.7读入1,表示1602液晶忙,需要等待
& &&&E=0;& && && && && &&&//读完以后,恢复E的电平
}
//---------------------------------------
//名称:1600写命令函数
//---------------------------------------
void LCD1602_Write_com(unsigned char combuf)
{
& &&&RS=0;& && && && && & //选择指令寄存器
& &&&RW=0;& && && && && & //选择写状态
& &&&P0=& && && &&&//将命令字通过P0口送至DB
& &&&E=1;& && && && && &&&//E高电平将命令字写入1602液晶
& &&&E=0;& && && && && &&&//写完以后,恢复E的电平
}
//---------------------------------------
//名称:1602写命令函数(带忙检测)
//---------------------------------------
void LCD1602_Write_com_busy(unsigned char combuf)
{
& &&&LCD1602_busy();& && && && &//调用忙检测函数
& &&&LCD1602_Write_com(combuf); //调用忙检测函数
}
//---------------------------------------
//名称:1602写数据函数(带忙检测)
------------------------
void LCD1602_Write_data_busy(unsigned char databuf)
{
& &&&LCD1602_busy();& && &//调用忙检测函数
& &&&RS=1;& && && && && & //选择数据寄存器
& &&&RW=0;& && && && && & //选择写状态
& &&&P0=& && && & //将命令字通过P0口送至DB
& &&&E=1;& && && && && &&&//E高电平将命令字写入1602液晶
& &&&E=0;& && && && && &&&//写完以后,恢复E的电平
}
//---------------------------------------
//名称:1602液晶显示地址写函数
//---------------------------------------
void LCD1602_Write_address(unsigned char x,unsigned char y)
{
& &&&x&=0x0f;& && && && & //列地址限制在0-15间
& &&&y&=0x01;& && && && & //行地址限制在0-1间
& &&&if(y==0)& && && && & //如果是第一行
& && && &LCD1602_Write_com_busy(x|0x80);& && &&&//将列地址写入
& &&&else& && && && && &&&//如果是第二行
& && && &LCD1602_Write_com_busy((x+0x40)|0x80); //将列地址写入
}
//---------------------------------------
//名称:1602液晶初始化函数
//---------------------------------------
void LCD1602_init(void)
{
& &&&Delay);& && && && && &//调用延时函数
& &&&LCD1602_Write_com(0x38);& && & //8位数据总线,两行显示模式,5*7点阵显示
& &&&Delay);& && && && && & //调用延时函数
& &&&LCD1602_Write_com(0x38);& && & //8位数据总线,两行显示模式,5*7点阵显示
& &&&Delay);& && && && && & //调用延时函数
& &&&LCD1602_Write_com(0x38);& && & //8位数据总线,两行显示模式,5*7点阵显示
& &&&LCD1602_Write_com_busy(0x38);&&//8位数据总线,两行显示模式,5*7点阵显示
& &&&LCD1602_Write_com_busy(0x08);&&//显示功能关,无光标
& &&&LCD1602_Write_com_busy(0x01);&&//清屏
& &&&LCD1602_Write_com_busy(0x06);&&//写入新的数据后,光标右移,显示屏不移动
& &&&LCD1602_Write_com_busy(0x0C);&&//显示功能开,无光标
}
//---------------------------------------
//名称:1602液晶指定地址显示函数
//---------------------------------------
void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
{
& &&&LCD1602_Write_address(x,y);& & //先将地址信息写入
& &&&LCD1602_Write_data_busy(buf);&&//再写入要显示的数据
}
//---------------------------------------
//名称:定时器0中断服务程序
//---------------------------------------
void Timer0(void) interrupt 1
{& && && && && && && &&&
& &//***此处用户自行添加定时器T0中断处理程序***
& && &&&flag=0;
& &//******************************************
}
//---------------------------------------
//名称: 主函数
-----------------------
void main(void)& && && && &//主函数,单片机开机后就是从这个函数开始运行
{
& && &&&long S;
& && &&&
& && &&&unsigned int&&T
& &LCD1602_init();& && &&&//调用1602液晶初始化函数
& && &&&//***定时器Timer0初始化***
& &TMOD&=0xF0;& && && && && && &&&//将TMOD的低4位定时器0控制部分清零
& &TMOD|=0x01;& && && && && && &&&//设置定时器0为方式1
& && &&&TMOD=0x01;
& &TL0=0;& && && && && && && && && && &//设置定时器0初值低8位
& &TH0=0;& && && && && && && && && && &//设置定时器0初值高8位
& &TR0=0;& && && && && && && && & //停止定时器0
& &ET0=1;& && && && && && && && & //Timer0中断允许
& &//**********************
& &//***开全局中断设置****
& &//定时器Timer0设置了中断允许,此处要开全局中断
& &EA=1;& && && && && && && && &&&//开全局中断
& &//*********************
& && &&&while(1)
& && &&&{& && && && && &
& && && && && & TIRG=1;& && && && && && && && && && && && && && && &//发一个脉冲触发信号
& && && && && && &i=4;& && && && && && && && && && && && && && && &//维持约17US,符合不低于10US的要求
& && &while(i&0)& && && && && && && && && && && & //维持约17US,符合不低于10US的要求
& && && && &&&i--;& && && && && && && && && && && && & //维持约17US,符合不低于10US的要求& && && && && &
& && && && && && &TIRG=0;& && && && && && && && && && && && && && && &//撤销触发信号
& && && && && & TR0=0;& && && && && && && && && && && && && && && && &//关闭定时器
& && && && && & TL0=0;& && && && && && && && && &&&//设置定时器0初值低8位为0
& && && &&&TH0=0;& && && && && && && && && && &//设置定时器0初值高8位为0
& && && && && & k=0;& && && && && && && && & //清除溢出标志
& && && && && & flag=0;
& && && && && & Timeout=0;
& && && &&&while((ECHO==0)&&((Timeout++)&50000));& && && && && && && && && && &&&//等待回响高电平& && && && && &
& && && &&&TR0=1;& && && && && && && && && && && && && && &&&//回响高电平来后启动定时器
& && && && && & Timeout=0;
& && && &&&while((ECHO==1)&&((Timeout++)&50000));& && && && && && && && && && &&&//等待回响高电平结束后
& && && &&&TR0=0;& && && && && && && && && && && && && && && && &//关闭定时器
& && &S=((TH0*256+TL0)*0.5425)/58;& && &&&
& && && && && & if(flag==1||S&400)& && && && && & //超出测量范围显示“-”
& && && && && & {& && && && && && && && && && && && && && && && && && && &
& && && && && && && && && &LCD1602_Disp(0, 0, '-');& && && && && && && && && && && & //显示百位-
& && && && && && && && && &LCD1602_Disp(1, 0, '-');& && && && && && && && && && && & //显示十位-
& && && && && && && && && &LCD1602_Disp(2, 0, '-');& && && && && && && && && && && & //显示个位-
& && && && && && && && && &LCD1602_Disp(3, 0, 'C');& && && && && && && && && && && & //显示C
& && && && && && && && && &LCD1602_Disp(4, 0, 'M');& && && && && && && && && && &&&//显示M
& && && && && & }
& && && && && & else& && && && && && && && && && && && && && && && && && && && && && &
& && && && && & {& && && && && && && && && &
& && && && && && && && && && &&&LCD1602_Disp(0, 0, S%');& && && && && && &//显示百位
& && && && && && && && && &LCD1602_Disp(1, 0, S%+'0');&&//显示十位
& && && && && && && && && &LCD1602_Disp(2, 0, S%+'0');& && &&&//显示个位
& && && && && && && && && &LCD1602_Disp(3, 0, 'C');& && && && && && && && && && && && && && &//显示C
& && && && && && && && && &LCD1602_Disp(4, 0, 'M');& && && && && && && && && && && && && & //显示M
& && && && && & }
& && && && && & i=18000;& && && && && && && && && && && && && && &//维持约77400US,符合不低于60MS的要求
& && &while(i&0)& && && && && && && && && && && & //维持约77400US,符合不低于60MS的要求
& && && && &&&i--;& && && && && && && && && && && && & //维持约77400US,符合不低于60MS的要求
& && &&&}
}
此帖仅作者可见
此帖仅作者可见
Powered by单片机超声波测距模块20
您的位置: →
单片机超声波测距模块
HC-SR04超声波测距模块说明书1、产品特点:HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。基本工作原理:(1)采用IO口TRIG触发测距,给最少10us的高电平信呈。(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;2、实物图:如右图接线,VCC供5V电源,GND为地线,TRIG触发控制信号输入,ECHO回响信号输出等四个接口端。图一实物图3、电气参数:电气参数工作电压工作电流工作频率最远射程射程测量角度输入触发信号输出回响信号规格尺寸HC-SR04超声波模块DC5V15mA40kHz4m2cm15度10uS的TTL脉冲输出TTL电平信号,与射程成比例45*20*15mm4、超声波时序图:图二、超声波时序图以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。注:1、此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响模块的正常工作。2、测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果5、实物规格:
单片机超声波测距模块相关文章
《》由www.zaidian.com(在点网)整理提供,版权归原作者、原出处所有。
Copyright &
All Rights Reserved.}

我要回帖

更多关于 单片机超声波模块 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信