ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:242.60KB ,
资源ID:6637758      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6637758.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(超声波测距器的设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

超声波测距器的设计.docx

1、超声波测距器的设计基于MSP430单片机超声波测距器的设计一、总体设计1.1 超声波测距原理超声波发射器向某一方向发射超声波 ,在发射时刻的同时开始计时 ,超声波在空气中传播 ,途中碰到障碍物就立即返回来 ,超声波接收器收到反射波就立即停止计时 ,超声波在空气中传播的速度为,根据计时时间 ,就可以计算出发射点距障碍物的距离 ,即 (1) 公式中,V为声波在空气中传播的速度;t为超声波在空气中传播的时间这就是时间差测距法,本系统就是利用单片机控制超声波发射器发射超声波脉冲,同时利用单片机中的计数器开始计时。超声波达到后面的障碍物就会反射回来,接收装置接收到回波信号后由外部比较电路产生高电平使单片

2、机产生外部中断。单片机运行中断服务子程序(ISR)计算出距离,并传送给LCD显示给司机 ,同时程序内还有比较模块,若车距小于3米,则显示所测量的距离同时单片机输出一个高电平使蜂鸣器报警,若车距大于3米,则显示安全蜂鸣器不报警,这样以声光两种方式可靠地向司机反馈信息,来保证倒车或行车的安全。1.2 超声波时序图原理HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感应功能,测距精度高达3mm,模块包括超声波发射器、接收器与控制电路。时序图原理:1、 采用IO口TRIG触发测距,给至少10us的高电平信号;2、 模块自动发送8个40khz的方波,自动检测是否有信号返回;3、 有信号

3、返回,通过TO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340m/s)/2;1.3 总体设计方法本设计采用MSP430F1611单片机作为主控芯片,由超声波模块、电源电路模块、液晶显示模块、蜂鸣器等组成。利用定时器中断的方式捕获时间差,将采集的时间通过公式计算得到障碍物与测试点之间的距离,最后将测量的数据通过LCD12864液晶实时的显示出来。 二、硬件设计2.1 基本应用系统本设计采用MSP430F1611为主控芯片,由一个8M的晶振和32.768KHz的晶振外加一个复位电路,构成了基本应用系统,如图2所示:与常用的51系列单片机相

4、比,MSP430系列单片机功能强大、功耗低、集成度高,但其价格略高。为得到合适的性价比 ,选择了TI公司早期生产的MSP430F1611,这种型号的单片机价格较低 ,功能虽然并不强大 ,但足以满足本系统要求2.2 人机接口电路本设计使用的液晶是12864字符型液晶,并且带字符库的,不需要查找代码。液晶电路使用时如果发现液晶不亮可以调节连接液晶的点位器,改变液晶的亮度。通过超声波模块获取的数据通过液晶实时显示出来。人机接口电路如图2所示; 2.3 超声波模块电路超声波模块电路图如图4所示:超声波的发射和接收采用 HC-SR04 模块, 模块包括超声波发射器、接收器和控制电路。 采用 IO 口 T

5、RIG 触发测距,给至少 10s 的高电平信号,模块自动发送 8 个 40kHz 的方波,并自动检测是否有信号返回,一旦检测到有回波信号则输出回响信号,回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号的时间间隔可以计算出距离。测量周期应为 60ms 以上,以防止发射信号对回响信号产生影响。 模块中 ECHO 是信号接收引脚,有信号返回时,通过IO 口 ECHO 输出一个高电平, 高电平持续时间就是超声波从发射到返回的时间。2.4 电源电路电源电路如图5所示,本设计中分别采用了3.3V、5V电压为超声波测距器供电。此电源电路首先将220V交流电通过降压变压器降到10V交流电

6、,然后通过整流电路、滤波电路、稳压电路得到12V直流电,再通过SPX29300稳压芯片得到5V和3.3V电压。三、软件设计 3.1 程序流程图超声波测距系统的软件由主程序、 超声波发射及接收中断程序、显示子程序构成。 由于 C 语言有利于实现较为复杂的算法,而汇编程序有较高的效率并容易精确计算程序运行的时间,因此控制程序可以采用 C 语言程序与汇编语言程序的混合编程。超声波测距主程序先对系统进行初始化, 设定定时器 T0 工作在方式 1 ,置位总中断允许位 EA 并对显示端口 P2 清零,然后调用模块HC-SR04 发送超声波脉冲, 延时 2ms 后打开外部中断 0 接收返回的超声波信号。 主

7、程序检测到接收成功后,将计数器 T0 中的数(即超声波从发射到返回的时间 t ), 按照公式 d= ( v*t )/2 计算测距器与被测物体间的距离,其中 v 为声速。 超声波测距系统主程序流程如图 6 所示。 在环境温度变化不大的情况下,可以认为声速是基本不变的。设计时取 20 时的声速为 344m/s ,则有 d= ( 172*T0/10000)cm ,其中, T0为计数器 T0 的计数值。 表 1 列出了在不同温度下超声波的声速。表1 不同温度下超声波速度温度/C-30-20-100102030100声速(m/s)3133193253233383443493863.2 接口定义本设计采用

8、的MSP430F1611单片机是一款功能强大、低功耗工业型微处理器。单片机与超声波模块、液晶显示模块、蜂鸣器模块的接口定义如表2所示:表2 MSP430F1611单片机接口定义序号引脚号引脚名接口定义备注133P2.4CSLCD12864232P2.5CLK331P2.6SID438P5.3TRIG超声波模块537P5.2ECHO616P4.5IO蜂鸣器四、超声波测距器测量结果及分析系统设计并调试后,测试了8组数据,并对测距结果进行了分析,用以验证测距器的准确性与稳定性,测距结果如表3所示:表3 超声波测距实验数据序号测试距离(cm)实际距离(cm)1212223111041011515152

9、200620010174004018420500对测距结果进行分析可知, 超声波测距器 HC-SR04 测距模块的测距范围为 2cm-400cm。在程序设计的过程中,要考虑到发射信号对回响信号的影响,测量周期至少在 60ms以上。测距时被测物体的面积应不少于0.5m2,并保证被测面尽量平整,以免影响测量结果。在测距精度要求很高的情况下,要考虑到温度对于超声波声速的影响,通过温度补偿的方法进行校正。五、结论超声波指向性强,能量消耗慢,在介质中传播的距离较远,可以经常用于距离的测量。 利用单片机控制器和 HC-SR04 超声波模块设计的超声波测距系统,设计较为方便,计算处理也比较简单,在测量精度方

10、面能达到日常应用的要求,测量速度快,结果显示直观,在汽车倒车控制、建筑施工工地及其他工业现场的位置监控方面有较好的应用前景。附录一 硬件电路图附录二 源代码/*P1.2为捕获源输入端口,P1.3与传感器的trig端口相连*/#include#include12864.h#define uint unsigned int#define uchar unsigned char#define CPU (1000000)#define delay_us(x) (_delay_cycles(double)x*CPU/1000000.0) /_#define delay_ms(x) (_delay_cyc

11、les(double)x*CPU/1000.0)uchar line1=距离为:;unsigned long line210; /用于储存高电平期间计数的数值uint overflow=0,n=0;float r=0;/*(不精确)延时函数*/void delay_nms(uint x) uint i,j; for(i=0;ix;i+) for(j=0;j 0; i-); / Time for flag to set while (IFG1 & OFIFG); / OSCFault flag still set? BCSCTL2 |=SELM_2+SELS+DIVM_3; / MCLK=1M,

12、SMCLK= 8M /MCLK频率测试 /P5SEL|=BIT4; /P5DIR|=BIT4; /*TA的初始化设置*/void CAP_Init() P1DIR &= BIT2; /设置P1.2为输入 P1SEL |= BIT2; /设置P1.2为模块功能,即捕获源 TACCTL1|=CAP+CCIS_0+CM_3+CCIE+SCS; /上升、下降沿触发捕捉,用于测脉宽,同步模式、时能中断CCI1A TACTL |=TASSEL1 + ID_3+ MC_2+TACLR; /选择8MSMCLK时钟,8分频,连续计数模式/*处理函数*/void chuli() unsigned long sum

13、=0; P1SEL &=BIT2; /设置P1.2为普通IO口 P1DIR |= BIT2; /设置P1.2为输出 P1OUT &=BIT2; /先把echo端口拉低 P1OUT |= BIT3; delay_us(15); P1OUT &=BIT3; delay_us(200); P1SEL |= BIT2; /设置P1.2为模块功能,即捕获源 P1DIR &=BIT2; /设置P1.2为输入 if(n=10) uint k; n=0; TACTL|=MC_0; /关定时器 for(k=0;k10;k+) sum=sum+line2k; sum=sum/10; r=sum/1000000.0

14、; /把us化成s r=(r*340)/2.0; displayfloat(1,4,r); delay_ms(200); sum=0; r=0; /*主函数*/void main() WDTCTL = WDTPW + WDTHOLD; /关看门狗 P1SEL &=BIT3; /(trig)设置为普通IO口 P1DIR |= BIT3; /配置为输出 P1OUT &=BIT3; /*P1SEL &=BIT4; /(echo)设置为普通IO口 P1DIR |= BIT4; /配置为输出 P1OUT &=BIT4;*/ init_lcd(); /液晶初始化 init_clk(); CAP_Init(

15、); _EINT(); while(1) displaystr(1,0,line1); delay_nms(20); chuli(); delay_ms(20); /*TA的中断服务程序*/#pragma vector=TIMERA1_VECTOR_interrupt void Timer_A (void) switch (TAIV) /向量查询 case 2: /捕获中断 if (TACCTL1&CCI) /上升沿触发 TACTL |=TACLR; /清除TAR overflow=0; else /下降沿触发 line2n+=TACCR1+overflow; TACTL |=TACLR; /

16、清除TAR overflow=0; break; /TACCR1 CCIFG中断向量(P1.2) case 4: break; case 10: /定时器溢出中断 overflow+; /溢出次数 break; default: break; /*/*12864的模板程序,LCD12864的4、5、6脚分别接P4、P5、P6 */*/*/*/#include#include 12864.h#define BIT(x) (10;j-) switch(j) case 3:temp=firstbyte;break; /第一个字节 case 2:temp=transdata&0xf0;break; /

17、第二个字节 case 1:temp=(transdata0;i-) if(temp&0x80) /提取最高位 P2OUT |= BIT(cySID); /最高位为1时输出1 else P2OUT &= BIT(cySID); /最高位为0时输出0 P2OUT |= BIT(cySCLK); /时钟拉高,写数据 temp= 1; P2OUT &= BIT(cySCLK); /时钟线拉低 delay_nms(1); /延时 P2OUT &= BIT(cySID); /输出为0 P2OUT &= BIT(cyCS); /片选线拉低,为下一次做准备/* 函数名: 12864显示数组* 函数功能: 根据

18、输入的数组,显示到12864指定的位置* 输入参数: X,Y坐标,数组指针*/void displaystr(uchar x,uchar y,uchar *p) lcd_pos(x,y); uint i=0; while(*(p+i)!=0) send(1,*(p+i); i+; /* 函数名: 12864显示数字* 函数功能: 根据输入的数字,显示到12864指定的位置* 输入参数: X,Y坐标,要显示的整形数组NUM* 返回值: 无* 函数创建者: * 函数创建日期:2014年6月21日*/void displayint(uchar x,uchar y,uint NUM) /*uchar

19、a_SHOW5; a_SHOW0=NUM/1000+0; /qian a_SHOW1=NUM%1000/100+0; /bai a_SHOW2=NUM%1000%100/10+0; /shi a_SHOW3=NUM%10+0;/ge a_SHOW4=0;*/ uchar a_SHOW6; a_SHOW0=NUM/10000+0; /wan a_SHOW1=NUM%10000/1000+0; /qian a_SHOW2=NUM%10000%1000/100+0; /bai a_SHOW3=NUM%10000%1000%100/10+0; /shi a_SHOW4=NUM%10+0;/ge a_S

20、HOW5=0; displaystr(x,y,a_SHOW);/* 函数名: 12864显示当个字符* 函数功能: 根据输入的字符,显示到12864指定的位置* 输入参数: X,Y坐标,要显示的字符a*/void displaychar(uchar x,uchar y,char a) lcd_pos(x,y); send(1,a);/* 函数名: 显示浮点型数据* 函数功能: 根据输入的浮点型数字,显示到12864指定的位置* 输入参数: X,Y坐标,要显示的浮点数num* 返回值: 无* 函数创建者: * 函数创建日期:2014年6月21日*/void displayfloat(uchar

21、x,uchar y,float num) uchar a_SHOW7;long int t;t=(long int)(num*100); /乘以1000取整,保留二位小数a_SHOW0=(t/1000)%10+0; /shia_SHOW1=(t/100)%10+0 ; /gea_SHOW2=.; /小数点a_SHOW3=(t/10)%10+0; /shi fena_SHOW4=t%10+0; /bai fen a_SHOW5=m;/a_SHOW5=t%10+0; /qian fea_SHOW6=0; displaystr(x,y,a_SHOW);/*函数名称:Clear_GDRAM功 能:清除液晶GDRAM内部的随机数据参 数:无返回值 :无*/void Clear_GDRAM(void) uchar i,j,k; send(0,0x34); /打开扩展指令集 i = 0x80; for(j = 0;j 32;j+) send(0,i+); /对应行 send(0,0x80); /对应列 for(k = 0;k 16;k+) send(1,0x00); i = 0x80; for(j = 0;j 32;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1