基于DS18B20传感器温度测量课程设计报告

目录

?封面……………………………………………………………………………………1

?内容   

1.设计题目…………………………………………………………………3

2.设计目的…………………………………………………………………3

3.设计任务和要求………………………………………………………3

4.正文…………………………………………………………………………3

5.设计体会、致谢………………………………………………………16

6.参考文献…………………………………………………………………16

7.附录…………………………………………………………………………17

1. 设计题目

《基于DS18B20传感器温度测量》

2. 课程设计目的

通过基于MCS-51系列单片机AT89C51和DS18B20温度传感器检测温度,熟悉芯片的使用,温度传感器的功能,数码显示管的使用,汇编语言的设计;并且把我们这一年所学的数字和模拟电子技术、检测技术、单片机应用等知识,通过理论联系实际,从题目分析、电路设计调试、程序编制调试到传感器的选定等这一完整的实验过程,培养了学生正确的设计思想,使学生充分发挥主观能动性,去独立解决实际问题,以达到提升学生的综合能力、动手能力、文献资料查阅能力的作用,为毕业设计和以后工作打下一个良好的基础。。

3. 设计任务和要求

    以MCS-51系列单片机为核心器件,组成一个数字温度计,采用数字温度传感器DS18B20为检测器件,进行单点温度检测,检测精度为0.5摄氏度。温度显示采用3位LED数码管显示,两位整数,一位小数。具有键盘输入上下限功能,超过上下限温度时,进行声音报警。

4. 正文

一、方案选择与论证

    根据设计任务的总体要求,本系统可以划分为以下几个基本模块,针对各个模块的功能要求,分别有以下一些不同的设计方案:

1、温度传感器模块

方案一:采用热敏电阻,热敏电阻精度、重复性、可靠性较差,对于检测1摄氏度的信号是不适用的,也不能满足测量范围。在温度测量系统中,也常采用单片温度传感器,比如AD590,LM35等。但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给计算机,这样就使测温系统的硬件结构较复杂。另外,这种测温系统难以实现多点测温,也要用到复杂的算法,一定程度上也增加了软件实现的难度。

方案二:采用单总线数字温度传感器DS18B20测量温度,直接输出数字信号。便于单片机处理及控制,节省硬件电路。且该芯片的物理化学性很稳定,此元件线形性能好,在0—100摄氏度时,最大线形偏差小于1摄氏度。DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度装置,它直接输出温度的数字信号到微控制器。每只DS18B20具有一个独有的不可修改的64位序列号,根据序列号可访问不同的器件。这样一条总线上可挂接多个DS18B20传感器,实现多点温度测量,轻松的组建传感网络。

综上分析,我们选用第二种方案。

2、显示模块

方案一:采用8位段数码管,将单片机得到的数据通过数码管显示出来。该方案简单易行,但所需的元件较多,且不容易进行操作,可读性差,一旦设定后很难再加入其他的功能,显示格式受限制,且大耗电量大,不宜用电池给系统供电。

方案二:采用液晶显示器件,液晶显示平稳、省电、美观,更容易实现题目要求,对后续的园艺通兼容性高,只需将软件作修改即可,可操作性强,也易于读数,采用RT1602两行十六个字符的显示,能同时显示其它的信息如日期、时间、星期、温度。

综上分析,我们采用了第二个方案。

3、微控制器模块

方案一:此方案采用AT89C51八位单片机实现。它内存较小,只有4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,无在线下载编程功能,也无在线仿真功能。只能通过编程器类烧写以.hex 为后缀名的文件。

方案二:此方案采用AT89S52八位单片机实现。它内存较大,有8K的字节Flash闪速存储器,比AT89C51要多4K。它可在线编程,可在线仿真的功能,这让调试变得方便。单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制。而且体积小,硬件实现简单,安装方便。

综上所述,我们采用了第二个方案,即AT89S52。

二、系统的具体设计与实现

1、系统的总体设计方案

采用AT89S52单片机作为控制核心对温度传感器DS18B20控制,读取温度信号并进行计算处理,并送到液晶显示器RT1602显示。

按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路。数字温度计总体电路结构框图如图5所示。

                    图5 电路结构框图

2、硬件电路设计

(1)、单片机控制模块

    该模块由AT89S52单片机组成在设计方面,AT89S52的EA接高电平,其外围电路提供能使之工作的晶振脉冲、复位按键,四个I/O分别接8路的单列IP座方便与外围设备连接。

当AT89S52芯片接到来自温度传感器的信号时,其内部程序将根据信号的类型进行处理,并且将处理的结果送到显示模块,发送控制信号控制各模块。

该模块的硬件电路如下图

(2)温度传感器模块

DS18B20相关资料

1、DS18B20原理与分析

DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,它能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。 以下是DS18B20的特点:

(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(2)在使用中不需要任何外围元件。

(3)可用数据线供电,电压范围:+3.0~ +5.5 V。

(4)测温范围:-55 - +125 ℃。固有测温分辨率为0.5 ℃。

(5)通过编程可实现9-12位的数字读数方式。

(6)用户可自设定非易失性的报警上下限值。

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

(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

2、DS18B20的测温原理

DS18B20的测温原理上图所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 ℃ 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。

另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。  

DS18B20工作过程一般遵循以下协议:初始化——ROM操作命令——存储器操作命令——处理数据

① 初始化

单总线上的所有处理均从初始化序列开始。初始化序列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。存在脉冲让总线控制器知道DS1820 在总线上且已准备好操作。

② ROM操作命令

一旦总线主机检测到从属器件的存在,它便可以发出器件ROM操作命令之一。所有ROM操作命令均为8位长。这些命令列表如下:

Read ROM(读ROM)[33h]

此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下可以使用。如果总线上存在多于一个的从属器件,那么当所有从片企图同时发送时将发生数据冲突的现象(漏极开路会产生线与的结果)。

Match ROM( 符合ROM)[55h]

此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。只有与64位ROM序列严格相符的DS18B20才能对后继的存贮器操作命令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此命令在总线上有单个或多个器件的情况下均可使用。

Skip ROM( 跳过ROM )[CCh]

在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。如果在总线上存在多于一个的从属器件而且在Skip ROM命令之后发出读命令,那么由于多个从片同时发送数据,会在总线上发生数据冲突(漏极开路下拉会产生线与的效果)。

Search ROM( 搜索ROM)[F0h]

当系统开始工作时,总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。

Alarm Search(告警搜索)[ECh]

此命令的流程与搜索ROM命令相同。但是,仅在最近一次温度测量出现告警的情况下,DS18B20才对此命令作出响应。告警的条件定义为温度高于TH 或低于TL。只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值或者改变TH或TL的设置,使得测量值再一次位于允许的范围之内。贮存在EEPROM内的触发器值用于告警。

③ 存储器操作命令

Write Scratchpad(写暂存存储器)[4Eh]

这个命令向DS18B20的暂存器中写入数据,开始位置在地址2。接下来写入的两个字节将被存到暂存器中的地址位置2和3。可以在任何时刻发出复位命令来中止写入。

Read Scratchpad(读暂存存储器)[BEh]

这个命令读取暂存器的内容。读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。

Copy Scratchpad(复制暂存存储器)[48h]

这条命令把暂存器的内容拷贝到DS18B20的E2存储器里,即把温度报警触发字节存入非易失性存储器里。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又正在忙于把暂存器拷贝到E2存储器,DS18B20就会输出一个“0”,如果拷贝结束的话,DS18B20 则输出“1”。如果使用寄生电源,总线控制器必须在这条命令发出后立即起动强上拉并最少保持10ms。

Convert T(温度变换)[44h]

这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS18B20保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。

Recall E2(重新调整E2)[B8h]

这条命令把贮存在E2中温度触发器的值重新调至暂存存储器。这种重新调出的操作在对DS18B20上电时也自动发生,因此只要器件一上电,暂存存储器内就有了有效的数据。在这条命令发出之后,对于所发出的第一个读数据时间片,器件会输出温度转换忙的标识:“0”=忙,“1”=准备就绪。

Read Power Supply(读电源)[B4h]

对于在此命令发送至DS18B20之后所发出的第一读数据的时间片,器件都会给出其电源方式的信号:“0”=寄生电源供电,“1”=外部电源供电。

④ 处理数据

DS18B20的高速暂存存储器由9个字节组成,其分配如图3所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。

  

                                                                    

DS18B20温度数据表

上表是DS18B20温度采集转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于或等于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

温度转换计算方法举例:

例如当DS18B20采集到+125℃的实际温度后,输出为07D0H,则:

实际温度=07D0H╳0.0625=2000╳0.0625=1250C。

例如当DS18B20采集到-55℃的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则:

实际温度=370H╳0.0625=880╳0.0625=550C。

六、软件设计

     系统程序主要包括主程序、读出温度子程序、温度转换子程序、计算温度子程序、显示等等。

1.主程序

主要功能是完成DS18B20的初始化工作,并进行读温度,将温度转化成为压缩BCD码

并在显示器上显示传感器所测得的实际温度。

2.读出温度子程序

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

3.温度转换命令子程序

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

4.计算温度子程序

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

图1 主程序流程图

图2读出温度子程序流程图

图3 温度转换命令子程序流程图

图4 计算温度子程序流程图

完整程序如下:

;温度传感器18B20采用器件默认的12位转化,最大转化时间要750毫秒

;内存分配声明

TEMPER_L  EQU   31H             ;用于保存读出温度的低字节

TEMPER_H  EQU   30H             ;用于保存读出温度的高字节

T_DF      EQU   33H             ;FORMAT后的小数部分(decimal fraction),半字节的温度小数(存在低四位)

T_INTEGER EQU   32H             ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节

FLAG    BIT     20H             ;标志位

DAT     BIT     P1.4            ;DS18B20数据线

;------------------------------主函数开始-----------------------------

        ORG     0000H

        AJMP    MAIN

        ORG     0030H

MAIN:

        CLR     EA              ;使用DS18B20一定要禁止中断

        MOV     SP,#60H

        MOV     T_DF,#00H       ;赋初始温度为30度

        MOV     T_INTEGER,#30H

START:  LCALL   GET_TEMPER      ;调用读温度子程序

        LCALL   T_FORMAT        ;将读出的2字节温度格式化,并转换为压缩BCD码

        LCALL   DISPLAY         ;显示温度

        AJMP    START

;-----------------------DS18B20的温度转换子程序-----------------------

GET_TEMPER:

        LCALL   Set_18B20

        MOV     A,#0CCH         ;跳过ROM匹配

        LCALL   WRITE_1820

        MOV     A,#44H          ;发出温度转换命令

        LCALL   WRITE_1820

        LCALL   DISPLAY         ;用显示温度(持续1s左右)来等待AD转换结束,12位的话要转换750ms

        LCALL   Set_18B20       ;准备读温度前先初始化

        MOV     A,#0CCH         ;跳过ROM匹配

        LCALL   WRITE_1820

        MOV     A,#0BEH         ;发出读温度命令

        LCALL   WRITE_1820

        LCALL   READ_1820       

        RET

;--------------------------DS18B20初始化程序--------------------------

Set_18B20:

        SETB    DAT

        NOP

        CLR     DAT

        MOV     R2,#250         ;主机发出延时500微秒的复位低脉冲

        DJNZ    R2,$

        SETB    DAT             ;然后拉高数据线

        MOV     R2,#30

        DJNZ    R2,$            ;延时60us等待DS18B20回应

        JNB     DAT,INIT1

        JMP     Set_18B20       ;超时而没有响应,重新初始化

INIT1:  MOV     R2,#120

        DJNZ    R2,$            ;延时240us

        JB      DAT,INIT2       ;数据变高,初始化成功

        JMP     Set_18B20

INIT2:  MOV     R2,#240

        DJNZ    R2,$

        RET

;-----------------写DS18B20的子程序(有具体的时序要求)-----------------

WRITE_1820:

        MOV     R2,#8           ;一共8位数据

WR0:    CLR     DAT

        MOV     R3,#6

        DJNZ    R3,$

        RRC     A

        MOV     DAT,C

        MOV     R3,#20

        DJNZ    R3,$

        SETB    DAT

        NOP

        NOP

        DJNZ    R2,WR0

        SETB    DAT

        RET

;------读DS18B20的程序,从DS18B20中读出两个字节的温度数据--------------------------

READ_1820:

        MOV     R4,#2           ;将温度高位和低位从DS18B20中读出

        MOV     R1,#TEMPER_L    ;低位存入31H(TEMPER_L)

RE0:    MOV     R2,#8

RE1:    SETB    DAT

        NOP

        NOP

        CLR     DAT

        NOP

        NOP

        SETB    DAT

        MOV     R3,#4

        DJNZ    R3,$

        MOV     C,DAT

        RRC     A

        MOV     R3,#30

        DJNZ    R3,$

        DJNZ    R2,RE1

        MOV     @R1,A

        DEC     R1              ;高位存入30H(TEMPER_H)

        DJNZ    R4,RE0

        RET

;----------整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------

T_FORMAT:

        MOV     A,#0FH

        ANL     A,TEMPER_L

        MOV     T_DF,A          ;获得小数部分(4位)

        MOV     A,TEMPER_L

        SWAP    A

        MOV     @R0,A

        MOV     A,TEMPER_H

        SWAP    A

        XCHD    A,@R0

        MOV     T_INTEGER,A     ;获得整数部分(1字节)

TO_BCD: MOV     A,T_INTEGER

        MOV     B,#10

        DIV     AB

        SWAP    A

        ADD     A,B

        MOV     T_INTEGER,A     ;整数部分压缩BCD码送T_INTEGER

        MOV     A,T_DF

        MOV     B,#10

        MUL     AB

        MOV     B,#16

        DIV     AB

        MOV     R2,A            ;暂存R2

        MOV     A, B

        MOV     B,#10

        MUL     AB

        MOV     B,#16

        DIV     AB

        MOV     B,A

        MOV     A,R2

        SWAP    A

        ADD     A,B

        MOV     T_DF,A          ;小数部分压缩BCD码送T_DF

        RET

;---------------------------显示温度子程序----------------------------

DISPLAY:MOV     R1,#250

DISP1:  MOV     A,T_INTEGER

        MOV     R3,#01H

        MOV     R4,#02H

        SETB    FLAG

DISP2:  CPL     FLAG

        MOV     B,#10H

        DIV     AB

        MOV     R2,A            ;高位送R2暂存

        MOV     DPTR,#3FFFH     ;字位口

        MOV     A,R3

        MOVX    @DPTR,A         ;送字位

        MOV     A,R2            ;字型R2送A

        MOV     DPTR,#TAB       ;表首地址送DPTR

        MOVC    A,@A+DPTR       ;查表

        MOV     DPTR,#5FFFH     ;字型口

        MOVX    @DPTR,A         ;送字型

        CALL    D1MS            ;延时

        MOV     A,#0FFH

        MOVX    @DPTR,A         ;关闭字型显示

        MOV     R2,B            ;低位送R2暂存

        MOV     DPTR,#3FFFH     ;字位口

        MOV     A,R4

        MOVX    @DPTR,A         ;送字位

        MOV     A,R2            ;字型R2送A

        MOV     DPTR,#TAB       ;表首地址送DPTR

        MOVC    A,@A+DPTR       ;查表

        JNB     FLAG,D1

        JMP     D2

D1:     ANL     A,#7FH

D2:     MOV     DPTR,#5FFFH     ;字型口

        MOVX    @DPTR,A         ;送字型

        CALL    D1MS            ;延时

        MOV     A,#0FFH

        MOVX    @DPTR,A         ;关闭字型显示

        MOV     A,T_DF

        MOV     R3,#04H

        MOV     R4,#08H

        JNB     FLAG,DISP2

        DJNZ    R1,DISP1

        RET

;-------------------------1mS延时(按12MHZ算)--------------------------

D1MS:   MOV     R7,#250

LOOP0:  NOP

        NOP

        DJNZ    R7,LOOP0

        RET

;-------------------------共阳数码管对应字型表-------------------------

TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H  ;段码表

        ;   0    1    2     3   4   5   6    7   对应内容

        DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH

        ;   8   9   A    B   C   D    E   F

END

5.  设计体会与致谢

通过这次基于DS18B20传感器测量温度的设计,作为一个团队,我们学到了不少新的知识。首先,这次设计让我把书本上学到的理论知识转化成为现实生活中有价值的实物。如果没有这次设计为我 们搭建的平台,我们就不能对书本上的知识进行很好的理解,也不能熟练的把它们应用到现实生活中。同时,这次设计加强了我们独立思考的能力。一个好的设计需要通过我们不断的思维,不断的改善。经过设计之后,我们不像以前那样,遇到问题都不愿意独立思考,只会一味的向别人求助。现在,我们会通过自己的思考,解决我们自己遇到的问题和困难。还有,我们学会不能手高眼低,要踏踏实实,从基础学起、做起。一开始我们通过讨论,初步有了设计的方案,觉得还是比较简单的。但是,具体到设计时,我们遇到了很多麻烦,比如如何将传感器得到的温度转换成为对应的电信号,如何将电信号输送到单片机进行控制,如何把测得的温度用数字显示出来等等。这就要求我们学习要一步一个脚印,掌握扎实的理论基础了。最重要的一点是,我们在这次设计中培养了自己的学习能力。由于好多知识超出了我们的课本范围,这就要求我们自己通过查资料来增加我们的知识,解决遇到的一些问题。在短时间内从书本资料中筛选出我们所需要的知识,对我们的自主学习能力有很大的帮助。就拿DS18B20来说,我们书本上没有介绍到这种温度传感器,所以我们就通过学习DS18B20的说明书,了解它工作的原理以及特性,并弄清楚在实际应用时要注意的事项,对DS18B20进行初始化、编程的要求和规定等。培养了自主学习的能力,无论以后我们要做什么样的设计,我们都能够通过查阅资料来实现。最后,本次设计能够顺利完成,我要特别感谢实验室老师给予的大力支持和热心帮助。   

参考文献

【1】   梁森,欧阳三泰,王侃夫. 自动检测技术及应用【M】.北京:机械工业出版社,2009.

【2】   高洪志.  MCS-51单片机原理及应用技术教程【M】北京:人民邮电出版社,2009.

【3】   李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998

【4】   李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994

【5】   康华光.数字电子技术基础(第四版). 北京:高等教育出版社,1989

6.  附录

电路仿真图

相关推荐