单片机交流
直播中

ronga245

12年用户 590经验值
私信 关注
[问答]

怎样去编写HC-SR04超声波模块的控制程序呢

超声波测距的原理是什么?
HC-SR04超声波模块是怎样工作的?
怎样去编写HC-SR04超声波模块的控制程序呢?

回帖(1)

许佳

2021-11-8 09:28:56
  1.超声波测距原理
  超声波是利用反射的原理测量距离的,被测距离一端为超声波传感器,另一端必须有能反射超声波的物体。测量距离时,将超声波传感器对准反射物发射超声波,并开始计时,超声波在空气中传播到达障碍物后被反射回来,传感器接收到反射脉冲后立即停止计时,然后根据超声波的传播速度和计时时间就能计算出两端的距离。
  
  2.超声波模块
  此次采用的是市面上常用的超声波模块HC-SR04;
  HC-SR04参数:
  工作电压:DC5V
  静态电流:小于2mA
  电平信号输出:高5V ,低0V
  感应角度:不大于15度
  探测距离:2cm-450cm
  超声波模块工作原理:
  
  (1)采用IO触发测距,给至少10us的高电平信号;
  (2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
  (3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.
  (4)单片机将得到的数据进行处理计算,公式如下
  测试距离 = (高电平时间 * 声速(340M / S)) /2
  3.系统总体硬件图
  
  硬件组成:单片机最小系统+LCD1602显示屏+超声波模块+DC5V电源
  4.程序分析
  1.超声波模块控制程序
  (1)触发信号发送
  void StartModule() //启动模块
  {
  TX=1; //启动一次模块
  _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  _nop_(); _nop_();_nop_(); _nop_(); _nop_();
  _nop_();
  TX=0;
  }
  (2)接收回波并计算
  void Conut(void)
  {
  time=TH0*256+TL0;
  TH0=0;
  TL0=0;
  S=(time*1.7)/100; //算出来是CM
  if((S》=700)||flag==1) //超出测量范围显示“-”
  {
  flag=0;
  DisplayOneChar(0, 1, ASCII[11]);
  DisplayOneChar(1, 1, ASCII[10]); //显示点
  DisplayOneChar(2, 1, ASCII[11]);
  DisplayOneChar(3, 1, ASCII[11]);
  DisplayOneChar(4, 1, ASCII[12]); //显示M
  }
  else
  {
  di***uff[0]=S%1000/100;
  di***uff[1]=S%1000%100/10;
  di***uff[2]=S%1000%10 %10;
  DisplayOneChar(0, 1, ASCII[di***uff[0]]);
  DisplayOneChar(1, 1, ASCII[10]); //显示点
  DisplayOneChar(2, 1, ASCII[di***uff[1]]);
  DisplayOneChar(3, 1, ASCII[di***uff[2]]);
  DisplayOneChar(4, 1, ASCII[12]); //显示M
  }
  }
  一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,就可以达到你移动测量的值
  (3) 主程序
  void main(void)
  {
  unsigned char TempCyc;
  Delay400Ms(); //启动等待,等LCM讲入工作状态
  LCMInit(); //LCM初始化
  Delay5Ms(); //延时片刻(可不要)
  DisplayListChar(0, 0, mcustudio);
  DisplayListChar(0, 1, email);
  ReadDataLCM();//测试用句无意义
  for (TempCyc=0; TempCyc《10; TempCyc++)
  Delay400Ms(); //延时
  DisplayListChar(0, 1, Cls);
  while(1)
  {
  TMOD=0x01; //设T0为方式1,GATE=1;
  TH0=0;
  TL0=0;
  ET0=1; //允许T0中断
  EA=1; //开启总中断
  while(1)
  {
  StartModule();
  // DisplayOneChar(0, 1, ASCII[0]);
  while(!RX); //当RX为零时等待
  TR0=1; //开启计数
  while(RX); //当RX为1计数并等待
  TR0=0; //关闭计数
  Conut(); //计算
  delayms(80); //80MS
  }
  }
  }
  注意事项:
  1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响模块工作。
  2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分