基于数字温度传感器DS18B20的测温设计.docx
《基于数字温度传感器DS18B20的测温设计.docx》由会员分享,可在线阅读,更多相关《基于数字温度传感器DS18B20的测温设计.docx(26页珍藏版)》请在冰豆网上搜索。
![基于数字温度传感器DS18B20的测温设计.docx](https://file1.bdocx.com/fileroot1/2023-1/5/0eb1bae7-99b9-4373-a335-bda615748c6a/0eb1bae7-99b9-4373-a335-bda615748c6a1.gif)
基于数字温度传感器DS18B20的测温设计
基于数字温度传感器DS18B20的测温设计
一.功能要求
1.三位数码管显示温度值,保留小数点后一位。
2.温度超过50摄氏度,红灯亮,低于50摄氏度,绿灯亮。
二.方案论证
在日常生活及农业生产中经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。
而热电偶和热电阻测出的一般都是电压,在转化成对应的温度,需要比较多的外部硬件电路支持,硬件电路复杂,软件调试复杂,制作成本高。
本数字温度计设计采用美国DALLAS半导体公司继DS1820后推出的一种改进型智能温度传感器DS18B20作为检测元件,测温范围为-55°C~125°C,最大分辨率可达0.0625°C。
DS18B20可以直接读出被测温度值,而且采用3线制与单片机相连,减少了外部电路,具有低成本和易使用的特点。
按照系统设计功能的要求,确定系统由3个模块组成:
主控制器(P89C51)、测温电路(DS18B20)、显示电路(四数码管及其驱动电路)和温度值高低报警电路(两红绿二极管)。
三.系统硬件电路的设计
3.1PHILIPSP89C51RD2HBP
3.1.1P89C51概述:
P89C51采用高性能的静态80C51采用了静态设计可提供很宽的操作频率范围频率可降至0,可实现两个由软件选择的节电模式空闲模式和掉电模式空闲模式冻结CPU,但RAM定时器串口和中断系统仍然工作
掉电模式保存RAM的内容但是冻结振荡器导致所有其它的片内功能停止工作由于设计是静态的,时钟可停止而不会丢失用户数据运行可从时钟停止处恢复,分别包含128字节和256字节RAM32条I/O口线3个16位定时/计数器6输入4优先级嵌套中断结构1个串行I/O口可用于多机通信I/O扩展或全双工UART以及片内振荡器和时钟电路,设计由先进CMOS工艺制造并带有非易失性Flash程序存储器全部支持12时钟和6时钟操作.
3.1.2P89C51特性:
采用80C51核心处理单元,含4k字节FLASH,128字节RAM,布尔处理器,全静态操作,12时钟操作可选6个时钟通过软件或并行编程器,存储器寻址范围64K字节ROM和64K字节RAM,
电源控制模式:
时钟可停止和恢复,空闲模式,掉电模式
两个工作频率范围:
6时钟模式时为0~20MHz,12时钟模式时为0~33MHz
其他:
扩展温度范围,双数据指针,3个加密位,4个中断优先级,6个中断源,4个8位I/O口,全双工增强型UART,帧数据错误检测,自动地址识别,3个16位定时/计数器T0T1标准80C51和增加的T2捕获和比较,可编程时钟输出,异步端口复位,低EMI(禁止ALE以及6时钟模式),掉电模式可通过外部中断唤醒
3.1.3P89C51管脚图(见图3-1)
图3-1
3.2数字温度传感器DS18B20
3.2.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.2.2DS18B20工作原理:
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图3-2所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3-2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图3-2
3.2.3DS18B20的外形和内部结构:
1、外形及引脚(见图3-3)
图3-3
(1)GND为电源地;
(2)DQ为数字信号输入/输出端;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
2、DS18B20内部结构:
图3-4
由图3-4可知,内部结构主要由四部分组成:
64位激光ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
3.2.4DS18B20主要的数据部件:
1、64bit激光ROM
激光ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位激光ROM的排列是:
开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1),如图3-5。
光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
图3-5
2、DS18B20中的温度传感器
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
具体见图3-6:
图3-6:
DS18B20温度值格式表
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例:
+125℃的数字输出为07D0H,+25.0625℃为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
常见温度数据见图3-7。
图3-7DS18B20温度数据表
3、DS18B20温度传感器的高速RAM存储器
高速暂存存储器由9个字节组成,其分配如图3-8所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
第九个字节是冗余检验字节。
寄存器内容
字节地址
温度值低位(LSByte)
0
温度值高位(MSByte)
1
高温限值(TH)
2
低温限值(TL)
3
配置寄存器
4
保留
5
保留
6
保留
7
CRC校验值
8
图3-8DS18B20暂存寄存器分布
4、DS18B20配置寄存器
该字节各位的意义如图3-9:
TM
R1
R0
1
1
1
1
1
图3-9:
配置寄存器结构
低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如图3-10:
(DS18B20出厂时分辨率被设置为12位)
R1
R0
分辨率
温度最大转换时间
0
0
9位
93.75ms
0
1
10位
187.5ms
1
0
11位
375ms
1
1
12位
750ms
图3-10
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
表6:
ROM指令表
指令
约定代码
功能
读ROM
33H
读DS1820温度传感器ROM中的编码(即64位地址)
符合ROM
55H
发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。
搜索ROM
0FOH
用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。
为操作各器件作好准备。
跳过ROM
0CCH
忽略64位ROM地址,直接向DS1820发温度变换命令。
适用于单片工作。
告警搜索命令
0ECH
执行后只有温度超过设定值上限或下限的片子才做出响应。
表6:
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.2.5DS18B20初始化及读写时序:
1.初始化序列:
复位和应答脉冲
单总线上的所有通信都是以初始化序列开始,包括主机发出复位脉冲及从机的应答脉冲。
如图3-11所示当从机发出响应主机的应答脉冲时,即向主机表明它处于总线上且工作准备就绪,在主机初始化过程主机通过拉低单总线至少480s以产生Tx复位脉冲,接着主机释放总线并进入接收模式Rx,当总线被释放后,5k上拉电阻将单总线拉高在单总线器件检测到上升沿后延时15-60s,接着通过拉低总线60-240s以产生应答脉冲脉冲。
图3-11
2.读/写时隙
在写时隙期间主机向单总线器件写入数据而在读时隙期间主机读入来自从机的数据,在每一个时隙总线只能传输一位数据。
2.1写时隙
存在两种写时隙写1和写0,主机采用写1时隙向从机写入1,而采用写0时隙向从机写入0,所有写时隙至少需要60s,且在两次独立的写时隙之间至少需要1s的恢复时间,两种写时隙均起始于主机拉低总线,如图3-12所示,产生写1时隙的方式:
主机在拉低总线后接着必须在15s之内释放总线,由5k上拉电阻将总线拉至高电平而产生。
写0时隙的方式:
在主机拉低总线后只需在整个时隙期间保持低电平即可,至少60s,在写时隙起始后15-60s期间单总线器件采样总线电平状态。
如果在此期间采样为高电平则逻辑1被写入该器件;如果为0则写入逻辑0。
2.2读时隙
单总线器件仅在主机发出读时隙时才向主机传输数据,所以在主机发出读数据命令后必须马上产生读时隙以便从机能够传输数据。
所有读时隙至少需要60s,且在两次独立的读时隙之间至少需要1s的恢复时间,每个读时隙都由主机发起至少拉低总线1s,如图3-13所示,在主机发起读时隙之后,单总线器件才开始在总线上发送0或1,若从机发送1则保持总线为高电平;若发送0,则拉低总线。
当发送0时,从机在该时隙结束后释放总线,由上拉电阻将总线拉回至空闲高电平状态,从机发出的数据在起始时隙之后保持有效时间15s。
因而主机在读时隙期间必须释放总线,并且在时隙起始后的15s之内采样总线状态。
图3-13图3-14
3.3设计电路图及功能说明
见下页图3-14
功能说明:
(1)DS18B20接在P3.7口上,采集温度数据,输入单片机
(2)数码管动态显示部分:
8位数据线接在P1口;4位控制线接在P2.0~P2.3,并使用与非门驱动。
(3)发光二极管:
单片机判断温度高于50°C时红灯亮,否则绿灯亮
图3-14
四.系统程序的设计
4.1主程序
通过主程序调用各个子程序,实现温度实时显示,读出并处理温度值,利用中断计时,每隔1s测量一次温度。
程序框图如图4-1
4.2读出温度子程序
读出温度子程序就是读出RAM中LSM和MSB两个字节,框图入图4-2所示。
4.3温度转换命令子程序
温度转换子程序就是向传感器发温度转换命令,由于本程序中使用的分辨率位12位,转换时间为750ms,因此程序采用中断计时,每过1s才去转化一次温度。
具体过程见图4-3
4.4计算温度子程序
计算温度子程序将RAM中读取的温度值进行BCD码转换,并标记正负号,如图4.4所示
4.5显示数据刷新子程序
显示子程序是从RAM对应单元中读出处理好的小数位,十位,个位,符号位,查对应的表可得对应数码管所要显示的字型码。
发DS18B20复位命令
发跳过ROM命令
发读取温度命令
读取操作
9字节完?
移入温度暂存器
结束
N
Y
图4-2读取温度子程序流程图
4.6程序源代码
FLAGBIT24H
SIGNBITFLAG.1
ABOVE100BITFLAG.2
REDLIGHTEQUP3.0
GREENLIGHTEQUP3.1
BITSTDATA20H
TIMEHEQU0D8H;T0中断计时,方式一,1s初值
TIMELEQU0F0H
TEMPHEADEQU36H
TIME1SOKBITBITST.1
INTFIRSTBITBITST.2
PORTEQUP3.7
TEMPLDATA26H
TEMPHDATA27H
TEMPHCDATA28H
TEMPLCDATA29H
ORG0000H
LJMPSTART
ORG000BH
LJMPINT_START
ORG100H
;------------------主函数开始处---------------------------------
START:
MOVSP,#60H;堆栈指针初始化
CLRRAM:
;清空RAM数据子程序:
数据较多需使用RAM中单元作为标志位
MOVR0,#20H
CLRRAM_LOOP:
MOV@R0,#00H
INCR0
CJNER0,#80H,CLRRAM_LOOP
INT_CONFIG:
;中断配置:
开启内部定时中断T0,每过1s刷新一次数据
MOVTMOD,#21H
MOVTH0,#TIMEH
MOVTL0,#TIMEL
SETBET0
SETBTR0
SETBEA
MOVPSW,#00H
CLRINTFIRST
SJMPMAIN
INT_START:
PUSHPSW
MOVPSW,#10H
MOVTH0,#TIMEH
MOVTL0,#TIMEL
INCR7
CJNER7,#64H,INT
MOVR7,#00H
SETBTIME1SOK
INT:
POPPSW
RETI
MAIN:
LCALLDISP
JNBTIME1SOK,MAIN;TIME1SOK=0,表示中断开启,计时进
CLRTIME1SOK;行中,将循环刷新LED
JNBINTFIRST,MAIN2
LCALLREAD_TEMP
LCALLCONVTEMP;单片机内部进行温度转换
LCALLDISPBCD
LCALLDISP
MAIN2:
LCALLCONVER_TEMP
SETBINTFIRST
LJMPMAIN
;************************************************************
;DS18B20底层功能子函数定义:
;INIT_DS:
初始化DB0832
;READ_BYTE:
:
读取DS18B20一字节数据
;WRITE_BYTE:
写入DS18B20一字节数据,即写入ROM命令
;************************************************************
;------------------------------------------------------------
;初始化DB0832
;------------------------------------------------------------
INIT_DS:
SETBPORT;1
NOP
NOP
CLRPORT;1->0
MOVR6,#0A0H;主机拉低单总线480us
DJNZR6,$;
MOVR6,#0A0H
DJNZR6,$
SETBPORT
MOVR6,#32H;上拉电阻拉高70us
DJNZR6,$
MOVR6,#3CH
LOOP_INIT_DS:
MOVC,PORT
JCINIT_OUT
DJNZR6,LOOP_INIT_DS
MOVR6,#64H
DJNZR6,$
SJMPINIT_DS
RET
INIT_OUT:
SETBPORT
RET
;------------------------------------------------------------
;读取DS18B20一字节数据
;------------------------------------------------------------
READ_BYTE:
MOVR6,#8
RD11:
CLRPORT
MOVR4,#4
NOP
SETBPORT
RD12:
DJNZR4,RD12
MOVC,PORT
RRCA
MOVR3,#30
RD13:
DJNZR3,RD13
DJNZR6,RD11
SETBPORT
RET
;------------------------------------------------------------
;写入DS18B20一字节数据
;------------------------------------------------------------
WRITE_BYTE:
MOVR3,#8;写入一个字节
WR11:
SETBPORT
MOVR4,#8
RRCA
CLRPORT
WR12:
DJNZR4,WR12
MOVPORT,C
MOVR4,#20;延时3*20us=60us,保证有足够时间写入
WR13:
DJNZR4,WR13
DJNZR3,WR11
SETBPORT
RET
;****************************************
;高层函数
;
(1)CONVER_TEMP函数:
DS18B20温度转换函数
;
(2)READ_TEMP函数:
DS18B20温度读取函数
;(3)CONVTEMP函数:
单片机内部进行温度处理函数
;(4)DISPBCD函数:
二进制的温度转换为BCD码函数
;(5)DISP函数:
查表显示温度函数
;****************************************
;------------------------------------------------------------
;温度转换
;------------------------------------------------------------
CONVER_TEMP:
LCALLINIT_DS
MOVA,#0CCH
LCALLWRITE_BYTE
MOVR6,#34H
DJNZR6,$
MOVA,#44H
LCALLWRITE_BYTE
MOVR6,#34H
DJNZR6,$
RET
;------------------------------------------------------------
;读取DS18B20中温度数据
;------------------------------------------------------------
READ_TEMP:
LCALLINIT_DS
MOVA,#0CCH
LCALLWRITE_BYTE
MOVR6,#34H
DJNZR6,$
MOVA,#0BEH
LCALLWRITE_BYTE
MOVR6,#34H
DJNZR6,$
MOVR5,#09H
MOVR0,#TEMPHEAD
MOVB,#00H
READTEMP2:
LCALLREAD_BYTE
MOV@R0,A
INCR0
READTEMP21:
;LCALLCRC8CAL
DJNZR5,READTEMP2
;MOVA,B
;JNZREADTEMPOUT
MOVA,TEMPHEAD+0
MOVTEMPL,A
MOVA,TEMPHEAD+1
MOVTEMPH,A
READTEMPOUT:
RET
;---------------------------------------------------
;单片机内部进行初步数据处理
;
;输入:
读入的温度输出:
二进制温度
;---------------------------------------------------
CONVTEMP:
MOVA,TEMPH
ANLA,#80H
JZTEMPC1
SETBSIGN
CLRC
MOVA,TEMPL
CPLA
ADDA,#01
MOVTEMPL,A
MOVA,TEMPH
CPLA
ADDC