基本信息
文件名称:带温度补偿的超声波测距程序.docx
文件大小:17.54 KB
总页数:23 页
更新时间:2025-05-31
总字数:约8.72千字
文档摘要

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

#include<intrins、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()

//最大定时时间约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)