基于单片机的超声波测距仪设计

控制/MCU

1879人已加入

描述

一、工具准备

工欲善其事,必先利其器,这次基于51单片机,绘制一个最小系统原理图,制板并焊接,利用超声波模块测距。这次项目需要用到51单片机、超声波模块、电脑端的串口助手,以及自己绘制一个51单片机最小系统的电路板。画板部分推荐嘉立创EDA,国产免费,有很多免费的库和一些优秀的开源工程,可以直接拿来用,非常方便;画完板子直接嘉立创下单打样,每个月两次免费的打样机会,白嫖的板子拿来练手,岂不美哉?

看我文章的大多都是大学生,大学阶段要多练习,从绘图到制板再到焊接,先模仿再创新,熟能生巧,不管是大学阶段的作业、课程设计还是毕业设计,都会非常简单。若本专业没有必须要求的绘图软件,这个嘉立创EDA软件,我是极力推荐的,上手很快,如果用过CAD等软件,最多半个小时基本上就会用了,大家可以在线或者下载下来使用,登录自己的账号即使换电脑了,之前保存的工程文件也可以继续使用。

二、硬件介绍

基本流程:首先绘制原理图,完成原理图之后,就可以转成PCB文件,根据需求选择好板子的大小,调整好各个元器件的位置,然后布线,最后检查没问题就生成Gerber文件。把这个Gerber文件交给制板厂家进行打样,等板子到了根据原理图把元器件焊接到板子的对应位置就可以了,不想手焊的话也可以交由厂家贴片完成,像嘉立创从绘制PCB到打板到smt贴片一条龙就很方便。

硬件设计:51单片机最小系统就不再细讲了,我把原理图放到下面;整体思路就是通过单片机向超声波模块发送命令,超声波模块接收到正确命令后,返回出我们需要的数据(高电平时间),然后我们时间还有声速,就可以算出来距离了,最后单片机通过串口,把距离发送到上位机,该功能就实现了。

超声波

51单片机最小系统原理图

质量把控:板子的质量对于焊接后的外观以及电气性能的至关重要,性能优异,颜值更是锦上添花;要好看的颜值和优异的性能,生产板子的原材料、精度和一致性等都很重要,因此,制板厂家是否靠谱对于项目的推进有着不可忽视的作用,我自己也在很多厂家打过板子,现在基本上就是首选嘉立创了,也推荐给大家。     工艺科普:想要产品质量好,制程工艺非常重要,先进的工艺不仅可以提高产品质量,还可以方便客户使用,在一些高多层板的设计中,如果使用盘中孔工艺,则可以在设计阶段大大提高PCB设计工程师的效率、提高PCB的良率,有利于高速板的性能。现在嘉立创又推出了“盘中孔工艺对6-20层的板子全免费”,不仅提高了焊盘的机械强度,并且方便布线,对于密集的点位,若使用“盘中孔工艺”,布线的时间将大大缩减,对于高速板来说,不用弯弯绕绕的布线了,性能也会有所提升,想更多了解“盘中孔工艺”,可以看下面这篇文章。

嘉立创”盘中孔设计工艺”

嘉立创,公众号:嘉立创嘉立创强烈建议你6、8-20层电路板采用“盘中孔设计工艺”

超声波

嘉立创盘中孔内部结构示意图

三、实验原理

HC-SR04超声波测距模块:

超声波

模块工作原理: (1)采用IO触发测距,给至少10us的高电平信号; (2)模块自动发送8个40KHz的方波,自动检测是否有信号返回; (3)有信号返回,通过IO输出高电平,高电平持续的时间就是超声波从发射到返回的时间; 测试距离=(高电平时间*声速(340m/s))/2;     根据公式S=v*t,我们要想通过超声波来测量距离,就需要知道速度v和时间t,一般情况下,以空气为介质,声速为340m/s,速度知道后,就差时间了。

这个模块一共有4个引脚,除了VCC和GND外,还有Trig(控制端)和Echo(接收端),当控制端接收到信号时,模块就会就自动发送8个方波,遇到障碍物后就会反射回来①;发射时记一个时间,接收时再记一个时间,时间差就是一来一回所用的时间了,这个时间差不用我们去算,模块会自动帮我们算,然后会在Echo引脚输出一个高电平,然后再自动拉低,这样我们只要读出来这个高电平时间②,就可以知道发射的声波一来一回用了多长时间,再除以2,就可以知道单方向所用的时间了,有了速度,有了时间,就可以根据公式把距离算出来了。

下面具体介绍一下如何实现:     ①:根据超声波模块的工作原理可以得知,需要给控制端Trig一个大于10us的高电平,于是初始化时要先将Trig引脚初始化为低电平,然后将Trig置高电平,延时大于10us,再置低电平。这个工作做完后,声波就自动发射出去了,下面该算时间了。

 

void Ultrasound_Init(void)
{  
  Trig_P17 = 0;//初始化为低电平
  Echo_P32 = 0;
  Timer0_Init();
}
int get_distance(void)
{
  unsigned char i,t1,t2;
  unsigned char timeH,timeL;
  unsigned int time;
  unsigned int distance;


  Trig_P17 = 1;//置为高电平
  for(i=0;i<12;i++)//延时大于10us
  {
    _nop_();
  }
  Trig_P17 = 0;//置为低电平
  ……
  ……
  }
      ②:计算时间,就是计算接收端Echo的高电平时间,所以我们也要先把Echo初始化为低电平,硬件自动拉高,然后再自动拉低;咱们检测自动拉高的这一段时间就可以了,这里用到了一个小技巧,巧用了定时器的工作模式,以定时器0为例:     TR0:定时器T0的运行控制位,当GATE=1时,TR0=1且INT0输入高电平时,才允许T0计数。     现在我们把接收端Echo接到外部中断0,P32引脚,先把TR0置1,这时候定时器不工作,只有Echo为高电平时,才开始计数,刚好咱们的超声波模块也是用高电平时间反馈声波一来一回所用的时间,这样咱们就把定时器的初值设为0,开始计数时是从0开始的,如果Echo由高电平变为低电平时,定时器停止计数,这时我们再读取定时器的计数值,就可以知道记了多少个数,以12MHz晶振为例,12T模式下记一个数需要1us,这样咱们就知道高电平一共是多长时间了,再除以2,就得到了单方向的时间。于是,根据公式距离就可以算出来了。
void Timer0_Init(void)
{
  TMOD &=0xF0;
  TMOD |=0x09; //设T0为方式1,GATE=1;
  TH0 = 0; //高位置0
  TL0 = 0; //低位置0
  TF0 = 0;
  TR0 = 1;
}


void Ultrasound_Init(void)
{  
  Trig_P17 = 0;
  Echo_P32 = 0;//初始化为低电平
  Timer0_Init();
}


int get_distance(void)
{
  unsigned char i,t1,t2;
  unsigned char timeH,timeL;
  unsigned int time;
  unsigned int distance;
……
  Echo_P32 = 1;
 ……
  timeH = TH0;//得到最终的计数值
  timeL = TL0;
  TH0 = 0;//初值清零,重新计数
  TL0 = 0;


  time = timeH*255 + timeL;    //计数数量转化为十进制
……
  distance = time * 1.7/100;//计算得到距离  
  return distance;
}

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分