课程设计(论文)基于单片机的超声波测距仪.doc

上传人:仙人指路1688 文档编号:3993539 上传时间:2023-03-30 格式:DOC 页数:20 大小:10.74MB
返回 下载 相关 举报
课程设计(论文)基于单片机的超声波测距仪.doc_第1页
第1页 / 共20页
课程设计(论文)基于单片机的超声波测距仪.doc_第2页
第2页 / 共20页
课程设计(论文)基于单片机的超声波测距仪.doc_第3页
第3页 / 共20页
课程设计(论文)基于单片机的超声波测距仪.doc_第4页
第4页 / 共20页
课程设计(论文)基于单片机的超声波测距仪.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《课程设计(论文)基于单片机的超声波测距仪.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于单片机的超声波测距仪.doc(20页珍藏版)》请在三一办公上搜索。

1、目 录第一章 绪论11.1 嵌入式系统简介11.2 研究背景及意义1第二章 超声波测距仪简介. 2第三章 原理图设计.3第四章 PCB设计.6 第五章 程序设计及作品展示. .75.1 程序设计框图75.2 作品展示85.3 源代码9总结.19第一章 绪论1.1 嵌入式系统简介随着电子技术的快速发展,特别是大规模集成电路的产生而出现的微型机,使现代科学研究得到了质的飞跃,而嵌入式微控制器技术的出现则给现代工业控制领域带来了一次新的技术革命。由嵌入式微控制器组成的系统,最明显的优势就是可以嵌入到任何微型或小型仪器、设备中。 嵌入式系统被定义为:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适

2、应应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统1。嵌入式系统是将先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。 嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统2。和通用计算机不同,嵌入式系统是针对具体应用的专用系统,目的就是要把一切变得更简单、更方便、更普遍、更适用;它的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能。嵌

3、入式系统通常由嵌入式处理器、外围设备、嵌入式操作系统和应用软件等极大部分组成1.2 研究背景及意义超声波是一种在弹性介质中的机械振荡,它是由与介质相接触的振所引起的,其频率在20kHz以上,是人耳听不到的一种声波,传播速度仅为光波的百万分之一,纵向分辨率较高。近年来,随着国民经济科学技术及工业自动化的发展,特别是移动机器人的自动避障导航系统和视觉识别系统的需要,出现了许多识别方法和原理根据其信息载体的不同可归纳为光学方法和超声波方法,但光学方法在某些领域有其局限性,相比之下,超声波方法在这些方面具有突出的优点:愁啊黄色光波对色彩光照度不敏感,可用于识别透明及漫反射差的物体(如玻璃抛光体);对外

4、界光线和电磁场不敏感,可用于黑暗有灰尘或烟雾电磁干扰性强等有毒的恶劣环境中;超声波传感器结构简单体积小费用低信息处理简单可靠,易于小型化和集成化。因此,超声检测法已越来越引起人们的重视,被广泛应用在液位测量机械手控制车辆自动导航物体识别等方面特别是在空气测距中,由于空气中波速较慢,其回波信号中包含的沿传播方向上的结构信息很容易检测出来,具有很高的分辨力,因此其准确度也较其他方法高。 第二章 超声波测距仪简介在日常生产生活中,很多场合如汽车倒车、机器人避障、工业测井、水库液位测量等需要自动进行非接触测距。而超声波是指频率大于20kHz的在弹性介质中产生的机械震荡波,其具有指向性强、能量消耗缓慢、

5、传播距离相对较远等特点,因此常被用于非接触测距。由于超声波对光线、色彩和电磁场不敏感,因此超声波测距对环境有较好的适应能力,此外超声波测量在实时、精度、价格也能得到很好地折衷。发展方向:由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人研制上也得到了广泛的应用。超声波测距原理:超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中遇到障碍物就立即返回来,超声波接收器收到

6、反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间,就可以计算出发射点距离障碍物的距离(s),即:s=340*t/2。这就是所谓的时间差测距法。超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样的。由于超声波易于定向发射、方向性好、强度易于控制,且与被测物体不需要直接接触的优点,是作为液体高度测量的理想手段。 Figure1 测量原理第三章 原理图设计本设计采用 Protel 99SE进行原理图设计,设计的原理图共一张,如下

7、:电源模块:采用USB供电的方式,对整个电路进行供电。数码管显示电路:采用四位一体共阳数码管,实时显示距离,单位是厘米。数码管驱动电路:驱动数码管实时显示测到的距离。单片机:采用STC89C52单片机作为主控芯片,HC-SR04超声波模块采集数据,采集到的数据经处理器STC89C52处理之后通过数码管显示出来。STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52

8、为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 Figure2 STC89C52引脚图 Figure3 STC89C52实物 超声波测距模块:在这个板子中采用的是HC-SR04超声波模块。1:这个模块性能稳定,测度距离精确。但和国外的SRF05,SRF02等超声波测距模块还是有一定的差距的。2:主要的技术参数: 1)使用电压 : DC 5V 2)静态电流 : 小于2mA 3) 电平输出 : 高5V 4)感应角度 : 不大于15度 5)探测距离 : 2cm-450cm 6)高精度 : 可达0.2cm 7)输入触发信号 : 10us的TTL脉冲 8)输出回响信号 : 输出TTL电平信号,与

9、射程成比例3:HC-SR04实物图: Figure4 HC-SR04模块实物图 4:接口定义这个模块共有四个引脚(Vcc,Trigger,Echo,GND)。Vcc端接电源,Trigger 端接触发信号输入,Echo端接回响信号输出,GND接地。 5: 模块工作原理 1)采用IO触发测距,给至少10us的高电平信号; 2)模块自动发送8个40kHz的方波,自动检测是否有信号返回; 3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速)/2; 原理如下图所示: Figure5 模块工作原理 第四章 PCB设计原理图设计完毕后,采用Pro

10、tel 99SE进行PCB板设计。PCB设计主要按照以下步骤实现:1.根据元件资料、手册完成所需元器件的PCB封装。注意完成后,要以1比1的比例打印进行核对。2.确定PCB尺寸。3.综合考虑按照使用习惯、走线难度,为原理图中的不同模块摆放元器件。元器件分布尽量平均、有序。4.连接走线。走线时,为了增加系统的稳定性,遵守以下原则:电源地线要隔离,走线尽量以短、粗、少转角为准则。5.铺地,并且铺数字地。6.丝印调整,增强PCB可识性。完成后的PCB为单层板如下图所示: Figure6 PCB图第五章 程序设计及作品展示5.1 程序设计框图 5.2 作品展示5.3 源代码 头文件coon_def.h

11、,定义了一些延时函数。#ifndef _COON_DEF_H_#define _COON_DEF_H_/当前主板类型/#define _TIANXIANG_MCU_ 1 /#define _HXZ_MCU_ 2 /#define _COON_MCU_ 3 /数据类型#define uchar unsigned char /无符号字符型#define uint unsigned int /无符号整型/设备数据交互模式#define PARALLEL_MODE 1 /并行模式#define SERIAL_MODE 2 /串行模式#define MCU_FREQUENCY_12 (12) /12M处

12、理器主频/#define MCU_FREQUENCY_110592 (11.0592) /11.0592M处理器主频#define NEED_MS_SLEEP 1 /需要毫秒级延时函数#define NEED_US_SLEEP 1 /需要微秒级延时函数#endif /_COON_DEF_H_头文件coon_reg.h,是51微控制器的通用头文件,包含了一些定义和命令。/*-REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2002 Keil Elektronik GmbH and

13、Keil Software, Inc.All rights reserved.-*/#ifndef _COON_REG_H_#define _COON_REG_H_/* BYTE Register */sfr P0 = 0x80; /P0寄存器(可位寻址)sfr P1 = 0x90; /P1寄存器(可位寻址)sfr P2 = 0xA0; /P2寄存器(可位寻址)sfr P3 = 0xB0; /P3寄存器(可位寻址)sfr PSW = 0xD0; /程序状态字(可位寻址)sfr ACC = 0xE0; /累加器(可位寻址)sfr B = 0xF0; /乘法寄存器(可位寻址)sfr SP = 0x

14、81; /堆栈指针sfr DPL = 0x82; /数据存储器指针DPTR低8位sfr DPH = 0x83; /数据存储器指针DPTR高8位sfr PCON = 0x87; /电源控制及波特率选择sfr TCON = 0x88; /定时器控制(可位寻址)sfr TMOD = 0x89; /定时器方式选择sfr TL0 = 0x8A; /定时器0低8位sfr TL1 = 0x8B; /定时器1低8位sfr TH0 = 0x8C; /定时器0高8位sfr TH1 = 0x8D; /定时器1高8位sfr IE = 0xA8; /中断允许寄存器(可位寻址)sfr IP = 0xB8; /中断优先级寄

15、存器(可位寻址)sfr SCON = 0x98; /串行口控制器(可位寻址)sfr SBUF = 0x99; /串行数据缓冲/* BIT Register */* PSW 程序状态寄存器 */sbit CY = 0xD7; /进位/借位标志.表示是否有向高位的进位/借位sbit AC = 0xD6; /辅助进位/借位标志.表示是否有向高4位进位/借位sbit F0 = 0xD5; /用户定义标志位sbit RS1 = 0xD4;sbit RS0 = 0xD3;sbit OV = 0xD2; /溢出标志位sbit F1 = 0xD1; /用户定义标志位sbit P = 0xD0; /奇偶标志位.

16、累加器A中1的个数,P为1表示奇数个1/* TCON 中断控制寄存器 */sbit TF1 = 0x8F; /当计数器T1溢出时,由硬件将TF1置0,当CPU响应该中断后,由硬件将该位置0sbit TR1 = 0x8E;sbit TF0 = 0x8D; /当计数器T0溢出时,由硬件将TF0置0,当CPU响应该中断后,由硬件将该位置0sbit TR0 = 0x8C;sbit IE1 = 0x8B; /标示是否有外部中断1发生.如有外部中断发生则,由硬件将该位置为1,当CPU处理该中断后,由硬件将该位置0sbit IT1 = 0x8A; /设置外部中断1的触发方式.1:表示负跳变触发,0:表示的电

17、平触发sbit IE0 = 0x89; /标示是否有外部中断0发生.如有外部中断发生则,由硬件将该位置为1,当CPU处理该中断后,由硬件将该位置0sbit IT0 = 0x88; /设置外部中断0的触发方式.1:表示负跳变触发,0:表示的电平触发/* IE 中断允许寄存器 */sbit EA = 0xAF; /全局中断允许标志位:EA. EA0 所有中断不允许, EA1 所有中断均允许sbit ES = 0xAC; /串行中断是否允许. 1表示允许sbit ET1 = 0xAB; /定时器/计数器中断1是否允许. 1表示允许sbit EX1 = 0xAA; /外部中断1是否允许. 1表示允许s

18、bit ET0 = 0xA9; /定时器/计数器中断0是否允许. 1表示允许sbit EX0 = 0xA8; /外部中断1是否允许. 1表示允许/* IP 中断优先级寄存器 */sbit PS = 0xBC; /串行口中断优先级. 1:表示高优先级sbit PT1 = 0xBB; /定时器/计数器1中断优先级sbit PX1 = 0xBA; /外部中断1优先级sbit PT0 = 0xB9; /定时器/计数器1中断优先级sbit PX0 = 0xB8; /外部中断0优先级/* P3 */sbit RD = 0xB7; /读sbit WR = 0xB6; /写sbit T1 = 0xB5; /T

19、/C1sbit T0 = 0xB4; /T/C0sbit INT1 = 0xB3; /外中断1sbit INT0 = 0xB2; /外中断0sbit TXD = 0xB1; /串行发送sbit RXD = 0xB0; /串行接收/* SCON */sbit SM0 = 0x9F; /sbit SM1 = 0x9E; /串口工作方式sbit SM2 = 0x9D; /什么鬼特征位,要用查书,或者等我以后解释,啊哈sbit REN = 0x9C; /串行接收允许sbit TB8 = 0x9B; /收到的第九位sbit RB8 = 0x9A; /要发的第九位sbit TI = 0x99; /发送完成

20、中断标志sbit RI = 0x98; /接收完成中断标志#endif /_COON_REG_H_coon.h头文件定义了一些延时函数#ifndef _COON_H_#define _COON_H_#include coon_def.h#ifdef NEED_US_SLEEPvoid delay_20us(); /延时20us#endif#ifdef NEED_MS_SLEEPvoid delay_ms(uint pMS); /延时指定毫秒时间pMS#endif#endif /_COON_H_coon.c文件实现了两个延时函数。#include coon.h#include #ifdef NE

21、ED_US_SLEEP/* 原型: void delay_20us() 功能: 延时20us*/void delay_20us()#ifdef MCU_FREQUENCY_12_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();#endif#ifdef MCU_FREQUENCY_110592_nop_(); _no

22、p_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_(); _nop_(); #endif#endif#ifdef NEED_MS_SLEEP/* 原型: void delay_ms(uint pMS) 功能: 延时指定的毫秒时间pMS, 延时误差小于1% 参数: pMS 延时的毫秒数*/void delay_ms(uint pMS)uchar i=0, j=0;#ifdef MCU_FREQU

23、ENCY_12 if( pMS 10 ) j=121;else if( pMS 100 ) j=122;else j=123;while(pMS-)for(i=0; ij; i+);#endif#ifdef MCU_FREQUENCY_110592 if( pMS 10 ) j=111;else if( pMS 100 ) j=112;else j=113;while(pMS-)for(i=0; ij; i+);#endif#endifHC-SR04模块的头文件HCSR04.h#ifndef _HCSR04_H_#define _HCSR04_H_float get_distance_HCSR

24、04();#endif /_HCSR04_H_HC-SR04模块的实现文件HCSR04.c#include HCSR04.h#include coon_reg.h#include coon.hsbit echo_HCSR04=P15; /sbit trig_HCSR04=P14;bit flag_HCSR04=0;/* 原型: float get_distance_HCSR04() 功能: 执行一次距离测量,并返回测量结果 返回: 测量到的距离, 单位为厘米*/float get_distance_HCSR04()float s=0.0;TMOD = (TMOD & 0xF0) | 0x01;

25、ET0 = 1; /允许T0中断/最大定时时间为65msTH0 = 0; TL0 = 0;/生成20us的脉冲宽度的触发信号trig_HCSR04 = 1; delay_20us();trig_HCSR04 = 0;/等待回响信号变高电平while(!echo_HCSR04); /当RX为零时等待TR0=1; /开启计数/等待回响信号变低电平while(echo_HCSR04); /当RX为1计数并等待TR0=0; /关闭计数if(flag_HCSR04 = 0) /超出测量s = (TH0*256+TL0)*1.87)/100; /算出来是CMif( s 10 ) s = s - 0.4;e

26、lse if( s 20 ) s = s - 0.8;elseflag_HCSR04 = 0;return s;/* 原型: void interrupt_HCSR04() 功能: 中断程序, 测量失败时触发*/void interrupt_HCSR04() interrupt 1flag_HCSR04 = 1; /中断溢出标志数码管实现距离显示的头文件DigitalTube.h#ifndef _DigitalTube_H_#define _DigitalTube_H_#include coon_def.hvoid display_DigitalTube(uchar pIdx, uchar p

27、Letter, uchar pDot);#endif /_DigitalTube_H_数码管实现距离显示的实现文件DigitalTuhe.c#include DigitalTube.h#include coon_reg.h#define dis_port_DigitalTube P0#define bit_port_DigitalTube P2uchar code bit_DigitalTube=0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB; /位驱动码(05),最多支持6个数码管uchar code dis_DigitalTube=0xC0, 0xF9, 0xA4,

28、0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, /09 0xBF, 0xff; /负号, 空/* 原型: void display_DigitalTube(uchar pIdx, uchar pLetter, uchar pDot) 功能: 数码管显示 参数: pIdx 数码管编号 pLetter 显示的字符, 09 pDot 是否显示小数点*/void display_DigitalTube(uchar pIdx, uchar pLetter, uchar pDot)dis_port_DigitalTube = 0xFF;bit_port_DigitalT

29、ube = bit_DigitalTubepIdx;if( pDot = 1 )dis_port_DigitalTube = dis_DigitalTubepLetter & 0x7F;elsedis_port_DigitalTube = dis_DigitalTubepLetter; 主函数main.c #include HCSR04.h#include DigitalTube.h#include coon.h#include coon_def.h#include #include #include float distance=0;float distances10=0;/* 原型: vo

30、id get_distance() 功能: 将10次测量结果排序,取中间4次的平均值, 保存到distance变量中*/void get_distance()int i=0, j=0, m=0;for(i=0; i9; i+)for(j=i; j10; j+)if( distancesj distancesi )m = distancesi;distancesi = distancesj;distancesj = m;distance = distances3 + distances4 + distances5 + distances6;distance = distance / 2;/* 原

31、型: void display_distance() 功能: 显示测试的距离*/void display_distance()display_DigitalTube(3, (int)distance / 100, 0);delay_ms(1);display_DigitalTube(2, (int)distance % 100 / 10, 0);delay_ms(1);display_DigitalTube(1, (int)distance % 10, 1);delay_ms(1);display_DigitalTube(0, (int)(distance*10) % 10, 0);delay

32、_ms(1);void main(void) int times=0;EA=1; /开启总中断while(1)display_distance();if( (times%3)=0 )distancestimes/3 = get_distance_HCSR04();times+;if( times = 30 )get_distance();times = 0; 总结 除了HC-SR04超声波测距模块来说,还有一些其他的更好的模块。例如URM37使用了更好的超声波处理方法,使测量距离更远更稳定;模块使用RS232串口通讯可靠性更好,同时可以通过电脑串口采集数据,编写通讯程序非常的便捷;模块内部带一

33、个温度测量部件,可以通过通讯口读出分辨率0.1摄氏度的环境温度数据;模块提供一个舵机组组成一个270度测量组件用于机器人扫描0-270度范围的障碍物;模块内带温度补偿电路提高测量的精度。经过一段时间的努力,本次课程设计终于做完了。嵌入式系统设计是综合性比较强的学科,由于以前对一些理论不是很清晰,尤其是软件编程和硬件电路的设计及调试方面都遇到了不少问题,但在老师指导和同学的帮助下,基本得到了解决。通过本次课程设计,我对嵌入式系统有了更多的了解,对超声波测距仪的实现原理有了更清晰的认识,同时掌握一些基本的实际操作技能,提高了动手能力。而且,通过本次课程设计,我对自己的专业知识又进行了一轮系统的填充。把平时忽略的、遗忘的又一次融合到实践中去检验。总之,本次课程设计是我受益匪浅。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号