基于DS18B20的数字温度计的毕业设计

 

 

 

 

 

毕业设计论文

 

题目  基于单片机的DS18B20数字温度计    电话13812281034            

 

 

                电子信息工程系             

      专业  应用电子                         

      姓名 王水浪          班级 电子061      

指导教师   孙玲   职称   讲师      

设计时间  2008-11-17——2008-12-20       

 

 

 

            

 

 

 

1 设计要求

基本范围-50-110

精度误差小于0.5

LED数码直读显示

 

 

数字温度计

 

摘要

随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。

关键词单片机,数字控制,温度计, DS18B20AT89C2051

中图分类号: TP311                      文献标识码: A

 

1 引言

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机STC89C51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。

2 总体设计方案

2.1数字温度计设计方案论证

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

2.2方案的总体设计框图

温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3LED数码管以串口传送数据实现温度显示。

单片机复位位

时钟振荡

报警点按键调

文本框: 主   控   制  器 文本框: LED显 示 文本框: 温 度 传 感 器  


 

 

 

 

 

 

 

1 总体设计方框图

2.2.1 主控制器

单片机AT89C2051具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。

2.2.2 显示电路

显示电路采用3位共阳LED数码管,从P3RXD,TXD串口输出段码

2.2.3温度传感器

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下

●独特的单线接口仅需要一个端口引脚进行通信;

●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;

●无须外部器件;

●可通过数据线供电,电压范围为3.0~5.5V;

●零待机功耗;

●温度以9或12位数字;

●用户可定义报警设置;

●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

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

DS18B20采用3脚PR35封装或8脚SOIC封装,其内部结构框图如图2所示。

C

 

 

 

64

ROM

线

 

 

 

高速缓存

存储器与控制逻辑

温度传感器

高温触发器TH

低温触发器TL

配置寄存器

8CRC发生器

Vdd

           

 

I/O

 

 

 

 

 

 

 

 

 

 

 

 

 


2 DS18B20内部结构

64ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器TH和TL,可通过软件写入户报警上下限。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图3所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。

温度  LSB

温度  MSB

TH用户字节1

TL用户字节2

配置寄存器

保留

保留

保留

CRC



 

 

 

 

 

 

 

 

 

3  DS18B20字节定义

由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。

高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。

DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB形式表示。

当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。

1 DS18B20温度转换时间表

 

DS18B20完成温度转换后,就把测得的温度值与RAM中的THTL字节内容作比较。若T>THTTL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。

64ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20CRC值作比较,以判断主机收到的ROM数据是否正确。

DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。

2 一部分温度对应值表

温度/

二进制表示

十六进制表示

+125

0000 0111    1101 0000

07D0H

+85

0000 0101    0101 0000

0550H

+25.0625

0000 0001    1001 0000

0191H

+10.125

0000 0000    1010 0001

00A2H

+0.5

0000 0000    0000 0010

0008H

0

0000 0000    0000 1000

0000H

-0.5

1111 1111    1111 0000

FFF8H

-10.125

1111 1111    0101 1110

FF5EH

-25.0625

1111 1110    0110 1111

FE6FH

-55

1111 1100    1001 0000

FC90H

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


4  DS18B20与单片机的接口电路

 

2.3 DS18B20温度传感器与单片机的接口电路

 

DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B201脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,如图4 所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。

DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。

2.4 系统整体硬件电路

2.4.1 主板电路

系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主板电路等,如图5 所示。

5中有三个独立式按键可以分别调整温度计的上下限报警设置, LED数码管将没有被测温度值显示,从而测出被测的温度值。

    5 中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。

2.4.2 显示电路

    显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少,只用p3口的RXD,TXD,串口的发送和接收,四只数码管采用74LS164右移寄存器驱动,显示比较清晰。

                                   

5 单片机主板电路

6 温度显示电路

3系统软件算法分析

系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。

3.1主程序

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

Y

DS18B20复位命令

发跳过ROM命令

发读取温度命令

读取操作,CRC校验

9字节完?

CRC校验正?确?

移入温度暂存器

结束 

N

N

Y

 


初始化

调用显示子程序

1S到?

初次上电

读出温度值温度计算处理显示数据刷新

发温度转换开始命令

N

Y

N

Y

                                                                           

 

 

 

 

 

                                              

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                

 

 

7 主程序流程图                                                                       8读温度流程图

                               

 

3.2读出温度子程序

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

 

DS18B20复位命令

发跳过ROM命令

发温度转换开始命令

  结束

 

 

 

 

 

 

 

 

 

 

9 温度转换流程图

3.3温度转换命令子程序

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

3.4 计算温度子程序

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

 

  开始

温度零下?

温度值取补码置“—”标志

计算小数位温度BCD

计算整数位温度BCD

  结束

置“+”标志

N

Y

                                                                           

温度数据移入显示寄存器

十位数0

百位数0

十位数显示符号百位数不显示

百位数显示数据(不显示符号)

  结束

N

N

Y

Y

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

         10 计算温度流程图                 11 显示数据刷新流程图

 

3.5 显示数据刷新子程序

显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图11

4.调式及性能分析

系统的调式以程序调试为主

硬件调试比较简单,首先检查电路的焊接是否正确,然后可用万用表测试或通电检测

软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序,读出温度程序子程序.温度转换命令子程序,计算温度子程序和显示刷新子程序等的编程及调试

由于DS18B20与单片机采用的是串行通信 ,因此,DS18B20进行读/写是必须严格保证读/写时序;是否将无法读取测量结果.本程序采用单片机汇编,WAVE3.2编程并调试.

性能测试可用制作温度计和已有的成品温度计同时进行观察比较.由于DS18B20的灵敏度很高,所以误差指标可以限制在+0.5度到-0.5度以内.DS18B20温度计还可以在高低温报警,远距离多点测温控制等方面进行应用和开发,但在实际设计中应注意下面问题:

(1)                    DS18B20工作电流高达1.5mA,总线上挂接点较多且进行转换时要考虑增加总线驱动,可以用单片机端口在温度转换时道统一个MOSFET供电.

(2)                    连接DS18B20的总线电缆事实有长度限制的,因此在用DS18B20进行长距离测温系统时,要充分考虑总线的分布电容和阻抗的匹配问题.

 

5.控制源程序清单

1.    1单片机汇编源程序清单

DS18B20温度计

采用4LED供阳显示器显示测温值,显示精度0.1,测温范围-55--+125,AT89CC2051单片机,12MHz晶振

**********************常数定义*************************/

TIMEL      EQU   0EOH              ;20ms,定时器0时间常数

TIMEL      EQU   0B1H

TEMPHEAD   EQU   36H

**********************工作内存定义*******************

BITST      DATA   20H

TIME1SOK   BIT    BITST.1

TEMPONEOK  BIT    BITST.2

TEMPL      DATA   26H

TEMPH      DATA   27H

TEMPHC     DATA   28H

TEMPLC     DATA   29H

*********************引脚定义**************************

TEMPDIN    DATA   P3.7

********************中段向量区*************************

          ORG     0000H

          LJMP    START

ORG       0OBH

LJMP       T0IT

*********************系统初始化**********

          ORG       100H

START:    MOV       SP,#60H

CLSMEM:   MOV       R0,#20H

          MOV       R1,#60H

CLSMEM1:  MOV       @R0,#00H

          INC       R0

          DJNZ      R1,CLSMEM1

          MOV       TMOD,#00100001B

          MOV       TH0,#TIMEL

          MOV       TL0,#TIMEH

          SJMP      INIT

ERROR:    NOP

          LJMP      START

          NOP

          NOP

          SETB        ET0

          SETB        TR0

          MOV         PSW,#00H

          CLR         TEMPONEOK

          LJMP        MAIN

定时器0中断服务程序

TOIT:     PUSH        PSW

          MOV         PSW,#10H

          MOV         TH0,#TIMEH

          MOV         TL0,#TIMEL

          INC         R7

          CJNE          R7,#32H,T0IT1

          MOV           R7,00H

          SETB          TIME1SOK;1秒定时到标志

 T0IT1:     POP           PSW

            RETI

               主程序

*******************************************************

MAIN:      LCALL          DISP1    ;调用显示子程序

           JNB            TEMPONEOK ;  MAIN2

           CLR            TIME1SOK  ;测温每秒一次

JNB            TEMPONEOK  ; MAIN2;上电时先温度转换一次

LCALL          READTEMP1  ;读出温度值子程序

LCALL          CONVTEMP  ;温度BCD码计算处理子程序

LCALL          DISPBCD ;显示区BCD码温度值刷新子程序

LCALL          DISP1;秒闪烁一次

MAIN2:      LCALL          READTEMP;温度转换开始

LJMP           MAIN

子程序区

***************复位DE18B20**********************

   INITDS18B20:  SETB           TEMPDIN

                 NOP

                 NOP

                 CLR           TEMPDIN

                 MOV            R6,#0AOH

                 DJNZ          R6,$

SETB         TEMPDIN

                 MOV          R6,#32H

                 DJNZ          R6 ,$

                 MOV           R6 ,#3CH

  LOOP1820:      MOV        C,TEMPDIN

                 JC         INNITDS1820OUT

                 DJNZ       R6,LOOP1820

                 MOV         R6,#064H

                 DJNZ        R6,$

                 SJMP        INITDS1820

                 RET

INITDS1820OUT:   SETB        TEMPIN

RET

*********DS18B30的程序,DS18B20中读一个数据*******

READDS1820:     MOV           R7,#08H

SETB          TEMPDIN

NOP

NOP

READDS1820LOOP: CLR          TEMPDIN

                NOP

                NOP

                NOP

                SETB           TEMPDIN

                MOV            R6,#07H

                DJNZ          R6,$

                MOV            C,TEMPDIN

                MOV            R6 ,#3CH

                DJNZ           R6,$

RRC           A

SETB             TEMPDIN

DJNZ           R7,READDS1820LOOP

MOV            R6,$

RET

************DS18B20的程序,DS18B20中写一个数据**

WRITEDS1820:    MOV            R7,#08H

                SETB           TEMPDIN

                NOP

                NOP

WRITEDS1820LOP: CLR             TEMPDIN

                MOV             R6,#07H

                DJNZ            R6,$

                RRC              A

MOV             TEMPDIN,C

MOV               R6,#34H

DJNZ             R6,$

SETB            TEMPDIN

DJNZ            R7,WRITEDS1820LOP

RET

***************TEMP*************************

READTEMP:       LCALL           INITDS1820

MOV             A,#0CCH

LCALL           WRITEDS1820

MOV             R6,$

MOV             A,#44H

LCALL            WRITEDS1820

MOV            R6,#34H

DJNZ            R6,$

RET

READTEMP1:      LCALL            INITDS1820

MOV            A,#0CCH

LCALL          WRITEDS1820

MOV          R6,#34H

DJNZ           R6,$

MOV           A,#0BEH

LCALL             WRITEDS1820

MOV               R6,#34H

DJNZ                  R6,$

MOV               R5,#09H

MOV                R0,#TEMPHEAD

MOV                B ,#00H

READTEMP2:     LCALL           READTEMP2

MOV               @R0,A

INC              R0

READTEMP21:    LCALL               CRC8CAL

DJNZ              R5,READTEMP2

MOV                A,B

JNZ             READTEMPOUT

MOV               A,TEMPHEAD+0

MOV              TEMPL  ,A

MOV              A,TEMPHEAD+1

MOV              TEMPH,A

READTEMPOUT:  RET

************************处理温度BCD码子程序**************

CONVTEMP:     MOV      A,TEMPH

ANL       A,#80H

JZ          TEMPC1

CLR                  C

MOV         A,TEMPL

CPL         A

ADD         A,#01H

MOV         TEMP  ,A

MOV         A,TEMP

CPL         A   

ADDC       A,#00H

MOV         TEMP,A

MOV         TEMPHC ,#0BH

SJMP        TEMPC11

TEMPC1:       MOV         TEMPC,#OAH

TEMPC11:      MOV         A,TEMPHC

              SWAP      A

MOV         TEMPHC,A

MOV           A,TEMPL

ANL          A,#0FH

MOV         DPTR,#TEMPDOTTAB

MOVC         A,@A+DPTR

MOV          TEMPLC ,A

MOV            A,TEMPL

ANL         A,#0FOH

SWAP         A

MOV          TEMPL,A

MOV          A,TEMPH

ORL        A,#0FH

SWAP           A

LCALL         HEX2BCD1

MOV        TEMPL,A

ANL         A,#0F0H

ANL          A,#OFOH

SWAP        A

ORL          A,TEMPHC

MOV        TEMP,A

MOV       A,TEMP

ANL         A,#0FH

SWAP         A

ORL    A,TEMPC

MOV      TEMPLC,A

MOV    A,R7

JZ     TEMPC12

ANL    A,#OFH

SWAP   A

MOV      R7,A

MOV         A,TEMPHC

ANL     A,#OFH

ORL       A,R7

MOV      TEMPHC,A

TEMPC12:      RET

*******************小数部分码表**********************

TEMPDOTTAB:   DB   00H,01H,02H,03H,04H,05H,06H,07H,06H,08H,09H

*******************显示区BCD码温度值刷新子程序************

 DISPBCD:      MOV     A,TEMPLC

ANL     A,#OFH

MOV     70H,A

MOV     A,TEMPLC

SWAP  A

ANL    A,#0FH

MOV     71H,A

MOV    A,TEMPHC

ANL    A,#0F0H

MOV     72H ,A

MOV     A,TEMPHC

SWAP   A

ANL      A,#0FH

MOV      73H ,A

MOV    A,TEMPHC

ANL       A,#0F0H

CJNE    A,#01H,DISPBCD

SJMP     DISPBCD2

DISPBCD0:      MOV       A,TEMPHC

ANL        A,#0F0H

JNZ       DISPBCD2

MOV      A,TEMPHC

SWAP     A

ANL      A,#0FH

MOV     73H,#0AH

MOV     72H  ,A

DISPBCD2:    RET

显示子程序

显示数据在70H73H,4LED供阳数码管显示,P1口输出端码数据,P3口作扫描控制,每个数码管亮1秒时间再循环

DISP1:        MOV     R1,#70H

MOV    R5,#0FEH

PLAY:         MOV    P1,#OFEH

MOV    A,R5

MOV   P3,A

MOV   A,@R1

MOV     DPTR,#TAB

MOVC    A,@A+DPTR

MOV    P1,A

MOV   A ,R5

JB     ACC.1,LOOP5

CLR    P1.7

LOOP5:        LCALL     DL1MS

              INC    R1

MOV          A,R5

JNB     ACC.3,ENDOUT

RL     A

MOV    R5,A

 AJMP   PLAY

ENEOUT:       MOV       P3 ,#0FFH

RET

TAB:        DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH

DL1MS:        MOV  R6,#14H

DL1:          MOV   R7,#19H

DL2:          DJNZ        R7,DL2

              DJNZ     R6,DL1

RET

单字节十六进制BCD

CRC8CAL:      PUSH   ACC

              MOV    R7,#08H

CRC8LOOP1:    XRL   A,B

              RRC    A

             MOV  A,B

JNC      CRC8LOOP2

XRL    A,#18H

CRC8LOOP2:   RRC   A

MOV   B,A

  POP   ACC

RR  A

PUSH   ACC 

DJNZ    R7,CRC8LOOP1

POP   ACC

RET

END

 

 

 

6总结与体会

    经过将近三月的毕业设计,终于完成了我的数字温度计的设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,高兴之余不得不深思呀!

在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是16进制的数直接加减,显示处理时在用除法去删分

从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

 

 

 

参考文献

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

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

[3] 阎石.数字电子技术基础(第三版). 北京:高等教育出版社,1989

[4] 廖常初.现场总线概述J.电工技术,1999.

 

你可能感兴趣的:(基于DS18B20的数字温度计的毕业设计)