数字温度计设计报告

时间:2024.4.14

数字温度计设计报告

          

姓名:

班级:

学号:

指导教师:

            

              20## 年 6 月 27日

         数字温度计报警实训报告  

   

     随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术, 本文主要介绍了一个基于89c51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感器DS18B20的数据采集过程。对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示,使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。DS18B20与AT89c51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。 

                            实习目的

1. 了解数数字温度计及工作原理。

2. 进一步掌握数字温度计设计方法。

 

3. 进一步掌握各芯片的逻辑功能及使用方法。

 

4. 进一步掌握keil和仿真软件的应用。

5. 进一步熟悉集成电路的引脚安排。

                          温度传感器

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

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

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

●无须外部器件;

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

●零待机功耗;

●温度以9或12位数字;

●用户可定义报警设置;

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

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

 

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

    

     

 

                               图2 DS18B20内部结构

    64位ROM的结构开始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决定温度转换的精度位数,来设置分辨率。



图3  DS18B20字节定义

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

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

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

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

表1 DS18B20温度转换时间表

 

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

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

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

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

表2 一部分温度对应值表

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

              主板电路

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

                                    

图5 单片机主板电路

             温度计程序


#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit DQ = P3^6;

sbit beep = P3^7;

sbit Hled =   P1^4;

sbit Lled =    P1^5;

bit ds18b20_ok=1;//18b20正常标志

bit halarm=0,lalarm=0;      //高低温警报标志

uint Time0_Count=0;

char tempvalaue_hl[2]={70,-20};

uchar CurrentT=0;      //当前读取温度整数部分

uchar temp_value[]={0x00,0x00};//从18b20读取的温度

uchar display_digit[]={0,0,0,0};//待显示的的温度数位

uchar code DSY_CODE[] =

{

       0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00

};

uchar code df_Table[] =

{

0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9

};

/**********************延时函数**************/

void delay(uint m)

{

       while(m--);

}

/**********************初始化DS18b20**************/

uchar resetDS18B20()

{

      uchar flag;

       DQ=1;

       delay(8);

       DQ=0;

       delay(90);

       DQ=1;

       delay(8);

       flag=DQ;

       delay(100);

       return flag;

             

}

/**********************DS18b20读指令**************/

uchar ReadOnebyte()

{

       uchar i,dat=0;

       DQ=1;

       _nop_();

       for(i=0;i<8;i++)

       {

        DQ=0;

        dat>>=1;

        DQ=1;

       _nop_();

       _nop_();

       if(DQ)

       dat|=0x80;

       delay(30);

       DQ=1;

        

       }

       return dat;

}

/**********************DS18b20写指令**************/

void WriteOnebyte(uchar dat)

{

       uchar i;

       for(i=0;i<8;i++)

       {

              DQ=0;

              DQ=dat&0x01;

              delay(5);

              DQ=1;

              dat>>=1;

            

       }

}

/**********************读取温度**************/

void Read_Temperature()

{

       if(resetDS18B20() == 1 )

          ds18b20_ok=0;  //有问题

          else

          {

                 WriteOnebyte(0xcc);

                     WriteOnebyte(0x44);

                     resetDS18B20();

                     WriteOnebyte(0xcc);

                     WriteOnebyte(0xbe);

                     temp_value[0]=ReadOnebyte();

                     temp_value[1]=ReadOnebyte();

                     tempvalaue_hl[0]=ReadOnebyte();

                     tempvalaue_hl[1]=ReadOnebyte();

                     ds18b20_ok=1;

          }

}

/**********************设置温度报警**************/

void Set_Alarm_Temp_Value()

{

       resetDS18B20();

       WriteOnebyte(0xcc);

       WriteOnebyte(0x4e);

       WriteOnebyte(tempvalaue_hl[0]);    //高八位

       WriteOnebyte(tempvalaue_hl[1]);    //低八位

       WriteOnebyte(0x7f);

       resetDS18B20();

       WriteOnebyte(0xcc);

       WriteOnebyte(0x48);

}

/**********************温度显示程序**************/

void Display_Temperature()

{

       uchar i;

       uchar t=150;

       uchar ng=0,np=0;

       char Signed_Current_Temp;

       if( (temp_value[1]&0xf8)==0xf8)

       {

              temp_value[1]=~temp_value[1];

              temp_value[0]=~temp_value[0]+1;

              if( temp_value[0]==0x00) temp_value[1]++;

              ng=1;

              np=0xfd;

       }

       //查表得到小数

       display_digit[0]=df_Table[temp_value[0]&0x0f];

       //zhengshubufen

       CurrentT=((temp_value[0]&0xf0)>>4)|((temp_value[1]&0x07)<<4);

       //有符号的温度值

       Signed_Current_Temp=ng? -CurrentT:CurrentT;

       //高低文警报

       halarm=Signed_Current_Temp>=tempvalaue_hl[0] ?1:0;

       lalarm=Signed_Current_Temp<=tempvalaue_hl[1] ?1:0;

//将整数部分分解为三位待显示数字

       display_digit[3]=CurrentT/100;

       display_digit[2]=CurrentT%100/10;

       display_digit[1]=CurrentT%10;

       if(display_digit[3]==0)

       {

              display_digit[3]=10;

              np=0xfe;

              if(display_digit[2]==0)

              {

                     display_digit[2]=10;

                     np=0xfd;

              }           

       }

       for(i=0;i<30;i++)

       {

              P0=DSY_CODE[display_digit[0]];

              P2=0xf7;

              delay(t);

              P2=0xff;

              P0=(DSY_CODE[display_digit[1]])|0x80;

              P2=0xfb;

              delay(t);

              P2=0xff;

              P0=DSY_CODE[display_digit[2]];

              P2=0xfd;

              delay(t);

              P2=0xff;

              P0=DSY_CODE[display_digit[3]];

              P2=0xfe;

              delay(t);

              P2=0xff;

              if(ng)//如果为负数则在调整后的位置显示—

              {

                    P0=0x40;

                     P2=np;

                     delay(t);

                     P2=0xff;

              }

       }

}

/**********************zhuchengxu**************/

void main (void)

{

       IE=0x82;

       TMOD=0x01;

       TH0=-1000/256;

       TL0=-1000%256;

       TR0=0;

       Hled=1;

       Lled=1;

       Set_Alarm_Temp_Value();

       Read_Temperature();

       delay(50000);

       delay(50000);

       while(1)

       {

              Read_Temperature();

              if(ds18b20_ok)

              {

                     if(halarm==1||lalarm==1)

                     TR0=1;

                     else

                     TR0=0;

                     Display_Temperature();

              }

              else

              {

                    P0=P2=0x00;

              }

       }

}

/**********************报警中断服务程序******/

void T0_INT() interrupt 1

{

       TH0=-1000/256;

       TL0=-1000%256;

       beep=!beep;

       if(++Time0_Count==400)

       {

              Time0_Count=0;

              if(halarm)

              Hled=~Hled;

              else Hled=1;

             

              if(lalarm)

              Lled=~Lled;

              else Lled=1;


       }

}


                       主程序

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

 

                                                                           

                                              

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

                                

 

                  读出温度子程序

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

图9 温度转换流程图

                

                   心得与体会 

经过一周的单片机课程设计,终于完成了我们的数字温度计课程设计,虽  然课程设计做的不是特别好,但从心底里说,还是高兴的,因为我们收获了很多很多,这些在平常的学习当中是收获不到的,但高兴之余不得不静下来深思!

 在本次课程设计的过程中,让我学到了很多、长进了很多,单片机课程设计的重点在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过一些程序,但觉的要写好一个程序并不是一件简单的事,所以我们只能不断的调试不断的修改才能把程写的更好。所以得出结论是:有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握,实践才是硬道理,实践是检验真理的唯一标准。

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

通过这次对数字温度计的设计与制作,让我们了解了设计电路的程序,也让我们了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全一样,因为,在实际接线中有着各种各样的条件制约着。并且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。

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

更多相关推荐:
数字温度计设计报告

数字温度计设计报告课程名称院别专业班级姓名指导教师时间20xx电子课程设计武警工程学院指挥自动化二队一区队王凯03田腾浩邹涛年1月12日23主要内容设计一个数字温度计测量范围0100C温度的实时LED数字显示测...

数字温度计报告 含有设计原理图

皖西学院机电学院电子信息科学与技术课程设计报告书摘要随着时代的进步和发展单片机技术已经普及到我们生活工作科研各个领域已经成为一种比较成熟的技术本文主要介绍了一个基于89S51单片机的测温系统详细描述了利用数字温...

数字温度计设计与总结报告

数字温度计A2题设计与总结报告专科组陈春梁福鑫钟才莉摘要随着时代的进步和发展单片机技术已经普及到我们生活工作科研等各个领域已经成为一种比较成熟的技术本设计在参阅了大量前人设计的数字温度计的基础上利用单片机技术结...

单片机数字温度计设计报告

单片机课程设计报告数字温度计学号班级姓名指导教师20xx年9月3日1设计要求基本范围50110精度误差小于05LED数码直读显示2扩展功能实现语音报数可以任意设定温度的上下限报警功能2数字温度计摘要随着时代的进...

数字温度计设计实验报告

数字电子综合性实验报告题目数字温度计学院电气工程与自动化班级姓名学号指导教师一实验任务温度计是工农业生产及科学研究中最常用的测量仪表本课题要求用中小规模集成芯片设计并制作一数字式温度计即用数字显示被测温度具体要...

数字温度计设计报告

单片机原理与应用技术课程设计报告论文基于单片机控制的数字温度计专业班级应教121姓名董镇玉时间20xx19指导教师宋长源李晓娟20xx年01月09日单片机课程设计项目系列基于单片机控制的数字温度计一设计要求一基...

数字温度计设计报告

常熟理工学院电气与自动化工程学院课程设计用纸前言根据在常熟理工这半年对于自动化专业的学习尤其是电工学自动控制原理以及电力电子技术等专业课程的学习让我对于设计数字温度计打下了基础对于我们自动化专业来讲这个专业对于...

数字温度计课程设计报告

数字温度计课程设计报告1课题说明随着现代信息技术的飞速发展和传统工业改造的逐步实现能够独立工作的温度检测和显示系统应用于诸多领域传统的温度检测以热敏电阻为温度敏感元件热敏电阻的成本低但需后续信号处理电路而且可靠...

数字温度计设计实训报告

西安航空职业技术学院小系统设计实训报告论文题目智能温度计所属系部电子工程系指导教师潘晶莹学生姓名谭晓辉学号0920xx26程创学号0920xx04专业电子信息工程技术西安航空职业技术学院制智能温度计西安航空职业...

数字温度计设计报告【C语言】

1设计概况11设计概述本设计所介绍的数字温度计与传统的温度计相比具有读数方便测温范围广测温准确其输出温度采用数字显示主要用于对测温比较准确的场所或科研实验室使用该设计控制器使用单片机AT89C52测温传感器使用...

简易数字温度计设计报告

24V交流单相在线式不间断电源摘要本文设计了一款输出24V交流单相在线式不间断电源设计中采用正弦波单相逆变电源控制芯片U3990F650作为主控芯片采用Boost升压电路对输入电压升压使逆变之前的电压维持在40...

数字温度计设计报告

课程名称题目数字温度计学院信息工程系电子信息工程专业电子信息工程班级电子113学号学生姓名起讫日期指导教师系分管主任王玉皞审核日期一绪论随着时代的发展控制智能化仪器小型化功耗微量化得到广泛关注单片机控制系统无疑...

数字温度计设计报告(38篇)