当前位置:文档之家› 带温度补偿的超声波测距程序

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

/**程序:基于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。

1+25*0、61;ﻩ//温度25度时声速得值ﻩﻩﻩTrig=0;Echo=0;TMOD=0x01;}/***输出距离值到LCD1602上***/void DisplayDistanceValue(floatdat){uchari=0,j=0,len;ﻩuint value;value=(uint)dat;//范围检查大于4000mm与小于20mm都为超出测量范围if(value〉4000)ﻩ{ﻩLCD_Display_String(Prompts[1],0x00);LCD_Display_String(Prompts[2],0x40);Beep(2);ﻩ}ﻩelse if(value<20)ﻩ{ﻩ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(i<16)ﻩﻩ{ﻩﻩDistanceText[i]=' ';ﻩi++;ﻩ}LCD_Display_String(DistanceText,0x40);//LCD_Display_String(Prompts[0],0x00); ﻩ}}/***显示温度值***/void DisplayTemperatureValue(){TemperatureText[13]=CurTempInteger/10+'0';TemperatureText[14]=CurTempInteger%10+'0';TemperatureText[15]='C';LCD_Display_String(TemperatureText,0x00);ﻩ}/***将无符号得整数转成字符串,返回字符串长度***/ucharUnsigedIntToString(uint value){uchar i=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’;ﻩreturn length;}/***蜂鸣器***/void Beep(uchar time){ﻩuchar i;for(i=0;i〈100;i++)ﻩ{ﻩBEEP=!BEEP;ﻩDelayMS(time);ﻩﻩ}BEEP=0;DelayMS(100);}/***延时函数毫秒@12、000MHz***/ void DelayMS(uint ms){ﻩuchar i, j;while(ms—-){ﻩ_nop_();ﻩﻩi=2;j=239;doﻩﻩ{while(—-j);ﻩﻩ}while (--i);ﻩ}}/***延时函数20微秒12、000MHz***/ void Delay20us(){uchar i;_nop_();ﻩi=7;while (--i);}/***定时器0中断***/void Timer0() interrupt 1{}//DS18B20代码:/*—------—-——-------——--—----—---——-———--—--—--—*程序功能: DS18B20温度检测程序*单片机型号:STC89C5212MHz* 晶振: 12Mhz-—----—--—-——-—--—-——--—------—-------—-------——*//*包含头文件*/#include<reg51。

h>#include<intrins、h〉/*宏定义*/#defineucharﻩunsigned char ﻩ//无符号8位#define uintﻩunsigned int//无符号16位sbit DS18B20_DQ =P3^3;ﻩ//定义DS18B20端口DS18B20_DQint xdata CurTempInteger; //当前采集得温度值整数部分int xdata CurTempDecimal;//当前采集得温度值小数部分/***功能:延时函数STC89C52 12MHz12T模式参数:无返回:无***/void Delayus(uintcount) ﻩ{ﻩwhile (--count);}/***功能:DS18B20复位及状态检测参数:无返回:0或1,1表示未准备好,0表示准备好***/ uchar Reset_DS18B20(){ﻩuchar status;ﻩDS18B20_DQ=1;ﻩDelayus(1);//开始复位过程DS18B20_DQ=0;ﻩ//数据线拉低ﻩDelayus(100); //延时480us-960usﻩDS18B20_DQ=1; ﻩ//数据线拉高ﻩDelayus(10); ﻩ//延时15us-60usstatus=DS18B20_DQ;ﻩ//读取数据线上得状态ﻩDelayus(120);ﻩreturn status;}/***功能:写一字节到DS18B20中参数:dat=数据返回:无***/void WriteByteToDS18B20(uchar dat){ﻩuchar i;for(i=0;i〈8;i++)ﻩ{ﻩﻩDS18B20_DQ=0;ﻩDS18B20_DQ=dat&0x01;ﻩ//发送1位数据ﻩDelayus(15);ﻩﻩﻩ//延时60us以上DS18B20_DQ=1;ﻩﻩﻩ//释放总线,等待总线恢复ﻩdat〉〉=1;ﻩﻩﻩ//准备下一位数据ﻩ}}/***功能:从DS18B20中读一字节参数:无返回:读取得数据***/uchar ReadByteFromDS18B20(){ﻩuchar i,dat=0;ﻩfor(i=0;i<8;i++)ﻩ{ﻩDS18B20_DQ=0; //拉低总线,产生读信号ﻩdat>>=1;ﻩDS18B20_DQ=1;ﻩ//释放总线,准备读1位数据ﻩﻩﻩDelayus(2);ﻩﻩ//延时4usﻩif(DS18B20_DQ) dat|=0x80;ﻩ//合并每位数据ﻩDelayus(15); ﻩﻩ//延时60usDS18B20_DQ=1;ﻩﻩ//拉高总线,准备读下1位数据ﻩ}ﻩreturndat;}/***功能:读取温度值并转换成有符号得数值形式参数:无返回:无***/ void ReadTemperatureFromDS18B20(){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]=ReadByteFromDS18B20();//后读高字节温度值ﻩReset_DS18B20();//复位ﻩ//计算温度值:先进行正温度与负温度判断,高5位全为1(0xF8)则为负数ﻩif((TempValue[1]&0xF8)==0xF8)ﻩ{ﻩ//负温度计算:取反加1,低字节为0时,高字节取反加1,否则不需要。

相关主题