带温度补偿的超声波测距程序Word格式.docx

上传人:b****4 文档编号:13604085 上传时间:2022-10-12 格式:DOCX 页数:15 大小:19.13KB
下载 相关 举报
带温度补偿的超声波测距程序Word格式.docx_第1页
第1页 / 共15页
带温度补偿的超声波测距程序Word格式.docx_第2页
第2页 / 共15页
带温度补偿的超声波测距程序Word格式.docx_第3页
第3页 / 共15页
带温度补偿的超声波测距程序Word格式.docx_第4页
第4页 / 共15页
带温度补偿的超声波测距程序Word格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

带温度补偿的超声波测距程序Word格式.docx

《带温度补偿的超声波测距程序Word格式.docx》由会员分享,可在线阅读,更多相关《带温度补偿的超声波测距程序Word格式.docx(15页珍藏版)》请在冰豆网上搜索。

带温度补偿的超声波测距程序Word格式.docx

#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_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1