带温度补偿的超声波测距系统设计说明
- 格式:doc
- 大小:878.50 KB
- 文档页数:20
超声波模块原理图:发射接收原理图PCB:51单片机原理图:软件部分C语言程序:/*=========================================================== =========调试要求:1.MCU:A T89S52芯片或AT89C522.晶振:12MHz调试注意:本程序带温度补偿,采用DS18B20测量温度1.LCD1602液晶屏有显示后,才接入超声波模块。
2.注意超声波模块电源的极性。
不清楚请参好淘宝的电路图3.没有选用频率为12MHz晶振,用了别的频率晶振,单片机定时器的测量值与发出的40KHz频率脉冲不对。
4.使用者经常误发出20KHZ脉冲当40KHZ脉冲。
(40KHz频率脉冲,周期25us,占空比为50% = 12.5us)5.如果是用开发板调超声波模块,请检查开发板上的电路是否与超声波模块的控制脚复用了, 若复用了,请通过跳线分开发板上的电路。
6如果使用的是万用板,请确定单片机的复位电路和晶振电路是否正常,同时单片机的31脚(EA)记得接高电平。
============================================================= =======*/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//===============================LCD1602接口定义=====================/*-----------------------------------------------------|DB0-----P2.0 | DB4-----P2.4 | RW-------P0.1 ||DB1-----P2.1 | DB5-----P2.5 | RS-------P0.2 ||DB2-----P2.2 | DB6-----P2.6 | E--------P0.0 ||DB3-----P2.3 | DB7-----P2.7 | 注意,P0.0到P0.2需要接上拉电阻---------------------------------------------------============================================================= */#define LCM_Data P2 //数据接口#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCM_RW = P0^1; //读写控制输入端,LCD1602的第五脚sbit LCM_RS = P0^2; //寄存器选择输入端,LCD1602的第四脚sbit LCM_E = P0^0; //使能信号输入端,LCD1602的第6脚//===============================超声波模块定义========================sbit RemPin =P3^2;// 接收端(这个不能修改,因为是外部中断(INT0)的引脚) sbit TxPin =P3^1;// 发射端//******************************************************************** ***//ds18b20数字温度传感器控制引脚定义sbit dq_ds18b20=P3^3;//定义控制DS18B20//******************************************************************** ***//LCD显示模块的函数声明void WriteDataLCM (uchar WDLCM);//LCD模块写数据void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令uchar ReadDataLCM (void);//LCD模块读数据uchar ReadStatusLCM (void);//读LCD模块的忙标void DisplayOneChar (uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符void DisplayListChar (uchar X,uchar Y,uchar delayms,uchar code *DData); void DisplayCursorPos (uchar X, uchar Y);void LCMInit (void);void DisplayIntData (uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu);void DisplayCharData (uchar X, uchar Y,uchar ZiFu);//******************************************************************** **//延时函数声明void delay25us_40KHz(unsigned char us);void DelayUs(uint us);void DelayMs(uint Ms);void delay_3us();//3US的延时程序void delay_8us(unsigned int t);//8US延时基准程序void delay_50us(unsigned int t);//延时50*T微妙函数的声明//******************************************************************** ***//DS18B20测温函数定义void w_1byte_ds18b20(uchar value);//向DS18B20写一个字节uchar r_1byte_ds18b20(void);//从DS18B20读取一个字节的数据void rest_ds18b20(void);//DS18B20复位程序void readtemp_ds18b20(void);//读取温度void display_temp(void);//温度显示程序//******************************************************************** ***//参数定义uint length = 0; // 测距的长度0.00Muchar flag = 0; // 测距的标志有信号接收=1uchar templ,temph;uint speed;//根据温度计算出来的声音速度uchar t_b,t_s,t_g,t_x;//从左到右分别存储温度百位,十位,个位,小数位uchar flag1;//温度正负性暂存,1为正数,0为负数const unsigned char tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x0 8,0x09,0x09};/*=========================================================== ================主程序============================================================= ================*/void main(void){uchar i;LCMInit(); //1602初始化EX0 = 1; //允许总中断中断,使能INT0 外部中断ET0 = 1;TMOD=0x11; //设定T0为16位时器,设定T1为16位时器DisplayOneChar( 0,14,'m');DisplayListChar(0,0,0, "Distanc: "); //显示字符串while(1){readtemp_ds18b20();display_temp();//显示温度for(i=0;i<20;i++){DisplayIntData(0, 13,length,5,3);//显示测量距离TH0=0x00;TL0=0x00;TR0=1; //启动定时器0EA = 1; //允许所有中断delay25us_40KHz(15); //发出脉冲信号DelayMs(200);}}}//******************************************************************** ***********//温度显示函数void display_temp(){if(flag1==1)//温度为正数时的显示程序{DisplayOneChar( 1,2,'+');}else{DisplayOneChar( 1,2,'-');}//显示温度信息DisplayOneChar( 1,0,'T');DisplayOneChar( 1,1,':');DisplayOneChar( 1,3,t_s+0x30);DisplayOneChar( 1,4,t_g+0x30);DisplayOneChar( 1,5,'.');DisplayOneChar( 1,6,t_x+0x30);//显示速度信息DisplayOneChar( 1,8,'S');DisplayOneChar( 1,9,':');DisplayOneChar( 1,10,speed/100%10+0x30);DisplayOneChar( 1,11,speed/10%10+0x30);DisplayOneChar( 1,12,speed%10+0x30);DisplayOneChar( 1,13,'M');DisplayOneChar( 1,14,'/');DisplayOneChar( 1,15,'S');}//****************************************************//读取温度void readtemp_ds18b20(void){uchar temp32;rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0x44); //启动温度转换delay_8us(2);rest_ds18b20();w_1byte_ds18b20(0xcc); //跳过读序列号的操作w_1byte_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度templ=r_1byte_ds18b20();temph=r_1byte_ds18b20();if((temph&0xf0))//判断温度的正负性{flag1=0;temph=-temph;templ=-templ;t_x=tabl3[templ & 0x0f];//计算温度的小数temp32=temph & 0x0f;temp32<<=4;templ>>=4;temp32=temp32 | templ;t_b=temp32/100%10;//计算温度的百位数据t_s=temp32/10%10;//计算温度的十位数据t_g=temp32%10;//计算温度的个位数据speed=331.4-0.607*(temp32 | templ);}else//为正数{t_x=tabl3[templ & 0x0f];//计算温度的小数temp32=temph & 0x0f;temp32<<=4;templ>>=4;temp32=temp32 | templ;t_b=temp32/100%10;//计算温度的百位数据t_s=temp32/10%10;//计算温度的十位数据t_g=temp32%10;//计算温度的个位数据flag1=1;speed=311.4+0.607*(temp32 | templ);}}/*=========================================================== =========功能:在1602显示一个整数数据说明:显示一个整数数据-9999->32625. 从右至左显示数据5位:============================================================= =========*/void DisplayIntData(uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu) {uchar i=0,k=0, BCD[5]={0};if(Digit>5) Digit=5;if(ZhengShu<0){k=1;//负数示志位ZhengShu=-ZhengShu;}BCD[4] =ZhengShu / 10000; //求出万位数据ZhengShu = ZhengShu % 10000;BCD[3] =ZhengShu / 1000; //求出千位数据ZhengShu = ZhengShu % 1000;BCD[2] =ZhengShu / 100; //求出百位数据ZhengShu = ZhengShu % 100;BCD[1] =ZhengShu / 10; //求出十位数据BCD[0] =ZhengShu % 10; //求出个位数据for(i=0;i<Digit;i++)//输出显示的数值{if((i==XiaoShu)&&(0!=XiaoShu)){DisplayOneChar(X,Y-i,'.');//输出小数点Y= Y-1;}DisplayOneChar(X,Y-i,BCD[i]+0x30); //显示一个字符}if(k==1)DisplayOneChar(X,Y-1,'-');//输出负符}//****************************************************************//读一个字节uchar r_1byte_ds18b20(void){uchar i=0;uchar value= 0;for (i=0;i<8;i++){value>>=1;dq_ds18b20=0;// DQ_L;delay_3us();dq_ds18b20=1; //DQ_H;delay_8us(2);if(dq_ds18b20==1) value|=0x80;delay_8us(6); //延时40us}dq_ds18b20=1;return value;}//******************************************************************** ***********//子程序功能:向DS18B20写一字节的数据void w_1byte_ds18b20(uchar value){uchar i=0;for(i=0;i<8;i++){dq_ds18b20=1;delay_3us();dq_ds18b20=0;delay_8us(2);if (value& 0x01) dq_ds18b20=1; //DQ = 1delay_50us(1); //延时50us 以上delay_8us(2);value>>=1;}dq_ds18b20=1; //DQ = 1}//;**************************************************//ds18b20复位子程序void rest_ds18b20(void){rest:delay_3us(); //稍做延时delay_3us();dq_ds18b20=1;delay_3us();dq_ds18b20=0;// DQ_L;delay_50us(11);//480us<T<960usdq_ds18b20=1;//拉高总线delay_8us(5);if(dq_ds18b20==1){return;}delay_50us(2); //延时90usif(dq_ds18b20==1){return;}else{goto rest;}}//==============================超声波模块测试子程序================================================/*=========================================================== =========注意:是用12MHz晶振设定延时时间:x*25us 与产生40KHZ的脉冲============================================================= =======*/void delay25us_40KHz(unsigned char us){while(us--){TxPin = 0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TxPin = 1;_nop_();_nop_();_nop_();_nop_();}TxPin = 1;}/*=========================================================== ==================中断程序的入口(注意:接收与发射的电平是相反的)============================================================= ==================*/void init0int() interrupt 0{uint timer_us = 0;TR0=0; //关闭定时器0timer_us =TH0*256+TL0;if(timer_us>190)timer_us=timer_us-180; //修正测距的距离if(timer_us<=735){timer_us=timer_us-96;//二次修正}if(timer_us>5059){timer_us+=29;}if(timer_us>5470){timer_us+=29;}if(timer_us>6410){timer_us+=29;}if(timer_us>7410){timer_us+=29;}if(timer_us>8410){timer_us+=29;}if(timer_us>9410){timer_us+=29;}if(timer_us>10410){timer_us+=29;}length = ((unsigned long)(speed)*timer_us)/2000;//计算长度,是扩大100倍flag = 0;EA = 0; //禁止所有中断}/*=========================================================== =========功能:在1602显示一个字符数据说明:显示一个字符数据0~256. 从左至右显示数据3位============================================================= =========*/void DisplayCharData(uchar X, uchar Y,uchar ZiFu){uchar i=0;uchar V alueBCD[3];V alueBCD[0] = ZiFu / 100; //求出百位数据ZiFu = ZiFu % 100;V alueBCD[1] = ZiFu / 10; //求出十位数据V alueBCD[2] = ZiFu % 10; //求出个位数据for(i=0;i<3;i++)//输出显示的数值{DisplayOneChar(X,Y+i,V alueBCD[i]+0x30); //显示一个字符}}/*=========================================================== ================超出测量时间============================================================= ================*/void timer0int (void) interrupt 1{TR0=0; //关闭定时器0length = 0; //超出测量时间显示示0flag = 1; //EA = 0; //禁止所有中断}/*=========================================================== ===========LCM初始化============================================================= =========*/void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置DelayMs(100);}/*=========================================================== =========显示光标的位置============================================================= =======*/void DisplayCursorPos( unsigned char X, unsigned char Y){X &= 0x1;Y &= 0xF; //限制Y不能大于15,X不能大于1if (X) Y |= 0x40; //当要显示第二行时地址码+0x40;Y |= 0x80; // 算出指令码WriteCommandLCM(Y, 1); //这里不检测忙信号,发送地址码}/*=========================================================== =========按指定位置显示一串字符:第X 行,第y列注意:字符串不能长于16个字符============================================================= =========*/void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData){unsigned char ListLength;ListLength = 0;X &= 0x1;Y &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]!='\0') //若到达字串尾则退出{if (Y <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;Y++;DelayMs(delayms);//延时显示字符串}elsebreak;//跳出循环体}}/*=========================================================== =========设定延时时间:x*1us============================================================= =======*/void DelayUs(uint us){while(us--);}/*=========================================================== =========设定延时时间:x*1ms============================================================= =======*/void DelayMs(uint Ms){uint i,TempCyc;for(i=0;i<Ms;i++){TempCyc = 250;while(TempCyc--);}}//==============================LCD1602显示子程序================================================/*=========================================================== ==========写数据函数: E =高脉冲RS=1 RW=0============================================================= =========*/void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}/*=========================================================== =========写指令函数: E=高脉冲RS=0 RW=0============================================================= =========*/void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}/*=========================================================== =========//读数据============================================================= =========*/unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}/*=========================================================== =========正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
目录1绪论 (2)1.1设计目的 (2)1.2设计意义 (2)1.3系统功能 (3)2设计方案 (4)2.1方案设计 (4)2.2方案论证 (4)3硬件设计 (5)3.1设计方案 (5)3.2 STC89C52外围电路设计 (6)3.2.1单片机 (6)3.2.2复位电路与震荡电路 (7)3.3 LCD显示模块的设计 (8)3.3.1字符型液晶显示模块 (8)3.3.2 字符型液晶显示模块引脚 (9)3.3.3 字符型液晶显示模块内部结构 (9)3.4温度传感器DS18B20电路设计 (10)3.4.1 温度传感器DS18B20简介 (10)3.4.2 DS18B20的主要特性 (11)3.5数据采集模块 (12)3.6 HC-SR04超声波测距模块 (13)3.7报警电路设计 (16)4 软件设计 (17)4.1系统软件设计说明 (17)4.2主程序的设计 (17)4.3超声波发射子程序和超声波接收中断子程序设计 (18)4.4温度测量子程序设计 (19)5 结果与结论 (21)5.1结果 (21)5.2结论 (22)致谢 (22)参考文献 (23)附录 (24)1绪论1.1设计目的随着国民经济的迅速发展,超声波在机械制造、石油化工、航空航天等领域发挥着越来越重要的作用。
超声波测距作为一种非接触式距离测量方法,具有不受外界光及电磁场等因素影响的优点,实现电路简单、成本低;同时,还具有易于定向发射、方向性好、对人体伤害小等特点。
上述优势使得与超声波测距领域相关的仪器设备在数据处理、检测性能和工程设计系统化等方面有了更大的发展空间。
利用超声波定位技术是蝙蝠等一些无目视能力的生物作为防御天敌及捕获猎物的生存手段, 这些生物体可发射人们听不到的超声波 ( 20KH 以上的机械波) ,借助空气介质传播, 根据猎物或障碍物反射回来的回波的时间间隔及强弱,判断猎物的性质或障碍物的位置。
在影响超声波测距误差的因素中,温度的影响是比较大的,超声波的传播速度在不同的温度下是不同的,那就要得出其传播速度与环境温度t的关系式。
超声波测距—设计报告摘要利用超声波测距原理,出于低成本、高精度的目的,提出了一种基于AT89C52的超声波测距的设计方案。
硬件部分采用AT89C52单片机作为控制器,主要有超声波发射电路、超声波接收电路、温度检测电路、LCD显示电路和报警电路。
在分析超声波测距原理的基础上,给出了实现超声波测距的硬件设计电路图和软件设计流程图。
该系统测量精度为1cm,测量范围为0.30-3.00m,能够很好的满足测距的设计要求。
关键字单片机超声波温度补偿测距 LCD显示1、设计任务(1)超声波测距系统原理1)超声波传感器总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。
电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。
他们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。
目前较为常用的是压电式超声波发生器。
压电式超声波发生器实际上是利用压电晶体的谐振来工作的。
它有两个压电晶片和一个共振板。
当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。
反之,如果两极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
超声波传感器结构如下:图 2超声波传感器外部结构 图 3 超声波传感器内部结构 2) 超声波测距的方案超声波测距方法主要有三种:1)相位检测法:精度高,但检测范围有限;2)声波幅值检测法:易受反射波的影响;3)渡越时间法:工作方式简单,直观,在硬件控制和软件设计上都容易实现,其原理为:检测从发射传感器发射的超声波经气体介质传播到接收传感器的时间t ,这个时间就是渡越时间,然后求出距离l 。
设l 为测量距离,t 为往返时间差,超声波的传播速度为c ,则有l=ct/2。
综合以上分析,本设计将采用渡越时间法。
图 4 测距原理由于超声波也是一种声波,其声速c 与空气温度有关,一般来说,温度每升高1摄氏度,声速增加0.6米/秒。
南通大学传感器与检测课程设计(预习)报告项目:带温度补偿的超声波测距系统设计班级:姓名:学号:联系方式:学期:2015-2016-2前言 (3)一.课题调研 (3)1.1传感器选型 (3)1.1.1可选温度传感器 DS18B20 (3)1.1.2可选用AD590温度传感器 (4)1.2超声波传感器 (5)1.2.2选用MAX232芯片做发射电路 (7)1.2.3超声波发射电路 (8)1.2.4超声波接收电路 (10)1.2.5选用TL074芯片作为接受电路 (11)1.3多种实现方法。
(12)1.3.1方法一:系统结构框图 (12)1.3.2工作原理 (12)1.3.3方案二:系统结构图如下。
(13)二.总体设计 (14)2.1电路图 (14)2.1.1超声波模块电路 (14)2.2.1主程序设计。
(19)前言以AT89S51单片机为核心,设计了一种带温度补偿的超声波测距系统。
系统包括单片机、超声波发射及接收模块、温度补偿模块、信息显示模块。
温度补偿模块采用温度传感器DS18B20 采集环境温度,根据超声波速度与温度值的对应关系及时修正波速,以纠正温度的变化引起超声波测距系统产生的误差。
一.课题调研1.1传感器选型集成传感器是采用硅半导体集成工艺而制成的,因此亦称硅传感器或单片集成温度传感器,它是将温度传感器集成在一个芯片上、可完成温度测量及模拟信号输出功能的专用IC。
模拟集成温度传感器的主要特点是功能单一(仅测量温度)、测温误差小、价格低、响应速度快、传输距离远、体积小、微功耗等,适合远距离测温、控温,不需要进行非线性校准,外围电路简单。
1.1.1可选温度传感器DS18B20由于声音的速度在不同的温度下有所不同,因此为提高精度,应通过温度补偿对超声波的传播速度进行校正。
系统采用DS18B20传感器测量温度,DS18B20 温度传感器具有不受外界干扰、精度高、测温范围宽等优点。
单片机口接DS18B20 数据总线,控制DS18B20 进行温度转换和传输数据,数据总线接10 kΩ的上拉电阻,作用是使总线控制器在温度转换期间无需一直保持高电平。
AT89C2051单片机结合温度补偿的超声波测距系统设计0 引言超声波是一种在弹性介质中的机械震荡,它是由与介质相接触的震荡源所引起的,其频率在20kHz以上。
由于超声波的速度相对于光速要小得多,其传播时间就比较容易检测,并且易于定向发射,方向性好,强度好控制,因而利用超声波测距在很多距离探测应用中有很重要的用途,包括无损检测、过程测量、机器人测量和定位,以及流体液面高度测量等。
利用单片机控制超声波检测往往比较迅速、方便、计算简单、易于实现,并且测量精度高。
1 系统设计超声波测距的最远距离和分辨能力,不仅需要良好的换能器,也需要合理的驱动电路及回波探测电路。
对发射而言,为了使电能到机械能的转换效益最大,换能器必须工作在它的共振频率处。
对接收电路而言,为了使机械能到电能的转换效率最大,最佳工作点必须取在反共振频率处,在传感器系统中,发射部分的共振频率要与接收部分的反共振频率相匹配。
同时,温度对声速有着较大的影响,温度补偿无疑是减少误差的很好方法。
本设计选用T40-16T/R超声波传感器,设计了一种以AT89C2051单片机为核心的低成本、高精度、微型化数字显示超声波测距仪。
为了进一步提高系统测量精度和系统稳定性,在硬件上增加了温度传感器测温电路,采取声速预置和媒质温度测量相结合的办法对声速进行修正,降低了温度变化对测距精度的影响。
有力提高了超声波测距系统的测量精度。
设计系统由单片机主控模块、显示模块、超声波发射模块、接收模块、温度测量补偿模块等五个模块组成,组成框图。
超声波发射电路由单片机输出端直接驱动超声波发送,超声波接收电路输出端与单片机相连接,单片机的输出端与显示电路输入端相连接。
单片机在TO时刻发射方波,同时启动定时器开始计时,当收到回波后,产生一负跳变到单片机中断口,单片机响应中断程序,定时器停止计数。
计算时间差即可得到超声波在媒介中传播的时间t,由此便可计算出距离。
2.1 超声波测距单片机控制系统单片机AT89C2051采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。
具有温度补偿功能的超声波测距系统设计超声波测距系统运行过程中,环境温度会对测距系统的测量精度造成较大影响,为了降低环境温度波动对超声波测距系统精确度的影响,需要在测距系统中增加温度补偿系统。
在具有温度补偿功能的超声波测距系统设计中,本文以单片机为控制核心,并使用温度传感器进行环境温度测量,从而实现在不同环境温度下的超声波波速确定,提高测量精度。
标签:温度补偿;超声波测距系统;单片机0 引言相较于其他测距方式,超声波测距具有更高的电磁抗干扰能力,并且对空气质量和环境光照强度要求更低,另外由于超声波测距属于非接触测距技术,用途更加广泛,同时超声波测距系统可靠性更高,制造运行所需的成本更低,当前已经取得广泛使用。
但是超声波对温度较为敏感,通过研究发现,当环境温度升高1℃时,声速下降0.607m/s。
1 超声波测距系统工作原理超声波测距系统工作过程中,由超声波发射系统发出超声波,由接收系统接收反射回的超声波,当超声波发出后,测距系统中的计数器开始同步工作,当接收器接收到第一个反射信号后,计时停止,通过当前环境温度下的声速与计时时间的相乘计算即可实现距离测量。
而要确定不同环境温度下的声速,可以通过以下公式确定声速:在超声波测距系统设计中,可以将声速公式代入到距离计算公式中,则可通过环境温度和计时时间确定距离。
在具有温度补偿功能的超声波测距系统设计中,在超声波测距系统中加入温度传感器,并将测得的环境温度传入单片机,由单片机中的程序进行距离计算,通过显示屏进行距离显示,在系统运行中,由于充分考虑了环境温度因素,所以可以极大提升超声波测距系统的精确度[1]。
2 具有温度补偿功能的超声波测距系统设计2.1 温度补偿系统设计温度补偿系统中最重要的就是温度传感器选取和与系统的连接,需要保证温度传感器有较高的灵敏度和较强的抗干扰能力,在完成温度测量后,将测量值输入单片机中,由相关程序进行距离计算。
本文选取了DS18B20温度传感器,传感器结构为两条数据总线,这两条总线能够实现温度转换和数据传输功能,在温度传感器运行过程中,可以将数据总线直接与单片机进行连接,将测量到的数据输入单片机中,在该过程中不需进行A/D转换,并且另一条数据线用于传输温度转换指令和读写指令。
在进行基于温湿度补偿的超声波测距系统研究时,需要全面评估温湿度对超声波传播的影响。
我们来探讨温湿度对超声波传播的影响。
温度和湿度会改变空气中声速的大小,进而影响超声波在空气中的传播速度和路径。
研究中需考虑温湿度变化对超声波测距系统的测量精度和稳定性的影响。
在撰写研究的文章时,我们将采用从简到繁、由浅入深的方式来探讨主题。
简要介绍超声波测距系统的基本原理和应用领域,然后深入探讨温湿度对超声波传播的影响,以及温湿度补偿的原理和方法。
我们将详细分析基于温湿度补偿的超声波测距系统的研究现状和发展趋势,最后总结回顾相关内容,共享个人观点和理解。
超声波测距系统是一种利用超声波在空气中传播的时间来实现距离测量的技术。
温湿度对超声波传播的影响主要体现在两个方面:一是温湿度会改变空气中声速的大小,影响超声波传播的速度;二是温湿度变化会引起超声波在空气中的散射和衰减,影响超声波传播的路径和稳定性。
针对温湿度对超声波传播的影响,研究人员提出了基于温湿度补偿的超声波测距系统。
这种系统可以通过对温湿度进行实时监测和测量,利用补偿算法来实现对超声波测距误差的校正,从而提高测量精度和稳定性。
常用的温湿度补偿方法包括基于实时监测数据的修正算法和基于模型预测的补偿算法。
当前,基于温湿度补偿的超声波测距系统的研究主要集中在以下方面:一是温湿度对超声波传播影响机理的深入研究;二是温湿度补偿算法的改进和优化;三是基于温湿度补偿的超声波测距系统在工业、军事和民用领域的应用探索。
基于温湿度补偿的超声波测距系统的研究具有重要的理论意义和实际应用价值。
但目前仍存在一些挑战和难点,如温湿度变化导致的超声波传播不确定性问题、温湿度补偿算法的精度和实时性等方面需要进一步研究和解决。
个人观点上,我认为基于温湿度补偿的超声波测距系统是一个具有潜力和前景的研究领域。
随着传感器技术和智能算法的不断发展,相信这一领域将迎来更多的创新和突破,为超声波测距技术的应用提供更多可能性。
基于温度补偿功能的超声波测距系统设计【摘要】设计了一款基于单片机的带有温度补偿功能的高精度超声波测距仪,利用超声波反射特性对障碍物进行测距。
由STC12C5206AD单片机、发送模块、接收模块、温度补偿模块、时钟模块、电源模块和显示模块等7部分组成。
实验结果表明该测距仪性能可靠,测量精度较高。
【关键词】超声波;测距;传感器;温度补偿目前,非接触式测距仪采用超声波、激光和雷达。
但激光和雷达的难度大、成本高,不利于普及应用,在某些应用领域有其局限性,相比之下,超声波方法具有明显的优势,因此超声波方法作为非接触监测和识别的手段,已经越来越引起人们的重视。
超声波是一种频率大于20kHz具有方向性好、指向性强、传播能量大、遇到杂质或界面会产生反射波等特点的机械波。
在机器人避障、导航系统、机械加工自动化装配及检测、自动测距、无损检测、超声定位、汽车倒车、工业测井、水库液位测量等方面已经有了广泛的应用[1]。
一、超声波测距原理当要计算某物体通过的一段路程时,只要知道物体运动的速度和所经历的时间,就可以计算它通过的路程。
利用超声波测距的方法有多种,如渡越时间检测法、相位检测法和声波幅值检测法。
相比较而言,渡越时间检测法测量时间和精度都较高,并且电路设计不复杂,因此本设计采用渡越时间检测法。
图1 超声波测距原理图超声波测距的原理如图1所示。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
根据接收器接到超声波时的时间差就可以计算出距被测物体的距离:d=s/2=(V×t)/2[2] ①其中d为被测物体到测距仪之间的距离,s为超声波往返通过的路程,V为超声波在介质中的传播速度。
T为超声波从发射到接收所用的时间。
超声波的传播主要受空气密度的影响,空气密度越高其速度越快,而空气密度和温度有着密切的关系。
表1为超声波在不同温度下的波速值。
unsigned int timer=0;sbit RS = P2^3; //数据命令选择端定义sbit RW = P2^4; //读写选择端定义sbit EN = P2^5; //使能端定义sbit Tr = P3^2; //触发信号输入定义sbit Ec = P3^3; //回响信号输出定义sbit Tr1 = P3^4;sbit Ec1 = P3^5;sbit DQ = P3^7;//定义ds18B20总线IOuint distance = 0;uchar count;void delayms(uint x) //毫秒延时函数{uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void write_com(uchar com) //写命令{RS = 0; //写命令时RS=0,RW=0 RW = 0;EN = 0;//把使能端设置为0P0 = com;//把要写的命令字送到数据总线上delayms(2);//延时2ms以待数据稳定EN = 1;//使能端给高脉冲delayms(5);//延时EN = 0;//把使能端置0以完成高脉冲delayms(2);}void write_dat(uchar dat) //写数据{RS = 1;//写数据时RS=1,RW=0RW = 0;EN = 0;//把使能端设置为0P0 = dat;//把要写的数据字送到数据总线上delayms(2);//延时2ms以待数据稳定EN = 1;//使能端给高脉冲delayms(5);//延时EN = 0;//把使能端置0以完成高脉冲delayms(2);void Init_1602() //初始化液晶{write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口delayms(5);write_com(0x0c);//设置开显示,不显示光标delayms(5);write_com(0x06);//写一个字符后地址指针自动加1delayms(5);write_com(0x01);//显示清屏,数据指针清0delayms(5);}void Init_TIMER0() //初始化定时器{TMOD = 0x01; //设置定时器0为工作方式1 ,16位定时器TL0 = 0x00;//装初值0TH0 = 0x00;}void Init_TIMER1() //初始化定时器{TMOD = 0x10; //设置定时器0为工作方式1 ,16位定时器TL1 = 0x00;//装初值0TH1 = 0x00;}void Init_mk() //初始化超声波传感器{Tr =0;//初值设为0Ec = 0;distance = 0;}void Init_mk1() //初始化超声波传感器1{Tr =0;//初值设为0Ec = 0;distance = 0;}void init_fs()//信号触发函数{Tr= 1;Tr1=1; //把触发信号Tr设为高电平_nop_();//使高电平信号保持15uS等待模块内部发出8个40KH周期电平并检测回波信_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Tr = 0;Tri=0//等待15uS后,Tr=0}void D_Distance()//测距函数{uint y;TR0 = 1;//启动定时器0while(Ec);//当检测到回响信号EcTR0 = 0;//关闭定时器0y = TH0*256+TL0;//取出定时器0高八位TH0中的数乘以256再加上第八位TL0,并将这个数赋给yTL0 = 0x00;//重装初值TH0 = 0x00;distance = y;//将定时器的时间计算出来在这里为了方便期间用距离变量表示}void D_Distance1()//测距函数{uint x;TR1 = 1;//启动定时器0while(Ec);//当检测到回响信号EcTR1= 0;//关闭定时器0x = TH1*256+TL1;//取出定时器0高八位TH0中的数乘以256再加上第八位TL0,并将这个数赋给yTL0 = 0x00;//重装初值TH0 = 0x00;juli = x;//将定时器的时间计算出来在这里为了方便期间用距离变量表示}void tmpDelay(int num)//延时函数{while(num--) ;}void Init_DS18B20()//初始化ds1820{unsigned char x=0;DQ = 1; //DQ复位tmpDelay(8); //稍做延时DQ = 0; //单片机将DQ拉低tmpDelay(80); //精确延时大于480usDQ = 1; //拉高总线tmpDelay(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败tmpDelay(20);}unsigned char ReadOneChar()//温度传感器读一个字节{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;tmpDelay(4);}return(dat);}void WriteOneChar(unsigned char dat)//温度传感器写一个字节{unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;tmpDelay(5);DQ = 1;dat>>=1;}}unsigned int Readtemp()//读取温度{unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //连续读两个字节数据//读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a; //两字节合成一个整型变量。
大学传感器与检测课程设计(预习)报告项目:带温度补偿的超声波测距系统设计班级:姓名:学号:联系方式:学期: 2015-2016-2前言 (3)一.课题调研 (3)1.1传感器选型 (3)1.1.1可选温度传感器 DS18B20 (3)1.1.2可选用AD590温度传感器 (4)1.2超声波传感器 (5)1.2.2选用MAX232芯片做发射电路 (7)1.2.3超声波发射电路 (8)1.2.4超声波接收电路 (10)1.2.5选用TL074芯片作为接受电路 (11)1.3多种实现方法。
(12)1.3.1方法一:系统结构框图 (12)1.3.2工作原理 (12)1.3.3方案二:系统结构图如下。
(13)二.总体设计 (14)2.1电路图 (14)2.1.1超声波模块电路 (14)2.2.1主程序设计。
(18)前言以AT89S51单片机为核心,设计了一种带温度补偿的超声波测距系统。
系统包括单片机、超声波发射及接收模块、温度补偿模块、信息显示模块。
温度补偿模块采用温度传感器 DS18B20 采集环境温度,根据超声波速度与温度值的对应关系及时修正波速,以纠正温度的变化引起超声波测距系统产生的误差。
一.课题调研1.1传感器选型集成传感器是采用硅半导体集成工艺而制成的,因此亦称硅传感器或单片集成温度传感器,它是将温度传感器集成在一个芯片上、可完成温度测量及模拟信号输出功能的专用IC。
模拟集成温度传感器的主要特点是功能单一(仅测量温度)、测温误差小、价格低、响应速度快、传输距离远、体积小、微功耗等,适合远距离测温、控温,不需要进行非线性校准,外围电路简单。
1.1.1可选温度传感器 DS18B20由于声音的速度在不同的温度下有所不同,因此为提高精度,应通过温度补偿对超声波的传播速度进行校正。
系统采用 DS18B20传感器测量温度,DS18B20 温度传感器具有不受外界干扰、精度高、测温围宽等优点。
单片机口接 DS18B20 数据总线,控制DS18B20 进行温度转换和传输数据,数据总线接 10 kΩ的上拉电阻,作用是使总线控制器在温度转换期间无需一直保持高电平。
1.1.2可选用AD590温度传感器AD590测量热力学温度、摄氏温度、两点温度差、多点最低温度、多点平均温度的具体电路,广泛应用于不同的温度控制场合。
由于AD590精度高、价格低、不需辅助电源、线性好,常用于测温和热电偶的冷端补偿。
AD590用于测量热力学温度的基本应用电路。
因为流过AD590的电流与热力学温度成正比,当电阻R1和电位器R2的电阻之和为1kΩ时,输出电压O V随温度的变化为1mV/K。
但由于AD590的增益有偏差,电阻也有误差,因此应对电路进行调整。
调整的方法为:把AD590放于冰水混合物中,调整电位器R2,使0V=273.2mV。
或在室温下(25℃)条件下调整电位器,使0V=273.2+25=298.2(mV)。
但这样调整只可保证在0℃或25℃附近有较高精度。
AD590把被测温度转换为电流再通过放大器和A/D转换器,输出数字量送给单片机进行温度控制。
通过查阅资料与比较分析可得: AD590需要和高精度ADC配合使用才能得到数据,优点是速度快,编程简单,缺点是是需要校准,电路复杂,成本高。
DS18B20保证精度足够,电路简单成本低,但是编程复杂,转换速度慢,但关键的是DS18B20性价比高,如果广泛选用,所带来的社会效应比较好,有利于环保节能。
综上所述:由于DS18B20将温度传感器、信号放大调理、A/D转换、接口全部集成于一个芯片,与单片机连接简单、方便,与AD590相比是更新一代的温度传感器,DS18B20不需要AD转换,精度高,电路简单且成本低,可行性好,经济性好,所以选用DS18B20。
1.2超声波传感器1.2.1超声波传感器 HC- SRF04。
选用HC-SR04集成发射与接收HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,其结构简单,使用单片机控制电路简单容易,而且价格便宜。
该模块包括超声波发射、接收与控制电路。
发射电路主要由Em78p153单片机、MAX232及超声波发射头T40组成,接受电路主要由TL074运算放大器及超声波接收探头R40组成。
实物如图如下超声波发射电路超声波接受电路1.2.2选用MAX232芯片做发射电路MAX232芯片是美信(MAXIM)公司专为RS-232标准串口设计的单电源电平转换芯片,如图所示,使用+5v单电源供电。
MAX220–MAX249系列线驱动器/接收器,专为EIA/TIA-232E以及V.28/V.24通信接口设计,尤其是无法提供±12V电源的应用。
发射电路如图1.2.3可选用TCT40-16T和一支超声波接收传感器 TCT40-16R。
TCT40-16T 可以发40 k Hz 左右的方波脉冲信号。
信号由单片机端口提供,由于单片机端口输出功率不够,40 k Hz 方波脉冲信号需经功率放大以便使发射距离足够远,满足测量距离要求。
TCT40-16R作接收传感器,经LM358 放大后进入 LM567 进行锁相环检波。
当LM567 的引脚输入合适的信号时,其引脚产生一个负跳变,在编程时将外部中断 0 的中断触发方式设置为下降沿触发,就可以通过 INT0 产生一个外部中断申请,由 CPU 来检测并理。
1.2.3超声波发射电路74LS04 是仪器生产的六反向器,总共有 14 个引脚,引脚 1A~6A 是输入端,引脚 1Y~6Y 是输出端,另外还有两个分别是电源的正负Vcc 和 GND 端电源电压 Vcc 的允许围是 4.75V~5.25V,输入高电平电压最小值是2V,输入低电平电压最大是 0.7V,输出高电平的时候电流时 400,输出低电平的时候电流是 8m A ,输出由低到高或者由高到低的传输时间最大时 15ns。
超声波发射电路利用单片机 AT89C51 的 P3.端口发射 40k Hz 的方波,通过芯片 74LS04 六反向器来驱动超声波传感器来发射超声波。
该测距电路的 40k Hz 方波信号由单片机的P3.5发出,方波的周期为 1/40ms,即 25s,半周期为 12.5s。
每隔半周期时间,让方波的输出引脚电平取反,便可以产生 40k Hz 的方波。
因为我们的单片机采用的晶振是 12M 的,单片机的时间分辨率是 1s,所以只能产生半周期为 12s 或者 13s 的方波信号,频率分别是41.67k Hz 和 38.46k Hz,本系统选择了后者,让单片机产生 38.46k Hz的方波。
单片机的引脚产生的 40k Hz 的方波信号,一路经 74LS04 的一级反向后送到超声波发射传感器的一个电极;另一路经过二级反向后送到超声波发射传感器的另外一个电极。
利用这种推挽的方式把方波信号加到超声波发射传感器的两极,这样的方式能增强超声波的发射强度,另外输出端采用两个反向器并联的方式来增强系统驱动能力,两个上拉电阻一方面可以提高反向器的驱动能力,另一方面可以增加超声波传感器的电气阻尼效果,大大缩短电气振荡的时间。
1.2.4超声波接收电路CX20106A 采用8 脚单列直插塑料封装,主要由以下几个部分组成前置放大器,限幅放大器,带通滤波器,检波器,积分器和整形电路,CX20106A 在输入微弱信号的时候,前置放大器具有很高的增益,而在输入强信号的时候又不会过载。
部的滤波器中心频率可以由其引脚 5 外接电阻进行调节,围可以从30k Hz~60k Hz。
CX20106A 的工作过程如下:前置放大器把超声波接收传感器检测到的微弱电压信号进行放大,电压增益约为 80d B,然后将放大后的信号送给限幅放大器,使其转变为矩形脉冲,再由滤波器进行频率选择,消除干扰信号,然后经过整形后,由其引脚 7 输出低电平。
1.2.5选用TL074芯片作为接受电路TL074芯片是四运算放大器,适合于电源电压围很宽的单电源使用,也适用于双电源供电工作模式,在推荐的工作条件下,电源电流与电源电压无关。
他的适用围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器。
接受电路如图所示:综上所述:选用TL074芯片作为接受电路,选用MAX232芯片做发射电路。
但是由于学校器件选购不合适等等原因,最终选择集发射和接受为一体的HC-SR04,编程简单,可行性好,经济性也好,是很好的选择。
1.3多种实现方法。
1.3.1方法一:系统结构框图1.3.2工作原理系统工作原理和功能本系统工作时,由单片机提供 40 k Hz 的脉冲信号,经放大后通过超声波发射器输出。
超声波在空气中传播,在到达被测物体时被反射回来,由超声波接收器接收。
当超声波接收器接收到反射波时,先经放大器放大,用锁相环电路检波处理后产生一个负跳变,在 INT0 产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务程序。
单片机在启动发射电路时同时启动单片机部的定时器 T0,利用定时器记录超声波发射的时间和收到反射波的时间。
在外部中断程序中读取时间差,计算距离。
其中温度补偿环节为:温度补偿环节,设超声波速度为v,往返时间为 t,温度为T,v = 331.5 + 0. 61T,距离为速度除以二可得。
1.3.3方案二:系统结构图如下。
接口向触发引脚发送≥10 μs 的脉冲触发信号,该模块部将发出 8 个 40 k Hz 周期电平并检测回波,一旦检测到有回波信号,则3 脚输出回响信号,所测的距离与回响信号的脉冲宽度成正比,由此可通过发射信号到收到回响信号的时间间隔计算得到距离。
超声波时序图综上所述:由于元器件的限制,最终选择第二种设计方案,同时,第二种方案,方便简单可行性高,同时经济性好,对社会环境影响小,所以选择第二种方案,有利于低碳环保可持续发展。
二.总体设计2.1电路图2.1.1超声波模块电路TL074接受电路MAX232发射电路温度检测电路LCD或LED显示模块2.2.1主程序设计选用社会效益、环保效益好的HC-SR04主程序流程图如下加入温度传感部分。