超声波测距仪实验报告.docx

上传人:椰子壳 文档编号:5027503 上传时间:2020-01-29 格式:DOCX 页数:32 大小:1.44MB
返回 下载 相关 举报
超声波测距仪实验报告.docx_第1页
第1页 / 共32页
超声波测距仪实验报告.docx_第2页
第2页 / 共32页
超声波测距仪实验报告.docx_第3页
第3页 / 共32页
超声波测距仪实验报告.docx_第4页
第4页 / 共32页
超声波测距仪实验报告.docx_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《超声波测距仪实验报告.docx》由会员分享,可在线阅读,更多相关《超声波测距仪实验报告.docx(32页珍藏版)》请在三一文库上搜索。

1、超声波测距仪 目录一超声波测距原理3二超声波测距硬件部分4 1.单片机部分及显示电路 5 2.发射部分7 3.接受部分7三超声波测距仪软件部分 9四串口 13五调试 11六 实验心得 15七 实验结果 16八 参考文献 17附录一 18附录二 21一超声波测距仪原理超声波发生器内部结构有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波本时,将压迫压电晶片作振动,将机械能转换为电信号,就成为超声波接收器。在超声探测电路中,发射端得到输出脉冲为一系列方波,其宽

2、度为发射超声的时间间隔,被测物距离越大,脉冲宽度越大,输出脉冲个数与被测距离成正比。超声测距大致有以下方法: 取输出脉冲的平均值电压,该电压 (其幅值基本固定 )与距离成正比,测量电压即可测得距离; 测量输出脉冲的宽度,即发射超声波与接收超声波的时间间隔 t,故被测距离为 S=12vt。本测量电路采用第二种方案。由于超 声波 的声速 与温度有关,如果温度变化不大,则可认为声速基本不变 。如果测距精度要求很高,则应通 过温度补偿 的方法加以校正。超声波测距适用于高精度的中长距离测量。因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测量

3、精度理论上可以达到毫米级。超声波仿真采用AT89C52,实际运用AT89S52单片机,晶振:11.0592M,单片机用P1.0口输出超声波换能器所需的40KHZ方波信号,利用外中断1口监测超声波接收电路输出的返回信号,显示电路采用简单的4位共阳LED数码管,断码用74HC245,位码用三极管驱动。超声波测距的算法设计: 超声波在空气中传播速度为每秒钟340米(15时)。X2是声波返回的时刻,X1是声波发声的时刻,X2-X1得出的是一个时间差的绝对值,假定X2-X1=0.03S,则有340m0.03S=10.2m。由于在这10.2m的时间里,超声波发出到遇到返射物返回的距离, 超声波测距器的系统

4、框图如下图所示:二 超声波测距仪硬件部分超声波学习板采用仿真用了AT89C512,实物用的是或AT89S52单片机,晶振:11.0592M,单片机用P1.0口输出超声波换能器所需的40KHZ方波信号,利用外中断0口监测超声波接收电路输出的返回信号,显示电路采用简单的4位共阳LED数码管,断码用74HC245,位码用三极管驱动. 主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。采用AT89S52来实现对CX20106A红外接收芯片和T40-16系列超声波转换模块的控制。单片机通过P1.0引脚经反相器来控制超声波的发送,然后单片机不停的检测INT0引脚,当INT0引脚的电

5、平由高电平变为低电平时就认为超声波已经返回。T1计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。 该测距装置是由超声波传感器、单片机、发射/接收电路和LED 显示器组成。传感器输入端与发射接收电路相连,接收电路输出端与单片机相连接,单片机的输出端与显示电路输入端相连接。其时序图如图1-2 所示。1.单片机系统及显示电路 单片机采用89S51或其兼容系列。采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测量误差。单片机用P1.0端口输出超声波转化器所需的40KHz方波信号,利用外中断0口检测超声波接受电路输出的返回信号。显示电路采用简单实用的4位共阳L

6、ED数码管,段码用74LS245驱动,位码用PNP三极管驱动。单片机系统及显示电路如下图所示.74HC245:总线驱动器,典型的TTL型三态缓冲门电路。 由于单片机等CPU的数据地址控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。 另外,也可以使用74HC244等其他电路,74HC244比74HC245多了锁存器。 74HC245 引脚图第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。 第29脚“A”信号输入输出端,A1=B1、A8=B8,A1与B1是一组,如果DIR=“1”

7、OE=“0”则A1输入B1输出,其它类同。如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。 第1118脚“B”信号输入输出端,功能与“A”端一样,不再描述。 第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。 第10脚GND,电源地。 第20脚VCC,电源正极。2.发射部分由单片机产生的40kHz 的方波需要进行放大,才能驱动超声波传感器发射超声波,发射驱动电路其实就是一个信号放大电路,本次试验所选用的是74HC04集成芯片,图1-3 为发射电路图。74HC04 逻辑图:3.接收电路超声波接收头接收到超声波后,转换

8、为电信号,此时的信号比较弱,必需经过放大。本系统采用了CX20106A对接收到的信号进行放大,接收电路如下图 所示。 使用CX20106A集成电路对接收探头受到的信号进行放大、滤波。其总放大增益80db。以下是CX20106A的引脚注释。1脚:超声信号输入端,该脚的输入阻抗约为40k。2脚:该脚与地之间连接RC串联网络,它们是负反馈串联网络的一个组成部分,改变它们的数值能改变前置放大器的增益和频率特性。增大电阻R1或减小C1,将使负反馈量增大,放大倍数下降,反之则放大倍数增大。但C1的改变会影响到频率特性,一般在实际使用中不必改动,推荐选用参数为R1=4.7,C1=1F。3脚:该脚与地之间连接

9、检波电容,电容量大为平均值检波,瞬间相应灵敏度低;若容量小,则为峰值检波,瞬间相应灵敏度高,但检波输出的脉冲宽度变动大,易造成误动作,推荐参数为3.3f。4脚:接地端。5脚:该脚与电源间接入一个电阻,用以设置带通滤波器的中心频率f0,阻值越大,中心频率越低。例如,取R=200k时,f042kHz,若取R=220k,则中心频率f038kHz。6脚: 该脚与地之间接一个积分电容,标准值为330pF,如果该电容取得太大,会使探测距离变短。7脚:遥控命令输出端,它是集电极开路输出方式,因此该引脚必须接上一个上拉电阻到电源端,推荐阻值为22k,没有接受信号是该端输出为高电平,有信号时则产生下降。8脚:电

10、源正极,4.55V。三超声波测距仪软件部分控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。模块工作原理:(1)采用 IO 触发测距,给至少10us 的高电平信号;(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;(3)有信号返回,通过IO 输出一高电平,高电平持续的时间就是(4)超声波从发射到返回的时间测试距离=(高电平时间*声速(340M/S)/2;程序流程图下图,(a)为主程序流程图,(b)为定时中断子程序

11、流程图,(c)为外部中断子程序流程图。1. 延时void delay_20us() uchar bt ; for(bt=0;bt100;bt+); 2. 中断程序/外部中断0,用做判断回波电平INTO_() interrupt 0 / 外部中断是0号 outcomeH =TH1; /取出定时器的值 outcomeL =TL1; /取出定时器的值 succeed_flag=1; /至成功测量的标志 EX0=0; /关闭外部中断 /*/定时器0中断,用做显示timer0() interrupt 1 / 定时器0中断是1号 TH0=0xfd; /写入定时器0初始值 TL0=0x77; switch(

12、flag) case 0x00:P0=ge; P2=0xfd;flag+;break; case 0x01:P0=shi;P2=0xfe;flag+;break; case 0x02:P0=bai;P2=0xfb;flag+;break; case 0x03:P0=qian;P2=0xf7;flag=0;break; 3. 显示部分采用的共阳的显示管uchar code SEG710=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/数码管0-9uint distance4=0,0,0,0; /测距接收缓冲区/定时器0中断,用做显示timer

13、0() interrupt 1 / 定时器0中断是1号 TH0=0xfd; /写入定时器0初始值 TL0=0x77; switch(flag) case 0x00:P0=ge; P2=0xfd;flag+;break; case 0x01:P0=shi;P2=0xfe;flag+;break; case 0x02:P0=bai;P2=0xfb;flag+;break; case 0x03:P0=qian;P2=0xf7;flag=0;break; 4. 转换部分:/显示数据转换程序void conversion(uint temp_data) uchar ge_data,shi_data,ba

14、i_data ,qian_data; mm=qian_data=temp_data/1000; temp_data=temp_data%1000; bb=bai_data=temp_data/100 ; temp_data=temp_data%100; /取余运算 c=shi_data=temp_data/10 ; temp_data=temp_data%10; /取余运算 d=ge_data=temp_data; qian_data=SEG7qian_data; bai_data=SEG7bai_data; shi_data=SEG7shi_data; ge_data =SEG7ge_dat

15、a; EA=0; qian=qian_data; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; 5.串口5.1 发送字符 void send(char dat) SBUF=dat; while(TI=0);TI=0;5.2 C52比C51多了一个定时器2(T2),以下为T2的初始设置/ 定时器CT2用于串行通信波特率发生器 / 定义为波特率发生器以后,ET2自动失效 /void uart_init(void) T2CON = 0x35; / 0b0011 0101 16位串行波特率/ 发生器,自动重装TH2 = 0xff ;TL2 =

16、 0xdc;RCAP2H = 0xff;RCAP2L = 0xdc;TR2 = 1; / 启动时钟SCON = 0x50; / 0b0111 1010 第一种工作方式/ 8位单机通信PCON=0x00;ES = 1; / 允许通信中断EA = 1; / 中断打开5.3 main函数中:Void main() uart_init();send(tabmm);send(.); send(tabbb);send(tabc);send(tabd); send( );四串口(上位机,下位机见软件部分)本次串口通信模块是用VB做得。见图:五调试由于硬件有问题(怀疑是芯片损坏),我们用的是HC-SR04模块

17、。在往AT89S52芯片中烧入程序代码后,发现数码管只显示3位,于是做了如下修改:修改后,第四位显示。之后发现用手挡在换能器前的时候,数码管显示的数字极度不稳定。后来发现,发射与接收探头需要测量一些平稳的平面,且小于15度的角度进行测量。经测验后,数字稳定了很多。之后是串口通信。首先是用了串口助手,然后先拿别人的(做温度计的同学出)串口代码来用,发现根本无法显示。经同学提醒后得知,串口通信发送数据需要用到波特率发生器,而T0与T1定时器都已经被使用,后得知C52多了一个定时器2 T2,于是经过搜书与上网,自己给定时器2进行初始化配置,T2与T1、T2的初始化配置都不同。当RCLK与TCLK置位

18、后,T2就作为波特率发生器使用。然后需要设置寄存器RCAP2H和RCAP2L,数值分别与相应的TH2和TL2相同。而且,TF2需要软件手动清零。在一系列地修改(比如全局变量与局部变量的冲突,波特率的修改,发送方式的修改,以及延时的增加等)后,终于发送成功。六实验心得此次实验花费的心神较多,首先是设计电路,然后是单片机代码,由于我们做的是超声波测距仪,无法在单片机上仿真,所以比作温度计的同学更加繁琐。当买了元器件后,开始焊电路,用了将近2天的时间进行焊接与调整后,发现发射与接收部分还是不能用,万不得已用到别的模块。在烧了N次代码后终于成功了,期间,由于一开始一点动静都没有,所以在做实验的过程中,

19、始终有一种患得患失的感觉。然后,开始做串口,在反反复复中,在不断的自己探索,与同学的讨论中,终于完成。期间挫折不断,但是在有一点成功后就会有无与伦比的喜悦,很有成就感。在做串口的过程中,是与大家在一起的,感觉到和大家一起奋斗,一起患得患失,一起吃饭,很有一种温馨,很开心。七实验结果八参考文献1.单片机原理及应用;李全利,仲伟峰,许军编著;2010年6月2.51单片机应用开发范例大全;宋戈 黄鹤松等编著;2010年2月3. C51单片机C程序模板与应用工程实践;刘同法 肖志刚 彭继卫;4. Visual Basic与RS-232串行通讯控制(最新版附光盘)/e时代网络编程系列;范逸之等编;200

20、2-01-015. 超声波测距系统设计6. 超声波测距板学习板附录一 . 电路图(仿真中没有cx20106A及74HC04这两种芯片,所以电路图只能用分段的形式进行。)显示部分:发射部分接受部分:部分整体(整体,将发射部分与接受部分有上面两图代替)最小系统(实际):附录二:程序代码(包括串口)单片机:/MCU=STC10F04XE/P0.0-P0.6共阳数码管引脚/Trig = P10/Echo = P32#include /包括一个52标准内核的头文件#define uchar unsigned char /定义一下方便使用#define uint unsigned int#define u

21、long unsigned long/* /为STC单片机的IO口设置地址定义sfr P0M1 = 0X93;sfr P0M0 = 0X94;sfr P1M1 = 0X91;sfr P1M0 = 0X92;sfrP2M1 = 0X95;sfrP2M0 = 0X96;sfr T2MOD = 0xC9; /*sbit Trig = P10; /产生脉冲引脚sbit Echo = P32; /回波引脚uchar code SEG710=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/数码管0-9uint distance4=0,0,0,0; /测

22、距接收缓冲区uchar code tab=0,1,2,3,4,5,6,7,8,9;uchar ge,shi,bai,qian,temp,flag,outcomeH,outcomeL,i,mm,bb,c,d; /自定义寄存器bit succeed_flag; /测量成功标志/*函数声明void conversion(uint temp_data);void delay_20us();void send(char dat);/发送字符 void send(char dat) SBUF=dat; while(TI=0);TI=0;/ 定时器CT2用于串行通信波特率发生器 / 定义为波特率发生器以后,

23、ET2自动失效 /void uart_init(void) T2CON = 0x35; / 0b0011 0101 16位串行波特率/ 发生器,自动重装TH2 = 0xff ;TL2 = 0xdc;RCAP2H = 0xff;RCAP2L = 0xdc;TR2 = 1; / 启动时钟SCON = 0x50; / 0b0111 1010 第一种工作方式/ 8位单机通信PCON=0x00;ES = 1; / 允许通信中断EA = 1; / 中断打开void main(void) / 主程序 uint distance_data,a,b; uchar CONT_1; uart_init(); P0M

24、1 = 0; /将io口设置为推挽输出 P1M1 = 0; P2M1 = 0; P0M0 = 0XFF; P1M0 = 0XFF; P2M0 = 0XFF; i=0; flag=0;Trig=0; /首先拉低脉冲输入引脚TMOD=0x11; /定时器0,定时器1,16位工作方式TR0=1; /启动定时器0 IT0=0; /由高电平变低电平,触发外部中断ET0=1; /打开定时器0中断 /ET1=1; /打开定时器1中断EX0=0; /关闭外部中断EA=1; /打开总中断0 while(1) /程序循环 EA=0; Trig=1; delay_20us(); Trig=0; /产生一个20us的

25、脉冲,在Trig引脚 while(Echo=0); /等待Echo回波引脚变高电平 succeed_flag=0; /清测量成功标志 EX0=1; /打开外部中断 TH1=0; /定时器1清零 TL1=0; /定时器1清零 TF1=0; / TR1=1; /启动定时器1 EA=1; while(TH1 30);/等待测量的结果,周期65.535毫秒(可用中断实现) TR1=0; /关闭定时器1 EX0=0; /关闭外部中断 if(succeed_flag=1) distance_data=outcomeH; /测量结果的高8位 distance_data=3) CONT_1=0; b=a; f

26、or(i=0;i100;i+) conversion(b); send(tabmm); send(.); send(tabbb); send(tabc); send(tabd); send( ); / i=0; / /*/外部中断0,用做判断回波电平INTO_() interrupt 0 / 外部中断是0号 outcomeH =TH1; /取出定时器的值 outcomeL =TL1; /取出定时器的值 succeed_flag=1; /至成功测量的标志 EX0=0; /关闭外部中断 /*/定时器0中断,用做显示timer0() interrupt 1 / 定时器0中断是1号 TH0=0xfd;

27、 /写入定时器0初始值 TL0=0x77; switch(flag) case 0x00:P0=ge; P2=0xfd;flag+;break; case 0x01:P0=shi;P2=0xfe;flag+;break; case 0x02:P0=bai;P2=0xfb;flag+;break; case 0x03:P0=qian;P2=0xf7;flag=0;break; /*/*/定时器1中断,用做超声波测距计时timer1() interrupt 3 / 定时器0中断是1号 TH1=0;TL1=0; */*/显示数据转换程序void conversion(uint temp_data)

28、uchar ge_data,shi_data,bai_data ,qian_data; mm=qian_data=temp_data/1000; temp_data=temp_data%1000; bb=bai_data=temp_data/100 ; temp_data=temp_data%100; /取余运算 c=shi_data=temp_data/10 ; temp_data=temp_data%10; /取余运算 d=ge_data=temp_data; qian_data=SEG7qian_data; bai_data=SEG7bai_data; shi_data=SEG7shi_data; ge_data =SEG7ge_data; EA=0; qian=qian_data; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; /*void delay_20us() uchar bt ; for(bt=0;bt 500 ThenText2.Text = End IfStatic c(20) As Integer For k = 1 To 19 c(k) = c(k + 1) Next k c(20) = Val(Text3.Text)End Sub32

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

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1