基于单片机下的数字温度计DS18B.docx
- 文档编号:24518210
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:21
- 大小:239.91KB
基于单片机下的数字温度计DS18B.docx
《基于单片机下的数字温度计DS18B.docx》由会员分享,可在线阅读,更多相关《基于单片机下的数字温度计DS18B.docx(21页珍藏版)》请在冰豆网上搜索。
基于单片机下的数字温度计DS18B
基于单片机的数字温度计设计
1、概论:
温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要意义。
在单片机的应用中,一个很重要的应用就是对温度进行检测。
测量温度的关键是温度传感器,采用智能温度传感器以实现温度数字化,既能以数字形式直接输出被测温度值,具有测量误差小,分辨力高,抗干扰能力强,能够远程传输数据,带串行总线接口等优点。
温度的数字输出显示在LCD1602上。
单片机、温度传感器与LCD1602等电子元器件的互联,可以研制和开发出具有高性价比的新一代测温系统——基于单片机的数字温度计。
基于单片机的数字温度计设计,即对温度进行实时测量,使用单线数字温度传感器DS18B20把温度信号直接转换成数字信号输入单片机。
经单片机处理后,将实时温度显示在LCD1602上。
完成本设计需要软件编程和硬件电路设计,需要用到两种软件。
2、温度传感器:
2.1DS18B20简单介绍
美国Dallas公司生产的单线数字温度传感器DS18B20,可以把温度模拟信号直接转换成串行数字信号供微机处理,是模/数转换器件,而且读DS18B20信息或写信息仅需单线接口,使用非常方便,新型的单线数字温度传感器体积小,精度高,使用更灵活。
DS18B20有三个引脚,GND接地;DQ为数字信号输入输出端;Udd为外接电源输入端。
DS18B20的内部结构如图-2所示:
DS18B20内结构主要由4部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH、TL和配置寄存器。
64位光刻ROM:
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,即ID。
它的作用是使每一个DS18B20的地址都各不相,可以实现在相同的总线上挂接多个DS18B20的目的。
64位光刻ROM的排列是开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
温度传感器:
在DS18B20温度传感器的使用中,以9位转化为例,从DS18B20中得到16位符号扩展的二进制补码读数形式,以0.5℃/LSB的形式表达,其中S为符号位,二进制的数存储在DS18B20的2个8位的RAM中,这是9位转化后得到的16位数据,其中前面5位是符号位,如果测得温度大于0℃,这5位为0,只要将测到的数值乘以0.5即可得到实际温度;如果温度小于0℃,这5位为1,测得到的数值需要取反加1再乘以0.5即可得到实际温度。
非发挥的温度报警触发器TH、TL:
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的电可擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
当温度达到低温或高温的时候,温度报警触发器会发出警报。
高速暂存RAM:
高速暂存存储器包含了9个连续字节,如表-1,当温度转换命令发出后,经转换所得的温度值存放在高速暂存存储器的第0和第1个字节内,第0个字节存放的是温度的低8位信息,第1个字节存放的是温度的高8位信息,单片机可通过单线接口读到该数据,读取时低位在前,高位在后;第2、3字节是TH、TL的易失性拷贝,第4个字节是结构寄存器的易失行拷贝,这三个字节的内容每一次上电复位时被刷新;第5、6、7字节用于内部计算;第8个字节是冗余检验字节。
Ds18B20的设置位有一个字节,该字节的各位定义为TMR1R011111,每一次进行针对DS18B20的读写前,都需要对DS18B20进行设置,从上面的定义可以看出,该字节的低5位一直都是1,TM位是测试模式位,用于设置DS18B20在工作模式及测试模式。
在DS18B20出厂时该位被置为0,,用户不要进行改动,R1、R0用来设置分辨率。
高速暂存存储器的内容及字节地址表-1
寄存器内容
字节地址
温度值低位(LS)
0
温度值高位(MS)
1
高温限值(TH)
2
低温限值(TL)
3
配置寄存器
4
保留
5
保留
6
保留
7
CRC校验值
8
DS18B20的通信协议:
在对DS18B20进行读写编程时,必须严格保证读写时序,否则将无法读取所测温度结果。
根据DS18B20的通信协议,主机控制DS18B20完成温度转换必须经过3个步骤:
每一次读写之前都要对DS18B20进行复位,复位成功后发送第一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
DS18B20的ROM指令如下表-2所示,DS18B20的RAM指令如下表-3所示
复位要求主CPU将数据线下拉50us,然后释放,DS18B20收到信号后等待16~240us的存在低脉冲,主CPU收到此信号表示复位成功。
DS18B20的ROM指令表-2
指令
约定代码
功能
温度变化
44H
启动DS18B20进行温度转换,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
读DS18B20的供电模式,寄生供电时DS18B20发送0,外接电源供电DS18B20发送1
DS18B20的RAM指令表-3
指令
约定代码
功能
读ROM
33H
读取DS18B20温度传感器ROM中的编码(即64位地址)
符合ROM
55H
发出命令后,接着发出64位Rom编码,访问单总线上与该编码对应的DS18B20,使之作出响应,为下一次该DS18B20读写准备
搜索ROM
0F0H
用于确定挂接在同一个总线上DS18B20的个数和识别64位的Rom地址,为操作各器件做好准备
跳过ROM
0CCR
跳过ROM工作
报警搜索命令
CECH
执行后只有温度超过设定值上限或下限的芯片才能作出响应
2.2DS18B20使用中的注意事项
DS18B20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:
●DS18B20从测温结束到将温度值转换成数字量需要一定的转换时间,这是必须保证的,不然会出现转换错误的现象,使温度输出总是显示85。
●在实际使用中发现,应使电源电压保持在5V左右,若电源电压过低,会使所测得的温度精度降低。
●较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。
在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。
●在DS18B20的有关资料中均未提及单总线上所挂DS18B20数量问题,容易使人误认为可以挂任意多个DS18B20,在实际应用中并非如此,当单总线上所挂DS18B20超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。
●在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环,这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视。
2.3DS18B20测温原理
DS18B20的测温原理如图-3所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度值。
图中的斜率累加器用于补偿和修正测温过程中的非线性其输出,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
DS18B20测温原理图图-3
3.硬件电路设计
本设计由DS18B20温度传感器芯片测量当前的温度并将转换后的结果送入单片机。
然后通过A89S51单片机驱动两位共阳极7段LED数码管显示测量温度值。
如附录中本设计硬件电路图所示,本电路主要有DS18B20温度传感器芯片,两位共阳极数码管,AT89S51单片机及相应外围电路组成。
其中DS18B20采用“一线制”与单片机相连。
3.1、温度检测电路
DS18B20最大的特点是单总线数据传输方式,DS18B20的数据I/O均由同一条线来完成。
DS18B20的电源供电方式有2种:
外部供电方式和寄生电源方式。
工作于寄生电源方式时,VDD和GND均接地,他在需要远程温度探测和空间受限的场合特别有用,原理是当1Wire总线的信号线DQ为高电平时,窃取信号能量给DS18B20供电,同时一部分能量给内部电容充电,当DQ为低电平时释放能量为DS18B20供电。
但寄生电源方式需要强上拉电路,软件控制变得复杂(特别是在完成温度转换和拷贝数据到E2PROM时),同时芯片的性能也有所降低。
外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。
因此本设计采用外部供电方式。
如下图所示:
温度传感器DS18B20的测量范围为-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃。
因为本设计只用于测量环境温度,所以只显示0℃~+85℃。
4、程序设计
用汇编语言完成对设计的软件编程,程序开始首先对温度传感器DS18B20进行复位,检测是否正常工作;接着读取温度数据,主机发出CCH指令与在线的DS18B20联系,接着向DS18B20发出温度A/D转换44H指令,再发出温度寄存器的温度值BEH指令,并反复调用复位,写入及读取数据子程序,之后再经过数据转换,由数码管显示出来,不断循环。
4.1、程序流程图
总程序流程图图-9
4.2、程序流程图中内容的说明及部分程序代码
①对DS18B20进行复位,写入和读取温度数据(在温度传感器DS18B20内部完成,并实现对温度信息的采集);读取温度流程如下:
复位→发CCH命令(跳过ROM)→发44H命令→延时1s→复位→发CCH命令(跳过ROM)→发BEH命令(读内部RAM中9字节内容)→连接从总线上读出2个字节的数据(温度数据的低8位和高8位)→结束
部分程序代码:
(1)DS18B20的复位子程序部分:
RESET_1820:
SETBDQ;
NOP
NOP
CLRDQ
;主机发出复位低脉冲
MOVR1,#3;
DLY:
MOVR0,#107;
DJNZR0,$;
DJNZR1,DLY;
;拉高数据线
SETBDQ
NOP
NOP
NOP
;等待DS18B20的回应
MOVR0,#25H;
T2:
JNBDQ,T3;
DJNZR0,T2;
JMPT4;
;标志位flag=1,表示DS18B20存在
T3:
SETBFLAG
JMPT5;
;标志位flag=0,表示DS18B20不存在
T5:
MOVR0,#117;
T4:
RET
注:
根据DS18B20的通信协议,每一次读写数据之前都要对DS18B20进行复位,复位要求主机先发出复位低脉冲(大于48us);然后释放,DS18B20收到信号后等待16~60us,然后发出60~240us的存在低脉冲,主机收到此信号表示复位成功。
初始化时序图-10
(2)DS18B20的写入子程序部分:
WRITE_1820:
MOVR2,#8;一位共8位数据
CLRC;C=0
WR1:
CLRDQ;总线低位,开始写入
MOVR3,#7;
DJNZR3,$;保持16us以上
RRCA;把字节DATA分成8个位,循环给C
MOVDQ,C;写入一个位;
MOVR3,#23;
DJNER3,$;等待
SETBDQ;重新释放总线;
NOP
DJNZR2,WR1;写入下一个位;
SETBDQ
RET
注:
当主机把数据从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。
有两种写时间隙,写1时间隙和写0时间隙。
所有写时间隙必须最少持续60μs,包括两个写周期至少1μs的恢复时间。
I/O线电平变低后,DS18B20在一个15μs到60μs的窗口内对I/O线采样。
如果线上事高电平,就是写1,如果是低电平,就是写0。
主机要生成一个写时间隙,必须把数据线拉到低电平然后释放,在写时间隙开始后的15μs内允许数据线拉到高电平。
主机要生成一个写0时间隙,必须把数据线拉到低电平并保存60μs。
每个读时隙都由主机发起,至少拉低总线1us,在主机发起读时序之后,单总线器件才开始在总线上发送0或1。
所有读时序至少需要60us。
写时序图-11
(3)DS18B20的读取子程序
READ_1820:
MOVR4,#2;读取两个字节的数字
MOVR1,#29H;低位存入29H,高位存入28H
RE0:
MOVR2,#8;数据一共有8位
RE1:
CLRC
SETBDQ
NOP
NOP
CLRDQ;读前总线保持为低
NOP
NOP
NOP
SETBDQ;开始读总线释放
MOVR3,#9;
RE2:
DJNZR3,RE2;延时18us
MOVC,DQ;从总线读到一个位
MOVR3,#23;
RE3:
DJNZR3,RE3;等待50us
RRCA;把读得的位值循环移给A
DJNZR2,RE1;读取下一位
MOV@R1,A;
DECR1
DJNZR4,RE0;
RET
注:
当从DS18B20读数据时,主机生成读时间隙。
当主机把数据从高电平拉到低电平时,读时间隙开始,数据线必须保持至少1μs;从DS18B20输出的数据在读时间隙的下降沿出现后15μs内有效。
因此,主机在读时间隙开始后必须把I/O脚驱动拉为的电平保持15μs,以读取I/O脚状态。
在读时间隙的结尾,I/O引脚将被外部上拉电阻拉到高电平。
所有读时间隙必须最少60μs,包括两个读周期至少1μs的恢复时间。
读时序图-12
②获得实际测量温度(温度传感器DS18B20把数据信息传给单片机,完成数据信息的传输);
数据转化子程序部分:
TURN:
ANL28H,#07H
ANL29H,#0F0H
MOVA,28H
ORL29H,A
MOVA,29H
SWAPA
MOV29H,A
RET
注:
温度传感器DS18B20所测得的温度数据低位存入29H,高位存入28H,将28H中的低4位移入29H中的高4位,获得一个新字节,这个字节就是实际测量的温度。
③将测量的温度数据在两位数码管上显示出来(单片机把数据信息传给LED数码管显示器,实现温度的数字化显示)。
温度显示子程序部分:
DISPLAY:
MOVA,29H;
MOVB,#10;
DIVAB
MOVB_bit,A;十位在A
MOVA_bit,B;个位在B
MOVDPTR,#TABLE;指定查表起始地址
MOVR0,#4;
DP1:
MOVR1,#250;显示1000次
LOOP:
MOVA,A_bit;取个位数
MOVCA,@a+DPTR;查个位数的7段代码
MOVP0,A;送出个位的7段代码
CLRP2.3;开个位显示
ACALLDELAY
SETBP2.3
MOVA,B_bit;取十位数
MOVCA,@A+DPTR;查出十位数的7段代码
MOVP0,A;送出十位的7段代码
CLRP2.2;开十位显示
ACALLDELAY;显示1ms
SETBP2.2
DJNZR1,LOOP;250次未完循环
DJNZR0,DP1;4个250次未完循环
RET
附录:
硬件电路图:
TEMPER_L EQU 29H ;放读取的低8位
TEMPER_H EQU 28H ;放读取的高8位
A_BIT EQU 33H ;百位存储单
B_BIT EQU 32H ;十位存储单元
C_BIT EQU 31H ;个位存储单元
D_BITEQU22H;个位小数
E_BITEQU23H;十位小数
F_BITEQU24H;百位小数
G_BITEQU25H;千位小数
T_DFEQU27H
T_INTEGEREQU30H
DQ BIT P3.7
主程序:
ORG 0030H
LOOP:
MOVSP,#60H
CLR EA
LCALLCHU_1820
LCALL DUWENDU
LCALL GET_TEMPER
LCALL T_FORMAT
;------------------------DS18B20初始化-----------------------
CHU_1820:
L0:
SETBDQ
NOP
CLRDQ
MOVR2,#250
L1:
DJNZR2,L1
SETBDQ
MOVR2,#25
L15:
DJNZR2,L15
CLRC
ORLC,DQ
JCL0
;CLRP2.0
MOVR6,#23
L16:
ORLC,DQ
JCL3
DJNZR6,L16
SJMPL0
L3:
MOVR2,#120
DJNZR2,$
RET
;------------------------设定暂存器----------------------------
DUWENDU:
CLREA
LCALLCHU_1820
JBDQ,TS1
RET
TS1:
MOVA,#0CCH ;跳过ROM匹配
LCALLXIE_1820
MOVA,#4EH
LCALLXIE_1820
RET
;-----------------------读转换后的温度值------------------------
GET_TEMPER:
SETB DQ
LCALL CHU_1820
JB DQ,TSS2
RET ;若不存在则返回
TSS2:
MOV A,#0CCH ;跳过ROM
LCALL XIE_1820
MOV A,#44H ;发出温度转换命令
LCALL XIE_1820
LCALL DISPLAY ;延时
LCALL CHU_1820
MOV A,#0CCH ;跳过ROM
LCALL XIE_1820
MOV A,#0BEH ;发出读温度换命令
LCALL XIE_1820
LCALL RED_1820 ;读两个字节的温度
RET
//----------------------写命令到1820--------------------------
XIE_1820:
CLREA
MOVR2,#8
L9:
SETBDQ
MOVR3,#7
RRCA
CLRDQ
DJNZR3,$
MOVDQ,C
MOVR3,#20
DJNZR3,$
DJNZR2,L9
SETBDQ
RET
//----------------------读出两字节温度数据-----------------------
RED_1820:
MOVR2,#2
MOVR1,#TEMPER_L ;低位存入(TEMPER_L),高位存入(TEMPER_H)
L7:
MOVR3,#8
L6:
CLRC
CLRDQ
NOP
NOP
NOP
SETBDQ ;开始读数据,总线释放
MOVR4,#4
DJNZR4,$ ;总线保持8us
MOVC,DQ
RRCA
MOVR5,#30
L5:
DJNZR5,L5 ;等待60us释放总线
DJNZR3,L6
MOV@R1,A
DECR1 ;指向高8位存储单元
DJNZR2,L7
SETBDQ
RET
;-----整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
T_FORMAT:
MOVA,#0FH
ANLA,TEMPER_L
MOVT_DF,A ;获得小数部分(4位)
MOVA,TEMPER_L
SWAPA
MOVTEMPER_L,A
MOVA,TEMPER_H
SWAPA
MOVR0,#TEMPER_L
XCHDA,@R0
MOVT_INTEGER,A ;获得整数部分(1字节)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 数字 温度计 DS18B