基于51单片机的HC-SR04超声波测距系统制作
基于51单片机的超声波测距系统的设计

-55-/2011.10/基于51单片机的超声波测距系统的设计衡水职业技术学院 曹月真【摘要】详细介绍了超声波测距原理以及基于51单片机的测距原理。
以HC-SR04超声波测距模块为核心实现超声波的发射与接收,采用LCD12864显示所测距离。
为了避开超声波从发射探头到接收探头的“敏感时间”,采用了“延时接收”的方法。
【关键词】超声波;单片机;测距一、设计任务和性能指标(一)设计任务利用单片机及外围接口电路设计制作一个超声波测距仪器,用液晶显示器将测出的距离显示出来。
要求画出系统的电路原理图,实物图,绘出程序流程图,并给出程序清单。
(二)性能指标距离显示:用LCD液晶显示器进行显示(单位是米)。
测距范围:10cm到400cm的距离感测功能,测距精度可达到5mm以内。
二、设计方案按照系统设计的功能要求,初步确定设计系统由单片机主控模块、显示模块、超声波发射模块、接收模块共四个模块组成(如图1)。
单片机主控芯片使用51系列AT89S52单片机,该单片机工作性能稳定,同时也是在单片机课程设计中经常使用到的控制芯片。
显示模块采用LCD12864,其突出优点就是可以显示汉字等字符,且与单片机的接口简单,操作方便。
超声波发射模块和接收模块采用HC-SR04超声波测距模块,该模块性能稳定,测量距离精确,精度高,盲区(2cm)超近。
三、主控电路本系统采用了STC89S52作为主控电路,图2为主控电路原理图,图3为主控电路实物图。
STC89S52为STC公司的一款通用单片机,其操作简便,功能强大,适用于简单的控制系统的数据处理和动作控制方面。
该芯片加密性强,具有超强抗干扰性能:1.高抗静电(ESD保护)2.轻松过2KV/4KV快速脉冲干扰(EFT 测试)3.宽电压,不怕电源抖动4.宽温度范围:-40℃~85℃5.I/O口经过特殊处理图1 系统设计框图图2 超声波测距模块图34.结论本文所设计的积分器采用电流模相乘器的结构,同时结合可逆计数器控制,实现了斜率自适应功能。
基于51单片机超声波测距系统方案

目录摘要 (1)一. 绪论 (2)二.超声波测距的原理 (3)2.1 超声波的基本理论 (3)2.2 超声波测距系统原理 (7)三. 系统硬件的具体设计与实现 (8)3.1 系统原理和框图 (8)3.2 功能模块的设计 (8)3.2.1 单片机介绍 (8)3.2.1.1 AT89C51管脚说明 (9)3.2.1.2 AT89C51主要特性 (10)3.2.1.3芯片擦除 (11)3.2.2 超声波测距模块HC-SR04 (11)3.2.2.1 产品特点 (11)3.2.2.2 基本原理 (12)3.2.2.3 电气参数 (12)3.2.2.4 超声波时序图 (12)四. 系统软件设计 (13)1. 程序设计思路 (13)2. 程序流程图 (13)3. 程序 (14)五. 总结 (15)六. 致 (16)七. 参考文献 (17)八.附录 (18)1.原理图 (18)2.PCB图 (19)3.主程序 (19)摘要基于传统的测距方法在很多特殊场合:如带腐蚀的液体,强电磁干扰,有毒等恶劣条件下,测量距离存在不可克服的缺陷,超声波测距能很好的解决此类的问题。
本系统主要以AT89C51单片机为核心,结合超声波测距模块HC-SR04、数码管、蜂鸣器等硬件平台,对超声波测距系统的原理、数码管显示、单片机的应用等进行了分析和验证。
关键词:超声波测距模块,AT89C51,数码管。
AbstractIn many special occasions, traditional measuring distance methods based on the existence of insurmountable distance measuring defects, such as the measurement of corrosion in the liquid with strong electromagnetic interference, toxic and other adverse conditions. The ultrasonic range can be a very good solution to the problem. This system mainly uses AT89C51 microcontroller as the core,hardware platform combined with the HC-SR04 ultrasonic ranging module,digital tube,buzzer etc. Analyzed and validated the principle of ultrasonic ran,d igital tube’s display,the application of single-chip microcomputer etc.Keywords: ultrasonic ranging module,AT89C51,Digital tube.一. 绪论随着科学技术的快速发展,超声波将在测距仪中的应用越来越广。
基于HC-SR04_模块的高精度超声测距系统

Science and Technology &Innovation ┃科技与创新2023年第17期·57·文章编号:2095-6835(2023)17-0057-03基于HC-SR04模块的高精度超声测距系统王永彬(临沂科技职业学院,山东临沂276000)摘要:研究设计了一种基于HC-SR04超声传感器、单片机和LCD1602液晶模块的超声波测距系统,并利用温度补偿算法和单片机门控触发精确定时中断技术进行测距修正,保证了不同温度环境下超声测距的高精度。
同时把测量结果实时显示在LCD1602液晶屏,并在达到设定安全距离时进行声音提醒报警或驱动执行机构动作,可广泛应用于生产线上的物品位置检测、汽车倒车距离安全提醒等场合。
关键词:超声测距原理;传感器;声速温度修正;液晶显示中图分类号:TP274.5文献标志码:ADOI :10.15913/ki.kjycx.2023.17.016在实际生产和生活中,经常需要对距离(位置)进行测量,以进行距离的直接提示,或者以距离为参量进行其他物理量的计算和控制,比如计算物体的速度。
测量距离的方法有很多种,总体上看有直接测量法(如利用尺子测量)和间接测量法(如激光测距、红外线测距、超声波测距等)2种。
由于超声波波束定向指向性强,在介质中传播时能量损耗比较小[1],特别是在空气、水中传播能达到较远的距离,因而适合利用超声波的这一特性进行距离的测量。
利用超声波测距的特点是测量过程迅速和方便,并且计算简单,测量精度高,因此被大量应用于工业场合,比如汽车的倒车雷达、移动机器人的位置确认等,都是超声波测距方式的典型应用。
1超声波测距原理超声波测距原理是利用超声波换能器的发射装置发出一定频率的超声波,超声波遇到障碍物时就会有反射波反射回来并被接收器接收,利用从发射到接收的往返时间差就可以进行距离测量,这与无线电雷达的测距原理很相似。
具体实现过程是:超声波模块的发射器向要进行测距的特定方向发射超声波,在发射开始的瞬间同步开始计时,如果没有障碍物,超声波在空气中会向前自由传播,当途中碰到障碍物阻挡时则会立即被反射回来,当反射波到达接收器时就立即停止计时操作。
HC-SR04超声波测距的51单片机程序

lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void chushihua1602()
{
lcden=0;
write_order(0x38);
write_order(0x0c);
write_order(0x06);
write_order(0x01);
void zd3() interrupt 3//T1中断用来扫描数L1=0x30;
timer++;
if(timer>=400)
{
timer=0;
trig=1;//800MS启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
{
write_date(a[n]);
delay(3);
}
}
}
a[11]=(s%10000%1000/100)+0x30;
a[12]=(s%10000%1000%100/10)+0x30;
a[13]=(s%10000%1000%100%10)+0x30;
}
else//超出测量范围显示
{
flag=0;
a[9]='w';
a[10]='r';
a[11]='o';
a[12]='n';
write_date(a[0]);
write_date(a[1]);
write_date(a[2]);
write_date(a[3]);
基于51单片机的超声波测距系统的毕业设计

基于51单片机的超声波测距系统的毕业设计超声波测距系统是一种常见的非接触式测距技术,通过发送超声波信号并测量信号的回波时间来计算距离。
本文将介绍基于51单片机的超声波测距系统的毕业设计。
首先,我们需要明确设计的目标。
本设计旨在通过51单片机实现一个精确、稳定的超声波测距系统。
具体而言,我们需要实现以下功能:1.发送超声波信号:通过51单片机的IO口控制超声波发射器,发送一定频率和波形的超声波信号。
2.接收回波信号:通过51单片机的IO口连接超声波接收器,接收并放大返回的超声波信号。
3.信号处理:根据回波信号的时间延迟计算出距离,并在显示器上显示出来。
4.稳定性和精确性:设计系统时需考虑测量过程中误差的影响,并通过合适的算法和校准方法提高系统的稳定性和精确性。
接下来,我们需要选择合适的硬件和软件配合51单片机实现上述功能。
硬件方面:1.51单片机:选择一款性能稳定、易于编程的51单片机,如STC89C522.超声波模块:选择一款合适的超声波传感器模块,常见的有HC-SR04、JSN-SR04T等。
模块一般包括发射器和接收器,具有较好的测距性能。
3.显示设备:选择合适的显示设备,如7段LED数码管或LCD显示屏,用于显示测距结果。
软件方面:1.C语言编程:使用C语言编写51单片机的程序,实现超声波测距系统的各项功能。
2.串口通信:通过串口与上位机进行通信,可以对系统进行监控和远程控制。
3.算法设计:选择合适的算法计算超声波回波时间延迟,并根据时间延迟计算距离值。
在设计过程中,我们需要进行以下步骤:1.硬件连接:按照超声波模块的说明书,将模块的发射器和接收器通过杜邦线与51单片机的IO口连接。
2.软件编程:使用C语言编写51单片机的程序,实现超声波模块的控制、信号接收和处理、距离计算等功能。
3.系统测试:进行系统的功能测试和性能测试,验证系统的可靠性和准确性,同时调试系统中出现的问题。
4.系统优化:根据测试结果,对系统进行优化,提高系统的稳定性和精确性。
(完整word版)用51单片机实现HC-SR04超声波测距程序(word文档良心出品)

#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Trig = P1^0; //产生脉冲引脚sbit Echo = P3^2; //回波引脚sbit test = P1^1; //测试用引脚uchar code SEG7[10]={~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90};//数码管0-9uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志//********函数声明void conversion(uint temp_data);void delay_20us();void main(void) // 主程序{uint distance_data,a,b;uchar CONT_1;i=0;flag=0;test =0;Trig=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断EX0=0; //关闭外部中断EA=1; //打开总中断0while(1) //程序循环{EA=0;Trig=1;delay_20us();Trig=0; //产生一个20us的脉冲,在Trig引脚while(Echo==0); //等待Echo回波引脚变高电平succeed_flag=0; //清测量成功标志EX0=1; //打开外部中断TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //TR1=1; //启动定时器1EA=1;while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0; //关闭定时器1EX0=0; //关闭外部中断if(succeed_flag==1){distance_data=outcomeH*256+outcomeL;distance_data= (distance_data*1.87)/100;} //为什么除以58等于厘米,Y米=(X 秒*344)/2// X秒=(2*Y米)/344 ==》X 秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零test = !test; //测试灯变化}/********************************************每循环3次就显示结果一次*********************************************/a=distance_data;if(b==a) CONT_1=0;if(b!=a) CONT_1++;if(CONT_1>=3){ CONT_1=0;b=a;conversion(b);}}}//***************************************************************//外部中断0,用做判断回波电平INTO_() interrupt 0 // 外部中断是0号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值succeed_flag=1; //至成功测量的标志EX0=0; //关闭外部中断}//****************************************************************//定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=0xfd; //写入定时器0初始值TL0=0x77;switch(flag){case 0x00:P0=ge; P2=0xfe;flag++;break;case 0x01:P0=shi;P2=0xfd;flag++;break;case 0x02:P0=bai;P2=0xfb;flag=0;break;}}//显示数据转换程序void conversion(uint temp_data){uchar ge_data,shi_data,bai_data ;bai_data=temp_data/100 ;temp_data=temp_data%100; //取余运算shi_data=temp_data/10 ;temp_data=temp_data%10; //取余运算ge_data=temp_data;bai_data=SEG7[bai_data];shi_data=SEG7[shi_data];ge_data =SEG7[ge_data];EA=0; //显示数据的时候不要测量bai = bai_data;shi = shi_data;ge = ge_data ;EA=1;}//****************************************************************** void delay_20us(){ uchar bt ;for(bt=0;bt<100;bt++);}。
基于51单片机超声波测距报警系统课程设计

基于51单片机超声波测距报警系统课程设计一、引言超声波测距技术是一种常见的非接触式测距技术,具有测距范围广、精度高等优点。
在日常生活中,超声波测距技术被广泛应用于车辆倒车雷达、智能家居中的人体感应等领域。
本文将介绍基于51单片机的超声波测距报警系统的课程设计。
二、设计思路本课程设计主要分为硬件设计和软件设计两部分。
硬件部分主要包括超声波模块、LCD显示屏、蜂鸣器等模块的连接和电路设计;软件部分主要包括51单片机程序设计及LCD显示程序编写。
三、硬件设计1. 超声波模块连接超声波模块是实现测距功能的核心部件。
在本课程设计中,我们采用HC-SR04型号的超声波模块。
该模块需要连接到51单片机上,具体连接方式如下:- 将VCC引脚连接到51单片机上的5V电源;- 将GND引脚连接到51单片机上的GND;- 将Trig引脚连接到P2.0口;- 将Echo引脚连接到P2.1口。
2. LCD显示屏连接LCD显示屏用于显示测距结果和报警信息。
在本课程设计中,我们采用1602型号的LCD显示屏。
该模块需要连接到51单片机上,具体连接方式如下:- 将VSS引脚连接到51单片机上的GND;- 将VDD引脚连接到51单片机上的5V电源;- 将VO引脚连接到一个10K电位器,再将电位器两端分别接到GND 和5V电源;- 将RS引脚连接到P1.0口;- 将RW引脚连接到P1.1口;- 将EN引脚连接到P1.2口;- 将D4-D7引脚分别连接到P0口的高四位。
3. 蜂鸣器连接蜂鸣器用于报警。
在本课程设计中,我们采用被动式蜂鸣器。
该模块需要连接到51单片机上,具体连接方式如下:- 将正极引脚(一般为长针)连接到51单片机上的P3.7口;- 将负极引脚(一般为短针)连接到51单片机上的GND。
四、软件设计1. 51单片机程序设计在本课程设计中,我们采用Keil C51作为编程工具,使用C语言编写程序。
主要程序流程如下:- 定义超声波模块的Trig和Echo引脚;- 定义LCD显示屏的RS、RW、EN和D4-D7引脚;- 定义蜂鸣器的引脚;- 定义变量存储测距结果和报警状态;- 初始化LCD显示屏、超声波模块等模块;- 循环执行以下操作:- 发送超声波信号并计算回波时间,从而得到距离值;- 根据距离值判断是否需要报警,并控制蜂鸣器发出报警声音;- 将测距结果和报警状态显示在LCD显示屏上。
51单片机实现超声波测距报警系统

51单片机实现超声波测距报警系统超声波测距报警系统是一种基于51单片机的硬件电路和软件程序开发的测距设备。
本文将从设备原理和设计、电路连接和程序开发等方面进行详细介绍。
一、设备原理和设计超声波测距报警系统的原理是利用超声波传感器测量并计算被测物体与传感器的距离,并通过单片机采集和处理超声波信号,根据测量结果触发报警和显示等功能。
1.超声波传感器:超声波传感器是用来发射和接收超声波信号的装置,一般由发射器和接收器组成。
发射器发射超声波信号,接收器接收被测物体反射的超声波信号。
2.单片机:本系统采用51单片机作为控制核心,负责采集和处理超声波信号,控制报警和显示等功能。
3.报警器:当距离小于设定阈值时,触发报警器发出声音或闪光等警告信号。
4.显示屏:用来显示测量结果,一般为数码管或液晶显示屏。
5.电源和电路:提供系统所需的电源和信号连接电路。
二、电路连接超声波测距报警系统的电路连接主要包括超声波传感器、单片机、报警器、显示屏以及电源等模块。
1.超声波传感器连接:将超声波传感器的发射端和接收端分别连接到单片机的引脚上,发射端连接到P1口,接收端连接到P2口。
2.报警器连接:将报警器连接到单片机的一个IO口,通过控制该IO 口的高低电平来触发报警。
3.显示屏连接:将显示屏连接到单片机的相应IO口,通过向显示屏发送数据来显示测量结果。
4.电源连接:将电源连接到单片机以及其他模块的供电端,确保系统正常工作。
三、程序开发1.初始化设置:包括引脚和端口的初始化设置,包括超声波传感器引脚和单片机的IO口设置。
2.测量距离:通过单片机控制超声波传感器发射超声波信号,并通过接收器接收反射的超声波信号,计算出被测物体与传感器的距离。
3.报警触发:根据设定的阈值,当测量到的距离小于阈值时,通过控制报警器发出声音或闪光等警告信号。
4.显示结果:通过控制显示屏将测量结果显示出来。
5.循环检测:通过循环检测的方式,不断进行测量并处理数据,实时更新测量结果和触发报警。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于51单片机带温度补偿的HC-SR04超声波测距系统利用从网上购买的HC-SR04超声波模块制作了一个测距装置,HC-SR04自身不带温度补偿功能,所以加上一个使用DS18B20做的温度测量模块。
整个系统包括:51单片机最小系统,超声波测距模块、温度测量模块、液晶显示模块。
使用了如下主要元器件:元件说明数量STC90C516RC51单片机1HC-SR04超声波测距模块1DS18B20温度测量模块1lcd1602液晶显示模块1系统电路图51单片机最小系统单片机型号:STC90C516,晶振:12Mhz。
自己动手焊接的最小系统板。
LCD1602A液晶显示模块:HC-SR04超声波测距模块HC-SR04超声波测距模块可提供2cm至400cm的非接触式距离感测功能,测距精度可达3mm;模块自身包括超声波发射器、接收器与控制电路。
实物正反两面图HC-SR04电气参数:HC-SR04工作原理及说明:1、给Trig触发控制信号IO端口至少10us的高电平信号;2、模块自动发送8个40khz的方波,并自动检测是否有信号返回;3、有信号返回时,Echo回响信号输出端口输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间;4、两次测距时间间隔最少在60ms以上,以防止发射信号对回响信号的影响;超声波时序图单片机控制HC-SR04超声波测距说明:原理图中,单片机的P1.7口接HC-SR04的Trig端口,P1.6口接HC-SR04的Echo端口,超声波在传播时碰到障碍物即返回,HC-SR04模块收到回波信号后Echo口输出一个高电平,单片机检测到高电平后即启动计数器开始计数,直到单片机检测到Echo口变成低电平后结束计数,计数器的计数值乘以单片机计数周期就是超声波从发射到接收的往返时间,即距离S=v*t/2;由于在室温下,声速受温度的影响,其变化关系为:V=334.1+T*0.61(T为当前温度),利用DS18B20温度传感器可以得到环境温度,补偿温度对声速的影响。
当温度高于26度或低于14度时,上述公式不能完全满足对测量的修正了,所以高于26度时取26度,低于14度时取14度。
距离计算公式为:S=(334.1+T*0.61)*N*T0/2T:当前环境温度值N:计数值T0:单片机计数周期=晶振频率/12(微秒)HC-SR04测量存在不稳定性,所在对同一距离进行多次测量,并对测量结果排序,去除最大和最小值,将余下的求平均值。
程序流程图:程序代码:/** 程序:基于HC-SR04的超声波测距系统* 单片机型号: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=1us* 计算公式:S=(334.1m/s+Temperature*0.61)*N*T/2,N为计数值=TH0*256+TL0 *//*包含头文件*/#include <reg51.h>#include <intrins.h>#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; //按下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]={{"Measure Distance"}, //测量距离{"- 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(uchar *, uchar);extern void ReadTemperatureFromDS18B20();extern int xdata CurTempInteger;//毫秒延时函数void DelayMS(uint ms);//20微秒延时函数void Delay20us();//HCSR04初始化void HCSR04_Initialize();//测量距离float MeasuringDistance();//测距的数值排序求平均float DistanceStatistics();//输出距离值到LCD1602上void DisplayDistanceValue(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(Echo);TR0=0; //关闭定时器0//返回距离值(mm)return (SPEEDSOUND*XTALTIME*((float)TH0*256+(float)TL0))/2000; }//HCSR04初始化void HCSR04_Initialize(){//计算单片机计数周期晶振=11.953M 单位usXTALTIME=12/11.953;//温度25度时声速的值SPEEDSOUND=334.1+25*0.61;Trig=0;Echo=0;TMOD=0x01;}//输出距离值到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++;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(){TemperatureText[13]=CurTempInteger/10+'0';TemperatureText[14]=CurTempInteger%10+'0';TemperatureText[15]='C';LCD_Display_String(TemperatureText,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;}//蜂鸣器void Beep(uchar time){uchar i;for(i=0;i<100;i++){BEEP=!BEEP;DelayMS(time);}BEEP=0;DelayMS(100);}//延时函数毫秒@12.000MHz void DelayMS(uint ms){uchar i, j;while(ms--){_nop_();i = 2;j = 239;do{while (--j);}while (--i);}}//延时函数20微秒@12.000MHz void Delay20us(){uchar i;_nop_();i = 7;while (--i);}//定时器0中断void Timer0() interrupt 1{}//DS18B20代码:/*----------------------------------------------* 程序功能:DS18B20温度检测程序* 单片机型号:STC89C52 12MHz* 晶振:12Mhz------------------------------------------------*//*包含头文件*/#include <reg51.h>#include <intrins.h>/*宏定义*/#define uchar unsigned char //无符号8位#define uint unsigned int //无符号16位//定义DS18B20端口DS18B20_DQsbit DS18B20_DQ = P3^7;//当前采集的温度值整数部分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);//开始复位过程DS18B20_DQ=0; //数据线拉低Delayus(100); //延时480us-960usDS18B20_DQ=1; //数据线拉高Delayus(10); //延时15us-60usstatus=DS18B20_DQ; //读取数据线上的状态Delayus(120);return status;}/*----------------------------------------------------------------* 功能:写一字节到DS18B20中* 参数:dat=数据* 返回:无----------------------------------------------------------------*/void WriteByteToDS18B20(uchar dat){uchar i;for(i=0;i<8;i++){DS18B20_DQ=0;DS18B20_DQ=dat&0x01; //发送1位数据Delayus(15); //延时60us以上DS18B20_DQ=1; //释放总线,等待总线恢复dat>>=1; //准备下一位数据}}/*----------------------------------------------------------------* 功能:从DS18B20中读一字节* 参数:无* 返回:读取的数据----------------------------------------------------------------*/uchar ReadByteFromDS18B20(){uchar i,dat=0;for(i=0;i<8;i++){DS18B20_DQ=0; //拉低总线,产生读信号dat>>=1;DS18B20_DQ=1; //释放总线,准备读1位数据Delayus(2); //延时4usif(DS18B20_DQ) dat|=0x80; //合并每位数据Delayus(15); //延时60usDS18B20_DQ=1; //拉高总线,准备读下1位数据}return dat;}/*----------------------------------------------------------------* 功能:读取温度值并转换成有符号的数值形式* 参数:无* 返回:无----------------------------------------------------------------*/void ReadTemperatureFromDS18B20(){uchar flag=0;//正负符号标志//存储当前采集的温度值uchar TempValue[]={0,0};if(Reset_DS18B20()){CurTempInteger=255;CurTempDecimal=0;}else{WriteByteToDS18B20(0xCC);//跳过ROM命令WriteByteToDS18B20(0x44);//温度转换命令Reset_DS18B20();//复位WriteByteToDS18B20(0xCC);//跳过ROM命令WriteByteToDS18B20(0xBE);//读取温度暂存器命令TempValue[0]=ReadByteFromDS18B20();//先读低字节温度值TempValue[1]=ReadByteFromDS18B20();//后读高字节温度值Reset_DS18B20();//复位//计算温度值//先进行正温度与负温度判断,高5位全为1(0xF8)则为负数if((TempValue[1]&0xF8)==0xF8){//负温度计算:取反加1,低字节为0时,高字节取反加1,否则不需要。