收藏 分享(赏)

基于51单片机的HC_SR04超声波测距系统制作.doc

上传人:精品资料 文档编号:10630829 上传时间:2019-12-10 格式:DOC 页数:18 大小:441KB
下载 相关 举报
基于51单片机的HC_SR04超声波测距系统制作.doc_第1页
第1页 / 共18页
基于51单片机的HC_SR04超声波测距系统制作.doc_第2页
第2页 / 共18页
基于51单片机的HC_SR04超声波测距系统制作.doc_第3页
第3页 / 共18页
基于51单片机的HC_SR04超声波测距系统制作.doc_第4页
第4页 / 共18页
基于51单片机的HC_SR04超声波测距系统制作.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、Word 格式完美整理基于 51 单片机带温度补偿的 HC-SR04 超声波测距系统利用从网上购买的 HC-SR04 超声波模块制作了一个测距装置,HC-SR04 自身不带温度补偿功能,所以加上一个使用 DS18B20 做的温度测量模块。整个系统包括:51 单片机最小系统,超声波测距模块、温度测量模块、液晶显示模块。使用了如下主要元器件:元件 说明 数量STC90C516RC 51 单片机 1HC-SR04 超声波测距模块 1DS18B20 温度测量模块 1lcd1602 液晶显示模块 1系统电路图Word 格式完美整理51 单片机最小系统单片机型号:STC90C516,晶振:12Mhz。自己

2、动手焊接的最小系统板。LCD1602A 液晶显示模块:Word 格式完美整理HC-SR04 超声波测距模块HC-SR04 超声波测距模块可提供 2cm 至 400cm 的非接触式距离感测功能,测距精度可达 3mm;模块自身包括超声波发射器、接收器与控制电路。实物正反两面图HC-SR04 电气参数:HC-SR04 工作原理及说明:1、 给 Trig 触发控制信号 IO 端口至少 10us 的高电平信号;2、 模块自动发送 8 个 40khz 的方波,并自动检测是否有信号返回;3、 有信号返回时,Echo 回响信号输出端口输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间;4、 两次测距

3、时间间隔最少在 60ms 以上,以防止发射信号对回响信号的影响;超声波时序图Word 格式完美整理单片机控制 HC-SR04 超声波测距说明:原理图中,单片机的 P1.7 口接 HC-SR04 的 Trig 端口,P1.6 口接 HC-SR04 的 Echo 端口,超声波在传播时碰到障碍物即返回,HC-SR04 模块收到回波信号后 Echo 口输出一个高电平,单片机检测到高电平后即启动计数器开始计数,直到单片机检测到 Echo 口变成低电平后结束计数,计数器的计数值乘以单片机计数周期就是超声波从发射到接收的往返时间,即距离 S=v*t/2;由于在室温下,声速受温度的影响,其变化关系为:V=33

4、4.1+T*0.61(T 为当前温度),利用 DS18B20温度传感器可以得到环境温度,补偿温度对声速的影响。当温度高于 26 度或低于 14 度时,上述公式不能完全满足对测量的修正了,所以高于 26 度时取 26 度,低于 14 度时取 14 度。距离计算公式为:S=(334.1+T*0.61)*N*T 0/2T:当前环境温度值N:计数值T0:单片机计数周期=晶振频率/12(微秒)HC-SR04 测量存在不稳定性,所在对同一距离进行多次测量,并对测量结果排序,去除最大和最小值,将余下的求平均值。程序流程图:Word 格式完美整理程序代码:/* 程序:基于 HC-SR04 的超声波测距系统*

5、单片机型号:STC90C516 12MHz* 说明:按下 K1 键后,指示灯点亮,开始连续进行 7 次超声波测距,每次测距间隔 80ms,* 完成后对 7 次结果排序并将最大的 2 个数值和最小的 2 个数值去除,对剩余的* 3 个数值取平均值。完成后指示灯灭,输出结果到 LCD1602 上。测量超出范围则发出报警声。* 使用两个 IO 端口控制 HC-SR04 触发信号输入和回响信号输出,* 以及一个 T0 定时器用于时间计数。* 使用 DS18B20 测量环境温度,声速公式:V=334.1m/s+Temperature*0.61,* 单片机晶振为 12Mhz(11.953M),计数时为 T

6、=1us* 计算公式:S=(334.1m/s+Temperature*0.61)*N*T/2,N 为计数值=TH0*256+TL0*/*包含头文件*/#include Word 格式完美整理#include #define Delay4us()_nop_();_nop_();_nop_();_nop_();/*宏定义*/#define uchar unsigned char /无符号 8 位#define uint unsigned int /无符号 16 位#define ulong unsigned long /无符号 32 位/*全局变量定义*/sbit K1=P10; /按下 K1 后

7、,开始测距sbit LEDRed=P11; /测距指示灯,亮表示正在测距,灭表示测距完成sbit BEEP=P15; /报警测量超出范围sbit Trig=P17; /HC-SR04 触发信号输入sbit Echo=P16; /HC-SR04 回响信号输出float xdata DistanceValue=0.0; /测量的距离值float xdata SPEEDSOUND; /声速float xdata XTALTIME; /单片机计数周期uchar xdata stringBuf6; /数值转字符串缓冲/LCD1602 提示信息uchar code Prompts16=“Measure D

8、istance“, /测量距离“- Out of Range -“, /超出测量范围“MAX range 400cm “, /测距最大值 400cm“MIN range 2cm “, /测距最小值 2cm“ “, /清屏“ Press K1 Start “ /按键开始测量;uchar xdata DistanceText=“Range: “;/测量结果字符串uchar xdata TemperatureText=“Temperature: “;/测量温度值/*外部函数声明*/extern void LCD_Initialize();extern void LCD_Display_String(

9、uchar *, uchar);extern void ReadTemperatureFromDS18B20();extern int xdata CurTempInteger; /毫秒延时函数void DelayMS(uint ms);/20 微秒延时函数void Delay20us();/HCSR04 初始化Word 格式完美整理void HCSR04_Initialize();/测量距离float MeasuringDistance();/测距的数值排序求平均float DistanceStatistics();/输出距离值到 LCD1602 上void DisplayDistanceV

10、alue(float dat);/将无符号的整数转成字符串,返回字符串长度,不包括0结束符uchar UnsigedIntToString(uint value);/蜂鸣器void Beep(uchar time);/显示温度值void DisplayTemperatureValue();/测量距离float MeasuringDistance()/最大定时时间约 65msTH0=0;TL0=0;/生成 20us 的脉冲宽度的触发信号Trig=1;Delay20us();Trig=0;/等待回响信号变高电平while(!Echo);TR0=1; /启动定时器 0/等待回响信号变低电平while

11、(Echo);TR0=0; /关闭定时器 0/返回距离值(mm)return (SPEEDSOUND*XTALTIME*(float)TH0*256+(float)TL0)/2000;/HCSR04 初始化void HCSR04_Initialize()/计算单片机计数周期 晶振=11.953M 单位 usWord 格式完美整理XTALTIME=12/11.953;/温度 25 度时声速的值SPEEDSOUND=334.1+25*0.61;Trig=0;Echo=0;TMOD=0x01;/输出距离值到 LCD1602 上void DisplayDistanceValue(float dat)u

12、char i=0,j=0,len;uint value;value=(uint)dat;/范围检查大于 4000mm 和小于 20mm 都为超出测量范围if(value4000)LCD_Display_String(Prompts1,0x00);LCD_Display_String(Prompts2,0x40);Beep(2);else if(value#include /*宏定义*/#define uchar unsigned char /无符号 8 位#define uint unsigned int /无符号 16 位/定义 DS18B20 端口 DS18B20_DQsbit DS18B

13、20_DQ = P37;/当前采集的温度值整数部分int xdata CurTempInteger; /当前采集的温度值小数部分int xdata CurTempDecimal;/*-* 功能:延时函数 STC89C52 12MHz 12T 模式* 参数:无* 返回:无-*/void Delayus(uint count)while (-count);/*-* 功能:DS18B20 复位及状态检测* 参数:无* 返回:0 或 1,1 表示未准备好,0 表示准备好-*/uchar Reset_DS18B20()uchar status;DS18B20_DQ=1;Delayus(1);/开始复位过

14、程DS18B20_DQ=0; /数据线拉低Delayus(100); /延时 480us-960usDS18B20_DQ=1; /数据线拉高Delayus(10); /延时 15us-60usWord 格式完美整理status=DS18B20_DQ; /读取数据线上的状态Delayus(120);return status;/*-* 功能:写一字节到 DS18B20 中* 参数:dat=数据* 返回:无-*/void WriteByteToDS18B20(uchar dat)uchar i;for(i=0;i=1; /准备下一位数据/*-* 功能:从 DS18B20 中读一字节* 参数:无*

15、返回:读取的数据-*/uchar ReadByteFromDS18B20()uchar i,dat=0;for(i=0;i=1;DS18B20_DQ=1; /释放总线,准备读 1 位数据Delayus(2); /延时 4usif(DS18B20_DQ) dat|=0x80; /合并每位数据Delayus(15); /延时 60usDS18B20_DQ=1; /拉高总线,准备读下 1 位数据return dat;/*-Word 格式完美整理* 功能:读取温度值并转换成有符号的数值形式* 参数:无* 返回:无-*/void ReadTemperatureFromDS18B20()uchar fla

16、g=0;/正负符号标志/存储当前采集的温度值uchar TempValue=0,0; if(Reset_DS18B20()CurTempInteger=255;CurTempDecimal=0;elseWriteByteToDS18B20(0xCC);/跳过 ROM 命令WriteByteToDS18B20(0x44);/温度转换命令Reset_DS18B20();/复位WriteByteToDS18B20(0xCC);/跳过 ROM 命令WriteByteToDS18B20(0xBE);/读取温度暂存器命令TempValue0=ReadByteFromDS18B20();/先读低字节温度值T

17、empValue1=ReadByteFromDS18B20();/后读高字节温度值Reset_DS18B20();/复位/计算温度值/先进行正温度与负温度判断,高 5 位全为 1(0xF8)则为负数if(TempValue1TempValue0=TempValue0+1;if(TempValue0=0x00) TempValue1+;flag=1;/负数标志/将温度值分为整数和小数两部分存储(默认为 12 位精度)CurTempInteger=(TempValue1if(flag) CurTempInteger=-CurTempInteger;CurTempDecimal=(TempValue

18、0/ LCD1602 程序代码:/*-* 程序功能:1602 液晶显示程序* 单片机型号:STC90C160 12MHzWord 格式完美整理-*/*1602 液晶显示器控制端口分配,数据使用 P0 端口*/sbit LCD_RS=P26;sbit LCD_RW=P25;sbit LCD_EN=P27;/*-* 功能:毫秒级延时函数* 参数:ms=毫秒数值* 返回:无-*/void LCDDelay(uint ms)uchar i, j;while(ms-)_nop_();i = 2;j = 239;dowhile (-j);while (-i);/*-* 功能:1602 液晶忙状态检测* 参

19、数:无* 返回:0 或 1,1 表示状态忙,0 表示状态闲-*/bit LCD_Busy_Check()bit result;LCD_RS=0; LCD_RW=1; LCD_EN=1;Delay4us();result=(bit)(P0LCD_EN=0;return result;/*-* 功能:1602 液晶写指令Word 格式完美整理* 参数:cmd=1602LCD 指令* 返回:无-*/void Write_LCD_Command(uchar cmd)while(LCD_Busy_Check();LCD_RS=0; LCD_RW=0; LCD_EN=0; _nop_(); _nop_()

20、;P0=cmd; Delay4us();LCD_EN=1; Delay4us(); LCD_EN=0;/*-* 功能:1602 液晶写数据* 参数:dat=一个字节数据* 返回:无-*/void Write_LCD_Data(uchar dat)while(LCD_Busy_Check();LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;Delay4us();LCD_EN=1;Delay4us();LCD_EN=0;/*-* 功能:设置 1602 液晶显示位置* 参数:pos=位置地址值* 返回:无-*/void LCD_Set_POS(uchar pos)Write_LC

21、D_Command(pos|0x80);/*-* 功能:1602 液晶初始化* 参数:无* 返回:无-*/void LCD_Initialize()Write_LCD_Command(0x01); LCDDelay(5);Write_LCD_Command(0x38); LCDDelay(5);Write_LCD_Command(0x0C); LCDDelay(5);Write_LCD_Command(0x06); LCDDelay(5);Word 格式完美整理/*-* 功能:在 1602 液晶指定的行上显示字符串(共两行,一行 16 个字符)* 参数:*str=字符串指针,LineNo=行首

22、地址(第一行 0x00,第二行 0x40)* 返回:无-*/void LCD_Display_String(uchar *str, uchar LineNo)uchar k;LCD_Set_POS(LineNo);for(k=0;k26)CurTempInteger=26;SPEEDSOUND=334.1+CurTempInteger*0.61;/计算声速DistanceValue=DistanceStatistics();/测距并返回距离值DisplayDistanceValue(DistanceValue);/显示距离值LEDRed=1;/测距的数值排序求平均float DistanceStatistics()uchar i,j;float disData7,t;/连续测距for(i=0;idisDatai+1)t=disDatai;disDatai=disDatai+1;disDatai+1=t;Word 格式完美整理return (disData2+disData3+disData4)/3;

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报