- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间: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*/
/*包含头文件*/
#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)
文档评论(0)