历史上的今天
今天是:2024年10月14日(星期一)
2020年10月14日 | 自编超声波测距模块(HC-SR04)STC单片机程序
2020-10-14 来源:51hei
各位朋友,大家好~
相信很多朋友都用过一款HC-SR04超声波测距模块,这个模块售价很平民,某宝上仅4RMB左右:能测3-400cm,真的很不错的。
前一段时间,偶尔看到一款超声波测距模块(m**eblock的),控制方式与HC-SR04有所不同,硬件上是大同小异的,但售价非常有逼格。
本菜出于好奇,在网上找了很久的资料,大多数都是讲怎么使用HC-SR04模块的,而我想找的资料是如何制作HC-SR04这个模块,关键是模块中STC单片机的程序。
1、原理部分
HC-SR04这个模块是2线制的(不包含电源线),Echo与Trig,Trig负责接收10us以上的触发信号,Echo则是输出距离信号;下面是时序图:

而m**eblock的超声波模块采用1线制(不包含电源线),,Echo与Trig和二为一(SIG),在一定程度上节省了IO资源,SIG在收到触发信号后采集并输出距离信号,其时序图与HC-SR04类似,使用起来略有不同,需要注意IO模式的转换,而如果使用m**eblock官方提供的库(Arduino)就非常简单了;
关于HC-SR04系列超声波传感器的介绍网上有很多的帖子,本菜不赘述了。
2、硬件部分:
下面就先看一个原理图吧,由于本菜的硬件不行,只是简单的分析一下,有说错的地方,欢迎大神们吐槽!

左边是m**eblock的原理图,右边是HC-SR04的原理图,可以看到,硬件部分的实现方式是大同小异的,下面以m**eblock为例。
这里主要分成三个部分:
1、主控IC部分:完成触发信号的检测、产生8个40KHz脉冲信号、检测回波信号、输出距离信号等;
2、发射部分:由主控IC产生8个40KHz脉冲信号后,经过MAX232放大后驱动超声波发射端;
3、接收部分:将微弱的回波信号放大,送到主控IC的IO端检测回波。
3、软件部分
下面是程序思路,围绕STC展开,说一下STC每个管脚的作用~
1、P30(SIG): 负责监测触发信号;
配置其为高阻输入,可以轮询其高低电平并使用Timer0(2),也可以轮询高电平后使用INT4低电平,完成一个触发脉冲的检测(10us以上),一旦检测到触发信号,此管脚配置为推挽输出,并拉低,当8个40KHz信号发送完成后将其拉高,等到回波到来。
2、P33(T2)、P32(T1):8个40KHz脉冲信号;
配置为推挽输出,当SIG检测到触发信号后,其同时发送8个40KHz信号,注意这两个信号存在半个周期的相位差(重要!),发射完成之后将SIG拉高。
3、P31(T_PWR):MAX232供、断电;
配置其为推挽输出;通过NPN控制232,低电平有效,只在8个40KHz脉冲信号时给232供电,防止杂波出现,232在这里起到一个驱动放大功率的作用;
4、P34(PWM): 比较电压;
一开始我以为这是一个PWM信号,后来发现我错了,可以看一下电路图中的放大器A,是作为一个比较器使用的。其实只要在检测回波信号的时候将其拉高就行了。(目前我是这样做的)
5、P35(CHK):回波检测;
配置为高阻输入;可以利用INT3来检测下降沿并使用Timer2(0)计算周期,并检测回波频率,判断是否为发射出去的40KHz信号,检测完成后将SIG拉高,完成一次测量。
第一次发表这么长的开源贴子,欢迎大家吐槽(鼓励~~),源代码中几乎每一条代码后都跟有注释,相信大家读起来不会太费时间的。程序中难免有些处理不妥的地方,欢迎大家下载优化,记得分享您的成果哈~~~
单片机源程序如下:
/*-----------------------------------------------
名称:HC-SR04内源码
版本:v1.1
编写:XiaoKai
环境:MDK51 Pro V9.50a
日期:2017.2.23
修改:无
内容:超声波测距模块源码
------------------------------------------------*/
#include "main.h"
bit TRRIG = FALSE; //标志是否接收到触发信号:FALSE(否)、TRUE(是)
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
Clock_Init(); //系统时钟初始化
GPIO_Init(); //GPIO 口初始化
Timer0_Init(); //Timer0 初始化,负责测量回波信号频率
Timer2_Init(); //Timer2 初始化,负责测量触发脉冲宽度
Exint3_Init(); //INT3 初始化,负责检测回波信号
DelayMs(10); //延时等待完成
while (1) //主循环
{
//---------------监测触发信号-------------
TRIGGER();
//--------------监测到触发信号------------
if(TRRIG)
{
//------------P3.0 设置为推挽输出----------
P3M0 |= (1 << 0); //P3.0 设置为推挽输出
P3M1 &= ~(1 << 0);
//-----------------拉低 SIG----------------
SIG = LOW; //SIG 由输入模式变为输出模式后默认输出高
//-----------发送 8 个 40KHz 信号----------
EIGHT(); //发送脉冲后应该立即拉高SIG,这样测量更加精准???
//-----------------拉高 SIG----------------
SIG = HIGH; //发送完 8 个 40KHz 后,拉高 SIG 表示测量开始
//----------开启Timer0及接收INT3-----------
INT_CLKO |= (1<<5); //接收INT3
//--------------等待 SIG 被拉低------------
while(SIG) //SIG 在 exint3.c 中被检测
{
//--------------比较电压输出高-----------
PWM = HIGH; //P34输出比较电压,允许信号通过
}
}
//-----------------拒收INT3----------------
INT_CLKO &= ~(1<<5); //拒收INT3
//----------------关闭Timer2---------------
TR0=0; //关闭Timer0
//---------------比较电压输出低------------
PWM = LOW;//不允许信号通过
//----------表示没有接收到触发信号---------
TRRIG = FALSE;
}
}
史海拾趣
|
品佳集团力顶Skype Mouse和USB Speaker解决方案 随着网络日益发达,免费网络语音通话也越来越受青睐,如果您目前是使用最原始的耳麦进行通话,除需忍受通讯质量不佳外,也会随着通话时间增长,而感受到耳根的不舒适感及耳麦线固定的不便。现在您有更佳的选择,品佳集团近期力推和(16bit/采样率8K/ ...… 查看全部问答> |
|
各位大侠:我在开发中加载了自己的触摸屏驱动,结果遇到这个错误, cl : Command line error D2004 : \'/I\' requires an argument 我从网上查到这个很有可能是sources或sources.cmn的INCLUDES问题,但我仔细察看了自己的sources文件和sources.cmn ...… 查看全部问答> |
|
WinCE只提供采用PCL语言的打印机的驱动 那么对于非PCL语言的打印机来说,由于不知道打印机语言的描述格式,是不是无法自己开发打印机驱动? 而对于采用PCL语言的打印机来说,WinCE已经提供了驱动,是不是就不需要自己开发了? 所以我结论是:Win ...… 查看全部问答> |
|
暑期酷学,这个名字够酷吧!用你手中的芯币,兑换AVR学习板及编程器。详情如下: STEP 1:如何兑换AVR学习板及编程器? ...… 查看全部问答> |
|
Andrew Armutat 产品市场部 吉时利仪器公司 2602型双通道系统源表[1] 缩短开发时间。测试工程师的时间是一种宝贵的资源,一般每年的成本高达100,000美元。在复杂的测试系统中,软件开发向来就是系统总成本的主要部分之一。这在专 ...… 查看全部问答> |
|
记得大学毕业设计的时候,我们一个实验室的同学有人用了msp430,而当时我选了凌阳的16位单片机,一直就没真正用过msp430.现在手头上有个项目,那个技术方案上选用的是 msp430. 很幸运的是网上搜到这个板块,进来学习下板子的用途大概就是 AD对于温度信号 ...… 查看全部问答> |




