1、课程设计报告设计名称: 超声波测距 班 级: 15 q 物联网 1 班 学 号: 201524690127 姓 名: 王东升 指导教师: 邢玉秀 2017 年 12 月 11 日-2017 年 12 月 15 日基于单片机的超声波测距设计1 设计目的我所设计的基于 ATMEL 公司 AT89C52 单片机的超声波测距,是利用该51 单片机和 HC-SR04 超声波模块来测量距离。超声波是只频率高于 20kHz 以上的声波,它属于机械波。遵循一般机械波在弹性介质种的传播规律,如在介质的分界面处发生反射和折射的现象,在进入介质后被介质吸收而发生衰减等。正是因为这些性质,使得超声波可以被用于距离的测
2、量中。超声测距是一种非接触检测技术,不受光线,被测对象的颜色等的影响,抗干扰能力强。利用超声波检测往往比较迅速、方便、计算简单、易于实现实时控制,并且在测量精度方面能达到工业实用的指标要求,因而超声波测距被广泛的应用于生活中的各个方面,甚至于很多机器人能及时避开障碍物也是用的超声波测距。因此研究超声波测距是非常有意义的。基于市面上单片机成本低、精度高、易于控制、操作简单,故本设计采用 AT89C52 单片机和 HC-SR04 超声波模块来测量距离。2 设计方案本设计采用以 AT89C52 单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法。整个电路采用模块化设计,
3、由主程序、预置子程序、发射子程序、接收子程序、显示子程序等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。基本工作原理: (1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。 (2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回; (3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S)/2; 1)硬件设计:超声波测距按模块可化分为:1 单片机主控芯片2 超声波发射部分
4、(包括功率驱动电路、超声波发生器)3 超声波接收部分(包括超声波接受器、放大电路、锁相环电路)4 显示部分 (显示电路 LCD1602)* 5 超声波是一种声波,属于机械波,其速度和使用环境的温度及空气的湿度、是否有尘埃物质都有较大的响,所以若要测量得更加精确,则必须要相关的传感器来检测使用的环境。此处只列出温度的影响情况。LCD1602此处可加温湿度传感器和空气种颗粒物含量传感器,用以来补偿或估测环境引起的误差2)软件设计1 主程序设计:主程序对整个单片机系统进行初始化后,先将超声波的回波接受标志位置位并且使单片机 P2.1 端口输出一个低电平用来启动超声波发射电路,同时将定时器 T0 启动
5、,然后调用距离计算的子程序,再根据定时器T0 记录的时间计算出所需要测量的距离,然后再调用显示子程序,再将测出的距离以十进制的形式送至 LCD1206 液晶显示屏显示。最后主程序通过对回拨信号的接收,完成后续的工作,假如标志位清 0 则说明接受到了回波信号,那么主程序就返回到初始端重新将回拨接收标志置位并且在单片机的P2.0 端口上发送低电平到超声波的发射电路,就这样连续不断的来运行,循环不断的工作用来实现测距。2 显示程序初始化 写命令 写数据*将各类函数声明都写到同一个头文件中,方便查看各个函数的参数以及功能。3 硬件电路HC-SR04超声波测距模块说明书 产品特点: HC-SR04 超声
6、波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。 注:1、此模块不宜带电连接,若要带电连接,则先让模块的 GND 端先连接,否则会影响 模块的正常工作。单片机主控芯片原理图:LCD1602 液晶屏显示电路图:HC-SR04 模块硬件电路:4 软件程序1 主程序(main.c)#include#include#include“lcd.h“sbit Trig = P21;sbit Echo = P20;unsigned char Us=“Ultrasonic Range“;unsigned char code ASCII
7、15 = 0,1,2,3,4,5,6,7,8,9,.,-,M;static unsigned char DisNum = 0; /显示用指针unsigned int time=0;unsigned long S=0;bit flag =0;unsigned char disbuff4 = 0,0,0,0,;/* 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*/void Conut(void)time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; /算出来是 CMif(S=700)|flag=1) /超出测量范围显示“
8、-”flag=0;DisplayOneChar(0, 1, ASCII11);DisplayOneChar(1, 1, ASCII10);/显示点DisplayOneChar(2, 1, ASCII11);DisplayOneChar(3, 1, ASCII11);DisplayOneChar(4, 1, ASCII12);/显示 Melsedisbuff0=S%1000/100;disbuff1=S%1000%100/10;disbuff2=S%1000%10 %10;DisplayOneChar(0, 1, ASCIIdisbuff0);DisplayOneChar(1, 1, ASCII
9、10);/显示点DisplayOneChar(2, 1, ASCIIdisbuff1);DisplayOneChar(3, 1, ASCIIdisbuff2);DisplayOneChar(4, 1, ASCII12);/显示 Mvoid zd0() interrupt 1 /T0 中断用来计数器溢出,超过测距范围flag=1; /中断溢出标志void StartModule() /启动模块Trig=1; /启动一次模块_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_()
10、; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();Trig=0;void delayms(unsigned int ms)unsigned char i;for(ms;ms0;ms-)for(i=110;i0;i-);void main(void)TMOD=0x01; /设 T0 为方式 1,GATE=1;TH0=0;TL0=0; ET0=1; /允许 T0 中断EA=1; /开启总中断InitLcd1602();LcdShowStr(0,0,Us
11、);while(1)StartModule();while(!Echo);/当 RX 为零时等待TR0=1; /开启计数while(Echo);/当 RX 为 1 计数并等待TR0=0;/关闭计数Conut();/计算delayms(80);2LCD1602 液晶显示函数声明(LCD.h)#ifndef _LCD_H_#define _LCD_H_/*当使用的是 4 位数据传输的时候定义,使用 8 位取消这个定义*/#define LCD1602_4PINS/*包含头文件*/#include/-重定义关键词-/#ifndef uchar#define uchar unsigned char#e
12、ndif#ifndef uint #define uint unsigned int#endif/*PIN 口定义*/#define LCD1602_DB P0 /data bus 数据总线sbit LCD1602_RS = P35;sbit LCD1602_RW = P36;sbit LCD1602_EN = P34;/*函数声明*/*在 51 单片机 12MHZ 时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); /误差 0usvoid Read_Busy(); /忙检测函数,判断 bit7 是 0,允许执行;1 禁止void Lcd1602_Write_Cm
13、d(unsigned char cmd); /写命令void Lcd1602_Write_Data(unsigned char dat); /写数据void LcdSetCursor(unsigned char x,unsigned char y); /坐标显示void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str); /显示字符串void InitLcd1602(); /1602 初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned ch
14、ar DData);#endif3LCD1602 液晶显示函数及初始化(LCD.c)#include“lcd.h“void Read_Busy() /忙检测函数,判断 bit7 是 0,允许执行;1 禁止unsigned char sta; /LCD1602_DB = 0xff;LCD1602_RS = 0;LCD1602_RW = 1;doLCD1602_EN = 1;sta = LCD1602_DB;LCD1602_EN = 0; /使能,用完就拉低,释放总线while(sta void Lcd1602_Write_Cmd(unsigned char cmd) /写命令Read_Busy(
15、);LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DB = cmd;LCD1602_EN = 1;LCD1602_EN = 0; void Lcd1602_Write_Data(unsigned char dat) /写数据Read_Busy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_EN = 1;LCD1602_EN = 0;void LcdSetCursor(unsigned char x,unsigned char y) /坐标显示unsigned char addr;if(y = 0)
16、addr = 0x00 + x;elseaddr = 0x40 + x;Lcd1602_Write_Cmd(addr|0x80);/按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)Y X /限制 X 不能大于 15,Y 不能大于 1if (Y) X |= 0x40; /当要显示第二行时地址码+0x40;X |= 0x80; /算出指令码Lcd1602_Write_Cmd(X); /发命令字Lcd1602_Write_Data(DData); /发数据void LcdShow
17、Str(unsigned char x,unsigned char y,unsigned char *str) /显示字符串LcdSetCursor(x,y); /当前字符的坐标while(*str != 0)Lcd1602_Write_Data(*str+);void InitLcd1602() /1602 初始化Lcd1602_Write_Cmd(0x38); /设置 16*2 显示,5*7 点阵,8位数据接口Lcd1602_Write_Cmd(0x0c);/设置开显示,不显示光标Lcd1602_Write_Cmd(0x06);/写一个字符后地址指针加 1Lcd1602_Write_Cmd
18、(0x01); /清屏,显示清 0,数据指针清 0 5 调试结果及说明最终调试出了正确的结果,理论上 HC-SR04 能测精确测量的量程是四米,然而实际精确测量的范围只有 2.5 米。这与实验使用的单片机型号有很重要的关系。所用的 AT89C52 单片机内部本来就焊接了很多电路,在本次超声波测距课设中都不会用到,其中的一部分电路还会影响其正常工作的性能。另外AT89C52 单片机的晶振为 11.0592MHz,T0 中断计数也有些微小的误差。不仅如此,超声波的声速还受到温度、空气湿度、空气中固体颗粒尘埃物的含量有关,甚至还与不同障碍物表面材料的不同介质有关。使用的超声波接受器和发射器是分开的,
19、中间存在夹角,而在本次课程设计中并未考虑此因素,若想更精确一般回再乘以超声波感应夹角一半的余弦值。除此之外,还有我们很少考虑到的余弦波的影响。*超生波测距被广泛地应用于生活中,本次设计也还可以做一些拓展,例如再加上蜂鸣器,当距离小于 1 米是蜂鸣器开始响,此项常用于车尾,倒车是后方距离太小就会发出警报。实习收获通过这次课程设计对我来说收获甚多。单片机在生活中应用很广泛,起初选题的时候本来打算选可插 SD 卡的 tft 彩屏,可是发现 tft 彩屏太难,代码量太大,于是选择了比较简单且常用的超声波测距。超声波测距原理的确简单,可是但对于设计菜鸟来说的我,真正接触到超声波时才发现原来超声波并不简单
20、,它涉及的内容也不少,看了很比较多的资料,然而之后让我更加混乱了,更加没有头绪。接着几天就没有看书,暂时放下课设,静静思考老师之前上理论课和实验课讲的步骤与方法,觉得做这些东西一般都采用自顶向下或者自底向上的设计方法,然而这些方法中有一个最核心的,那就是模块化。于是我按照这种方法重新整理思路,接着再看书,果然效果好多了,一共两周的时间,我的课程设计终于步入正轨。此次课程设计将我之前学习的很多知识都用上了,比如大学物理、模电、数电、C 语言等,通过次次课程设计对之前所学的内容进行了一个整合,这是一种很美妙的体验,感觉自己的能力在此次课程设计种提升了不少。同时也让我接触到了很多以前不知道的知识,对超声波有了更深的认识。这次的课设让我收益最大的是学会了做一件是得有正确的思想理论方法指导,这样会事半功倍,在学习的时候一定得积极思考,否则会被一些资料引偏,最终毫无方向感。学生: 年 月 日成绩评定优秀 良好 中等 及格 不及格指导老师参考文献:胡汉才.单片机原理及其接口技术.清华大学出版社,2004 王安敏,张凯.基于 AT89C52 单片机的超声波测距系统,仪表技术与传感器杨居义.单片机课程设计指导,清华大学出版社新浪博客天涯海角,超声波模块 HC-SR04 简介及编程