带温度补偿超声波测距系统设计
温度补偿超声波测距仪

摘要本文给出了系统总体框架、硬件电路、软件设计和程序流程图,并在硬件平台上实现了所设计的功能。
超声测距是一种非接触式的检测方式。
与其它方法相比,如电磁的或光学的方法,它不受光线、被测对象颜色等影响。
对于被测物处于黑暗、有灰尘烟雾、电磁干扰、有毒等恶劣的环境下有一定的适应能力。
而本文介绍的基于单片机STC90C516RD+的超声波测距系统的设计方案与软硬件实现。
采用温度传感器DS18B20 采集温度数据,液晶显示屏LCD1602C 显示温度数据及来回波的时间,当环境温度变化较大时,提取测得的温度,根据不同的温度对超声波测距系统的声速进行修正。
测距时接收到回波,点亮绿色发光二极管;当没有回波时,定时器溢出,点亮红色发光二极管。
关键词:红色发光二极管;超声波测距;温度补偿;温度传感器;电磁干扰目录摘要 (Ⅰ)第1章绪论 (1)1.1 概述 (1)1.2 系统软硬件的调试 (1)第2章系统设计原理 (2)2.1 系统主要硬件结构 (2)2.2 单片机主机系统介绍 (2)2.2.1 单片机控制模块 (2)2.2.2 温度数据采集模块 (2)2.2.3 主件LCD1602C的结构 (3)2.3 超声波测距的设备 (4)2.3.1 超声波测距系统的硬件电路设计 (4)2.3.2 超声波发射电路 (4)2.3.3 超声波检测接收电路 (5)第3章系统的软件设计 (6)3.1 语言的选用 (6)3.2 系统控制流程 (7)3.3 程序设计流程图 (10)3.4 超声波测距仪的算法设计 (12)3.5 超声波发生子程序和接收中断程序 (12)3.6 电路仿真 (12)第4章安装调试 (13)第5章电路特点和误差分析 (14)结论 (15)参考文献 (16)附录 (17)致谢 (24)第1章绪论1.1 概述制作超声波测距系统,并外加温度补偿使测距更精确。
前期制作超声波发送与接收电路,经过调试正常可用后,编写相应的超声波程序,完成对于整个测距系统的控制。
51单片机超声波测距离(带温度补偿)

超声波模块原理图:发射接收原理图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控制器忙。
带温度补偿的超声波测距程序

/**程序:基于HC-SR04得超声波测距系统*单片机型号:STC90C51612MHz*说明:开始连续进行7次超声波测距,每次测距间隔80ms,*完成后对7次结果排序并将最大得2个数值与最小得2个数值去除,对剩余得*3个数值取平均值。
完成后指示灯灭,输出结果到LCD1602上。
测量超出范围则发出报警声、*使用两个IO端口控制HC-SR04触发信号输入与回响信号输出,*以及一个T0定时器用于时间计数。
* 使用DS18B20测量环境温度,声速公式:V=334。
1m/s+Temperature*0、61,*单片机晶振为12Mhz(11、953M),计数时为T=1us*计算公式:S=(334。
1m/s+Temperature*0。
61)*N*T/2,N为计数值=TH0*256+TL0*/ /*包含头文件*/#include 〈reg51。
h>#include 〈intrins。
h>#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}/*宏定义*/#define uchar unsignedcharﻩ//无符号8位#define uintﻩunsigned int//无符号16位#define ulongunsigned long ﻩ//无符号32位/*全局变量定义*/sbit BEEP=P1^5;ﻩﻩ//报警测量超出范围sbit Trig=P3^4; //HC-SR04触发信号输入sbitEcho=P3^2;ﻩ//HC—SR04回响信号输出float xdataDistanceValue=0。
0;ﻩ//测量得距离值float xdata SPEEDSOUND; ﻩﻩ//声速float xdataXTALTIME; ﻩ//单片机计数周期uchar xdata stringBuf[6];ﻩﻩ//数值转字符串缓冲//LCD1602提示信息uchar codePrompts[][16]={ﻩ{"Measure Distance"}, //测量距离{"-Out of Range -"}, //超出测量范围ﻩ{"MAX range400cm "}, //测距最大值400cm{”MIN range 2cm"},ﻩ//测距最小值2cm{”"},ﻩ//清屏};uchar xdata DistanceText[]="Range: ";//测量结果字符串uchar xdata TemperatureText[]="Temperature:";//测量温度值/*外部函数声明*/extern voidLCD_Initialize(); //LCD初始化extern void LCD_Display_String(uchar*, uchar);externvoid ReadTemperatureFromDS18B20();extern int xdataCurTempInteger;void DelayMS(uint ms);ﻩ//毫秒延时函数voidDelay20us(); //20微秒延时函数voidHCSR04_Initialize();//HCSR04初始化float MeasuringDistance();ﻩ//测量距离float DistanceStatistics();ﻩ//测距得数值排序求平均void DisplayDistanceValue(float dat); //输出距离值到LCD1602上uchar UnsigedIntToString(uintvalue);ﻩ//将无符号得整数转成字符串,返回字符串长度,不包括'\0'结束符void Beep(uchar time); //蜂鸣器void DisplayTemperatureValue(); //显示温度值/***测量距离***/floatMeasuringDistance(){//最大定时时间约65msTH0=0;TL0=0;//生成20us得脉冲宽度得触发信号Trig=1; ﻩﻩﻩDelay20us();ﻩTrig=0;while(!Echo);//等待回响信号变高电平ﻩTR0=1; ﻩ//启动定时器0while(Echo);//等待回响信号变低电平ﻩTR0=0; //关闭定时器0return(SPEEDSOUND*XTALTIME*((float)TH0*256+(float)TL0))/2000; //返回距离值(mm)}/***HCSR04初始化***/void HCSR04_Initialize(){ﻩXTALTIME=12/12;ﻩﻩ//计算单片机计数周期晶振=12M 单位usﻩSPEEDSOUND=334。
基于单片机的超声波测距及温度补偿设计与实现

期末课程设计学院:软件学院_ __ 专业:软件工程_ __ 年级:2009级__ _ 课程:_单片机应用技术_ _姓名:_郭汉杰_ _ ___ 学号:_123012009138 __ ___二〇一二年六月福建师范大学软件学院2009级软件工程基于单片机的超声波测距及温度补偿设计与实现摘要本文介绍了基于单片机STC90C516RD+的超声波测距系统的设计方案与软硬件实现.采用温度传感器DS18B20 采集温度数据,液晶显示屏LCD1602C 显示温度数据及来回波的时间,当环境温度变化较大时,提取测得的温度,根据不同的温度对超声波测距系统的声速进行修正。
测距时接收到回波,点亮绿色发光二极管;当没有回波时,定时器溢出,点亮红色发光二极管。
本文给出了系统总体框架、硬件电路、软件设计和程序流程图,并在硬件平台上实现了所设计的功能。
关键词STC90C516RD+;超声波测距;温度补偿;温度传感器;液晶显示器一、引言1.1超声波测距系统概述随着社会的发展,超声波测量及控制变得越来越重要。
本文采用单片机STC90C516RD+设计了超声波测距及温度补偿系统。
单片机STC90C516RD+能够根据温度传感器DS18B20所采集的温度数据来修正测距系统中的声速,从而使超声波测得的距离更准确.同时,当温度高于设定的温度时,单片机启动蜂鸣器发出报警,并点亮绿色发光二极管;当温度低于设定的温度时,蜂鸣器停止报警。
所有测距和温度数据均通过液晶显示器LCD1602 显示出来。
当收到回波时,测距成功,并在屏幕上现实来回波的时间及距离,并可看到动态变化的当前温度和来回波时间;当未收到回波时,定时器溢出,测距失败,在屏幕上显示出错.1.2本设计任务和主要内容制作超声波测距系统,并外加温度补偿使测距更精确。
前期制作超声波发送与接收电路,经过调试正常可用后,编写相应的超声波程序,完成对于整个测距系统的控制.设计的最终结果是使超声波测距仪能够产生超声波,实现超声波的发送与接收,从而实现利用超声波方法测量物体间的距离.以数字的形式显示测量距离。
超声波测距系统的设计

超声波测距系统的设计引言:一、硬件设计:1.选择传感器:超声波传感器是测距系统的核心部件,通常采用脉冲法进行测量。
在选择传感器时,应考虑工作频率、测量范围、精度和稳定性等参数,并根据实际需求进行选择。
2.驱动电路设计:超声波传感器需要高频信号进行激励,设计驱动电路时需要根据传感器的工作要求来设计合适的电路,保证信号稳定且能够满足传感器的工作需求。
3.接收电路设计:超声波传感器产生的脉冲回波需要经过接收电路进行信号放大和滤波处理,设计接收电路时需要考虑信号放大的增益、滤波器的截止频率以及抗干扰能力等因素。
4.控制板设计:控制板是超声波测距系统中的核心控制器,负责控制测距过程、数据处理以及通信等功能。
在设计控制板时,应根据系统的要求选择合适的微控制器或单片机,并设计合理的电路布局和电源电路。
二、软件编程:1.驱动程序开发:根据传感器的规格书和数据手册,编写相应的驱动程序,实现对超声波传感器的激励和接收。
2.距离计算算法开发:通过测量超声波的往返时间来计算距离,根据声速和时间的关系进行距离计算,并根据实际情况对计算结果进行修正。
3.数据处理和显示:根据实际需求,对测量得到的距离进行处理,并将结果显示在合适的显示设备上,如LCD屏幕或计算机等。
4.数据通信:如果需要将测量结果传输至其他设备或系统,则需要编写相应的数据通信程序,实现数据的传输和接收。
三、系统测试与优化:1.测试传感器性能:测试测距系统的稳定性、精度和灵敏度等性能指标,根据测试结果对系统参数进行优化和调整。
2.系统校准:超声波测距系统可能受到环境温度、湿度和声速等因素的影响,需要进行校准以提高测量精度。
3.系统集成与实际应用:将超声波测距系统与实际应用场景进行集成,进行实际测试和验证。
总结:超声波测距系统的设计包括硬件设计和软件编程两个方面,其中硬件设计主要包括传感器选择、驱动电路设计和接收电路设计等;软件编程主要包括驱动程序开发、距离计算算法开发、数据处理和显示以及数据通信等。
基于Proteus的温控超声波测距半物理仿真系统设计

RS -232-C 异步串行接口将实物与仿真连接进行通信,电路还需搭载MAX232电平转换芯片。
具体连接过程为下位机通过RS -232-C 异步串行接口与PC 机接口相连,上位机中的COMPIM 虚拟接口编号设置为与下位机相连的PC 机的接口编号。
整体系统通过上位机与下位机之间的相互通信,实现温度检测、超声波测距及警报功能。
2 电路设计2.1 下位机电路设计由于Proteus 中超声波模块和蜂鸣器模块,与实物使用存在一定差别,为使实验便于操作,实验结果更加直观,设计如图2所示的下位机电路,该电路搭载有电源模块、RS -232-C 异步串行接口、蜂鸣器模块、单片机控制模块、DS18B20温度传感器、MAX232电平转换模块以及HC -SR04超声波测距模块。
可实现目标距离和环境温度的测量,将测量到的信息上传给上位机进行数据处理,并将处理好的数据发回实物单片机上,控制警报系统。
2.2 上位机电路设计在Proteus 中搭建如图3所示的上位机电路,该部分由LCD1602液晶显示模块、STC89C516控制模块、MAX232电平转换模块、RS -232-C 模块以及LED 状态指示模块组成。
由于上位机与下位机通过RS -232-C 异步串行接口相连,上位机电路的晶振频率应与实物电路的晶振频率相同为12MHz 。
当下位机将测得的数据传输给上位机时,上位机开始处理数据,并控制LCD1602实时显示目标距离。
如果目标距离小于20cm ,红色指示灯亮起,并将处理好的数据传输给下位机,使下位机发出警报,否则,绿灯亮起。
图1 系统总体框架示意图图2 下位机电路图图3 上位机电路图3 系统软件设计3.1 超声波测距模块原理本实验采用型号为HC-SR04的超声波测距模块,该模块集成有超声波发射器、接收器与控制电路,具有性能高,精度高,盲区小等优点[8]。
其工作时序图如图4所示,当单片机I/O口发送一个至少10µs以上的高电平至该模块的Trig控制信号输入引脚时,超声波测距模块内自动发出8个方波信号,其周期为40kHz,同时检测是否有返回信号。
超声波测距设计毕业设计

超声波测距设计毕业设计一、引言距离测量在许多领域都具有重要的应用,如工业自动化、机器人导航、汽车防撞等。
超声波测距作为一种非接触式的测量方法,具有测量精度高、响应速度快、成本低等优点,因此在实际工程中得到了广泛的应用。
本次毕业设计旨在设计一种基于超声波的测距系统,实现对目标物体距离的准确测量。
二、超声波测距原理超声波是一种频率高于 20kHz 的机械波,其在空气中的传播速度约为 340m/s。
超声波测距的原理是通过发射超声波脉冲,并测量其从发射到接收的时间间隔,然后根据声速和时间间隔计算出目标物体与传感器之间的距离。
假设发射超声波脉冲的时刻为 t1,接收到回波的时刻为 t2,声速为c,距离为 d,则距离 d 可以通过以下公式计算:d = c ×(t2 t1) / 2三、系统硬件设计(一)超声波发射模块超声波发射模块主要由超声波换能器和驱动电路组成。
超声波换能器将电信号转换为超声波信号发射出去,驱动电路则提供足够的功率和电压来驱动换能器工作。
(二)超声波接收模块超声波接收模块主要由超声波换能器、前置放大器、带通滤波器和比较器组成。
换能器将接收到的超声波信号转换为电信号,前置放大器对信号进行放大,带通滤波器去除噪声和干扰,比较器将信号整形为方波信号。
(三)控制与处理模块控制与处理模块采用单片机作为核心,负责控制超声波的发射和接收,测量时间间隔,并计算距离。
同时,单片机还可以将测量结果通过显示模块进行显示,或者通过通信模块与上位机进行通信。
(四)显示模块显示模块用于显示测量结果,可以采用液晶显示屏(LCD)或数码管。
(五)电源模块电源模块为整个系统提供稳定的电源,包括 5V 和 33V 等不同的电压等级。
四、系统软件设计(一)主程序流程系统上电后,首先进行初始化操作,包括单片机的初始化、定时器的初始化、端口的初始化等。
然后进入主循环,不断地发射超声波脉冲,并等待接收回波。
当接收到回波后,计算距离,并进行显示或通信。
超声波测距系统中的温度补偿

机在通过单总线接口访问 DS18B20 时 , 其工作流程必 需要遵守严格的操作时序 , 如果顺序中任意一步缺少 [ 6, 7 ] 或顺序错乱 , DS18B20 将不会响应 。DS18B20 的操 作顺序是 : 第一步 : 对 DS18B20 初始化 ; 第二步 : 发送 ROM 命令 ; 第三步 : 发送功能命令 。超声波测距系统 上电后 ,单片机开始初始化 DS18B20, 检测现场温度 , 软件控制 DS18B20 的具体流程如图 4 所示 。
- 30 313 - 20 319 - 10 325 0 323 10 338 20 344 30 349 100 386
收稿日期 : 2008 - 07 - 16; 修回日期 : 2008 - 09 - 10 3 基金项目 : 天津市应用基础与前沿技术计划 ( 07JCZDJC09300) ; 天津市教委科技发展基金 ( 2006BA12) 作者简介 : 赵小强 ( 1983 —) ,男 ,天津人 ,天津理工大学学生 ,硕士研究生 ,研究方向为检测与控制技术 , ( E - mail) zhaoxiaoqiang1983@163. com。
图 3 硬件结构
・6 3 ・
・ 控制与检测 ・
312 软件设计 DS18B20 对时序和电性参数要求很高 , 所以单片
tmpw ritebyte ( 0xcc) ; tmpw ritebyte (0x44) ;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南通大学
传感器与检测课程设计(预习)报告
项 目: 带温度补偿的超声波测距系统设计 班 级: 姓 名: 学 号: 联系方式: 学 期: 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Ω 的上拉电阻,作用是使总线控制器在温度转换期间无需一直保持高电平。 1.1.2可选用AD590温度传感器 AD590测量热力学温度、摄氏温度、两点温度差、多点最低温度、多点平均温度的具体电路,广泛应用于不同的温度控制场合。由于AD590精度高、价格低、不需辅助电源、线性好,常用于测温和热电偶的冷端补偿。AD590用于测量热力学温度的基本应用电路。因为流过AD590的电流与热力学温度成正比,当电阻R1和电位器R2的电阻之和为1kΩ时,输出电压OV随温度的变化为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,编程简单,可行性好,经济性也好,是很