带温度补偿的超声波测距程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/**程序:基于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*//*包含头文件*/#includereg51.h#includeintrins.h#defineDelay4us(){_nop_();_nop_();_nop_();_nop_();}/*宏定义*/#defineucharunsignedchar//无符号8位#defineuintunsignedint//无符号16位#defineulongunsignedlong//无符号32位/*全局变量定义*/sbitBEEP=P1^5;//报警测量超出范围sbitTrig=P3^4;//HC-SR04触发信号输入sbitEcho=P3^2;//HC-SR04回响信号输出floatxdataDistanceValue=0.0;//测量的距离值floatxdataSPEEDSOUND;//声速floatxdataXTALTIME;//单片机计数周期ucharxdatastringBuf[6];//数值转字符串缓冲//LCD1602提示信息ucharcodePrompts[][16]={{MeasureDistance},//测量距离{-OutofRange-},//超出测量范围{MAXrange400cm},//测距最大值400cm{MINrange2cm},//测距最小值2cm{},//清屏};ucharxdataDistanceText[]=Range:;//测量结果字符串ucharxdataTemperatureText[]=Temperature:;//测量温度值/*外部函数声明*/externvoidLCD_Initialize();//LCD初始化externvoidLCD_Display_String(uchar*,uchar);externvoidReadTemperatureFromDS18B20();externintxdataCurTempInteger;voidDelayMS(uintms);//毫秒延时函数voidDelay20us();//20微秒延时函数voidHCSR04_Initialize();//HCSR04初始化floatMeasuringDistance();//测量距离floatDistanceStatistics();//测距的数值排序求平均voidDisplayDistanceValue(floatdat);//输出距离值到LCD1602上ucharUnsigedIntToString(uintvalue);//将无符号的整数转成字符串,返回字符串长度,不包括'\0'结束符voidBeep(uchartime);//蜂鸣器voidDisplayTemperatureValue();//显示温度值/***测量距离***/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初始化***/voidHCSR04_Initialize(){XTALTIME=12/12;//计算单片机计数周期晶振=12M单位usSPEEDSOUND=334.1+25*0.61;//温度25度时声速的值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(DistanceText,0x40);//LCD_Display_String(Prompts[0],0x00);}}/***显示温度值***/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.000MHz***/voidDelayMS(uintms){uchari,j;while(ms--){_nop_();i=2;j=239;do{while(--j);}while(--i);}}/***延时函数20微秒@12.000MHz***/voidDelay20us(){uchari;_nop_();i=7;while(--i);}/***定时器0中断***/voidTimer0()interrupt1{}//DS18B20代码:/*----------------------------------------------*程序功能:DS18B20温度检测程序*单片机型号:STC89C5212MHz*晶振:12Mhz------------------------------------------------*//*包含头文件*/#includereg51.h#includeintrins.h/*宏定义*/#defineucharunsignedchar//无符号8位#defineuintunsignedint//无符号16位sbitDS18B20_DQ=P3^3;//定义DS18B20端口DS18B20_DQintxdataCurTempInteger;//当前采集的温度值整数部分intxdataCurTempDecimal;//当前采集的温度值小数部分/***功能:延时函数STC89C52@12MHz12T模式参数:无返回:无***/voidDelayus(uintcount){while(--count);}/***功能:DS18B20复位及状态检测参数:无返回:0或1,1表示未准备好,0表示准备好***/ucharReset_DS18B20(){ucharstatus;DS18B20_DQ=1;Delayus(1);//开始复位过程DS18B20_DQ=0;//数据线拉低Delayus(100);//延时480us-960usDS18B20_DQ=1;//数据线拉高Delayus(10);//延时15us-60usstatus=DS18B20_DQ;//读取数据线上的状态Delayus(120);returnstatus;}/***功能:写一字节到DS18B20中参数:dat=数据返回:无***/voidWriteByteToDS18B20(uchardat){uchari;for(i=0;i8;i++){DS18B20_DQ=0;DS18B20_DQ=dat&0x01;//发送1位数据Delayus(15);//延时60us以上DS18B20_DQ=1;//释放总线,等待总线恢复dat=1;//准备下一位数据}}/***功能:从DS18B20中读一字节参数:无返回:读取的数据***/ucharReadByteFromDS18B20(){uchari,dat=0;for(i=0;i8;i++){DS18B20_DQ=0;//拉低总线,产生读信号dat=1;DS18B20_DQ=1;//释放总线,准备读1位数据Delayus(2);//延时4usif(DS18B20_DQ)dat|=0x80;//合并每位数据Delayus(15);//延时60usDS18B20_DQ=1;//拉高总线,准备读下1位数据}returndat;}/***功能:读取温度值并转换成有符号的数值形式参数:无返回:无***/voidReadTemperatureFromDS18B20(){ucharflag=0;//正负符号标志//存储当前采集的温度值ucharTempValue[]={0,0};if(Reset_DS18B20())//DS18B20复位{CurTempInteger=255;CurTempDecimal=0;}else{WriteByteToDS18B20(0xCC);//跳过ROM命令WriteByteToDS18B20(0x44);//温度转换命令Reset_DS18B20();//复位WriteByteToDS18B20(0xCC);//跳过ROM命令WriteByteToDS18B20(0xBE);//读取温度暂存器命令TempValue[0]=ReadByteFromDS18B20();//先读低字节温度值TempValue[1]=ReadByteFromDS1

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功