您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 基于51单片机的HC-SR04超声波测距系统制作
基于51单片机带温度补偿的HC-SR04超声波测距系统利用从网上购买的HC-SR04超声波模块制作了一个测距装置,HC-SR04自身不带温度补偿功能,所以加上一个使用DS18B20做的温度测量模块。整个系统包括:51单片机最小系统,超声波测距模块、温度测量模块、液晶显示模块。使用了如下主要元器件:元件说明数量STC90C516RC51单片机1HC-SR04超声波测距模块1DS18B20温度测量模块1lcd1602液晶显示模块1系统电路图51单片机最小系统单片机型号:STC90C516,晶振:12Mhz。自己动手焊接的最小系统板。LCD1602A液晶显示模块:HC-SR04超声波测距模块HC-SR04超声波测距模块可提供2cm至400cm的非接触式距离感测功能,测距精度可达3mm;模块自身包括超声波发射器、接收器与控制电路。实物正反两面图HC-SR04电气参数:HC-SR04工作原理及说明:1、给Trig触发控制信号IO端口至少10us的高电平信号;2、模块自动发送8个40khz的方波,并自动检测是否有信号返回;3、有信号返回时,Echo回响信号输出端口输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间;4、两次测距时间间隔最少在60ms以上,以防止发射信号对回响信号的影响;超声波时序图单片机控制HC-SR04超声波测距说明:原理图中,单片机的P1.7口接HC-SR04的Trig端口,P1.6口接HC-SR04的Echo端口,超声波在传播时碰到障碍物即返回,HC-SR04模块收到回波信号后Echo口输出一个高电平,单片机检测到高电平后即启动计数器开始计数,直到单片机检测到Echo口变成低电平后结束计数,计数器的计数值乘以单片机计数周期就是超声波从发射到接收的往返时间,即距离S=v*t/2;由于在室温下,声速受温度的影响,其变化关系为:V=334.1+T*0.61(T为当前温度),利用DS18B20温度传感器可以得到环境温度,补偿温度对声速的影响。当温度高于26度或低于14度时,上述公式不能完全满足对测量的修正了,所以高于26度时取26度,低于14度时取14度。距离计算公式为:S=(334.1+T*0.61)*N*T0/2T:当前环境温度值N:计数值T0:单片机计数周期=晶振频率/12(微秒)HC-SR04测量存在不稳定性,所在对同一距离进行多次测量,并对测量结果排序,去除最大和最小值,将余下的求平均值。程序流程图:程序代码:/**程序:基于HC-SR04的超声波测距系统*单片机型号:STC90C51612MHz*说明:按下K1键后,指示灯点亮,开始连续进行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*//*包含头文件*/#includereg51.h#includeintrins.h#defineDelay4us(){_nop_();_nop_();_nop_();_nop_();}/*宏定义*/#defineucharunsignedchar//无符号8位#defineuintunsignedint//无符号16位#defineulongunsignedlong//无符号32位/*全局变量定义*/sbitK1=P1^0;//按下K1后,开始测距sbitLEDRed=P1^1;//测距指示灯,亮表示正在测距,灭表示测距完成sbitBEEP=P1^5;//报警测量超出范围sbitTrig=P1^7;//HC-SR04触发信号输入sbitEcho=P1^6;//HC-SR04回响信号输出floatxdataDistanceValue=0.0;//测量的距离值floatxdataSPEEDSOUND;//声速floatxdataXTALTIME;//单片机计数周期ucharxdatastringBuf[6];//数值转字符串缓冲//LCD1602提示信息ucharcodePrompts[][16]={{MeasureDistance},//测量距离{-OutofRange-},//超出测量范围{MAXrange400cm},//测距最大值400cm{MINrange2cm},//测距最小值2cm{},//清屏{PressK1Start}//按键开始测量};ucharxdataDistanceText[]=Range:;//测量结果字符串ucharxdataTemperatureText[]=Temperature:;//测量温度值/*外部函数声明*/externvoidLCD_Initialize();externvoidLCD_Display_String(uchar*,uchar);externvoidReadTemperatureFromDS18B20();externintxdataCurTempInteger;//毫秒延时函数voidDelayMS(uintms);//20微秒延时函数voidDelay20us();//HCSR04初始化voidHCSR04_Initialize();//测量距离floatMeasuringDistance();//测距的数值排序求平均floatDistanceStatistics();//输出距离值到LCD1602上voidDisplayDistanceValue(floatdat);//将无符号的整数转成字符串,返回字符串长度,不包括'\0'结束符ucharUnsigedIntToString(uintvalue);//蜂鸣器voidBeep(uchartime);//显示温度值voidDisplayTemperatureValue();//测量距离floatMeasuringDistance(){//最大定时时间约65msTH0=0;TL0=0;//生成20us的脉冲宽度的触发信号Trig=1;Delay20us();Trig=0;//等待回响信号变高电平while(!Echo);TR0=1;//启动定时器0//等待回响信号变低电平while(Echo);TR0=0;//关闭定时器0//返回距离值(mm)return(SPEEDSOUND*XTALTIME*((float)TH0*256+(float)TL0))/2000;}//HCSR04初始化voidHCSR04_Initialize(){//计算单片机计数周期晶振=11.953M单位usXTALTIME=12/11.953;//温度25度时声速的值SPEEDSOUND=334.1+25*0.61;Trig=0;Echo=0;TMOD=0x01;}//输出距离值到LCD1602上voidDisplayDistanceValue(floatdat){uchari=0,j=0,len;uintvalue;value=(uint)dat;//范围检查大于4000mm和小于20mm都为超出测量范围if(value4000){LCD_Display_String(Prompts[1],0x00);LCD_Display_String(Prompts[2],0x40);Beep(2);}elseif(value20){LCD_Display_String(Prompts[1],0x00);LCD_Display_String(Prompts[3],0x40);Beep(2);}else{//将数值转换成字符串len=UnsigedIntToString(value);//保留1位小数while(stringBuf[i]!='\0'){if(len-j==1){DistanceText[6+j]='.';j++;}else{DistanceText[6+j]=stringBuf[i];i++;j++;}}DistanceText[6+j]='c';j++;DistanceText[6+j]='m';i=7+j;//剩余位置补空格while(i16){DistanceText[i]='';i++;}//LCD_Display_String(Prompts[0],0x00);LCD_Display_String(DistanceText,0x40);}}//显示温度值voidDisplayTemperatureValue(){TemperatureText[13]=CurTempInteger/10+'0';TemperatureText[14]=CurTempInteger%10+'0';TemperatureText[15]='C';LCD_Display_String(TemperatureText,0x00);}//将无符号的整数转成字符串,返回字符串长度ucharUnsigedIntToString(uintvalue){uchari=0,t,length;//从个位开始转换do{stringBuf[i]='0'+value%10;value=value/10;i++;}while(value!=0);length=i;//将字符串颠倒顺序for(i=0;i(length/2);i++){t=stringBuf[i];stringBuf[i]=stringBuf[length-i-1];stringBuf[length-i-1]=t;}stringBuf[length]='\0';returnlength;}//蜂鸣器voidBeep(uchartime){uchari;for(i=0;i100;i++){BEEP=!BEEP;DelayMS(time);}BEEP=0;DelayMS(100);}//延时函数毫秒@12.000MHzvoidDelayMS(uintms){uchari,j;while(ms--){_nop_();i=2;j=239;do{while(--j);}while(--i);}}//延时函数20微秒@12.000MHzvoidDelay20us(){uchari;_nop_();i=7;while(--i);}//定时器0中断voidTimer0()interrupt1{}//DS18B20代码:/*----------------------------------------------*程序功能:DS18B20温度检测程序*单片机型号:STC89C5212MHz*晶振:12Mhz------------------------------------------------*//*包含头文件*/#includereg51.h#includeintrins.h/*宏定义*/#defineucharunsignedchar//无符号8位#defineuintunsignedint//无符号16位//定义DS18B20端口DS18B20_DQsbitDS18B20_DQ=P3^7;//当前采集的温度值整数部分intxdataCurTempInteger;//当前采集的温度值小数部分intxdataCurTempDecimal;/*----------------------------------------------------------------*功能:延时函数STC89C52@12MHz12T模式*参数:无*返回:无--------------------------------------------------------
本文标题:基于51单片机的HC-SR04超声波测距系统制作
链接地址:https://www.777doc.com/doc-5445734 .html