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

上传人:痛*** 文档编号:44644072 上传时间:2021-12-05 格式:DOC 页数:21 大小:10.75MB
返回 下载 相关 举报
课程设计(论文)基于单片机的超声波测距仪_第1页
第1页 / 共21页
课程设计(论文)基于单片机的超声波测距仪_第2页
第2页 / 共21页
课程设计(论文)基于单片机的超声波测距仪_第3页
第3页 / 共21页
点击查看更多>>
资源描述
目 录第一章 绪论.11.1 嵌入式系统简介.11.2 研究背景及意义.1第二章 超声波测距仪简介. 2第三章 原理图设计.3第四章 PCB 设计.6 第五章 程序设计及作品展示. .75.1 程序设计框图.75.2 作品展示.85.3 源代码.9总结.191第一章 绪论1.1 嵌入式系统简介随着电子技术的快速发展,特别是大规模集成电路的产生而出现的微型机,使现代科学研究得到了质的飞跃,而嵌入式微控制器技术的出现则给现代工业控制领域带来了一次新的技术革命。由嵌入式微控制器组成的系统,最明显的优势就是可以嵌入到任何微型或小型仪器、设备中。 嵌入式系统被定义为:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统1。嵌入式系统是将先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。 嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统2。和通用计算机不同,嵌入式系统是针对具体应用的专用系统,目的就是要把一切变得更简单、更方便、更普遍、更适用;它的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能。嵌入式系统通常由嵌入式处理器、外围设备、嵌入式操作系统和应用软件等极大部分组成1.2 研究背景及意义超声波是一种在弹性介质中的机械振荡,它是由与介质相接触的振所引起的,其频率在 20kHz 以上,是人耳听不到的一种声波,传播速度仅为光波的百万分之一,纵向分辨率较高。近年来,随着国民经济科学技术及工业自动化的发展,特别是移动机器人的自动避障导航系统和视觉识别系统的需要,出现了许多识别方法和原理根据其信息载体的不同可归纳为光学方法和超声波方法,但光学方法在某些领域有其局限性,相比之下,超声波方法在这些方面具有突出的优点:愁啊黄色光波对色彩光照度不敏感,可用于识别透明及漫反射差的物体(如玻璃抛光体);对外界光线和电磁场不敏感,可用于黑暗有灰尘或烟雾电磁干扰性强等有毒的恶劣环境中;超声波传感器结构简单体积小费用低信息处理简单可靠,易于小型化和集成化。因此,超声检测法已越来越引起人们的重视,被广泛应用在液位测量机械手控制车辆自动导航物体识别等方面特别是在空气测距中,由于空气中波速较慢,其回波信号中包含的沿传播方向2上的结构信息很容易检测出来,具有很高的分辨力,因此其准确度也较其他方法高。 第二章 超声波测距仪简介在日常生产生活中,很多场合如汽车倒车、机器人避障、工业测井、水库液位测量等需要自动进行非接触测距。而超声波是指频率大于 20kHz 的在弹性介质中产生的机械震荡波,其具有指向性强、能量消耗缓慢、传播距离相对较远等特点,因此常被用于非接触测距。由于超声波对光线、色彩和电磁场不敏感,因此超声波测距对环境有较好的适应能力,此外超声波测量在实时、精度、价格也能得到很好地折衷。发展方向:由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人研制上也得到了广泛的应用。超声波测距原理:超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中遇到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为 340m/s,根据计时器记录的时间,就可以计算出发射点距离障碍物的距离(s),即:s=340*t/2。这就是所谓的时间差测距法。超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样的。由于超声波易于定向发射、方向性好、强度易于控制,且与被测物体不需要直接接触的优点,是作为液体高度测量的理想手段。3 Figure1 测量原理4第三章第三章 原理图设计原理图设计本设计采用 Protel 99SE 进行原理图设计,设计的原理图共一张,如下:电源模块:采用 USB 供电的方式,对整个电路进行供电。数码管显示电路:采用四位一体共阳数码管,实时显示距离,单位是厘米。数码管驱动电路:驱动数码管实时显示测到的距离。单片机:采用 STC89C52 单片机作为主控芯片,HC-SR04 超声波模块采集数据,采集到的数据经处理器 STC89C52 处理之后通过数码管显示出来。STC89C52 是STC 公司生产的一种低功耗、高性能 CMOS8 位微控制器,具有 8K 在系统可编程Flash 存储器。STC89C52 使用经典的 MCS-51 内核,但做了很多的改进使得芯片具有传统 51 单片机不具备的功能。在单芯上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 STC89C52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。5 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 电平信号,与射程成比例3:HC-SR04 实物图: Figure4 HC-SR04 模块实物图6 4:接口定义这个模块共有四个引脚(Vcc,Trigger,Echo,GND)。Vcc 端接电源,Trigger 端接触发信号输入,Echo 端接回响信号输出,GND 接地。 5: 模块工作原理 1)采用 IO 触发测距,给至少 10us 的高电平信号; 2)模块自动发送 8 个 40kHz 的方波,自动检测是否有信号返回; 3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速)/2; 原理如下图所示: Figure5Figure5 模块工作原理模块工作原理7 第四章 PCB 设计原理图设计完毕后,采用 Protel 99SE 进行 PCB 板设计。PCB 设计主要按照以下步骤实现:1.根据元件资料、手册完成所需元器件的 PCB 封装。注意完成后,要以 1 比 1 的比例打印进行核对。2.确定 PCB 尺寸。3.综合考虑按照使用习惯、走线难度,为原理图中的不同模块摆放元器件。元器件分布尽量平均、有序。4.连接走线。走线时,为了增加系统的稳定性,遵守以下原则:电源地线要隔离,走线尽量以短、粗、少转角为准则。5.铺地,并且铺数字地。6.丝印调整,增强 PCB 可识性。完成后的 PCB 为单层板如下图所示: Figure6 PCB 图8第五章 程序设计及作品展示5.1 程序设计框图 开开始始初初始始化化定定时时器器0 0复复位位超超声声波波模模块块回回波波是是低低电电平平? ?是是否否启启动动定定时时器器0 0回回波波是是高高电电平平? ?是是否否关关闭闭定定时时器器0 0置置测测量量成成功功标标志志默默认认成成功功测测量量成成功功? ?成成功功失失败败计计算算距距离离显显示示距距离离初初始始化化数数码码管管超超声声波波测测距距主主流流程程图图 95.2 作品展示作品展示105.3 源代码 头文件 coon_def.h,定义了一些延时函数。#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 处理器主频/#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 Keil Software, Inc.All rights reserved.-*/#ifndef _COON_REG_H_#define _COON_REG_H_11/* BYTE Register */sfr P0 = 0 x80; /P0 寄存器(可位寻址)sfr P1 = 0 x90; /P1 寄存器(可位寻址)sfr P2 = 0 xA0; /P2 寄存器(可位寻址)sfr P3 = 0 xB0; /P3 寄存器(可位寻址)sfr PSW = 0 xD0; /程序状态字(可位寻址)sfr ACC = 0 xE0; /累加器(可位寻址)sfr B = 0 xF0; /乘法寄存器(可位寻址)sfr SP = 0 x81; /堆栈指针sfr DPL = 0 x82; /数据存储器指针 DPTR 低 8 位sfr DPH = 0 x83; /数据存储器指针 DPTR 高 8 位sfr PCON = 0 x87; /电源控制及波特率选择sfr TCON = 0 x88; /定时器控制(可位寻址)sfr TMOD = 0 x89; /定时器方式选择sfr TL0 = 0 x8A; /定时器 0 低 8 位sfr TL1 = 0 x8B; /定时器 1 低 8 位sfr TH0 = 0 x8C; /定时器 0 高 8 位sfr TH1 = 0 x8D; /定时器 1 高 8 位sfr IE = 0 xA8; /中断允许寄存器(可位寻址)sfr IP = 0 xB8; /中断优先级寄存器(可位寻址)sfr SCON = 0 x98; /串行口控制器(可位寻址)sfr SBUF = 0 x99; /串行数据缓冲/* BIT Register */* PSW 程序状态寄存器 */sbit CY = 0 xD7; /进位/借位标志.表示是否有向高位的进位/借位sbit AC = 0 xD6; /辅助进位/借位标志.表示是否有向高 4 位进位/借位sbit F0 = 0 xD5; /用户定义标志位sbit RS1 = 0 xD4;sbit RS0 = 0 xD3;sbit OV = 0 xD2; /溢出标志位sbit F1 = 0 xD1; /用户定义标志位sbit P = 0 xD0; /奇偶标志位.累加器 A 中 1 的个数,P 为 1 表示奇数个 1/* TCON 中断控制寄存器 */sbit TF1 = 0 x8F; /当计数器 T1 溢出时,由硬件将 TF1 置 0,当 CPU 响应该中断后,由硬件将该位置 0sbit TR1 = 0 x8E;sbit TF0 = 0 x8D; /当计数器 T0 溢出时,由硬件将 TF0 置 0,当 CPU响应该中断后,由硬件将该位置 0sbit TR0 = 0 x8C;12sbit IE1 = 0 x8B; /标示是否有外部中断 1 发生.如有外部中断发生则,由硬件将该位置为 1,当 CPU 处理该中断后,由硬件将该位置 0sbit IT1 = 0 x8A; /设置外部中断 1 的触发方式.1:表示负跳变触发,0:表示的电平触发sbit IE0 = 0 x89; /标示是否有外部中断 0 发生.如有外部中断发生则,由硬件将该位置为 1,当 CPU 处理该中断后,由硬件将该位置 0sbit IT0 = 0 x88; /设置外部中断 0 的触发方式.1:表示负跳变触发,0:表示的电平触发/* IE 中断允许寄存器 */sbit EA = 0 xAF; /全局中断允许标志位:EA. EA0 所有中断不允许, EA1 所有中断均允许sbit ES = 0 xAC; /串行中断是否允许. 1 表示允许sbit ET1 = 0 xAB; /定时器/计数器中断 1 是否允许. 1 表示允许sbit EX1 = 0 xAA; /外部中断 1 是否允许. 1 表示允许sbit ET0 = 0 xA9; /定时器/计数器中断 0 是否允许. 1 表示允许sbit EX0 = 0 xA8; /外部中断 1 是否允许. 1 表示允许/* IP 中断优先级寄存器 */sbit PS = 0 xBC; /串行口中断优先级. 1:表示高优先级sbit PT1 = 0 xBB; /定时器/计数器 1 中断优先级sbit PX1 = 0 xBA; /外部中断 1 优先级sbit PT0 = 0 xB9; /定时器/计数器 1 中断优先级sbit PX0 = 0 xB8; /外部中断 0 优先级/* P3 */sbit RD = 0 xB7; /读sbit WR = 0 xB6; /写sbit T1 = 0 xB5; /T/C1sbit T0 = 0 xB4; /T/C0sbit INT1 = 0 xB3; /外中断 1sbit INT0 = 0 xB2; /外中断 0sbit TXD = 0 xB1; /串行发送sbit RXD = 0 xB0; /串行接收/* SCON */sbit SM0 = 0 x9F; /sbit SM1 = 0 x9E; /串口工作方式sbit SM2 = 0 x9D; /什么鬼特征位,要用查书,或者等我以后解释,啊哈sbit REN = 0 x9C; /串行接收允许sbit TB8 = 0 x9B; /收到的第九位sbit RB8 = 0 x9A; /要发的第九位sbit TI = 0 x99; /发送完成中断标志13sbit RI = 0 x98; /接收完成中断标志#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 NEED_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_();14_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();#endif#ifdef MCU_FREQUENCY_110592_nop_(); _nop_();_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_FREQUENCY_12 if( pMS 10 ) j=121;else if( pMS 100 ) j=122;else j=123;while(pMS-)for(i=0; ij; i+);#endif15#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_HCSR04();#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;16TMOD = (TMOD & 0 xF0) | 0 x01;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;else if( s 20 ) s = s - 0.8;elseflag_HCSR04 = 0;return s;/* 原型: void interrupt_HCSR04() 功能: 中断程序, 测量失败时触发*/void interrupt_HCSR04() interrupt 1flag_HCSR04 = 1; /中断溢出标志17数码管实现距离显示的头文件 DigitalTube.h#ifndef _DigitalTube_H_#define _DigitalTube_H_#include coon_def.hvoid display_DigitalTube(uchar pIdx, uchar pLetter, 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=0 x7F, 0 xBF, 0 xDF, 0 xEF, 0 xF7, 0 xFB; /位驱动码(05),最多支持 6 个数码管uchar code dis_DigitalTube=0 xC0, 0 xF9, 0 xA4, 0 xB0, 0 x99, 0 x92, 0 x82, 0 xF8, 0 x80, 0 x90, /09 0 xBF, 0 xff; /负号, 空/* 原型: 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 = 0 xFF;bit_port_DigitalTube = bit_DigitalTubepIdx;if( pDot = 1 )18dis_port_DigitalTube = dis_DigitalTubepLetter & 0 x7F;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;/* 原型: void 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;19/* 原型: 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_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; 20总结 除了 HC-SR04 超声波测距模块来说,还有一些其他的更好的模块。例如 URM37 使用了更好的超声波处理方法,使测量距离更远更稳定;模块使用 RS232 串口通讯可靠性更好,同时可以通过电脑串口采集数据,编写通讯程序非常的便捷;模块内部带一个温度测量部件,可以通过通讯口读出分辨率 0.1 摄氏度的环境温度数据;模块提供一个舵机组组成一个 270 度测量组件用于机器人扫描 0-270 度范围的障碍物;模块内带温度补偿电路提高测量的精度。经过一段时间的努力,本次课程设计终于做完了。嵌入式系统设计是综合性比较强的学科,由于以前对一些理论不是很清晰,尤其是软件编程和硬件电路的设计及调试方面都遇到了不少问题,但在老师指导和同学的帮助下,基本得到了解决。通过本次课程设计,我对嵌入式系统有了更多的了解,对超声波测距仪的实现原理有了更清晰的认识,同时掌握一些基本的实际操作技能,提高了动手能力。而且,通过本次课程设计,我对自己的专业知识又进行了一轮系统的填充。把平时忽略的、遗忘的又一次融合到实践中去检验。总之,本次课程设计是我受益匪浅。
展开阅读全文
相关资源
相关搜索

最新文档


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


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!