历史上的今天
返回首页

历史上的今天

今天是: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;

  }

}

推荐阅读

史海拾趣

上海晶丰明源(BPS)公司的发展小趣事

上海晶丰明源半导体股份有限公司的创立,标志着中国在半导体领域的又一重要布局。公司自成立之初,就专注于电源管理芯片的研发与销售,凭借对技术的深入理解和市场需求的敏锐洞察,迅速在行业中崭露头角。初步发展阶段,晶丰明源通过不断优化产品设计、提升生产工艺,逐步赢得了客户的信任,并在市场上占据了一席之地。

台湾兆欣(EMTEK)公司的发展小趣事

随着科技的不断进步和市场需求的不断变化,兆欣始终保持对新技术和新应用的敏锐洞察力。他们不断推出创新产品和技术解决方案,引领着行业的发展方向。同时,兆欣还积极与高校和科研机构合作,共同推动电子行业的创新和发展。这种持续的创新精神是兆欣在电子行业中保持领先地位的关键所在。

请注意,以上故事是基于兆欣公司的发展历程和事实进行创作的,但具体细节和数据可能因时间和市场变化而有所不同。

DAYLIGHT公司的发展小趣事

DAYLIGHT公司成立于XX年,由一群富有远见卓识的电子工程师和投资者共同创立。当时,电子行业正经历着快速的技术革新,市场对高效、可靠的电子产品需求日益增加。DAYLIGHT公司凭借其独特的技术优势和创新能力,成功开发出一系列高性能的电子产品,迅速在市场中立足。

CANDD公司的发展小趣事

随着市场竞争的加剧,CANDD公司意识到单打独斗已经无法满足市场的需求。于是,公司开始积极寻求与其他企业的合作机会。通过与知名电子品牌商的合作,CANDD公司成功将其技术应用于更广泛的产品领域,进一步扩大了市场份额。同时,公司还与其他技术提供商建立了战略联盟,共同研发新技术,实现了互利共赢。

Adafruit公司的发展小趣事

随着全球环保意识的提高,CANDD公司积极响应号召,开始践行绿色环保理念。公司投入大量资金研发环保型电子产品,并采用了更加环保的生产工艺和材料。同时,公司还加强了废弃电子产品的回收和处理工作,努力减少对环境的污染。这些举措不仅提升了公司的社会形象,还为公司赢得了更多消费者的支持。

Clulite公司的发展小趣事
  1. 创业初期
    • 描述Clulite公司的创始人或核心团队如何识别电子行业中的某个市场机遇。
    • 讲述他们是如何筹集初始资金,设立公司,并开发出第一款产品或解决方案的。
    • 可以提及公司在初创阶段面临的挑战,如技术难题、市场竞争等。
  2. 技术创新
    • 讲述Clulite如何通过研发创新,推出了一款颠覆性的产品或技术,从而获得了市场认可。
    • 详细描述这一创新过程,包括研发团队的努力、关键技术的突破等。
    • 提及这一创新如何帮助公司在市场上取得了竞争优势。
  3. 市场拓展
    • 描述Clulite如何逐步扩大市场份额,从地区市场走向全国乃至国际市场。
    • 可以讲述公司如何建立销售网络、与合作伙伴建立合作关系,以及参与行业展会等活动来推广品牌和产品。
    • 提及公司在市场拓展过程中遇到的挑战和应对策略。
  4. 品质管理
    • 讲述Clulite如何注重产品质量和客户体验,通过严格的质量控制流程来提升产品可靠性。
    • 描述公司如何建立完善的售后服务体系,为客户提供及时、专业的支持。
    • 提及这些举措如何帮助公司赢得了客户的信任和口碑。
  5. 可持续发展
    • 讲述Clulite如何关注环境保护和社会责任,推动公司的可持续发展。
    • 描述公司如何采取环保措施,减少生产过程中的污染排放。
    • 提及公司如何参与社会公益事业,回馈社会。

请注意,这些故事需要根据Clulite公司的实际情况进行调整和补充。如果你需要更具体的内容,建议查阅Clulite公司的官方网站、新闻报道或行业分析报告,以获取更详细的信息和数据。

问答坊 | AI 解惑

品佳集团力顶Skype Mouse和USB Speaker解决方案

随着网络日益发达,免费网络语音通话也越来越受青睐,如果您目前是使用最原始的耳麦进行通话,除需忍受通讯质量不佳外,也会随着通话时间增长,而感受到耳根的不舒适感及耳麦线固定的不便。现在您有更佳的选择,品佳集团近期力推和(16bit/采样率8K/ ...…

查看全部问答>

电机烧了

电动双梁桥式起重机10吨 A6 起升电动机 22KW  外围电路用万用表打过。均无任何毛病。 无缺相现象。刚开始怀疑是转子接地。用摇表打过转子对地电阻 均为20兆欧, 电阻对地电阻均正常。不清楚是什么原因,请高手指点, 控制方式KT10-100/1J 直 ...…

查看全部问答>

初学嵌入式应该看哪些书

学校发的是:嵌入式微处理结构与应用 由浅入深还应该看哪些书? 请推荐一下。…

查看全部问答>

如何将passthru抓到的包 传递给应用程序?

如何将passthru抓到的包 传递给应用程序?…

查看全部问答>

'/I' requires an argument

各位大侠:我在开发中加载了自己的触摸屏驱动,结果遇到这个错误, cl : Command line error D2004 : \'/I\' requires an argument 我从网上查到这个很有可能是sources或sources.cmn的INCLUDES问题,但我仔细察看了自己的sources文件和sources.cmn ...…

查看全部问答>

WinCE下是不是无法自己开发打印机驱动

WinCE只提供采用PCL语言的打印机的驱动 那么对于非PCL语言的打印机来说,由于不知道打印机语言的描述格式,是不是无法自己开发打印机驱动? 而对于采用PCL语言的打印机来说,WinCE已经提供了驱动,是不是就不需要自己开发了? 所以我结论是:Win ...…

查看全部问答>

【芯币兑换AVR学习板及编程器】活动专帖(活动已结束)

暑期酷学,这个名字够酷吧!用你手中的芯币,兑换AVR学习板及编程器。详情如下:   STEP 1:如何兑换AVR学习板及编程器?                    ...…

查看全部问答>

可调光使用应急灯

还想加上太阳能充电,目前还在构思中。。。希望大侠能给点意见…

查看全部问答>

新型测试仪器如何缩短开发时间?

Andrew Armutat 产品市场部 吉时利仪器公司 2602型双通道系统源表[1]   缩短开发时间。测试工程师的时间是一种宝贵的资源,一般每年的成本高达100,000美元。在复杂的测试系统中,软件开发向来就是系统总成本的主要部分之一。这在专 ...…

查看全部问答>

同样重拾msp430

记得大学毕业设计的时候,我们一个实验室的同学有人用了msp430,而当时我选了凌阳的16位单片机,一直就没真正用过msp430.现在手头上有个项目,那个技术方案上选用的是 msp430. 很幸运的是网上搜到这个板块,进来学习下板子的用途大概就是 AD对于温度信号 ...…

查看全部问答>