-
Word
格式
基于<
/p>
51
单片机带温度补偿的
HC-
SR04
超声波测距系统
利用从网上购买的
HC-
SR04
超声波模块制作了一个测距装置,
HC-SR04
p>
自身不带温度补偿功能,所以
加上一个使用
DS18B20
做的温度测量模块。整个系统包括:
51
单片机最小系统,超声波测距模块、温度测
量模块、液晶显示模块。使
用了如下主要元器件:
元件
STC90C516RC
HC-SR04
DS18B20
lcd1602
系统电路图
51
单片机
超声波测距模块
温度测量模块
液晶显示模块
说明
数量
1
1
1
1
完美整理
Word
格式
51
单片机最小系统
单片机型号:
STC90C516
,晶振:
12Mhz
。自己动手焊接的最小系统板。
LCD1602A
液晶显示模块:
完美整理
Word
格式
HC-SR04
超声波测距模块
HC-SR04
超声波测距模块可提供
2cm
至
400cm
的非接触式距离感
测功能,测距精度可达
3mm
;模块自
身包括超声波发射器、接收器与控制电路。
实物正反两面图
HC-
SR04
电气参数:
HC-
SR04
工作原理及说明:
1
、
给
p>
Trig
触发控制信号
IO
端口至少
10us
的高电平信号;
2
、
模块自动发送
8
个
40khz
的方波,并自动检测是否有信号返回;
3
、
有信号
返回时,
Echo
回响信号输出端口输出一个高电平,高电平持
续的时间就是超声波从发射到
返回的时间;
4
、
两次测
距时间间隔最少在
60ms
以上,以防止发射信号对回响信号的
影响;
超声波时序图
完美整理
Word
格式
单片机控制
HC-
SR04
超声波测距说明:
原理图中,单片机的
P1.7
口接
HC-SR04
的
Trig
端口,
P1.6
口接
HC-SR04
的
Echo
端口,超声波在传
播时碰到障碍物即返回,
HC-SR04
模块收
到回波信号后
Echo
口输出一个高电平,
单片机检测到高电平后即
启动计数器开始计数,直到单片机检测到
< br>Echo
口变成低电平后结束计数,计数器的计数值乘以单片机计
数周期就是超声波从发射到接收的往返时间,即距离
S=v*t/2
;
由于在室温下,声
速受温度的影响,其变化关系为:
V=334.1+T*0.61(T
< br>为当前温度
)
,利用
DS18B
20
温度传感器可以得到环境温度,补偿温度对声速的影响。当温度高于
26
度或低于
14
度时,上述
公式不能
完全满足对测量的修正了,所以高于
26
度时取
26
度,低于
14<
/p>
度时取
14
度。
距离计算公式为:
S=(334.1
+T*0.61)*N*T
0
/2
T
:当前环境温度值
N
:计数值
T
0
:单片
机计数周期
=
晶振频率
/12(
微秒
)
HC-SR04
测量存在不稳定性,
所
在对同一距离进行多次测量,并对测量结果排序,去除最大和最小值,
将余下的求平均值
。
程序流程图:
完美整理
Word
格式
程序代码:
/*
*
程序:基于
HC-
SR04
的超声波测距系统
*
单片机型号:
STC90C516 12MHz
*
说明:按下
K1
< br>键后,指示灯点亮,开始连续进行
7
次超声波测距,每次
测距间隔
80ms
,
*
完成后对
7
次结果排序并将最大的
2
个数值和最小的
2
个数值去除,对剩余的
* 3
个数值取平均值。
完成后指示灯灭,
输出结果到
LCD1602
< br>上。
测量超出范围则发出报警声。
*
使用两个
IO
端口控制
HC-
SR04
触发信号输入和回响信号输出,
*
以及一个
T0
定时器用于时间计数。
* <
/p>
使用
DS18B20
测量环境温度,声速
公式:
V=334.1m/s+Temperature*0.61
,
*
单片机晶振
为
12Mhz(11.953M)
,计数时为
< br>T=1us
*
计算公式:
S=(334.1m/s+Temperature*0.61)*N*T/2
,
N
为计数值
=TH0*256+T
L0
*/
/*
包含头文件
*/
#include
#include
完美整理
Word
格式
#define
Delay4us(){_nop_();_nop_();_nop_();_nop_();}
/*
宏定义
*/
#define uchar
unsigned char
//
无符
号
8
位
#define uint
unsigned int
//
无符号
16
位
#define ulong
unsigned long
//
无符号
32
位
/*
全局变量定义
*/
sbit K1=P1^0;
<
/p>
//
按下
K1
后
,开始测距
sbit LEDRed=P1^1;
//
测距指示灯,亮表示正在测距,灭表示测距完成
sbit BEEP=P1^5;
//
报警测量超出范围
sbit Trig=P1^7;
//HC-SR04
触发信号输入
sbit Echo=P1^6;
//HC-
SR04
回响信号输出
float xdata DistanceValue=0.0;
//
测量的距离值
float xdata SPEEDSOUND;
//
声速
float xdata XTALTIME;
//
单片机计数周期
uchar xdata stringBuf[6];
//
数值转字符串缓冲
//LCD1602
提示信息
uchar code Prompts[][16]=
{
{
//
测量
距离
{
/
/
超出测量范围
< br>{
//
测距最大值
400cm
{
//
测距
最小值
2cm
{
//
清屏
{
//
按键开始测量
< br>
};
uchar xdata
DistanceText[]=
测量结果字符串
uchar xdata
TemperatureText[]=
测量温度值
/*
外部函数声明
*/
extern void LCD_Initialize();
extern void LCD_Display_String(uchar *,
uchar);
extern void
ReadTemperatureFromDS18B20();
extern
int xdata CurTempInteger;
//
毫秒延时函数
void DelayMS(uint ms);
//20
微秒延时函数
void Delay20us();
//HCSR04
初始化
void HCSR04_Initialize();
完美整理
Word
格式
//
测量距离
float MeasuringDistance();
//
测距的数值排序求平均
float DistanceStatistics();
//
输出距离值到
LCD1602
上<
/p>
void
DisplayDistanceValue(float dat);
//
将无符号的整数转成字符串,返回字符串长度,不包括
'0'
结束符
uchar
UnsigedIntToString(uint value);
//
蜂鸣器
void Beep(uchar time);
//
显示温度值
void DisplayTemperatureValue();
//
测量距离
float MeasuringDistance()
{
//
最大定时时间约
65ms
TH0=0;
TL0=0;
//
生成
2
0us
的脉冲宽度的触发信号
Trig=1;
Delay20us();
Trig=0;
//
等待回响信号变高电平
while(!Echo);
TR0=1;
//
启动定时器
0
//
等待回响信号变低电平
while(Echo);
TR0=0;
//
关闭定时器
0
//
返回距离值
(mm)
return (SPEEDSOUND*XTALTIME
*((float)TH0*256+(float)TL0))/2000;
}
//HCSR04
初始化
void HCSR04_Initialize()
{
//
计算单片机计数周期
晶振
=11.953M
单位
us
XTALTIME=12/11.953;
完美整理
Word
格式
//
温度
2
5
度时声速的值
SPEEDSOUND=334.1+25*0.61;
Trig=0;
Echo=0;
TMOD=0x01;
}
//
输出距离值到
< br>LCD1602
上
void
DisplayDistanceValue(float dat)
{
uchar i=0,j=0,len;
uint value;
value=(uint)dat;
//
范围检查大于
4000mm
和小
于
20mm
都为超出测量范围
if(value>4000)
{
LCD_Display_String(Prompts[1],0x00);
LCD_Display_String(Prompts[2],0x40);
Beep(2);
}
else if(value<20)
{
LCD_Display_String(Prompts[1],0x00);
LCD_Display_String(Prompts[3],0x40);
Beep(2);
}
else
{
//
将数值转换成字符串
len=UnsigedIntToString(value);
//
保留
1
位小数
while(stringBuf[i]!='0')
{
if(len-j==1)
{
DistanceText[6+j]='.';
j++;
}else
{
DistanceText[6+j]=stringBuf[i];
i++;
j++;
}
}
DistanceText[6+j]='c';
j++;
完美整理
Word
格式
DistanceText[6+j]='m';
i=7+j;
//
剩余位置补空格
while(i<16)
{
DistanceText[i]=' ';
i++;
}
//LCD_Display_String(Prompts[0],0x00);
LCD_Display_String(DistanceText,0x40);
}
}
//
显示温度值
void DisplayTemperatureValue()
{
TemperatureTex
t[13]=CurTempInteger/10+'0';
TemperatureText[14]=CurTempInteger%10+'0';
TemperatureText[15]='C';
LCD_Display_String(Temperat
ureText,0x00);
}
//
将无符号的整数转成字符串,返
回字符串长度
uchar
UnsigedIntToString(uint value)
{
uchar i=0,t,length;
//
从个位开始转换
do
{
stringBuf[i]='0'+value%10;
value=value/10;
i++;
}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]='0';
return length;
}
//
蜂鸣器
完美整理
-
-
-
-
-
-
-
-
-
上一篇:超声波测距仪的设计
下一篇:mathematic常用操作 (自动保存的)