DS18B20温度数据采集系统.docx
- 文档编号:27797720
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:23
- 大小:120.56KB
DS18B20温度数据采集系统.docx
《DS18B20温度数据采集系统.docx》由会员分享,可在线阅读,更多相关《DS18B20温度数据采集系统.docx(23页珍藏版)》请在冰豆网上搜索。
DS18B20温度数据采集系统
摘要
本文基于DS18B20设计了一种温度数据采集系统,系统主要由AT89C51单片机,一个DS18B20数字温度传感器以及一个液晶数码管构成。
软件方面,我们采用keil。
软件对程序进行编写以及调试,硬件方面,我们通过Proteus软件对硬件电路进行仿真以及测试,该系统结构简单,功耗较低,测温范围为-50℃~+255℃。
现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量。
该系统硬件分为3部分:
DS18B20温度测量模块、单片机模块、显示模块。
关键词:
DS18B20、7SEG-MPX4液晶数码管、AT89C51
一、绪论
在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。
其中,温度控制也越来越重要。
在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。
采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大提高产品的质量和数量。
因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题。
目前应用的温度检测系统大多采用由模拟温度传感器、多路模拟开关、A/D转换器及单片机等组成的传输系统。
这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上.安装和拆卸繁杂,成本也高。
同时线路上传送的是模拟信号,易受干扰和损耗,测量误差也比较大,不利于控制者根据温度变化及时做出决定。
针对这种情况,本文提出一种采用数字化单总线技术的温度采集系统,并利用Proteus和KeilμVision2软件对设计电路进行综合虚拟仿真,实现了温度实时测量和显示。
二、系统方案实现
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.1DS18B20的主要特性
(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.2DS18B20的外形和内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的外形及管脚排列如下图:
图2:
DS18B20外形及引脚排列图
DS18B20引脚定义:
(1)GND为电源地;
(2)DQ为数字信号输入/输出端;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)
图3
3.1.3DS18B20工作原理
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
R1
R0
1
1
1
1
1
低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如下表所示:
(DS18B20出厂时被设置为12位)
表2:
温度分辨率设置表
R1
R0
分辨率
温度最大转换时间
0
0
9位
93.75ms
0
1
10位
187.5ms
1
0
11位
375ms
1
1
12位
750ms
3.1.4高速暂存存储器
高速暂存存储器由9个字节组成,其分配如表5所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。
对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
表2是对应的一部分温度值。
第九个字节是冗余检验字节。
表3:
DS18B20暂存寄存器分布
寄存器内容
字节地址
温度值低位(LSByte)
0
温度值高位(MSByte)
1
高温限值(TH)
2
低温限值(TL)
3
配置寄存器
4
保留
5
保留
6
保留
7
CRC校验值
8
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
表4:
ROM指令表
指令
约定代码
功能
读ROM
33H
读DS1820温度传感器ROM中的编码(即64位地址)
符合ROM
55H
发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。
搜索ROM
0FOH
用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。
为操作各器件作好准备。
跳过ROM
0CCH
忽略64位ROM地址,直接向DS1820发温度变换命令。
适用于单片工作。
告警搜索命令
0ECH
执行后只有温度超过设定值上限或下限的片子才做出响应。
表5:
RAM指令表
指令
约定代码
功能
温度变换
44H
启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。
结果存入内部9字节RAM中。
读暂存器
0BEH
读内部RAM中9字节的内容
写暂存器
4EH
发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。
复制暂存器
48H
将RAM中第3、4字节的内容复制到EEPROM中。
重调EEPROM
0B8H
将EEPROM中内容恢复到RAM中的第3、4字节。
读供电方式
0B4H
读DS1820的供电模式。
寄生供电时DS1820发送“0”,外接电源供电DS1820发送“1”。
3.2AT89C51
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数据存储器(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具体程序
temp1equ5ah;符号位和耗电量位公用的存放单元
temp2equ5bh;十位存放单元
temp3equ5ch;个位存放单元
temp4equ5dh
temp5equ5eh;数据临时存放单元
temp6equ5fh
temp7equ60h
temp8equ61h
org0000h
ajmpmain
org0030h
main:
movsp,#70h
lcallint;调用DS18B20初始化函数
main1:
lcallgettemp;调用温度转换函数
lcallchuli;调用温度计算函数
lcalldisp;调用温度显示函数
ajmpmain1;循环
int:
l0:
setbp3.6;先释放DQ总线
movr2,#250;给R2赋延时初值,同时可让DQ保持高电平2us
l1:
clrp3.6;给DQ一个复位低电平
djnzr2,l1;保持低电平的时间至少为480us
setbp3.6;再次拉高DQ释放总线
movr2,#25
l2:
djnzr2,l2;保持15us-60us
clrc
orlc,p3.6;判断是否收到低脉冲
jcl0
movr6,#100
l3:
orlc,p3.6
djnzr6,l3;存在低脉冲保持60us-240us
;jcl0;否则继续从头开始,继续判断
setbp3.6
ret
;调用温度转换函数
gettemp:
clrpsw.4
setbpsw.3;设置工作寄存器当前所在的区域
clrea;使用DS18B20前一定要禁止任何中断
lcallint;初始化DS18B20
mova,#0cch;送入跳过ROM命令
lcallwrite
mova,#44h;送入温度转换命令
lcallwrite
lcallint;温度转换完成,再次初始化
mova,#0cch;送入跳过ROM命令
lcallwrite
mova,#0beh;送入读温度暂存器命令
lcallwrite
lcallread
movtemp4,a;读出温度的低字节存在TEMP4
lcallread
movtemp5,a;读出温度的高字节存在TEMP5
setbea
ret
chuli:
mova,temp5;将温度的高字节取出
jnbp3.6,zheng;判断最高们是否为0,为则表示温度为正,则转到ZHENG否则温度为负,将温度的低字节取出
mova,temp4
cpla;求反
inca;加工厂
movtemp8,a;存到TEMP8
anla,#0fh;保留低四位
lcallmuld;调用乘以625子程序
lcallhb2;调用双字节16进制数转成BCD码子程序
mova,r4;将结果的千位百位取出
anla,#0f0h;保留千位
swapa
movtemp7,a;把小数结果保存在TEMP7中
mova,temp4;再次取出温度低字节
anla,#0ffh;判断是否为0
jzxx;为何则转到XX执行
mova,temp5;
cpla;不为则直接将温度的高字节取反
sjmpyy
xx:
mova,temp5;为0则求补码
cpla
inca
yy:
anla,#0f0h;保留高字节的低四位
swapa;将其换到高4位
movr5,a;暂时保存于R5中
mova,temp8;取出求反后的低位字节
anla,#0f0h;取其高四位
swapa;将其换到低四位
orla;合并成温度的整数部分
movtemp6,a;将整数部分存到TEMP6中
lcallhbcd;调用一字节的16进制转换BCD数的子程序
movtemp1,#0bh;将号的段选值存到符号位
mova,temp2;取出十位
cjnea,#00h,next
movtemp2,#0ch;十位为0不显示
ret
zheng:
mova,temp4;将温度的低字节取出
anla,#0fh;保留低四位
lcallmuld;调用乘以625子程序
lcallhb2;调用双字节16进制数转换成BCD码子程序
mova,r4;将结果的千位百位取出
swapa
movtemp7,a;把小数结果保存在TEMP7中
mova,temp4;再次取出温度的低字节
anla,#0f0h保留高4位
swapa;换到低4位
movr5,a;暂时保存于R5中
mova,temp5;取出温度的高字节
anla,#0fh;保留低4位
swapa;换到高4位
orla,r5;合并成温度的整数部分
movtemp6,a;整数部分存到TEMP6中
lcallhbcd;单字节的16进制转换成BCD码
mova,temp1;取出百位
cjnea,#00h,next;百位不为0则转NEXT
movtemp1,#0ch;为0则不显
mova,temp2;取出十位
cjnea,#00h,next
movtemp2,#0ch;十位为0也不是
next:
ret
muld:
movb,#71h
mulab
movr7,a
movr6,b
movb,#02h
mulab
adda,r6
movr6,a
ret
write:
movr3,#8;一个字节共8位
wr1:
setbp3.6;先释放总线
movr4,#8
rrc;把要写的字节的最低位右环移到C中
clrp3.6;把C中的位写到DQ总线中
wr3:
djnzr4,wr3;保持低电平0-15us
movp3.6,c;
movr4,#20
djnzr4,$
djnzr3,wr1
setbp3.6
ret
read:
movr6,#8
re1:
setbp3.6;先释放总线
nop
clrp3.6;把要写的字节的最低位右环移到C中
nop;写开始
movr4,#4;保持低电平0-15us
setbp3.6;将C中的位写到DQ总线上
re2:
djnzr4,re2;产生读时间
movc,p3.6;将总线上的位读到C
movr5,#30
djnzr5,$;持续60us
rrca;将C里的位右环移到A里
djnzr6,re1;读下一位
setbp3.6
ret
hbcd:
mova,temp6
movb,#10
divab
movtemp3,b;将个位存到TEMP3
movb,#10
divab
movtemp2,;将十位存到TEMP2
movtemp1,a;将百位存到TEMP1
ret
hb2:
clra
movr3,a
movr4,a
movr5,a
movr2,#10h
hb3:
mova,r7
rlca
movr7,a
mova,r6
rlca
movr6,a
mova,r5
addca,r5
daa
movr5,a
mova,r4
addca,r4
daa
movr4,a
mova,r3
addca,r3
movr3,a
djnzr2,hb3
ret
disp:
movdptr,#disptab
movr0,#4
dp1:
movr1,#140
loop:
mova,temp7;取出小数部分
movca,@a+dptr;取出相应的字型码
movp1,a;显示在数码管上
setbp3.0;数码管位选
acalldelay100;延时
clrp3.0;清数码管位选
mova,temp3;取个位
movca,@a+dptr
anla,#7fh;显示小数点
movp1,a
setbp3.1
acalldelay100;取十位
clrp3.1
mova,temp2
movca,@a+dptr
movp1,a
setbp3.2
acalldelay100
clrp3.2
mova,temp1;取符号位或百位
movca,@a+dptr
movp1,a
setbp3.3
acalldelay100
clrp3.3
djnzr1,loop;循环显示
djnzr0,dp1
ret
delay100:
movr7,#80;延时
djnzr7,$
ret
disptab:
db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0ffh,0bfh,0ffh
end
五、总结
经过两个周的设计以及调试,我们基本上完成了该课程设计的设计要求,能读出并显示DS18B20采集的温度,但还是有一项问题困扰着我们,我们至今也无法解决,这个问题就是不能实现高低温报警,经过好几次的修改也未获得成功。
我想最主要的原因还是对程序没有研究好但我想我们会在以后的学习中慢慢把这个问题解决。
六、设计体会及今后的改进意见
通过此次课程设计,使我对硬件电路的工作原理有了进一步的学习,进一步的认识;在软件方面,在程序的设计,程序的调试方面都学到了很多东西,这是第一次编写单片机的大程序,很有成就感。
在这几天课设的时间里,实验室的氛围对我们的影响很大,大家一起努力,这也是我们能完成课设的动力。
另外在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,我们也是这么做的,这在课设中十分重要。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。
虽然两个周的课程设计过去了,但此次课程设计暴露了我不少问题,虽然在课堂上我学了不少东西,但当付诸于实际时却摸不着头脑,所以我们不但要学习知识,还要在实践中运用知识,做到游刃有余。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 温度 数据 采集 系统