带温度补偿的超声波测距程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**程序:基于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()
{
//最大定时时间约65ms
TH0=0;
TL0=0;
//生成20us得脉冲宽度得触发信号
Trig=1; ﻩﻩﻩ
Delay20us();
ﻩTrig=0;
while(!Echo);//等待回响信号变高电平
ﻩTR0=1; ﻩ//启动定时器0
while(Echo);//等待回响信号变低电平ﻩ
TR0=0; //关闭定时器0
return(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);