基于MSP430的简易超声波探测仪Word格式文档下载.docx
《基于MSP430的简易超声波探测仪Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于MSP430的简易超声波探测仪Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
![基于MSP430的简易超声波探测仪Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/9/e07b2391-2041-4810-90f3-bead19b3db89/e07b2391-2041-4810-90f3-bead19b3db891.gif)
不仅如此系统的大小还得考虑,合理的安排元件的位置,以减少板子的大小。
第2章设计方案与论证
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章硬件设计
3.1系统原理方框图
图3-1系统原理方框图
3.2主电路图
图3-2主电路图
3.3I/O口分配
P1.0接DS18B20,P1.1和P1.2分别接HC-RS04的Trig和Echo引脚。
P1.3P1.4接两个按钮。
P1.7P1.6P2.5P2.4P2.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)
•比较器模块ComparatorA+
•片内温度传感器TempSensor
•十位逐次逼近型ADC10
•斜率型slopeADC
3.4.2HC-SR04超声波模块
HC-SR04可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;
使用方法:
控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了
基本工作原理:
(1)采用IO口TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2。
图3-4HC-SR04模块原理图
3.4.3温度传感器DS18B20
独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0V至5.5V无需备用电源测量温度范围为-55°
C至+125℃。
-10°
C至+85°
C范围内精度为±
0.5°
C。
温度传感器可编程的分辨率为9~12位,温度转换为12位数字格式最大值为750毫秒,用户可定义的非易失性温度报警设置。
由于DS18B20是一条口线通信,所以中央微处理器与DS18B20只有一个一条口线连接。
为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。
因为每一个DS18B20的包含一个独特的序号,多个ds18b20s可以同时存在于图3-5DS18B20接线图
1条总线。
这使得温度传感器放置在许多不同的
2条地方。
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-61117稳压模块原理模块
3.4.55110液晶显示
该模块具有以下特点:
1、84x48的点阵LCD,可以显示4行汉字,
2、采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9条。
支持多种串行通信协议(如AVR单片机的SPI、MCS51的串口模式0等),传输速率高达4Mbps,可全速写入显示数据。
3、可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印制板上,因而非常便于安装和更换。
4、LCD控制器/驱动器芯片已绑定到LCD晶片上,模块的体积很小。
5、采用低电压供电,正常显示时的工作电流在200μA以下,且具有掉电模式
图3-75110原理图
第4章软件设计
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软件自带的单步执行功能在电脑上显示出测距值,并于直尺上的数值进行对照。
在3cm之内时测量
实际值/cm
0.5
1
1.5
2.0
2.5
3.0
3.5
测量值/cm
无结果
2.4左右
2.2
2.4
3.1
3.7
表5-1近距离系统测试结果
(在3cm之内的程序略有不同,对于数值的显示精确度进行了修改)
在3cm之外的测量
5
10
15
20
30
40
50
60
4
9
14
29
59
表5-2远距离系统测试结果
通过结果可得在2cm之内时,测距值精确度不高,因为盲区的影响不能实现近距测量。
但是3cm之后的测量比较准确,基本可以实现设计要求。
第6章设计心得
通过此次课程设计首先我学习HC-SR04超声波测距模块的使用方法,也了解了很多超声波的应用以及测距的发展历史。
另外DS18B20的使用是我对于串行口的数据输出、输入的常用格式有了一定的了解。
其次对于5110液晶的学习使得以后再显示应用中有了更多的选择,不需要再进行繁琐的数码管焊接,并且显示的效果也更好。
当然对于其他电路,比如稳压电路也是一种复习。
但是5110的显示功能很强,这一次只用到了很少的一部分功能,以后还要继续研究学习。
在这次设计工程中,查阅了许多关于便携式设备的资料,了解到当前便携式设备最主要考虑的一个问题就是功耗问题。
由于不能随时充电,对于低功耗的设计就显得很重要。
这方面的研究还有很大的前景等着我们去探索。
本系统的芯片选型就考虑到了这方面的要求,芯片选型就是采用TI公司专门为这方面设计的单片机。
不过这款单片机的真正功能在这个系统中并未很好的体现出来,对于它复杂的时钟系统以及各种休眠模式的应用并不多,以后可以继续改进程序。
在制作、编程过程中我学习到细节的重要性。
焊接电路版的时候任何小的接线都会影响整个系统的正常运行。
特别是在软件上,有时候一个符号的错误都会导致整个程序的混乱,所以下次制作一定要细心,减少这种事情的发生。
总之,通过此次课程设计,不仅学习到了一些实际应用,也将我们的理论和实践相结合,取得了不少了收获。
参考文献
【1】郭天祥.《51单片机C语言教程—入门、提高、开发、拓展全攻略》.电子工业出版社2009
【2】沈建华杨艳琴《MSP430系列16位低功耗原理与应用》清华大学出版社,2004
【3】谭浩强.《C程序设计》(第二版)清华大学出版社,2000
【4】阎石.《数字电子技术基础》(第五版)高等教育出版社2005
【5】夏路易石宗义.《电路原理图与电路板设计教程Protel99SE》北京希望电子出版社2002
【6】张迎新.《单片机微型计算机原理、应用及接口技术》(第二版)国防工业出版社2009
【7】康华光.《电子技术基础模拟部分》(第五版)高等教育出版社2005
【8】电子发烧网电子论坛
附录1:
源程序
/*****主程序函数*****/
#include<
msp430g2553.h>
#include"
Display.h"
Distance.h"
Temperature.h"
#defineuintunsignedint
#defineucharunsignedchar
intT;
uintdistance_main,count;
ucharstyle;
voidinit()
{
WDTCTL=WDTPW+WDTHOLD;
if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
{
while
(1);
}
BCSCTL1=CALBC1_1MHZ;
DCOCTL=CALDCO_1MHZ;
TA1CTL|=TASSEL_0+MC_1+TACLR;
TA1CCR0=1637;
TA1CCTL0=CCIE;
P1DIR|=BIT2;
P1DIR&
=~BIT1;
TACTL|=TASSEL_1;
=~(BIT3+BIT4);
P1REN|=BIT3+BIT4;
P1OUT|=BIT3+BIT4;
P1IES|=BIT3+BIT4;
P1DIR|=BIT6+BIT7;
P2DIR|=BIT3+BIT4+BIT5;
}
voidmain(void)
init();
LCD_init();
T=Temperature();
_EINT();
while
(1)
distance_main=Distance();
if(style)
{
Display(distance_main,T);
}
_delay_cycles(50000);
#pragmavector=PORT1_VECTOR
__interruptvoidPort(void)
_delay_cycles(10000);
if(P1IN&
BIT3)
style=0;
BIT4)
style=1;
P1IFG&
#pragmavector=TIMER1_A0_VECTOR
__interruptvoidTimer_A(void)
count++;
if(count>
600)
T=Temperature();
count=0;
/*****超声波测距函数*****/
#ifndefDISTANCE_H_
#defineDISTANCE_H_
intDistance();
#endif/*DISTANCE_H_*/
#defineuintunsignedint
#defineucharunsignedchar
uintdistance,times;
intDistance()
{
P1OUT|=BIT2;
_delay_cycles(10);
P1OUT&
=~BIT2;
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;
returndistance;
/*****温度测量程序*****/
#ifndefTEMPERATURE_H_
#defineTEMPERATURE_H_
#definePOUTP1DIR|=BIT0;
#definePINP1DIR&
=~BIT0;
#defineP_1P1OUT|=BIT0;
#defineP_0P1OUT&
ucharTemperature_init(void);
voidTemperature_write(uchardata);
ucharTemperature_read(void);
intTemperature_main(void);
intTemperature(void);
#endif/*TEMPERATURE_H_*/
externuintT;
ucharTemperature_init(void)
uchari;
POUT;
P_0;
_delay_cycles(600);
P_1;
_delay_cycles(60);
BIT0)
i=0;
else
i=1;
_delay_cycles(480);
returni;
voidTemperature_write(uchardata)
for(i=0;
i<
8;
i++)
POUT;
P_0;
_delay_cycles(10);
if(data&
P_1;
if(!
(data&
BIT0))
P_0;
_delay_cycles(40);
P_1;
data>
>
=1
ucharTemperature_read(void)
uchartem=0,i;
tem>
=1;
PIN;
if(P1IN&
tem|=0x80;
returntem;
intTemperature_main(void)
ucharT_L,T_H;
intnum=0;
Temperature_init());
Temperature_write(0xcc);
Temperature_write(0x44);
_delay_cycles(400);
Temperature_write(0xbe);
T_L=Temperature_read();
T_H=Temperature_read();
if(T_H&
0XF8)
T_H=T_H<
<
num=T_H|T_L;
num=-(~num+1)*0.625;
else
num=(T_H<
8|T_L)*0.625;
returnnum;
intTemperature(void)
ucharn;
T=0;
_DINT();
for(n=3;
n>
0;
n--)
T+=Temperature_main();
T=T/3;
/*****5110液晶显示程序*****/
#defineuintunsignedint
#defineDC_1P2OUT|=BIT5;
#defineDC_0P2OUT&
=~BIT5;
#defineCE_1P1OUT|=BIT6;
#defineCE_0P1OUT&
=~BIT6;
#defineRST_1P1OUT|=BIT7;
#defineRST_0P1OUT&
=~BIT7;
#defineSDIN_1P2OUT|=BIT4;
#defineSDIN_0P2OUT&
=~BIT4;
#defineSCLK_1P2OUT|=BIT3;
#defineSCLK_0P2OUT&
=~BIT3;
voidLCD_write_byte(uchardata,ucharcommand);
voidLCD_set_XY(ucharX,ucharY);
voidLCD_clear();
voidLCD_init();
voidLCD_write_char(ucharc);
voidLCD_write_Char(ucharX,ucharY,ucharasc);
voidLCD_write_English_string(ucharX,ucharY,char*s);
voidLC