DS18B20温度数据采集系统

DS18B20温度数据采集系统
DS18B20温度数据采集系统

目录

摘要 (2)

一、绪论 (3)

二、系统方案实现 (3)

2.1.设计要求 (3)

2.2.设计方案论证 (3)

2.3.总体设计框图 (4)

三、主要硬件介绍 (4)

3. 1. DS18B20 (4)

3.1.1 DS18B20的主要特性 (4)

3.1.2 DS18B20的外形和内部结构 (5)

3.1.3 DS18B20工作原理 (6)

3.1.4 高速暂存存储器 (7)

3.2 AT89C51 (8)

四、软件介绍 (9)

4.1 功能概述 (9)

4.2 系统软件流程图 (9)

4.2.1程序 (9)

4.2.2读出温度子程序 (10)

4.2.3温度转换命令子程序 (11)

4.3具体程序 (11)

五、总结 (17)

六、设计体会及今后的改进意见 (17)

参考文献 (18)

摘要

本文基于DS18B20设计了一种温度数据采集系统,系统主要由AT89C51单片机,一个DS18B20 数字温度传感器以及一个液晶数码管构成。软件方面,我们采用keil。软件对程序进行编写以及调试,硬件方面,我们通过Proteus软件对硬件电路进行仿真以及测试,该系统结构简单,功耗较低,测温范围为- 50℃~ + 255℃。现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量。该系统硬件分为3部分:DS18B20 温度测量模块、单片机模块、显示模块。

关键词:DS18B20、7SEG-MPX4液晶数码管、AT89C51

一、绪论

在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。

目前应用的温度检测系统大多采用由模拟温度传感器、多路模拟开关、A/D转换器及单片机等组成的传输系统。这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上.安装和拆卸繁杂,成本也高。同时线路上传送的是模拟信号,易受干扰和损耗,测量误差也比较大,不利于控制者根据温度变化及时做出决定。针对这种情况,本文提出一种采用数字化单总线技术的温度采集系统,并利用Proteus和KeilμVision 2软件对设计电路进行综合虚拟仿真,实现了温度实时测量和显示。

二、系统方案实现

2.1.设计要求

(1)要实现LED数码直读显示当前温度值;

(2)温度检测范围-55°到125°

2.2.设计方案论证

2.1.1方案一

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

2.1.2 方案二

进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

2.3.总体设计框图

系统主要由硬件和软件两大部分构成,当接收到系统发出的温度转换命令后,DS18B20开始进行温度转换操作并把转化后的结果放到16 位暂存寄存器中的温度寄存器内,然后及系统进行数据通信,系统将温度读出并驱动LED 数码管显示。如果温度值低于设定下限值或高于设定上限值,则自动启动报警装置。

由于DS18B20 单总线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。该系统结构图:

图1

三、主要硬件介绍

3. 1. DS18B20

3.1.1 DS18B20的主要特性

(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电

(2)独特的单线接口方式,DS18B20在及微处理器连接时仅需要一条口线即可实现微处理器及DS18B20的双向通讯

(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温

(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内

(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃

(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温

(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快

(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力

(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。3.1.2 DS18B20的外形和内部结构

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的外形及管脚排列如下图:

图2:DS18B20外形及引脚排列图

DS18B20引脚定义:

(1) GND为电源地;

(2) DQ为数字信号输入/输出端;

(3) VDD为外接供电电源输入端(在寄生电源接线方式时接地)

图3

3.1.3 DS18B20工作原理

DS18B20的读写时序和测温原理及DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理

如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计

数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。

DS18B20有4个主要的数据部件:

(1)光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码

(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

(2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。

这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。

(3)DS18B20温度传感器的存储器

DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

(4)配置寄存器

该字节各位的意义如下

低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位)

表2

3.1.4 高速暂存存储器

高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。

单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表2是对应的一部分温度值。第九个字节是冗余检验字节。

表3

根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM 指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将

数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。

3.2 AT89C51

AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes 的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片

内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。ATC9C51实物图如图4。主要参数如下:

·及MCS-51产品指令系统完全兼容

·4k字节可重擦写Flash闪速存储器

·1000次擦写周期

·全静态操作:0Hz-24MHz

·三级加密程序存储器

·128×8字节内部RAM

·32个可编程I/O口线

·2个16位定时/计数器

·6个中断源

·可编程串行UART通道

·低功耗空闲和掉电模式

图4

四、软件介绍

4.1 功能概述

本系统的软件由汇编语言编写,程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值。

4.2 系统软件流程图

4.2.1程序

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图5所示。

图5程序流程图

4.2.2读出温度子程序

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图9所示

4.2.3温度转换命令子程序

温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图9所示

3.4 计算温度子程序

计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程

序流程图如

图10所示。

4.3具体程序

temp1 equ 5ah ;符号位和耗电量位公用的存放单元

temp2 equ 5bh ;十位存放单元

temp3 equ 5ch ;个位存放单元

temp4 equ 5dh

temp5 equ 5eh ;数据临时存放单元

temp6 equ 5fh

temp7 equ 60h

temp8 equ 61h

org 0000h

ajmp main

org 0030h

main:

mov sp,#70h

lcall int ;调用DS18B20初始化函数

main1: lcall gettemp ;调用温度转换函数

lcall chuli ;调用温度计算函数

lcall disp ;调用温度显示函数

ajmp main1 ;循环

int:

l0: setb p3. 6 ;先释放DQ总线

mov r2,#250 ;给R2赋延时初值,同时可让DQ保持高电平2us l1: clr p3.6 ;给DQ一个复位低电平

djnz r2,l1 ;保持低电平的时间至少为480us

setb p3.6 ;再次拉高DQ释放总线

mov r2,#25

l2:

djnz r2,l2 ;保持15us-60us

clr c

orl c,p3.6 ;判断是否收到低脉冲

jc l0

mov r6,#100

l3:

orl c,p3.6

djnz r6,l3 ;存在低脉冲保持60us-240us

;jc l0 ;否则继续从头开始,继续判断

setb p3.6

ret

;调用温度转换函数

gettemp:

clr psw.4

setb psw.3 ;设置工作寄存器当前所在的区域

clr ea ;使用DS18B20前一定要禁止任何中断

lcall int ;初始化DS18B20

mov a,#0cch ;送入跳过ROM命令

lcall write

mov a,#44h ;送入温度转换命令

lcall write

lcall int ;温度转换完成,再次初始化

mov a,#0cch ;送入跳过ROM命令

lcall write

mov a,#0beh ;送入读温度暂存器命令

lcall write

lcall read

mov temp4,a ;读出温度的低字节存在TEMP4

lcall read

mov temp5,a ;读出温度的高字节存在TEMP5

setb ea

ret

chuli: mov a, temp5 ;将温度的高字节取出

jnb p3.6,zheng ;判断最高们是否为0,为则表示温度为正,则转

到ZHENG否则温度为负,将温度的低字节取出mov a, temp4

cpl a ;求反

inc a ;加工厂

mov temp8,a ;存到TEMP8

anl a,#0fh ;保留低四位

lcall muld ;调用乘以625子程序

lcall hb2 ;调用双字节16进制数转成BCD码子程序

mov a,r4 ;将结果的千位百位取出

anl a,#0f0h ;保留千位

swap a

mov temp7,a ;把小数结果保存在TEMP7中

mov a,temp4 ;再次取出温度低字节

anl a,#0ffh ;判断是否为0

jz xx ;为何则转到XX执行

mov a,temp5;

cpl a ;不为则直接将温度的高字节取反

sjmp yy

xx: mov a,temp5 ;为0则求补码

cpl a

inc a

yy: anl a,#0f0h ;保留高字节的低四位

swap a ;将其换到高4位

mov r5,a ;暂时保存于R5中

mov a,temp8 ;取出求反后的低位字节

anl a,#0f0h ;取其高四位

swap a ;将其换到低四位

orl a ;合并成温度的整数部分

mov temp6,a ;将整数部分存到TEMP6中

lcall hbcd ;调用一字节的16进制转换BCD数的子

程序

mov temp1,#0bh ;将号的段选值存到符号位

mov a,temp2 ;取出十位

cjne a,#00h,next

mov temp2,#0ch ;十位为0不显示

ret

zheng: mov a,temp4 ;将温度的低字节取出

anl a,#0fh ;保留低四位

lcall muld ;调用乘以625子程序

lcall hb2 ;调用双字节16进制数转换成BCD码子

程序

mov a,r4 ;将结果的千位百位取出

swap a

mov temp7,a ;把小数结果保存在TEMP7中

mov a,temp4 ;再次取出温度的低字节

anl a,#0f0h 保留高4位

swap a ;换到低4位

mov r5,a ;暂时保存于R5中

mov a,temp5 ;取出温度的高字节

anl a,#0fh ;保留低4位

swap a ;换到高4位

orl a,r5 ;合并成温度的整数部分

mov temp6,a ;整数部分存到TEMP6中

lcall hbcd ;单字节的16进制转换成BCD码

mov a,temp1 ;取出百位

cjne a,#00h,next ;百位不为0则转NEXT

mov temp1,#0ch ;为0则不显

mov a,temp2 ;取出十位

cjne a,#00h,next

mov temp2,#0ch ;十位为0也不是

next:ret

muld:

mov b,#71h

mul ab

mov r7,a

mov r6,b

mov b,#02h

mul ab

add a,r6

mov r6,a

ret

write:

mov r3,#8 ;一个字节共8位

wr1: setb p3.6 ;先释放总线

mov r4,#8

rrc ;把要写的字节的最低位右环移到C中

clr p3.6 ;把C中的位写到DQ总线中

wr3:

djnz r4,wr3 ;保持低电平0-15us

mov p3.6, c;

mov r4 ,#20

djnz r4,$

djnz r3,wr1

setb p3.6

ret

read:

mov r6,#8

re1: setb p3.6 ;先释放总线

nop

clr p3.6 ;把要写的字节的最低位右环移到C中

nop ;写开始

mov r4,#4 ;保持低电平0-15us

setb p3.6 ;将C中的位写到DQ总线上re2:

djnz r4,re2 ;产生读时间

mov c,p3.6 ;将总线上的位读到C

mov r5,#30

djnz r5,$ ;持续60us

rrc a ;将C里的位右环移到A里

djnz r6,re1 ;读下一位

setb p3.6

ret

hbcd:

mov a,temp6

mov b,#10

div ab

mov temp3,b ;将个位存到TEMP3

mov b,#10

div ab

mov temp2, ;将十位存到TEMP2

mov temp1,a ;将百位存到TEMP1

ret

hb2:

clr a

mov r3,a

mov r4,a

mov r5,a

mov r2,#10h

hb3:

mov a,r7

rlc a

mov r7,a

mov a,r6

rlc a

mov r6,a

mov a,r5

addc a,r5

da a

mov r5,a

mov a,r4

addc a,r4

da a

mov r4,a

mov a,r3

addc a,r3

mov r3,a

djnz r2,hb3

ret

disp:

mov dptr,#disptab

mov r0,#4

dp1: mov r1,#140

loop: mov a,temp7 ;取出小数部分

movc a,@a+dptr ;取出相应的字型码

mov p1,a ;显示在数码管上

setb p3.0 ;数码管位选

acall delay100 ;延时

clr p3.0 ;清数码管位选

mov a,temp3 ;取个位

movc a,@a+dptr

anl a,#7fh ;显示小数点

mov p1,a

setb p3.1

acall delay100 ;取十位

clr p3.1

mov a,temp2

movc a,@a+dptr

mov p1,a

setb p3.2

acall delay100

clr p3.2

mov a,temp1 ;取符号位或百位

movc a,@a+dptr

mov p1,a

setb p3.3

acall delay100

clr p3.3

djnz r1,loop ;循环显示

djnz r0,dp1

ret

delay100:

mov r7,#8 0 ;延时

djnz r7,$

ret

disptab: db

0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0ffh,0bfh,0ffh

end

五、总结

经过两个周的设计以及调试,我们基本上完成了该课程设计的设计要求,能读出并显示DS18B20采集的温度,但还是有一项问题困扰着我们,我们至今也无法解决,这个问题就是不能实现高低温报警,经过好几次的修改也未获得成功。我想最主要的原因还是对程序没有研究好但我想我们会在以后的学习中慢慢把这个问题解决。

六、设计体会及今后的改进意见

通过此次课程设计,使我对硬件电路的工作原理有了进一步的学习,进一步的认识;在软件方面,在程序的设计,程序的调试方面都学到了很多东西,这是第一次编写单片机的大程序,很有成就感。在这几天课设的时间里,实验室的氛围对我们的影响很大,大家一起努力,这也是我们能完成课设的动力。另外在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,我们也是这么做的,这在课设中十分重要。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。虽然两个周的课程设计过去了,但此次课程设计暴露了我不少问题,虽然在课堂上我学了不少东西,但当付诸于实际时却摸不着头脑,所以我们不但要学习知识,还要在实践中运用知识,做到游刃有余。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写及读的过程中才能提高。

还有一点就是自学的能力,在开始的两天里我通过去图书馆或在网上查找资料的方式,基本弄懂了DS18B20的工作模式,为我后续的课程设计奠定了基础。我想在以后的日子我们总会碰到这样那样的问题,我们不可能任何事都依靠他人,自己去找答案,自己去解决问题是我们必须经历的一个过程。

两周的课程设计虽然已经过去,但它让我学到了很多,让我认识到了自己的不足,它将督促着我不断前行。

参考文献

1、《电子设计自动化技术基础》马建国、孟宪元编清华大学出版2004

年4月

2、《实用电子系统设计基础》姜威 2008年1月

3、《单片机系统的PROTEUS设计及仿真》张靖武 2007年4月

附录:图纸部分

电路仿真图:

相关主题
相关文档
最新文档