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

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档