一、原理介绍

遇到障碍物,能够感应做出反应,超声波可以作为一种测量手段,超声波在固体液体气体中传播良好,气体中速度约为340m/s。如果知道时间,那么就可以计算出距离。利用宏晶STC89C52计算超声波模块HC-SR04反馈信号高电平的时间,换算成距离显示在数码管上(这里用573和138组合的共阴极数码管显示电路)。

STC89C52是国产宏晶的一块8位寄存器芯片,IO准双向口,可以输入输出,七个中断源,六个中断通道,有ISP系统,支持USB串口下载,8KB系统可编程下载Flash(程序储存空间),512BRAM(数据储存空间),27个特殊功能寄存器。

HC-SR04超声波模块,模块四个引脚触发信号Trig,回声信号Echo,供电VCC和GND,测量周期60ms以上。当给Trig一个10us以上的脉冲时,HC-SR04内部自动循环发出8个40KHz的脉冲,Echo刚收到回波时置一(超出一定范围收到的信号不够HC-SR04置一定时器不计数),单片机定时器开始计数,直到Echo没有收到信号置零,记了TH+TL次机器周期,一个机器周期需要12个振荡周期,由此时间就可以计算出来,再用时间X速度就可以计算出距离S。

数码管有七段的,十四段的,十六段的,这里用的八位共阴极七段数码管。共阴极数码管就是共地,a,b,c,d,e,f,g,h对应哪一段输入高电平,哪一段LED亮,所以特定的组合可以显示0~9数字,所以有共阴极段码表,一组数组,显示几就对P0端口赋值对应这个数值的下标的数组元素。

HC-SR04收发信号,STC89C52计算结果,数码管显示,74HC573负责数码管的段选,74LS138负责数码管的位选。

二、仿真测试

完整的电路仿真图如图一所示,首先打开Protues ISIS新建一个空白文件,从库中拾取元件,选择IC芯片AT89C52,第一步取两个20PF~33PF的电容一个晶振和个地信号组成晶振电路,第二步给P0口上拉一的330欧的排阻,第三步加入两个四位共阴极(CC)七段数码管,第四步加一个74HC573进行段选,连接数码管的段选引脚,第五步加入一个74LS138,三位地址线控制八位位选,连接上数码管的位选位,第六步构造一个HC-SR04超声波传感器模块,并根据程序连好线,第七步加入一个信号源和一个示波器,方便模拟测试,电路连接完成。

图一 仿真电路

激励源连接在HC-SR04模块的Echo脚上,进行如图二的设置。

图二 激励源设置

示波器分别接上HC-SR04的Trig和Echo脚,双击主控芯片,打开程序生成的hex文件,点击运行,得到如图三的结果。

图三 仿真结果

首先黄色线是Trig,放大看了下,如图四。单位5us,由图可见四格多,这个触发信号高电平20几us,符合资料中Trig触发信号高电平要保持10us以上。其次水平滚轮每20代表一格即一个单位,结合图三和图五,两个发射信号水平滚轮数间隔16000左右,800格左右,单位为1ms,即800ms,符合程序中发射间隔800ms。最后数码管显示34,给Echo的方波200hz,占空比40%,即高电平2ms,12M晶振的单片机一个机器周期1us,定时器需要计数2000次,所以TH+TL=2000,根据公式S=(Th+TL)X1.7/100=34cm。综上所述,仿真程序设计没有问题。

图四 触发信号保持时间

图五 触发信号间隔时间

三、程序设计

#include "reg51.h"
#include <intrins.h>

//常变量定义:
code unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//表:共阴数码管 0-9 -
unsigned int  time=0;
unsigned int  timer=0;
unsigned long S=0;
bit flag =0;

unsigned char l_disbuff[4]={ 0,0,0,0};//显示缓冲
unsigned char l_posit=1; //位选择

//引脚定义:
//sbit SMG_q = P2^2; //定义数码管阳级控制脚(千位)本例程只用到三位数码管
sbit SMG_b = P2^2; //定义数码管阳级控制脚(百位)
sbit SMG_s = P2^3; //定义数码管阳级控制脚(十位)
sbit SMG_g = P2^4; //定义数码管阳级控制脚(个位)

sbit RX = P2^1; //模块引脚
sbit TX = P2^0;
/********************************************************/

//显示函数,参数为显示内容
void display()
{
P0=0X00; //
switch(l_posit){
case 0: //选择千位数码管,关闭其它位
//SMG_q=0;
SMG_b=1;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[0]];
break;
case 1: //选择百位数码管,关闭其它位
//SMG_q=1;
SMG_b=0;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[1]];//加入小数点要与一下
break;
case 2: //选择十位数码管,关闭其它位
//SMG_q=1;
SMG_b=1;
SMG_s=0;
SMG_g=1;
P0=table[l_disbuff[2]];
break;
case 3: //选择个位数码管,关闭其它位
//SMG_q=1;
SMG_b=0;
SMG_s=0;
SMG_g=1;
P0=table[l_disbuff[3]];
break;
}
l_posit++;
if(l_posit>3)
l_posit=0;

}

/********************************************************/
void Count(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;

S=(time*1.7)/100;     //算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{  
 flag=0;
 l_disbuff[1]=10;   //“-”
 l_disbuff[2]=10;   //“-”
 l_disbuff[3]=10;   //“-”
}
else
{
 l_disbuff[1]=S%1000/100;
 l_disbuff[2]=S%1000%100/10;
 l_disbuff[3]=S%1000%10 %10;
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
    flag=1; //中断溢出标志
}
/********************************************************/
void  zd3()  interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=0xf8;
TL1=0x30;
display();
timer++;
if(timer>=400)
{
 timer=0;
 TX=1;        //800MS  启动一次模块
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_();
 _nop_(); 
 _nop_(); 
 _nop_(); 
 _nop_();
 TX=0;

}
/*********************************************************/

void  main(  void  )
{  
    TMOD=0x11;   //设T0,T1为方式1
TH0=0;
TL0=0;          
TH1=0xf8;   //2MS定时
TL1=0x30;
ET0=1;             //允许T0中断
ET1=1;   //允许T1中断
TR1=1;   //开启定时器
EA=1;   //开启总中断

while(1)
{
while(!RX); //当RX为零时等待
TR0=1;    //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
     Count(); //计算
}
}

四、实物测试

HC-SR04超声波模块程序原理和Proteus ISIS仿真相关推荐

  1. 无模型自适应迭代学习控制原理和matlab代码仿真学习记录

    无模型自适应ILC原理及代码实现 这里学习的是很老的一篇论文<基于无模型自适应控制的反馈-前馈迭代学习控制系统收敛性研究>,作者是晏静文和侯忠生,大家有兴趣可以找来看看.这里主要介绍的无模 ...

  2. 超声波模块c语言编程,51单片机超声波模块的C语言程序.pdf

    //超声波模块程序 //超声波模块程序 //Trig P2^0 //Echo P3^2 #include #define uchar unsigned char #define uint unsign ...

  3. 超声波c语言程序,51单片机超声波模块的C语言程序.doc

    51单片机超声波模块的C语言程序.doc 超声波模块程序 超声波模块程序 Trig P20 Echo P32 include define uchar unsigned char define uin ...

  4. hc sr04流程图_超声波传感器HC-SR04完整应用以及程序讲解

    带有Arduino的超声波传感器HC-SR04完整应用指南 本文是有关流行的超声波传感器HC – SR04的应用指南.我们将解释其工作原理,向您展示其某些功能,并分享一个您可以遵循的Arduino项目 ...

  5. hc sr04流程图_超声波测距模块工作原理_HC-SR04模块详解

    超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是目前来说测试距离比较远的一款了,另外还有比较 ...

  6. 【物联网】老程序教你一招,10行代码让超声波模块秒变声控开关

    目录 1. 超声波模块的测距原理 2. 超声波模块如何与Arduino开发板连接 3. 先从测距开始 4. 如何将超声波改造成声控开关 5. 再加一个超声波开关 在本文最后有完整的视频讲解 玩Ardu ...

  7. hc-sr04程序c语言,常用模块原理程序秘技——超声波模块HC-SR04(1)

    使用STM32定时器写超声波模块HC-SR04程序 前言 首先,来说说大伙常见的超声波模块,一般就俩,HC-SR04和HY-SRF05,这两种模块电路有些许不一样,但是就功能来说,没什么区别,甚至可以 ...

  8. 【数据结构与算法】程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码

    [数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 文章目录 [数据结构与算法]程序员们常用的10个关键数据结构,包括它们的原理和C语言实现代码 1. 数组 (Arra ...

  9. arduino 多个超声波模块HC-SR04 Newping.h库的使用——摆脱万恶的阻塞等待

    目录 前言(一点废话) 问题的发现 Newping.h库 简介 安装 例程1:定时器示例TimerExample 例程2:超声波模块的读取NewPingExample 例程3:中断读取超声波NewPi ...

最新文章

  1. Linux那些事儿之我是Sysfs(11)sysfs 创建普通文件
  2. Vue搜索框保存临时搜索的记录
  3. 激光打标软件_走向工业自动化生产之路——激光飞行打标
  4. golang 数据库null值错误 解决方法
  5. OpenLayers加载搜狗地图
  6. cocos2dx基础篇(9)——触碰事件Touch
  7. SAP Spartacus home页面请求product数据生成HTTP请求url的代码处
  8. 变电站计算机监控系统的作用和工作原理,变电站计算机监控系统的主要功能.pdf...
  9. Android之学习安卓每天成长笔记
  10. Gitlab添加SSH密钥的解决办法
  11. JavaWeb学习笔记-目录(待完成)
  12. 带你从零入门 Serverless | 一文详解 Serverless 架构模式
  13. 未来计算机的展望800字,展望作文800字【精选】
  14. 怎么成为开源贡献者_开源如何成为您下一份工作的门户
  15. 又一个国家5G基站被焚烧,这次理由是5G影响人类健康?
  16. 大数据处理与开发课程设计——纽约出租车大数据分析
  17. 架构之:serverless架构
  18. 关于年薪百万,聊聊年薪380万的研发人是什么样子的
  19. 二代征信报告解读及信贷风控中的应用
  20. [LaTex报错解决]Unicode character , (U+FF0C)

热门文章

  1. golang实现断点续传
  2. 淘宝IFashion风格馆日常如何运营?
  3. 利用R语言制作GGEBiplot-双标图教程
  4. CKA考试习题:存储管理-普通卷、PV、PVC
  5. 谷歌翻译 网页嵌入代码_在网页上嵌入Google地图
  6. 初次注册知乎账号,不小心遭受系统限制,该如何解封?
  7. cad标注桩号lisp_CAD插件标桩号的AutoLISP程序语言求解释并译成中文,谢谢
  8. 微软在移动设备上的失败
  9. 华为云首席架构师顾炯炯:敢为人先,探索架构创新之路如何走
  10. 100以内加减法练习题,打印到A4纸