K型热电偶温度控制实验

   K型热电偶测温实验

一、实验目的:

了解K型热电偶的特性与应用

二、实验仪器:

智能调节仪、PT100、K型热电偶、温度源、温度传感器实验模块。

三、实验原理:

热电偶传感器的工作原理

热电偶是一种使用最多的温度传感器,它的原理是基于1821年发现的塞贝克效应,即两种不同的导体或半导体A或B组成一个回路,其两端相互连接,只要两节点处的温度不同,一端温度为T,另一端温度为T0,则回路中就有电流产生,见图33-1(a),即回路中存在电动势,该电动势被称为热电势。

                 图33-1(a)                          图33-1(b)          

两种不同导体或半导体的组合被称为热电偶。

当回路断开时,在断开处a,b之间便有一电动势ET,其极性和量值与回路中的热电势一致,见图33-1(b),并规定在冷端,当电流由A流向B时,称A为正极,B为负极。实验表明,当ET较小时,热电势ET与温度差T-T0成正比,即

            ET=SABT-T0                                         (1)

SAB为塞贝克系数,又称为热电势率,它是热电偶的最重要的特征量,其符号和大小取决于热电极材料的相对特性。

热电偶的基本定律:

(1)均质导体定律   

由一种均质导体组成的闭合回路,不论导体的截面积和长度如何,也不论各处的温度分布如何,都不能产生热电势。

(2)中间导体定律  

用两种金属导体A,B组成热电偶测量时,在测温回路中必须通过连接导线接入仪表测量温差电势EABTT0,而这些导体材料和热电偶导体A,B的材料往往并不相同。在这种引入了中间导体的情况下,回路中的温差电势是否发生变化呢?热电偶中间导体定律指出:在热电偶回路中,只要中间导体C两端温度相同,那么接入中间导体C对热电偶回路总热电势EABTT0没有影响。

(3)中间温度定律   

如图33-2所示,热电偶的两个结点温度为T1T2时,热电势为EABT1T2;两结点温度为T2T3时,热电势为EABT2T3,那么当两结点温度为T1T3时的热电势则为

EABT1T2+ EABT2T3=EABT1T3                     (2)

式(2)就是中间温度定律的表达式。譬如:T1=100℃,T2=40℃,T3=0℃,则

EAB10040+EAB400=EAB1000                    (3)

图33-2

热电偶的分度号

热电偶的分度号是其分度表的代号(一般用大写字母S、R、B、K、E、J、T、N表示)。它是在热电偶的参考端为0℃的条件下,以列表的形式表示热电势与测量端温度的关系。

四、实验内容与步骤

    1.重复实验二十九,将温度控制在500C,在另一个温度传感器插孔中插入K型热电偶温度传感器。

2.将±15V直流稳压电源接入温度传感器实验模块中。温度传感器实验模块的输出Uo2接主控台直流电压表。

3.将温度传感器模

块上差动放大器的输入

端Ui短接,调节Rw3

到最大位置,再调节电

位器Rw4使直流电压

表显示为零。

4.拿掉短路线,按

图33-3接线,并将K型

热电偶的两根引线,热

端(红色)接a,冷端

(绿色)接b;记下模块输出Uo2的电压值。     图33-3

5.改变温度源的温度每隔50C记下Uo2的输出值。直到温度升至1200C。并将实验结果填入下表

                                        表33-1

五、实验报告

      1.根据表33-1的实验数据,作出UO2-T曲线,分析K型热电偶的温度特性曲线,计算其非线性误差。      

2.根据中间温度定律和K型热电偶分度表,用平均值计算出差动放大器的放大倍数A。

 

第二篇:基于单片机的热电偶冷端温度控制论文

  

基于单片机的热电偶冷端温度补偿设计

摘要:热电偶的冷端温度控制系统以AT89C51单片机为中心控制器件,主要由温度传感模块,A/D转换放大模块,单片机编程模块,显示模块等部分组成。温度信号由热电偶采集,经MAX6675进行冷端补偿并放大,然后送入单片机内。显示部分由“人机交互界面”的1602液晶显示,增加可读性。该系统具备较高的测量精度,能较好的完成设计要求。

Thermocouple cold end temperature control system based on AT89C51 single chip microcomputer as the central control device, mainly by the temperature sensing module, A / D conversion amplification module, MCU programming module, display module and other components. The temperature signal acquisition by thermocouple cold end compensation, by MAX6675 and amplification, and then into the single chip computer. The display section by" interface" of the 1602 liquid crystal display, increase readability. The system has higher accuracy, and better able to complete the design requirements.

 

1.引言…………………………………………………………………………………

设计任务及要求…………………………………………………………………

设计方案…………………………………………………………………………

2.1各模块的电路的方案选择及论证…………………………………………

2.1.1温度采集及控制模块……………………………………………………

2.1.2 主机控制模块…………………………………………………………

2. 1. 3显示模块…………………………………………………………………………

2.2系统各模块的最终案……………………………………………………………

3.功能模块设计和参数计算…………………………………………………………

   3.1温度采集及控制部分……………………………………………………

   3.2 单片机控制部分 ……………………………………………………

   3.3 数字显示部分 …………………………………………………

4.软件设计 …………………………………………………………………

4.1主程序………………………………………………………………

  4.2 液晶显示模块………………………………………………………

5.系统测试及结果分析…………………………………………………………

5.1实用仪器及型号 ………………………………………………………

5.2.2温度数据采集测试记录 ……………………………………………

6.总结 ………………………………………………………………………………

参考文献……………………………………………………………………………

1. 引言

热电偶在热处理炉温控制,航空发动机排气温度点检等100~1300摄氏度高温度测量领域有着广泛的应用,测量精度意义重大。K型热电偶是工业生产中被广泛应用的廉价高温传感器。但由于:①产生的信号很微弱(仅约40μV/℃),需要精密放大器对其进行放大;②按0℃分度,冷端在非0℃情况下需进行温度补偿;③输出的信号为模拟信号,欲与单片机等数字电路接口时须进行A/D转换。因此,以往的热电偶测温电路比较复杂、成本高、精度低,而且容易遭受干扰。MAXIM公司新近开发出一种K型热电偶信号转换器(IC)MAX6675,该转换器集信号放大、冷端补偿、A/D转换于一体,直接输出温度的数字信号,使温度测量的前端电路变得十分简单。

1.设计任务及要求

    设计一个热电偶冷端自动补偿温度控制系统,冷端在非0℃情况下需进行温度补偿。采集的热电势经MAX667送入单片机,然后在显示器上显示现场的温度。

2.系统设计方案

   该系统以AT89C51单片机为中心控制器件,主要由温度传感模块,A/D转换放大模块,单片机编程模块,显示模块,控制模块等部分组成,如图2.1

图2.1  系统基本模块方框图

2.1各模块电路的方案选择及论证

2.1.1温度采集及控制模块

方案一:k型热电偶与MAX6775结合进行冷端温度补偿及温度的采集。电路简单、可靠性高、抗干扰性强 。

方案二:采用热敏电阻。选用此类元件的优点价格便宜,但由于热敏电阻的非线性特性会带来较大的误差。

方案三:使用带有A/D(模数转换)单片集成的DS18B20传感器。DS18B20数字温度计是DALLAS公司生产的即单总线器件,无需其他外加电路,直接输出数字量。可直接与单片机通信,读取测温数据。具有线路简单,性能稳定体积小的特点。但DS18B20的程序较复杂,且时序时间较苛刻,不便于书写程序。

比较以上方案,结合设计精度要求最小区分度为1℃,所以选择方案一。

2.1.2主机控制模块

    方案一:采用FPGA作为系统控制器。FPGA功能强大,可实现各种复杂的逻辑功能,规模大,密度高,它将所有器件集成在一块芯片上,可以减少体积,提高稳定性,并且可用EDA软件仿真、调试,易于进行功能扩展,但成本较高。由于本设计对数据的处理速度本不高,FPGA的高速处理优势得不到充分体现,且引脚较多,

方案二:采用模拟放大器组成的PID控制系统。对于温度控制系统是足够的。但要附加显示,温度设置等功能,附加电路较多,且反应速度慢。

方案三:采用AT89C51单片机作为控制器。单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑功能。本身带有定时/计数器,可以用来定时、计数,并且具有功耗低、体积小、技术成熟和成本低等优点。

基于以上分析,拟定方案三,由AT89C51作为主机控制部分。

2.1.3显示模块

方案一:采用三个LED八段数码管分别显示温度的十位、个位和小数位。数码管具有低能耗,低损耗,寿命长,耐老化,对外界环境要求低。但LED八度数码管引脚排列不规则,动态显示时要加驱动电路,硬件电路复杂。

方案二:采用可以显示字幕的1602液晶显示屏。1602液晶显示屏(LCD)具有功耗低、轻薄短小无辐射危险,平面显示及影像稳定,不闪烁,可视面积大,画面效果好,抗干扰能力强。同时,编程容易,且具有多种功能:光标显示、画面移位、睡眠模式,增加可读性,降低功耗。

2.2系统各模块的最终方案

根据以上分析,结合器件和设备等因素,确定如下方案:

1.采用AT89C51单片机作为控制器,分别对温度采集、LCD显示。

2.温度测量模块采用R\热电偶与MAX6775相结合可实现冷端温度补偿高分辨率测量

3.显示用液晶显示屏显示实时温度值。

3.功能模块设计和参数计算

3.1温度采集与控制部分

系统的信号采样和转换电路主要由热电偶与MAX6775组成。

(1)MAX6675内部电路构成、性能

 MAX6675的内部由精密运算放大器、基准电源、冷端补偿二极管、模拟开关、数字控制器及ADC电路构成,完成热电偶微弱信号的放大、冷端补偿和A/D转换功能。MAX6675采用8脚SO形式封装,图1为引脚排列图,T+接K型热电偶的正极(镍铬合金),T-接K型热电偶的负极(镍硅合金或镍铝合金);片选信号端CS为高电平时启动温度转换,低电平时允许数据输出;SCK为时钟输入端;SO为数据输出端,温度转换后的12位数据由该脚以SPI方式输出。

(1)GND接地端                          (2) T- K型热电偶负极                                      

(3) T+ K型热电偶正极                      (4) VCC 正电源端                       

(5) SCK 串行时钟输入                      (6) CS 片选端,CS为低时、启动串行接口  

(7) SO 串行数据输出 (8 )N.C. 空引脚

2)温度变化

MAX6675内部具有将热电偶信号转换为与ADC输入通道兼容电压的信号调节放大器,T+和T-输入端连接到低噪声放大器A1,以保证检测输入的高精度,同时使热电偶连接导线与干扰源隔离。热电偶输出的热电势经低噪声放大器A1放大,再经过A2电压跟随器缓冲后,被送至ADC的输入端。在将温度电压值转换为相等价的温度值之前,它需要对热电偶的冷端温度进行补偿,冷端温度即是MAX6675周围温度与0℃实际参考值之间的差值。对于K型热电偶,电压变化率为41μV/℃,电压可由线性公式Vout=(41μV/℃)×(tR-tAMB)来近似热电偶的特性。上式中,Vout为热电偶输出电压(mV),tR是测量点温度;tAMB是周围温度

3冷端补偿

热电偶的功能是检测热、冷两端温度的差值,热电偶热节点温度可在0℃~+1023.75℃范围变化。冷端即安装MAX6675的电路板周围温度,比温度在-20℃~+85℃范围内变化。当冷端温度波动时,MAX6675仍能精确检测热端的温度变化。MAX6675是通过冷端补偿检测和校正周围温度变化的。该器件可将周围温度通过内部的温度检测二极管转换为温度补偿电压,为了产生实际热电偶温度测量值,MAX6675从热电偶的输出和检测二极管的输出测量电压。该器件内部电路将二极管电压和热电偶电压送到ADC中转换,以计算热电偶的热端温度。当热电偶的冷端与芯片温度相等时,MAX6675可获得最佳的测量精度。因此在实际测温应用时,应尽量避免在MAX6675附近放置发热器件或元件,因为这样会造成冷端误差。

(4) 与单片机的通讯

  MAX6675采用标准的SPI串行外设总线与单片机接口。MAX6675从SPI串行接口输出数据的过程如下:单片机使CS置为低电平,并提供时钟信号给SCK,由SO读取测量结果。CS变低将停止任何转换过程,CS变高将启动一个新的转换过程。将CS变低在SO端输出第一个数据,一个完整串行接口读操作需16个时钟周期,在时钟的下降沿读16个输出位,第1个输出位是D15,是一伪标志位,并总为0;D14位到D3位为以MSB到LSB顺序排列的转换温度值;D2位平时为低,当热电偶输入开放时为高,开放热电偶检测电路完全由MAX6675实现,为开放热电偶检测器操作,T-必须接地,并使接地点尽可能接近GND脚;D1位为低以提供MAX6675器件身份码,D0位为三态标志位。  

  MAX6675 SO端输出温度数据的格式如图3所示。

  

5噪声补偿

MAX6675的测量精度对电源耦合噪声较敏感。为降低电源噪声影响,可在MAX6675的电源引脚附近接入1只0.1μF陶瓷旁路电容。


(6)SPI串行接口

MAX6675采用标准的SPI串行外设总线与MCU接口,且MAX6675只能作为从设备。MAX6675 SO端输出温度数据的格式如图3所示,MAX6675 SPI接口时序如图4所示。MAX6675从SPI串行接口输出数据的过程如下:MCU使CS变低并提供时钟信号给SCK,由SO读取测量结果。CS变低将停止任何转换过程;CS变高将启动一个新的转换过程。一个完整串行接口读操作需16个时钟周期,在时钟的下降沿读16个输出位,第1位和第15位是一伪标志位,并总为0;第14位到第3位为以MSB到LSB顺序排列的转换温度值;第2位平时为低,当热电偶输入开放时为高,开放热电偶检测电路完全由MAX6675实现,为开放热电偶检测器操作,T-必须接地,并使能地点尽可能接近GND脚;第1位为低以提供MAX6675器件身份码,第0位为三态。

3.2 单片机控制部分

此部分是电路的核心部分,系统的控制采用了单片机AT89C51。单片机AT89C51内部有8KB单元的程序存储器及256字节的数据存储器。因此系统不必扩展外部程序存储器和数据存储器这样大大的减少了系统硬件部分。

图3.2单片机控制电路

3.4数字显示部分
    在设计显示电路时,我们使用单片机AT89C51作为电路控制的核心,单片机AT89C51具有一个全双工的串行口,利用此串行口能够方便的实现系统的控制和显示功能。

3.4 数字显示部分

4.软件设计

  程序设计采用了模块化思想,有一个主程序,两个应用程序,即温度采集程序、液晶显示程序。

4.1主程序

主程序首先进行系统初始化,对显示模块进行必要的初始化,设置系统显示界面。其次就是温度值的读取、显示。如图4.1:

温度采集流程

4.2 液晶显示模快

液晶显示模块主要完成人机交换界面的显示及系统相关的操作指示。具体能显示当前的温度值、预设值、控制功能(预设值加1、减1图标)。流程如图4.2:

图 4.2 液晶显示流程图

4.3 温度读取

单片机读取MAX6675转换来的温度信息二进制代码值,并依据电路原理及相关计算公式,将包含温度信息的二进制代码转化成相应的十进制温度值。

5.系统测试及结果分析

5.1实用仪器及型号

K型热电偶、MAX6675

5.2测试数据结果

在本系统中,温度数据的采集是最重要的部分,数据的准确度将直接影响到系统的可靠性。在测试的时候选用北师大的数字温度计2602作为基准温度。测试并记录数据如表一。

表一 温度数据采集测试记录

由上表可知,低温测量的时候实际温度与系统温度的误差在1℃以内。综上所述此测温方法可以满足系统的需要。

6.总结

MAX6675将热电偶测温应用时复杂的线性化、冷端补偿及数字化输出等集中在一个芯片上解决,简化了热电偶测温电路的设计,实际运行结果表明,该测温系统抗干扰能力强、结构简单、可靠性高,测量精度满足要求。因此,在基于微处理器的单片机嵌入式工业测温系统中,由MAX6675构成的单片热电偶测温解决方案,具有良好的实用价值。在本次系统设计中遇到了很多困难,最后在老师的帮助、队友的配合下,最终得以解决,通过思考,更加深了对单片机的认识和了解。

参考文献

[1] 张毅刚.单片机原理及应用[M].高等教育出版社, 2003.

[2]高吉祥.全国大学生电子设计竞赛培训系列教程模拟电子线路设计[M].北京:电子工业出版社,2007.5

黄智伟.全国大学生电子设计竞赛训练教程[M].北京:电子工业出版社,2005

[4]陈杰,黄鸿.传感器与检测技术[M].北京:高等教育出版社,2008

[5]翟玉文等.电子设计与实践[M].北京:北京中国电力出版社,2005

[6] 肖忠祥.数据采集原理[M].西安:西北工业出版社,2002

[7] 余锡存,曹国华.单片机原理及接口技术西安:西安电子科技大学出版社,2004

[8]谭浩强.C程序设计(第三版)[M].北京:清华大学出版社,2005

Zhang Yigang [ 1]. Single chip microcomputer principle and application [ M ]. Higher education press, 2003

Gao Jixiang [ 2]. The National Undergraduate Electronic Design Contest Training Series Course of analog electronic circuit design [ M]. Beijing: Publishing House of electronics industry, 2007.5

Huang Zhiwei. The National Undergraduate Electronic Design Contest Training Tutorial [M ]. Beijing: Publishing House of electronics industry, 2005

[4 ] Chen Jie, Huang Hong. The sensor and detection technology [ M]. Beijing: Higher Education Press, 2008

Zhai Yuwen [5 ]. Electronic design and practice [M ]. Beijing: Beijing China Electric Power Press, 2005

[6 ] Xiao Zhongxiang. Data acquisition theory [M]. Xi'an: Northwest Industry Press, 2002

[7 ] Yu Xicun, Cao Guohua. The SCM theory and interface technology, Xi'an: Xi'an Electronic and Science University press, 2004

[8 ] Tan Haoqiang C program design ( Third Edition ) [ M]. Beijing: Tsinghua University press, 2005

附件1:程序设计

温度采集程序

 ;温度值读取程序

  ;位定义

  CS   BIT P1.0    ;数据输入

  SCK     BIT P1.1    ;片选

  SO   BIT P1.2    ;时钟

  ;数据字节定义

  DATAH    DATA   40H  ;读取数据高位

  DATAL    DATA   41H   ;读取数据低位

  TDATAH  DATA   42H    ;温度高位

  TDATAL  DATA   43H    ;温度低位

  CLR     CS          ;CS低电平,停止数据转换,输出数据D15

  CLR     CLK        ;时钟置为低电平

  MOV     R7,  #08H

  RD_DATAH:             ;读数据高位字节D15-D8

  MOV        C,SO    ;读SO端数据

  RLC     A       ;累加器左移一位

  SETB    SCK

  NOP

  CLR     SCK

  DJNZ    R7,RD_DATA  

  MOV        DATAH,A   ;将数据高位移入缓冲区

  MOV     R7,#08H

  RD_DATAL:               ;读数据低位字节D7-D0

  MOV     C,SO    ;读SO端数据

  RLC        A       ;累加器左移一位

  SETB       SCK

  NOP

  CLR        SCK

  DJNZ       R7,RD_DATAL

  MOV        DATAL,A ;将数据低位移入缓冲区

  SETB        CS   ;CS高电平,停止数据输出,启动新的数据转换;数据转换子程序,将读得的16位数据转换为12位温度值,去掉无用的位

  MOV     A,DATAL 

  RLC     A      

  MOV     DATAL,A

  MOV     A,DATAH

  RLC     A       ;整个数据位左移一位,去掉D15位

  SWAP A       ;将DATAH中的高低4位数据互换

  MOV     B,A    ;数据暂存于B中

  ANL     A,#0FH   ;得到温度数据高位字节部分D14 ~D11

  MOV     TDATAH,A ;将温度值高位字节保存

  MOV     A,B

  ANL     A,#0F0H  ;得到温度数据低位字节部分D10 ~D7

  MOV     B,A   

  MOV     A,DATAL  ;

  ANL     A,#0FH   ;得到温度数据低位字节部分D6 ~D3

  ORL     A,B    ;合并的温度低位字节

  MOV     TDATAL,A ;将温度值低位字节保存  

LED显示程序

                   RS EQU P2.0

                   RW EQU P2.1

                   E  EQU P2.2

                  LDATA EQU P1

                   ORG 0000H

                   AJMP MAIN

                   ORG 0030H

             MAIN: MOV R0,#00H     ;R0:每行显示字符的个数

                   MOV R1,#80H     ;寄存器地址

                   MOV A,#38H      ;设置显示(16×2)                 

                   ACALL WIR      

                   MOV A,#0EH      ;开显示,显示光标,光标不闪烁

                   ACALL WIR

                   MOV A,#06H      ;整屏显示不移动

                   ACALL WIR

                   MOV A,#01H      ;显示清屏

                   ACALL WIR

                   MOV DPTR,#LCD

            LOOP0: MOV A,R1        ;写地址

                   ACALL WIR

                   INC R1          ;地址加一

                   CJNE R1,#90H,TT  ;判断第一行写完没有

                   MOV R1,#0C0H     ;若写完,R1=第二行地址

            TT:    MOV A,R0

                   MOVC A,@A+DPTR

                   ACALL WDR        

                   INC R0           ;计数R0加1

                   LCALL DELAY1

                   CJNE R0,#20H,LOOP0  ;R1不等于32则继续

            RE:    AJMP RE

              WIR: ACALL BUSY         ;写指令寄存器子程序

                   CLR E              ;初始化

                   CLR RS

                   CLR RW

                   SETB E

                   MOV LDATA,A

                   CLR E

                   RET

             WDR:  ACALL BUSY         ;写数据寄存器子程序

                   CLR E

                   SETB RS

                   CLR RW

                   SETB E

                   MOV LDATA,A

                   CLR E

                   RET

            BUSY:  PUSH ACC             ;检测忙信号子程序

            ISBUSY:CLR E

                   CLR RS

                   SETB RW

                   SETB E

                   MOV A,LDATA

                   JB ACC.7,ISBUSY     ;ACC.7=1,说明忙

                   POP ACC

                   ACALL DELAY1

                   RET

            DELAY1:MOV R6,#5          ;延时子程序

               D0: MOV R7,#248

                   DJNZ R7,$

                   DJNZ R6,D0

                   RET

            DELAY2:MOV R5,#2

             D1:   MOV R3,#245

             D2:   MOV R4,#245

                   DJNZ R4,$

                   DJNZ R3,D2

                   DJNZ R5,D1

                   RET

            LCD:DB '   MCS-51 TEST  '  

                     DB '   Xu Rui Feng  '

                END

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^7;//ds18b20与单片机连接口

sbit RS=P3^0;

sbit RW=P3^1;

sbit EN=P3^2;

unsigned char code str1[]={"temperature: "};

unsigned char code str2[]={"              "};

uchar data disdata[5];

uint tvalue;//温度值

uchar tflag;//温度正负标志

/*************************lcd1602程序**************************/

void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)

{unsigned int i,j;

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

    for(j=0;j<100;j++);

}

void wr_com(unsigned char com)//写指令//

{ delay1ms(1);

   RS=0;

   RW=0;

   EN=0;

   P2=com;

   delay1ms(1);

   EN=1;

   delay1ms(1);

   EN=0;

}

void wr_dat(unsigned char dat)//写数据//

{ delay1ms(1);;

   RS=1;

   RW=0;

   EN=0;

   P2=dat;

   delay1ms(1);

   EN=1;

   delay1ms(1);

   EN=0;

}

void lcd_init()//初始化设置//

{delay1ms(15);

wr_com(0x38);delay1ms(5);

   wr_com(0x08);delay1ms(5);

    wr_com(0x01);delay1ms(5);

     wr_com(0x06);delay1ms(5);

      wr_com(0x0c);delay1ms(5);

}

void display(unsigned char *p)//显示//

{

while(*p!='\0')

{

wr_dat(*p);

p++;

delay1ms(1);

}

}

init_play()//初始化显示

{ lcd_init();

    wr_com(0x80);

display(str1);

wr_com(0xc0);

display(str2);

   }

/******************************ds1820程序***************************************/

void delay_18B20(unsigned int i)//延时1微秒

{

   while(i--);

}

void ds1820rst()/*ds1820复位*/

{ unsigned char x=0;

DQ = 1;          //DQ复位

delay_18B20(4); //延时

DQ = 0;          //DQ拉低

delay_18B20(100); //精确延时大于480us

DQ = 1;          //拉高

delay_18B20(40);

   }

   uchar ds1820rd()/*读数据*/

{ unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{   DQ = 0; //给脉冲信号

    dat>>=1;

    DQ = 1; //给脉冲信号

    if(DQ)

    dat|=0x80;

    delay_18B20(10);

}

   return(dat);

}

void ds1820wr(uchar wdata)/*写数据*/

{unsigned char i=0;

   for (i=8; i>0; i--)

   { DQ = 0;

     DQ = wdata&0x01;

     delay_18B20(10);

     DQ = 1;

     wdata>>=1;

   }

}

read_temp()/*读取温度值并转换*/

{uchar a,b;

ds1820rst();   

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0x44);//*启动温度转换*/

ds1820rst();   

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();

b=ds1820rd();

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

    if(tvalue<0x0fff)

   tflag=0;

    else

   {tvalue=~tvalue+1;

tflag=1;

   }

tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数

return(tvalue);

}

/*******************************************************************/

   void ds1820disp()//温度值显示

{ uchar flagdat;

   disdata[0]=tvalue/1000+0x30;//百位数

     disdata[1]=tvalue%1000/100+0x30;//十位数

     disdata[2]=tvalue%100/10+0x30;//个位数

     disdata[3]=tvalue%10+0x30;//小数位

   

     if(tflag==0)

     flagdat=0x20;//正温度不显示符号

     else

       flagdat=0x2d;//负温度显示负号:-

     if(disdata[0]==0x30)

    {disdata[0]=0x20;//如果百位为0,不显示

   if(disdata[1]==0x30)

    {disdata[1]=0x20;//如果百位为0,十位为0也不显示

    }

   }

    wr_com(0xc0);

   wr_dat(flagdat);//显示符号位

    wr_com(0xc1);

    wr_dat(disdata[0]);//显示百位

    wr_com(0xc2);

    wr_dat(disdata[1]);//显示十位

    wr_com(0xc3);

    wr_dat(disdata[2]);//显示个位

    wr_com(0xc4);

    wr_dat(0x2e);//显示小数点

    wr_com(0xc5);

    wr_dat(disdata[3]);//显示小数位

   }

/********************主程序***********************************/

void main()

{ init_play();//初始化显示

   while(1)

{read_temp();//读取温度

    ds1820disp();//显示

}

}

相关推荐