1、1 基于 AT89S52的超声波测距系统 关键词 AT89S52 DS18B20 超声波 设计思路 用于距离测量的超声波一般是指频率为 40KHZ 的机械波,利用其指向性强,能量消耗缓慢,传播距离远,遇到障碍物会发生反射等特性进行距离的测量。通过超声波发射传感器向某一方向发射超声波,在发射时刻的同时开始计时,利用声波在空气传播的速度和时间的乘积就可以得到被测障碍物的距离。本系统采用 AT89S52 单片机为主控器件来完成测量过程中信号的采集,控制和数据的处理,测量结果通过液晶显示器 1602 显示,测量过程中与被测物体没 有直接接触。 系统结构框图 各部分电路的设计及原理 一 超声波电路的设计
2、 电路如图 1所示超声波收发 信号处理 单片机 温度测量 显示 2 图 1 用于距离测量的超声波是由压电陶瓷的压电效应产生。为了提高超声波模块的可靠性,我们采用了成品的 CKdz40-38F 超声波模块,实物图如图 2 所示。 图 2 超声波经固体表面或液体反射折回,由另一传感器接收,测量超声波整个运行时间 t,计算出发射点与反射点的距离 s( m/s): s=c t 2 式中: c为超声波的传播速度( m/s)。 3 超声波在固体中传播速度最快,在 气体中传播速度最慢,而且受温度影响最大。超声波在空气中的传播速度 c()大约为: c=C0 0.607 T 式中: T为环境摄氏温度(), C0
3、为零度时超波的速度( m/s)。 二 测温电路的设计 电路如图 3所示 图 3 我们采用的 DS18B20 是 Dallas 半导体公司生产的数字化温度传感器,温度测量范围为 55 125 ,可编程为 9 位 12 位 A/D 转换精度,且当温度在 10 85 之间时测量误差仅为 0.5。 DS18B20 通过单总线进行通信, 信息经过单线接口送入 DS18B20 或从DS18B20 送出 ,因此 仅需要一条数据线(和地线)就能与中央微处理器进行通信。 三 整流电路的设计 电路如图 4所示 4 图 4 整流部分原理是,当合上开关时, 220V 交流电压经过变压器降压,输出 9V 的交流电压,经
4、桥式整流和滤波,在经过 7805 稳压输出 +5V 直流电源做为本电路的工作电源。 四 主板电路 主板电路包括单片机及其复位电路,液晶显示部分,电路如图 5所示 图 5 5 功能测试 接通电源后,液晶显示屏显示环境温度和被测物体距离。经过测试,温度误差小于 0.5,有效测距范围是 7cm 至 300cm,测距误差小于 3cm,功能 已经基本实现。 作品应用 超声波测距 系统 ,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于液位、井深、管道长度的测量等场合。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人
5、的研制上也得到了广泛的应用 。 总结 通过对超声波测距系统的制作,我们不仅增加了知识,而且增加了对本专业课程学习的兴趣。在这次电子设计过程中我们了解到超声波测距的基本工作原理以及各个元器件的功能,了解各元器件的测试筛选过程及要求,这些都不但复习了我们以 前学的专业知识,而且给我们以后的学习也做了铺垫,使我们学习的愿望更强烈了。 这次电子设计给我们带来的更重要的好处就是让我们了解到所有电子工艺产品都是有一定的工艺要求的,我们必须按照工艺要求做才能做出合格的产品,才能最后做成功。再以后我们要自己设计电路,自己制作设计的东西,很有可能就是本来设计的是正确的就是因为有的地方没有按工艺要求操作而导致失败
6、,把自己的设计就否定了,从而导致失败。 这次电子设计竞赛给了我们一个实践的机会,锻炼了我们的动手能力,培养了我们自己发现问题,动手解决问题的能力,为我们以后打下一个良 好的基础,更重要的是有助于我们养成严谨的治学的态度,为以后的学习奠定了信心! 6 附录 源程序 #include #include #include “1602.h“ #define uchar unsigned char #define uint unsigned int #define nop _nop_() /宏定义,空语句 float cc; uchar *p,a3,*p1,*p2,*p3,disdata4,vv5; v
7、oid uchar2string(void); void LCD_disp_string(uchar x,uchar y,uchar *Date); sbit DQ=P37;/ds18b20 与单片机连接口 sbit in=P33;/外部中断 1,接 CX20106的 7脚 sbit csb=P10;/40KHz 方波输出脚 uint tvalue,vvalue;/温度值 uchar tflag;/温度正负标志 /*/ void init(void);/初始化 void delay_nms(uint n);/延时 nms void tran(void);/发射超声波 /*/ uint coun
8、t=0,dis; uchar flag=0,high_time,low_time; uchar disp4; /*ds1820 程序*/ void delay_18B20(unsigned int i)/延时 1微秒 while(i-); void ds1820rst()/*ds1820 复位 */ unsigned char x=0; DQ = 1; /DQ 复位 delay_18B20(4); /延时 DQ = 0; /DQ 拉低 delay_18B20(100); /精确延时大于 480us DQ = 1; /拉高 7 delay_18B20(40); uchar ds1820rd()/
9、*读数据 */ unsigned char i=0; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0; /给脉冲信号 dat=1; DQ = 1; /给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); return(dat); void ds1820wr(uchar wdata)/*写数据 */ unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = wdata delay_18B20(10); DQ = 1; wdata=1; void read_temp()/*读取温度值并
10、转换 */ uchar a,b; ds1820rst(); ds1820wr(0xcc);/*跳过读序列号 */ ds1820wr(0x44);/*启动温度转换 */ ds1820rst(); ds1820wr(0xcc);/*跳 过读序列号 */ ds1820wr(0xbe);/*读取温度 */ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue0;i-) csb=!csb; nop; nop; nop; nop; nop; nop; nop; 10 csb=0; delay_nms(1); /延时 1ms 左右后再开中断,避免直接回来 的回波 EX1=
11、1; delay_nms(60);/50); if(flag=1) temp=high_time*256+low_time;/将定时器的计数值转换为时间 temp=(temp/1000)/2; cc=cc/10; temp*=cc; /temp=temp/10; /去掉 mm,保留 cm的单位 dis=(unsigned int)temp; flag=0; disp0 = dis/10%10; /十位 disp1 = dis/100%10; /百位 disp2 = dis/1000%10; /* 函数名称:初始化函数 修改日期: 入口参数:无 返回值: 无 */ void init(void) TMOD=0x01;/定时器 0方式 1用于计时,定时器 1用于产生 38K 方波 TH0=0; TL0=0; /* 设定 T0 的工作模式为 2*/ EA=1; IT1=1;/下降沿有效 ,左传感器 /* 函数名称:主函数 修改日期: 入口参数:无