基于MSP430的简易超声波探测仪

更新时间:2023-05-26 18:38:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机原理与接口技术

课程设计

题目名称: 简易超声波测距仪

专业班级:学生姓名: 学 号: 指导教师:

目 录

引言 ............................................... 4 第一章 绪论

1.1 超声波测量原理 ................................. 4 1.2系统概述 ....................................... 4 第二章 设计方案与论证

2.1 超声波测距模块 ................................. 5 2.2 供电模块 ....................................... 5 2.3 显示模块 ....................................... 5 2.4测温模块 ....................................... 6 第三章 硬件设计

3.1 系统原理方框图 ................................ 6 3.2 主电路图 ....................................... 7 3.3 I/O口分配 ..................................... 7 3.4 元器件选型 ..................................... 8 3.4.1 主控制芯片MSP430G2553 ..................... 8 3.4.2 HC-SR04超声波模块 ......................... 8 3.4.3 温度传感器DS18B20 ......................... 9 3.4.4 稳压芯片LM1117 ............................. 9 3.4.5 5110液晶显示 ............................. 10 第四章 软件设计

4.1 主流程图及介绍 ............................... 10 第五章 系统调试

5.1 测距调试 ...................................... 11 第六章 设计心得 ................................... 11 参考文献 .......................................... 12 附录1:源程序..................................... 14 附录2:相关照片 ................................... 27

引言:

设计一个超声波测距仪,可应用于汽车倒车、 建筑施工工地以及一些工业现场的位置监控, 也可用于如液位、 井深、 管道长度的测量、 移动机器人、 安全线提示, 银行及取款机的一米线提示等场合。要求测量范围在 0.20~4.00m, 测量精度 1cm, 测量时与被测物体无直接接触, 能够清晰稳定地显示测量结果。

第一章 绪论

1.1 超声波测量原理

超声波为直线传播方式,频率高,反射能力强;在空气中传播速度为 340m/s, 容易控制;受环境影响小,因此采用超生波传感器作为距离探测的" 眼睛"。用于测距领域的超声波频率为20kHz~ 400kHz的频段,空气介质中常用为 40kHz。避障系统的超声波测距通常运用超声波的反射原理,采用渡越时间法,通过测量超声波发射到返回之间的时间间隔来计算距离。由于时间长度与声音通过的距离成正比关系,当发射超声波传感器发出一个短暂的脉冲波时,记时开始;当接收超声波传感器接收到第一个回波脉冲后,计时立即停止。此时,记录得到的时间值为 t,那么从超声波发射位置到障碍物之间的实际距离就可按下式求得。

L=ct/2 (I)

式(I)中:L为超声波发射位置到障碍物之间的实际距离;

t 为超声波发生器发出超声波到接收到超声波的时间间隔。

1.2系统概述

此系统为一个简易超声波测距仪,测量4m以内的距离。它以MSP430G2553为中心控制器,由测距、显示、供电、以及测温部分组成。测距部分采用HC-SR04模块,显示部分为5110液晶显示。系统由两块串联到一起的手机电池供电,通过两个1117稳压芯片把电压转换成5v和3.3v给各个模块供电。DS18B20芯片首先测得当前温度,对于超声波测距进行校正,并和温度值一起在5110液晶上进行显示。还可以通过两个按键锁定和解锁液晶。完成对于距离的测量。

考虑到这是一个便携式的设备,系统要尽可能的简化电路以减少功耗。程序设计也尽可能的减少硬件的工作次数,比如较为复杂温度的测量就是每隔30s刷新一次。不仅如此系统的大小还得考虑,合理的安排元件的位置,以减少板子的大小。

第二章 设计方案与论证

2.1 超声波测距模块

方案一:

按照电路图手工焊接相关电路。优点:可以合理安排零件的位置,减少系统的大小。缺点:调试难度大,并且精度没有保证。最后不予考虑。 方案二:

使用超声波模块KS103。测距最大距离8米,盲区为最小1cm之内。测量精度平均3mm,最高达1mm.而且相当灵敏。具有目前其他同类超声波模块产品所无法达到的性能优势和质量保障。测量距离,温度,光强,三合一功能 。但是缺点是价格太高,不予考虑。 方案三:

使用超声波模块HC-SR04模块。模块特点:HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。综合价格、大小、精度等各方面因素,系统最后选择此模块座位测距模块。 2.2 供电模块

方案一:

使用若干节五号干电池供电。由于直流升压芯片相比降压来说要少,并且在稳压过程中的损耗比降压要大,所以需要5v以上的电压供电。干电池每节1.5v,也就是说需要4节干电池。体积较大,并且不能充电,所以不采用此方案。 方案二:

使用手机电池供电。手机电池为锂电池,电量大,体积小。要达到5v以上电压只需两块电池串联。并且还可以充电,便于循环使用。两块手机电池串联之后实际电压为8.4v,1117稳压芯片也很便宜。经过两级降压分别输出5v和3.3v的电压。本系统就是采用这个方案。 2.3 显示模块

方案一:

1602液晶显示屏,可以显示两排数字以及字符。但是它所占用的引脚太多,除去供电引脚外还需12个引脚。MSP430G2只有组8位I/O口,所以1602不予考虑。

方案二:

5110液晶显示屏可以显示15*6个数字或字符,并且还能显示汉字。除去电源引脚外只需占用5个I/O口即可工作,所以本系统采用此液晶显示。 2.4测温模块

方案一:

使用热电阻组成电桥电路,将温度转换成电压值,经过单片机内部的AD转换电路变成数字量。但是电桥电路的平衡由于存在各种漂移不容易调整,并且电桥持续工作浪费电量,不符合便携式的设计要求,综上不予考虑此方案。 方案二:

数字化芯片DS18B20温度传感器,控制较为简单,并且只需占用一个引脚。集成程度高,休眠时的功率也很小。精度为0.5摄氏度。满足本系统的设计要求。

第三章 硬件设计

3.1 系统原理方框图

图3-1 系统原理方框图

3.2 主电路图

图3-2 主电路图

3.3 I/O口分配

P1.0接DS18B20,P1.1和P1.2分别接HC-RS04的Trig和Echo引脚。

P1.3 P1.4接两个按钮。

P1.7 P1.6 P2.5 P2.4 P2.3接5110液晶显示屏

图3-3 单片机I/O口分配图

3.4 元器件选型

3.4.1 主控制芯片MSP430G2553

MSP430G2 系列是德州仪器推出的一款产品, 在秉承 MSP430 超低功耗, 高集成度

的优点的同时,具有高性价比的特点 MSP430 单片机片上外围模块: 16MHz 主频 16 位 CPU

片上程序存储器 FLASH(512B/1KB/2KB/4KB/8KB/16KB)及 FLASH 控制器 片上随机存储器 SRAM(128B/256B/512B)

通用并行输入输出端口 GPIO(4 位/16 位/20 位/24 位) 支持电容触摸式 I/O 看门狗定时器 WDT

上电复位模块 BOR

多功能通信模块 USI(I2C/SPI)USIC_A(UART/LIN/IrDA/SPI) USIC_B(I2C&SPI)

比较器模块 Comparator A+ 片内温度传感器 Temp Sensor 十位逐次逼近型 ADC10 斜率型 slope ADC

3.4.2 HC-SR04超声波模块

HC-SR04可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。

使用方法:控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了

基本工作原理:

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回; (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。

图3-4 HC-SR04模块原理图

3.4.3 温度传感器DS18B20

独特的一线接口,只需要一条口线通信 多点能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源 测量温度范围为-55 °C至+125 ℃ 。 -10 °C至+85 °C范围内精度为±0.5 °C。

温度传感器可编程的分辨率为9~12位,温度转换为12位数字格式最大值为750毫秒,用户可定义的非易失性温度报警设置。

由于DS18B20是一条口线通信,所以中央微处理器与DS18B20只有一个一条口线连接。为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。 因为每一个DS18B20的包含一个独特的序号,多个ds18b20s可以同时存在于 一条总线。这使得温度传感器放置在许多不同的 二条地方。

3.4.4 稳压芯片LM1117

AMS1117是一个正向低压降稳压器,在1A电流下压降为1.2V。AMS1117有两个版本:固定输出版本和可调版本,固定输出电压为1.5V、1.8V、2.5V、2.85V、3.0V、3.3V、5.0V,具有1%的精度;固定输出电压为1.2V的精度为2%。

AMS1117

图3-5 DS18B20接线图

内部集成过热保护和限流电路,是电池供电和便携式计算机的最佳选择。

图3-6 1117稳压模块原理模块

3.4.5 5110液晶显示

该模块具有以下特点:

1、84x48 的点阵LCD,可以显示4 行汉字,

2、采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9 条。支持多种串行通信协议(如AVR 单片机的SPI、MCS51 的串口模式0等),传输速率高达4Mbps,可全速写入显示数据。 3、可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印制板上,因而非常便于安装和更换。

4、LCD 控制器/驱动器芯片已绑定到LCD 晶片上,模块的体积很小。

5、采用低电压供电,正常显示时的工作电流在200μA 以下,且具有掉电模式

图3-7 5110原理图

第四章 软件设计

4.1 主流程图及介绍

图4-1 系统软件流程图

程序初始化之后,首先由DS18B20为温度赋初值。之后HC-SR04模块开始测距,测距时使用的定时器T0为模块返回的高脉冲计时,按模块的设计要求,计算出脉冲宽度即可得到声波反射所需时间。得出时间后代入公式测试:距离=(高电平时间*声速(340M/S))/2。并且此时的声速已经经过了温度矫正,以减少误差。与此同时定时器T1一直在定时,每隔50ms就会产生一次中断,在中断程序中标志位每次加1,当标志位加到600时,即一共30s时,程序就会刷新温度值。 在5110液晶上显示的为距离值,单位cm,以及温度值。当按键1按下时,触发中断改变标志位,使得液晶锁屏。按键2按下时触发中断解锁屏幕。

由于超声波计数和温度测量时的程序不允许打断,在这两项进行的时候全局中断关闭,防止打断程序影响结果。

第五章 系统调试

5.1 测距调试

首先将HC-SR04模块固定,前方放置一个长直尺,单片机中烧入测距程序并循环此程序。在循环开始处设置断点,通过CCS软件自带的单步执行功能在电脑上显示出测距值,并于直尺上的数值进行对照。

表5-1 近距离系统测试结果

(在3cm之内的程序略有不同,对于数值的显示精确度进行了修改)

表5-2 远距离系统测试结果

通过结果可得在2cm之内时,测距值精确度不高,因为盲区的影响不能实现近距测量。但是3cm之后的测量比较准确,基本可以实现设计要求。

第六章 设计心得

通过此次课程设计首先我学习HC-SR04超声波测距模块的使用方法,也了解了很多超声波的应用以及测距的发展历史。另外DS18B20的使用是我对于串行口的数据输出、输入的常用格式有了一定的了解。其次对于5110液晶的学习使得以后再显示应用中有了更多的选择,不需要再进行繁琐的数码管焊接,并且显示的效果也更好。当然对于其他电路,比如稳压电路也是一种复习。但是5110的显示功能很强,这一次只用到了很少的一部分功能,以后还要继续研究学习。

在这次设计工程中,查阅了许多关于便携式设备的资料,了解到当前便携式设备最主要考虑的一个问题就是功耗问题。由于不能随时充电,对于低功耗的设

计就显得很重要。这方面的研究还有很大的前景等着我们去探索。本系统的芯片选型就考虑到了这方面的要求,芯片选型就是采用TI公司专门为这方面设计的单片机。不过这款单片机的真正功能在这个系统中并未很好的体现出来,对于它复杂的时钟系统以及各种休眠模式的应用并不多,以后可以继续改进程序。

在制作、编程过程中我学习到细节的重要性。焊接电路版的时候任何小的接线都会影响整个系统的正常运行。特别是在软件上,有时候一个符号的错误都会导致整个程序的混乱,所以下次制作一定要细心,减少这种事情的发生。

总之,通过此次课程设计,不仅学习到了一些实际应用,也将我们的理论和实践相结合,取得了不少了收获。

参考文献

【1】郭天祥. 《51单片机C语言教程—入门、提高、开发、拓展全攻略》. 电子工业出版社 2009

【2】沈建华 杨艳琴 《MSP430系列16位低功耗原理与应用》 清华大学出版社,2004

【3】谭浩强. 《C程序设计》(第二版) 清华大学出版社,2000 【4】阎石. 《数字电子技术基础》(第五版) 高等教育出版社 2005

【5】夏路易 石宗义.《电路原理图与电路板设计教程Protel 99SE 》 北京希望电子出版社 2002

【6】张迎新. 《单片机微型计算机 原理、应用及接口技术》(第二版) 国防工业出版社 2009

【7】康华光. 《电子技术基础 模拟部分》(第五版) 高等教育出版社 2005 【8】电子发烧网电子论坛

附录1:源程序

/*****主程序函数*****/ #include <msp430g2553.h> #include "Display.h" #include "Distance.h" #include "Temperature.h" #define uint unsigned int int T;

uint distance_main,count; uchar style; void init() {

if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) {

while(1); }

BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ;

#define uchar unsigned char

WDTCTL=WDTPW+WDTHOLD;

TA1CTL |= TASSEL_0+ MC_1 + TACLR; TA1CCR0 = 1637; TA1CCTL0 = CCIE; P1DIR|=BIT2; P1DIR&=~BIT1; TACTL|=TASSEL_1; P1DIR&=~(BIT3+BIT4); P1REN|=BIT3+BIT4; P1OUT|=BIT3+BIT4; P1IES|=BIT3+BIT4;

}

P2DIR |= BIT3+BIT4+BIT5;

void main(void) { }

#pragma vector=PORT1_VECTOR __interrupt void Port(void) { }

#pragma vector = TIMER1_A0_VECTOR __interrupt void Timer_A(void) {

count++; if(count>600) {

T = Temperature();

_delay_cycles(10000); if(P1IN&BIT3)

style=0; style=1;

if(P1IN&BIT4) P1IFG&=~(BIT3+BIT4);

while(1) { }

distance_main = Distance(); if(style) { }

_delay_cycles(50000);

Display(distance_main,T);

init(); LCD_init(); _EINT();

T = Temperature();

}

}

/*****超声波测距函数*****/ #ifndef DISTANCE_H_ #define DISTANCE_H_ int Distance();

#endif /* DISTANCE_H_ */

#include <msp430g2553.h> #include "Distance.h" #define uint unsigned int #define uchar unsigned char int T;

uint distance,times;

int Distance() { }

/*****温度测量程序*****/ #ifndef TEMPERATURE_H_

return distance; while(!(P1IN&BIT1)); TACTL|=MC_2+TACLR; while(P1IN&BIT1); TACTL&=~MC_2; times=TAR;

distance=times*(332 + 0.607*T/10)/655.36; times=0;

P1OUT|=BIT2; _delay_cycles(10); P1OUT&=~BIT2;

#define TEMPERATURE_H_ #define uint unsigned int #define uchar unsigned char #define POUT P1DIR|=BIT0; #define PIN P1DIR&=~BIT0; #define P_1 P1OUT|=BIT0; #define P_0 P1OUT&=~BIT0; uchar Temperature_init(void); void Temperature_write(uchar data); uchar Temperature_read(void); int Temperature_main(void); int Temperature(void);

#endif /* TEMPERATURE_H_ */

#include <msp430g2553.h> #include "Temperature.h" #define uint unsigned int #define uchar unsigned char

extern uint T;

uchar Temperature_init(void)

{ uchar i; POUT; P_0;

_delay_cycles(600); P_1;

_delay_cycles(60); if(P1IN&BIT0) i=0;

else

i=1;

_delay_cycles(480); return i;

}

void Temperature_write(uchar data) {

uchar i; for(i=0;i<8;i++) { POUT; P_0;

_delay_cycles(10); if(data&BIT0) P_1; if(!(data&BIT0))

P_0; _delay_cycles(40); P_1; data>>=1

}

}

uchar Temperature_read(void) { uchar tem=0,i; for(i=0;i<8;i++) { tem>>=1; POUT; P_0; P_1; PIN;

if(P1IN&BIT0)

tem|=0x80;

_delay_cycles(40);

} return tem; }

int Temperature_main(void) { uchar T_L,T_H; int num=0;

while(!Temperature_init());

Temperature_write(0xcc);

Temperature_write(0x44); _delay_cycles(400); while(!Temperature_init()); Temperature_write(0xcc); Temperature_write(0xbe); T_L=Temperature_read(); T_H=Temperature_read(); if(T_H&0XF8)

{ T_H=T_H<<8; num=T_H|T_L; num=-(~num+1)*0.625;

} else

{ num=(T_H<<8|T_L)*0.625;

}

return num;

}

int Temperature(void) { uchar n; T=0; _DINT(); for(n=3;n>0;n--)

{

T+=Temperature_main();

} _EINT(); T=T/3;

}

/*****5110液晶显示程序*****/ #define uint unsigned int

#define uchar unsigned char #define DC_1 P2OUT|=BIT5;

#define DC_0 P2OUT&=~BIT5; #define CE_1 P1OUT|=BIT6; #define CE_0 P1OUT&=~BIT6; #define RST_1 P1OUT|=BIT7; #define RST_0 P1OUT&=~BIT7; #define SDIN_1 P2OUT|=BIT4; #define SDIN_0 P2OUT&=~BIT4; #define SCLK_1 P2OUT|=BIT3; #define SCLK_0 P2OUT&=~BIT3;

void LCD_write_byte(uchar data,uchar command); void LCD_set_XY(uchar X,uchar Y); void LCD_clear(); void LCD_init();

void LCD_write_char(uchar c);

void LCD_write_Char(uchar X,uchar Y,uchar asc); void LCD_write_English_string(uchar X,uchar Y,char *s) ; void LCD_write_nummber_1(uchar X,uchar Y,uint num); void LCD_write_nummber_2(uchar X,uchar Y,uint num); void Display(uint dis,int T); #endif /* DISPLAY_H_ */

#include <msp430g2553.h> #include"Display.h" const uchar font6x8[][6] = {

{ 0x00, 0x00, 0x00, 0x00, 0x06, 0x00 }, // sp 32 { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! 33 { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // " 34 { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // % { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // & { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // * { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // + { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,

本文来源:https://www.bwwdw.com/article/lpo4.html

Top