带温度补偿的超声波测距程序Word格式.docx
《带温度补偿的超声波测距程序Word格式.docx》由会员分享,可在线阅读,更多相关《带温度补偿的超声波测距程序Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
#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)
/***HCSR04初始化***/
voidHCSR04_Initialize()
XTALTIME=12/12;
//计算单片机计数周期晶振=12M单位us
SPEEDSOUND=334.1+25*0.61;
//温度25度时声速的值
Echo=0;
TMOD=0x01;
/***输出距离值到LCD1602上***/
voidDisplayDistanceValue(floatdat)
uchari=0,j=0,len;
uintvalue;
value=(uint)dat;
//范围检查大于4000mm和小于20mm都为超出测量范围
if(value>
4000)
{
LCD_Display_String(Prompts[1],0x00);
LCD_Display_String(Prompts[2],0x40);
Beep
(2);
}
elseif(value<
20)
LCD_Display_String(Prompts[3],0x40);
else
len=UnsigedIntToString(value);
//将数值转换成字符串
//保留1位小数
while(stringBuf[i]!
='
)
if(len-j==1)
DistanceText[6+j]='
.'
j++;
}else
DistanceText[6+j]=stringBuf[i];
i++;
c'
m'
i=7+j;
//剩余位置补空格
while(i<
16)
DistanceText[i]='
'
LCD_Display_String(DistanceText,0x40);
//LCD_Display_String(Prompts[0],0x00);
/***显示温度值***/
voidDisplayTemperatureValue()
TemperatureText[13]=CurTempInteger/10+'
0'
TemperatureText[14]=CurTempInteger%10+'
TemperatureText[15]='
C'
LCD_Display_String(TemperatureText,0x00);
/***将无符号的整数转成字符串,返回字符串长度***/
ucharUnsigedIntToString(uintvalue)
uchari=0,t,length;
//从个位开始转换
do
stringBuf[i]='
+value%10;
value=value/10;
}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]='
returnlength;
/***蜂鸣器***/
voidBeep(uchartime)
uchari;
100;
BEEP=!
BEEP;
DelayMS(time);
BEEP=0;
DelayMS(100);
/***延时函数毫秒@12.000MHz***/
voidDelayMS(uintms)
uchari,j;
while(ms--)
_nop_();
i=2;
j=239;
while(--j);
}while(--i);
/***延时函数20微秒@12.000MHz***/
voidDelay20us()
i=7;
while(--i);
/***定时器0中断***/
voidTimer0()interrupt1
//DS18B20代码:
/*----------------------------------------------
*程序功能:
DS18B20温度检测程序
STC89C5212MHz
*晶振:
12Mhz
------------------------------------------------*/
sbitDS18B20_DQ=P3^3;
//定义DS18B20端口DS18B20_DQ
intxdataCurTempInteger;
//当前采集的温度值整数部分
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-960us
//数据线拉高
Delayus(10);
//延时15us-60us
status=DS18B20_DQ;
//读取数据线上的状态
Delayus(120);
returnstatus;
写一字节到DS18B20中参数:
dat=数据返回:
voidWriteByteToDS18B20(uchardat)
8;
DS18B20_DQ=dat&
0x01;
//发送1位数据
Delayus(15);
//延时60us以上
DS18B20_