首页 > 范文大全 > 正文

基于DS18B20的数字温度计的设计与实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于DS18B20的数字温度计的设计与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

作者简介:杨辉(1989-),男,广东湛江人氏,现就读于中山大学新华学院电子信息科学与技术专业,主攻C语言编程及程序设计,对单片机功能开发、系统智能化等项目均有研究经验

摘 要:针对市面上的数字温度计造价高,功能单一,操作复杂等弊端,本设计采用单片机AT89C52作为核心元件,利用DS18S20及其他的硬件电路完成对环境温度的实时检测及显示。较之传统的数字温度计,该设计由软件与硬件电路配合实现了高精度、广范围的温度检测,并且支持多点测温,智能显示等功能,而且电路简单,操作方便,造价适中,具有较高的实用价值。

关键词:单片机;ds18b20;多点测温;温度检测

与传统的测温元件热电偶和热电阻相比,热电偶和热电阻测出的数据一般都是电压值,再转换成对应的温度,因而需要比较多的外部硬件支持,硬件电路复杂,软件调试繁琐,制作成本高。而现代数字测温元件DS18B20以其超小的体积,超低的硬件开销,抗干扰能力强,精度高,附加能力强等优势,成为学习单片机技术和开发温度相关产品的不二之选。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20用严格的通信协议来保证各位数据传输的正确性和完整性。协议规定,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。 该协议定义了几种信号的时序:初始化时序、读时序、写时序。DS18B20的数据读写时通过时间间隙处理位和命令字来确认信息交换。

1延时子程序

#include //这个头文件包涵了对_nop_() 的定义

void DelayX0us(unsigned char n){ while (n--){ _nop_();_nop_();}}

延时时间=n*(2+1+1+2+1+1+2)+2≈10*n

2复位脉冲与存在脉冲

单总线上的所有处理均从初始化(复位)开始。

#include //这个头文件包含了对P端口以及CY的定义

sbit DQ = P3^7; //DS18B20的数据口位P3.7

Void DS18B20_Reset ()

{ CY = 1;

While (CY)

{ DQ = 0; //发出低电平复位信号

DelayX0us(48); //延时至少480us

DQ = 1; //释放总线并进入接收状态

DelayX0us(6); //等待60us

CY = DQ;

//检测存在脉冲,如果为0,则说明设备存在,否则继续循环。

DelayX0us(42); //等待设备释放I/O线(480-60)us

3写数据

向DS18B20写入某字节的时候,先要写入该字节的最低位,然后依次一位一位地写入,最后写入该字节的最高位。该子程序将DATA 中的数据写入DS18B20。

4读数据

DS18B20的某字节在被读取的时候,DS18B20会先在总线输出该字节的最低位,然后依次一位一位地在总线中输出,最后输出该字节的最高位。该子程序将读得的位存到 DATA 中。

5 多路测量

DS18B20的“一线总线”特点不但体现在命令指令输入和数字数据输出能在同一总线上实现,而且还可以实现多个DS18B20 数据总线使用同一条数据线。

在本设计中,充分考虑了各种客观因素和条件以后,笔者事先将每个DS18B20的序列号分别检测出来并存到程序空间中,从而跳过复杂的序列号搜索过程,大大简化了测温过程。这种做法只适合于使用传感器数量较少的场合,否则系统维护和程序空间消耗会成为应用瓶颈。

6温度测量

在本设计中先跳过 ROM ,即是启动所有 DS18B20 进行温度测量,温度测量完成之后,通过匹配 ROM ,再逐一地读取每个 DS18B20 的温度数据。这样可以将测量需要的时间缩减到最少。

7温度读取

设备复位 ――发送ROM进行选择――发送需要验证的ROM――发送读暂存存储器命令――读温度低字节LSB――读温度高字节MSB――设备复位,中止读取。

8温度的处理

该子函数重点实现温度的处理功能,并返回所测温度值绝对值的百倍数值。

unsigned int do_temperatuer (TPH,TPL) // TPH,TPL分别代表温度值的高、低字节

{ unsigned char FLAG; // FLAG=1,则温度为负;FLAG=0,则温度为正

float tt; Char i; unsigned int temp; unsigned char A;

temp = TPH; //先把高八位有效数据赋于temp

temp

temp = temp|TPL;

//两字节合成一个整型变量,temp就是实际测量获得的温度

A= TPH & 128; //128=80H,只保留第一位,是符号位。

if (A) FLAG=1 ; //全局变量FLAG=1,则温度为负

else FLAG=0; //全局变量FLAG=0,则温度为正

if (FLAG)

{temp = ~ temp;

temp = temp+1;} //如果温度为负值,通过反码求出原码

tt = temp*0.0625; //得到真实十进制温度值

temp = tt*100+0.5; return temp;}

因为12位转化是每一位的精度为0.0625度,所以读回数据的最低位代表的是0.0625度。但是从实际出发,我们不需要显示4位小数,只需要保留2位小数。所以我们可以将实际测得的温度放大一百倍,再加上0.5,然后取整,得到的结果就是实际测得的温度四舍五入保留两位小数,再放大一百倍的数值。

小结:本设计使用的测温元件DS18B20只在一根I/O线上读写数据,因此在电路结构上比传统的电子测温仪器大为优化,本设计基本实现了预期的效果,在功能和实用性上面,都比传统电子测温仪得到更好的发展。如果根据实际情况,配合其他的操作部件加以改进,其商业价值和实用价值将会得到更大的发挥。(作者单位;:中山大学新华学院)