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