DS18B20单总线多点式测温系统资料讲解

合集下载

十三.DS18B20 测量温度系统

十三.DS18B20 测量温度系统

十三.DS18B20 测量温度系统[实验任务]用一片DS18B20 构成测温系统,测量的温度精度达到0.1 度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。

[硬件电路图][实验原理]DS18B20 数字温度计是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。

DS18B20 产品的特点(1)、只要求一个I/O口即可实现通信。

(2)、在DS18B20中的每个器件上都有独一无二的序列号。

(3)、实际应用中不需要外部任何元器件即可实现测温。

(4)、测量温度范围在-55。

C到+125。

C之间。

(5)、数字温度计的分辨率用户可以从9位到12位选择。

(6)、内部有温度上、下限告警设置。

DS18B20详细引脚功能描述1 GND地信号;2 DQ数据输入/输出引脚。

开漏单总线接口引脚。

当被用着在寄生电源下,也可以向器件提供电源;3 VDD可选择的VDD引脚。

当工作于寄生电源时,此引脚必须接地。

DS18B20的使用方法。

由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。

DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。

该协议定义了几种信号的时序:初始化时序、读时序、写时序。

所有时序都是将主机作为主设备,单总线器件作为从设备。

而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。

数据和命令的传输都是低位在先。

[C语言源程序]#include<reg52.h>code unsigned char seg7code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //显示段码void Delay(unsigned int tc) //显示延时程序{while( tc != 0 ){unsigned int i;for(i=0; i<100; i++);tc--;}}sbit TMDAT =P3^1; //DS18B20 的数据输入/输出脚DQ,根据情况设定unsigned int sdata;//测量到的温度的整数部分unsigned char xiaoshu1;//小数第一位unsigned char xiaoshu2;//小数第二位unsigned char xiaoshu;//两位小数bit fg=1; //温度正负标志void dmsec (unsigned int count) //延时部分{unsigned char i;while(count--){for(i=0;i<115;i++);}}void tmreset (void) //发送复位{unsigned char i;TMDAT=0; for(i=0;i<103;i++);TMDAT = 1; for(i=0;i<4;i++);}bit tmrbit (void) //读一位//{unsigned int i;bit dat;TMDAT = 0;i++;TMDAT = 1;i++; i++; //微量延时//dat = TMDAT;for(i=0;i<8;i++);return (dat);}unsigned char tmrbyte (void) //读一个字节{unsigned char i,j,dat;dat = 0;for (i=1;i<=8;i++){ j = tmrbit(); dat = (j << 7) | (dat >> 1); } return (dat);}void tmwbyte (unsigned char dat) //写一个字节{unsigned char j,i;bit testb;for (j=1;j<=8;j++){ testb = dat & 0x01;dat = dat >> 1;if (testb){ TMDAT = 0; //写0i++; i++;TMDAT = 1;for(i=0;i<8;i++); }else{ TMDAT = 0; //写0for(i=0;i<8;i++);TMDAT = 1;i++; i++;}}}void tmstart (void) //发送ds1820 开始转换{ tmreset(); //复位dmsec(1); //延时tmwbyte(0xcc); //跳过序列号命令tmwbyte(0x44); //发转换命令44H,}void tmrtemp (void) //读取温度{unsigned char a,b;tmreset (); //复位dmsec (1); //延时tmwbyte (0xcc); //跳过序列号命令tmwbyte (0xbe); //发送读取命令a = tmrbyte (); //读取低位温度b = tmrbyte (); //读取高位温度if(b>0x7f) //最高位为1 时温度是负{a=~a; b=~b+1; //补码转换,取反加一fg=0; //读取温度为负时fg=0}sdata = a/16+b*16; //整数部分xiaoshu1 = (a&0x0f)*10/16; //小数第一位xiaoshu2 = (a&0x0f)*100/16%10;//小数xiaoshu=xiaoshu1*10+xiaoshu2; //小数}void DS18B20PRO(void){ tmstart();//dmsec(5); //如果是不断地读取的话可以不延tmrtemp(); //读取温度,执行完毕温度将存于}void Led(){if(fg==1) //温度为正时显示的数据{ P2=P2&0xef;P0=seg7code[sdata/10]; //输Delay(8); P2=P2|0xf0; P2=P2&0xdf;P0=seg7code[sdata%10]|0x80; //输出个Delay(8); P2=P2|0xf0; P2=P2&0xbf;P0=seg7code[xiaoshu1]; //输出小数点Delay(8); P2=P2|0xf0; P2=P2&0x7f;P0=seg7code[xiaoshu2]; //输出小Delay(4); P2=P2|0xf0;}if(fg==0) //温度为负时显示的数据{ P2=P2&0xef;P0=seg7code[11]; //负号Delay(8); P2=P2|0xf0; P2=P2&0xdf;P0=seg7code[sdata/10]|0x80; //输出十位Delay(8); P2=P2|0xf0; P2=P2&0xbf;P0=seg7code[sdata%10]; //输出个位Delay(8); P2=P2|0xf0; P2=P2&0x7f; P0=seg7code[xiaoshu1]; //输出小Delay(4); P2=P2|0xf0;}}main(){fg=1;while(1){DS18B20PRO(); Led();}}。

18B20单总线多点式测温系统设计

18B20单总线多点式测温系统设计

18B20单总线多点式测温系统设计1.DS18B20的概述1.1,DSl8B20的外部管脚及特点DS18B20可编程温度传感器有3个管脚。

GND为接地线,DQ为数据输入输出接口,通过一个较弱的上拉电阻与单片机相连。

VDD为电源接口,既可由数据线提供电源,又可由外部提供电源,范围3.O~5.5 V。

本文使用外部电源供电。

主要特点有:1. 用户可自设定报警上下限温度值。

2. 不需要外部组件,能测量-55~+125℃范围内的温度。

3. -10℃~ +85℃范围内的测温准确度为±0.5℃。

4. 通过编程可实现9~l2位的数字读数方式,可在至多750 ms内将温度转换成12 位的数字,测温分辨率可达0.0625℃。

5. 独特的单总线接口方式,与微处理器连接时仅需要一条线即可实现与微处理器双向通讯。

1.2 DS18B20的内部结构DS18B20内部功能模块如图2所示,主要由4部分组成:64位光刻R0M(图3)、温度传感器、非易失性的温度报警触发器TH和TL、配置寄存器。

R0M 中的64位序列号是出厂前被光刻好的,他可以看作是该DSISB20的地址序列码,每个DSI8B20的64位序列号均不相同。

高低温报警触发器TH 和TL,配置寄存器均由一个字节的E2PROM组成,使用一个存储器功能命令可对TH,TL或配置寄存器写入。

配置寄存器中R1,R0决定温度转换的精度位数:R1R0=’00’,9位精度,最大转换时间为93.75 ms;R1R0 = ‘01’,10位精度,最大转换时间为187.5 ms;R1R0 = ‘10’,11位精度,最大转换时间为375 ms;R1R0 =’11’,12位精度,最大转换时间为750 ms;未编程时默认为12位精度。

本系统采用的也是12位的精度。

1.3,DS18B20的内存结构DSI8B20温度传感器的内部存储器包括一个高速暂存RAM (便笺式的内部存储器)和一个非易失性的可电擦除的EEPROM,后者存放高温和低温触发器TH,TL和结构寄存器。

多点测温DS18B20

多点测温DS18B20
}
Void delay( unsigned int i) { while (i--); }
(2)读一字节程序 Unsigned char ReadByte() { Unsigned char i,value=0; for (i=0;i<8;i++) { DQ= 0; value>>= 1; DQ = 1; if (DQ ==1) value=value| 0x80; delay (5); } return (value); }
}
19 18
X1 X2
AT89S52
2.0℃~+85℃范围内.可确保测量误差不 超过±0.5℃;在-55℃~+125℃范围内,其测量误差不超过 ±2℃。 (2) DS18B20内置64位经过激光修正的ROM.出厂前作为唯 一的产品序号存入ROM中。构成大型温控系统时,允许在单总 线上挂接多个DS18B20,理论上可挂接264个。 (3) DS18B20可分别设定各路温度的上、下限并写入RAM 中.并能迅速识别出温度越限的器件。 (4)采用Dallas公司独特的“单总线”专有技术,通过串 行口(I/O)直接输出所测温度值。
读温度
Unsigned int ReadTemp() {
unsigned char TempH,TempL; unsigned int temp; ConvertAD ( ); delay(100000);//需要延时700ms Initial(); WriteByte(0xcc); writeByte(0xbe); TempL = ReadByte(); TempH = ReadByte(); temp= TempL+TempH*256; return (temp);

DS18B20温度传感器资料

DS18B20温度传感器资料

DS18B20 单线温度传感器一.特征:●独特的单线接口,只需 1 个接口引脚即可通信●每个设备都有一个唯一的64位串行代码存储在光盘片上●多点能力使分布式温度检测应用得以简化●不需要外部部件●可以从数据线供电,电源电压范围为3.0V至5.5V●测量范围从-55 ° C至+125 ° C(-67 ° F至257 ° F),从-10℃至+85 ° C的精度为0.5 °C●温度计分辨率是用户可选择的9至12位●转换12位数字的最长时间是750ms●用户可定义的非易失性的温度告警设置●告警搜索命令识别和寻址温度在编定的极限之外的器件(温度告警情况)●采用8引脚SO(150mil),8引脚SOP和3引脚TO - 92封装●软件与DS1822兼容●应用范围包括恒温控制工业系统消费类产品温度计或任何热敏系统二.简介该DS18B20的数字温度计提供9至12位的摄氏温度测量,并具有与非易失性用户可编程上限和下限报警功能。

信息单线接口送入 DS1820 或从 DS1820 送出,因此按照定义只需要一条数据线(和地线)与中央微处理器进行通信。

它的测温范围从-55 °C到 +125 ° C,其中从-10 °C至+85 °C可以精确到0.5°C 。

此外,DS18B20可以从数据线直接供电(“寄生电源”),从而消除了供应需要一个外部电源。

每个 DS18B20 的有一个唯一的64位序列码,它允许多个DS18B20s的功能在同一1-巴士线。

因此,用一个微处理器控制大面积分布的许多DS18B20s是非常简单的。

此特性的应用范围包括 HVAC、环境控制、建筑物、设备或机械内的温度检测以及过程监视和控制系统。

三.综述64位ROM存储设备的独特序号。

存贮器包含2个字节的温度寄存器,它存储来自温度传感器的数字输出。

此外,暂存器可以访问的1个字节的上下限温度告警触发器(TH和TL)和1个字节的配置寄存器。

DS18B20的工作原理

DS18B20的工作原理

DS18B20的工作原理DS18B20是一种数字温度传感器,采用单总线接口通信,具有高精度、低功耗和可靠性强的特点。

它广泛应用于温度测量领域,例如室内温度监控、气象观测、工业自动化等。

DS18B20传感器的工作原理如下:1. 温度测量原理:DS18B20采用基于半导体的温度测量原理,利用温度对半导体材料电阻值的影响来测量温度。

它内部集成为了温度传感器和模数转换器,能够将温度转换为数字信号输出。

2. 单总线通信:DS18B20传感器采用单总线通信方式,即通过一个数据线进行数据传输和控制。

这种通信方式使得传感器的连接更加简单,只需一个数据线和一个电源线即可。

3. 工作原理:DS18B20传感器的工作原理基于温度对半导体材料电阻值的影响。

传感器内部有一个温度传感器和一个模数转换器。

当传感器接收到读取温度的指令时,它会测量温度并将其转换为数字信号。

具体的工作流程如下:- 主控设备发送启动信号,将总线拉低一段时间;- 主控设备释放总线,等待传感器的响应;- 传感器检测到总线被拉低后,开始工作;- 传感器将温度数据转换为数字信号,并通过总线发送给主控设备;- 主控设备接收到传感器发送的数据,并进行解析。

4. 温度测量精度:DS18B20传感器具有高精度的温度测量能力,可实现±0.5℃的测量精度。

它还具有可调节的分辨率,可以根据需要选择9位、10位、11位或者12位的分辨率。

5. 供电方式:DS18B20传感器可以通过总线路线供电,也可以通过外部电源供电。

通过总线供电时,传感器从总线路线获取所需的电能;通过外部电源供电时,传感器需要额外的电源路线提供电能。

总结:DS18B20传感器是一种基于半导体的数字温度传感器,采用单总线通信方式,具有高精度、低功耗和可靠性强的特点。

它的工作原理是利用温度对半导体材料电阻值的影响来测量温度,并通过单总线进行数据传输和控制。

DS18B20广泛应用于各种温度测量场景,为温度监测和控制提供了可靠的解决方案。

单总线温度传感器DS18B20简介

单总线温度传感器DS18B20简介

单总线温度传感器DS18B20简介DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。

它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

以上特点使DS18B20非常适用于远距离多点温度检测系统。

DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。

高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。

初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。

初始时,计数器1预置的是与-55℃相对应的一个预置值。

以后计数器1每一个循环的预置数都由斜率累加器提供。

为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。

计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。

ds18b20中文资料 (2)

ds18b20中文资料介绍DS18B20是一种数字温度传感器,由Maxim Integrated公司设计和制造。

它采用单总线接口和独特的数字编码技术,可直接测量环境温度。

DS18B20的小尺寸、低功耗和数字接口使其成为智能设备、电子设备和工业自动化等领域中广泛应用的理想选择。

特点1.单总线接口:DS18B20通过单一的总线进行数据传输和通信。

这种设计简化了电路连接,降低了硬件成本。

2.数字编码技术:DS18B20使用独特的数字编码技术将温度信息转换为12位二进制数据。

这种方式大大提高了测量的准确性和稳定性。

3.多种封装:DS18B20可提供不同的封装形式,包括TO-92,SOT-223和TDFN等,以适应不同的应用场景。

4.宽工作温度范围:DS18B20可在-55°C至+125°C的温度范围内工作,适应各种极端环境。

5.低功耗:DS18B20在测量温度时,功耗非常低,这对于电池供电的应用非常重要。

电气特性DS18B20的电气特性如下:•输入电压:3V至5.5V•测量范围:-55°C至+125°C•分辨率:可配置为9到12位•精度:±0.5°C(-10°C至+85°C范围内)•电流消耗:750μA(测量),千分之一微安(静态)•输出模式:数字•温度转换时间:750ms至10ms,取决于分辨率•封装形式:TO-92、SOT-223、TDFN等应用DS18B20广泛应用于以下领域:1.温度监控系统:DS18B20可以用于实时监测环境温度,例如室内温度、水温、土壤温度等。

这在农业、工业和家庭自动化等领域非常有用。

2.智能家居:DS18B20可用于智能恒温控制系统,通过检测室内温度并自动调节暖气、空调等设备,提供舒适的居住环境。

3.电子设备:DS18B20可用于电子设备的温度监测和保护。

例如,当电子元件过热时,可以触发警报或自动关闭设备以防止损坏。

DS18B20中文资料

DS18B20中文资料在现代电子技术领域,温度测量是一项非常重要的任务。

而DS18B20 作为一款常用的数字温度传感器,以其出色的性能和简单的接口,在各种温度测量应用中得到了广泛的应用。

DS18B20 是由美国达拉斯半导体公司(Dallas Semiconductor)推出的一款单线数字温度传感器。

它具有体积小、硬件开销低、抗干扰能力强、精度高等优点。

从外观上看,DS18B20 通常采用小型的TO-92 封装或者SOP 封装,这使得它能够轻松集成到各种电路中,占用极小的空间。

在性能方面,DS18B20 的测量范围非常广泛,从-55℃到+125℃,能够满足大多数实际应用场景的温度测量需求。

其测量精度在-10℃到+85℃范围内可达到 ±05℃,这对于很多对温度精度要求较高的场合来说,是非常出色的表现。

DS18B20 之所以能够在众多温度传感器中脱颖而出,很大程度上得益于其独特的单线接口。

这意味着它只需要一根数据线就可以与微控制器进行通信,大大简化了电路设计和布线工作。

在使用 DS18B20 进行温度测量时,首先需要将其正确连接到微控制器。

通常,将 DS18B20 的数据线连接到微控制器的一个通用输入输出引脚(GPIO)上。

然后,通过微控制器发送特定的指令来启动温度转换,并读取转换后的温度值。

DS18B20 的工作原理基于其内部的温度敏感元件和模数转换电路。

当接收到温度转换指令后,传感器内部的温度敏感元件会感知当前环境温度,并将其转换为对应的数字信号,然后通过单线接口传输给微控制器。

在编程方面,不同的微控制器平台可能会有一些差异,但基本的流程大致相同。

一般来说,需要先初始化单线接口,然后发送复位脉冲和搜索 ROM 指令来识别总线上的 DS18B20 设备。

接着,发送启动温度转换指令,并等待转换完成。

最后,读取转换后的温度数据,并进行相应的处理和显示。

为了确保测量的准确性和稳定性,在实际应用中还需要注意一些问题。

DS18B20资料



(3)发送存储器指令
DS18B20 的存储器指令集
现在我们要做的是让DS18B20进行一次温度的转换,那具体的操作就是: 1、主机先作个复位操作, 2、主机再写跳过ROM的操作(CCH)命令, 3、然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让 DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时 候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时 要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。 整个操作的总线状态如下图。
DS18B20管脚排列
DS18B20的管脚排列 1. GND为电源 地; 2. DQ为数字信号输入/输出 端; 3. VDD为外接供电电源输入端 (在寄生电源接线方式时接地,
寄生电源工作方式 (电源从IO口上获得)
注意:当温度高于 100℃ 时,不能使用寄生电源,因为此时 器件中较大的漏电流会使总线不能可靠检测高低电平,从而导致 数据传输误码率的增大。
DS18B20 单线通信功能是分时完成的,他有严格的时隙概念,如果出现序列混乱, 系统对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制 器控制 DS18B20 完成温度的转换必须经过以下 4 个步骤 : (1)每次读写前对 DS18B20 进行复位初始化。复位要求主 CPU 将数据线 下拉 500us ,然后释放, DS18B20 收到信号后等待 16us~60us 左右,然后发出 60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。 (2)发送一条 ROM 指令
unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat; //储存读出的一个字节数据 for (i=0;i<8;i++) {DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 _nop_(); //等待一个机器周期 DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++) ; //延时约6us,使主机在15us内采样 dat>>=1; if(DQ==1) dat|=0x80; //如果读到的数据是1,则将1存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十六进制数据 }

dallas DS18B20中文资料

报警搜索操作 DS1820 完成一次温度转换后,就拿温度值和存储在 TH 和 TL 中的值进行比较。因为这些寄存 器是 8 位的,所以 0.5℃位被忽略不计。TH 或 TL 的最高有效位直接对应 16 位温度寄存器的 符号位。如果测得的温度高于 TH 或低于 TL,器件内部就会置位一个报警标识。每进行一次 测温就对这个标识进行一次更新。当报警标识置位时,DS1820 会对报警搜索命令有反应。这 样就允许许多 DS1820 并联在一起同时测温,如果某个地方的温度超过了限定值,报警的器件 就会被立即识别出来并读取,而不用读未报警的器件。 64 位(激)光刻 ROM 每只 DS1820 都有一个唯一的长达 64 位的编码。最前面 8 位是单线系列编码(DS1820 的编码 是 19h)。下面 48 位是一个唯一的序列号。最后 8 位是以上 56 位的 CRC 码。(见图 5)64 位 ROM 和 ROM 操作控制区允许 DS1820 做为单线制器件并按照详述于“单线总线系统”一节的 单线协议工作。只有建立了 ROM 操作协议,才能对 DS1820 进行控制操作。这个协议用 ROM 操 作协议流程图来描述(图 6)。单线总线控制器必须得天独厚提供 5 个 ROM 操作命令其中之 一:1)Read ROM,2)Match ROM,3)Search Rom,4)Skip ROM,5)Alarm Search。成功 进行一次 ROM 操作后,就可以对 DS1820 进行特定的操作,总线控制器可以发出六个存储器和 控制操作命令中的任一个。
16 脚 SSOP PR35 符号
说明
9
1 GND 接地
8
2 DQ 数据输入/输出脚。对于单线操作:漏极开路(见“寄生电源”节)

7
3 VDD 可选的 VDD 引脚。具体接法见“寄生电源”节
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

D S18B20单总线多点式测温系统DS18B20单总线多点式测温系统1(2011-01-15 19:53:40)转载分类: DS18B20标签:ds18b20多点测量主文件:#include<reg51.h>#include<xuanze.h>unsigned int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39}; unsigned long t;void flcd_1602() //当为负温度时,液晶显示可以高位为0屏蔽.{init(0x80);write_data(0x4e);//NOinit(0x81);write_data(0x4f);init(0x82);write_data(0x80);init(0x85);write_data(0x74);//temperatureinit(0x86);write_data(0x65);init(0x87);write_data(0x6d);init(0x88);write_data(0x70);init(0x89);write_data(0x65);init(0x8a);write_data(0x72);init(0x8b);write_data(0x61);init(0x8c);write_data(0x74);init(0x8d);write_data(0x75);init(0x8e);write_data(0x72);init(0x8f);write_data(0x65);init(0xc0);write_data(0x80);init(0xc1);write_data(0x80);init(0xc2);write_data(0x69); //is:init(0xc3);write_data(0x73);init(0xc4);write_data(0x3a);if((t/1000)!=0){init(0xc5);write_data(0x2d);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{init(0xc5);write_data(0xfe);init(0xc6);write_data(0x2d);init(0xc7);write_data(shu[t/100]);}init(0xc8);write_data(0x2e);init(0xc9);write_data(shu[(t0)/10]);init(0xca);write_data(shu[t]);init(0xcb);write_data(0x27);init(0xcc);write_data(0x43);init(0xcd);write_data(0x80);init(0xce);write_data(0x80);init(0xcf);write_data(0x80);}void lcd_1602() //当为正温度时,液晶显示可以高位为0屏蔽. { init(0x80);write_data(0x4e);//NOinit(0x81);write_data(0x4f);init(0x82);write_data(0x80);init(0x84);write_data(0x80);init(0x85);write_data(0x74); //temperatureinit(0x86);write_data(0x65);init(0x87);write_data(0x6d);init(0x88);write_data(0x70);init(0x89);write_data(0x65);init(0x8a);write_data(0x72);init(0x8b);write_data(0x61);init(0x8c);write_data(0x74);init(0x8d);write_data(0x75);init(0x8e);write_data(0x72);init(0x8f);write_data(0x65);init(0xc0);write_data(0x80);init(0xc1);write_data(0x80);init(0xc2);write_data(0x69); //is:init(0xc3);write_data(0x73);init(0xc4);write_data(0x3a);if(t/10000!=0){init(0xc5);write_data(shu[t/10000]);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{if((t/1000)!=0){init(0xc5);write_data(0xfe);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{init(0xc5);write_data(0xfe);init(0xc6);write_data(0xfe);init(0xc7);write_data(shu[t/100]);}}init(0xc8);write_data(0x2e);init(0xc9);write_data(shu[(t0)/10]);init(0xca);write_data(shu[t]);init(0xcb);write_data(0x27);init(0xcc);write_data(0x43);init(0xcd);write_data(0x80);init(0xce);write_data(0x80);init(0xcf);write_data(0x80);}void jiance() //初始化,即检测是否存在DS18B20.{unsigned char k=0;loop:DS=1;DS=0; //主机将总线从高电平拉到低电平del(100); //持续400us~960usDS=1; //然后释放总线del(10); //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。

k=DS;del(20); //低电平至少要持续60~240usif(k==1) // 60~240us内若为高电平则要重新检测。

goto loop;}read() //从DS18B20中读出数据{ unsigned char i;unsigned long date=0;for(i=0;i<16;i++){ DS=0; //主机在某一时刻将总线从高电平拉到低电平.date>>=1;DS=1;del(3); //保持15us将总线拉到高电平,产生读时间隙if(DS)date|=0x8000;del(8); //读数据需要持续35us~60us.}return(date);}void main(){ unsigned long flag=0;EA=0;SP=0X60;init(0x01); //对液晶屏初始化init(0x38);init(0x0c);init(0x06);while(1){jiance(); //对DS18B20初始化matchrom();write(0x44); //启动温度变换del(100);jiance();matchrom();if(f==1){f=0;}else{ write(0xbe); // 读暂存存储器t=read();flag=t&0x8000; //对读取的数据进行处理 if(flag==0x8000){t=~t;t=t+1;t=t*25;t>>=2;flcd_1602();}else{ t=t*25;t>>=2;lcd_1602();}}}}头文件:#include<xuanze.h>#ifndef __XUANZE_H__#define __XUANZE_H__unsigned char k,f=0;sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit DS=P1^1;void del( int count ) //延时程序{while(count--);}void delay(unsigned int count)//延时程序{int p;while(count--)for(p=0;p<125;p++);}void write(unsigned char date)//向DS18B20中写入数据{ int i;for(i=0;i<8;i++) //由于是单总线每次只能写一位,一个字节需循环8次{DS=0; //主机在某一时刻将总线从高电平拉到低电平,产生写时间隙 DS=date&0x01; // 写入数据。

del(15); //写如数据要15us,ds18b20对数据采样需要15us~60us,共需35us~70us.DS=1;date>>=1;}}void init(unsigned int n)// RW=0,RS=0;向指令寄存器中写入命令,即对1602初始化。

{ delay(10);E=0;RS=0;RW=0;E=1;P0=n;E=0;}void write_data(unsigned char n)//RS=1,RW=0;向数据寄存器中写入数据,即显示的数符。

{delay(10);E=0;RS=1;RW=0;E=1;P0=n;E=0;}void matchrom() //匹配ROM{k=P3;switch(k){ case 0: { f=1;init(0x80);write_data(0x57);//whichinit(0x81);write_data(0x68);init(0x82);write_data(0x69);init(0x83);write_data(0x63);init(0x84);write_data(0x68);init(0x85);write_data(0x80);init(0x86);write_data(0x4e);//NOinit(0x87);write_data(0x4f);init(0x88);write_data(0x79);//youinit(0x89);write_data(0x6f);init(0x8a);write_data(0x75);init(0x8b);write_data(0x80);init(0x8c);write_data(0x57);//wantinit(0x8d);write_data(0x61);init(0x8e);write_data(0x6e);init(0x8f);write_data(0x74);init(0xc0);write_data(0x70); //pressinit(0xc1);write_data(0x72);init(0xc2);write_data(0x65);init(0xc3);write_data(0x73);init(0xc4);write_data(0x73);init(0xc5);write_data(0x80);init(0xc6);write_data(0x57);//whichinit(0xc7);write_data(0x68);init(0xc8);write_data(0x69);init(0xc9);write_data(0x63);init(0xca);write_data(0x68);init(0xcb);write_data(0x80);init(0xcc);write_data(0x6b);//keyinit(0xcd);write_data(0x65);init(0xce);write_data(0x79);init(0xcf);write_data(0x80); }break;case 1: { init(0x83);write_data(0x31); //NO 1 write(0x55);write(0x28);write(0x30);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x8e); }break;case 2: { init(0x83);write_data(0x32);//NO 2write(0x55);write(0x28);write(0x31);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0xb9); }break;case 4: { init(0x83);write_data(0x33); //NO 3 write(0x55);write(0x28);write(0x32);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0xe0); }break;case 8: { init(0x83);write_data(0x34); //NO 4 write(0x55);write(0x28);write(0x33);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0xd7); } break;case 16: { init(0x83);write_data(0x35); //NO 5 write(0x55);write(0x28);write(0x34);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0x52); } break;case 32: { init(0x83);write_data(0x36); // NO 6write(0x28);write(0x35);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0x65); }break;case 64: { init(0x83);write_data(0x37); //NO 7 write(0x55);write(0x28);write(0x36);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0x3c); } break;case 128: { init(0x83); write_data(0x38);//NO 8 write(0x55);write(0x28);write(0x37);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0x0b); } break;default:{f=1;init(0x80);write_data(0x50); //pleaseinit(0x81);write_data(0x6c);init(0x82);write_data(0x65);init(0x83);write_data(0x61);init(0x84);write_data(0x73);init(0x85);write_data(0x65);init(0x86);write_data(0x80);init(0x87);write_data(0x70); //pressinit(0x88);write_data(0x72);init(0x89);write_data(0x65);init(0x8a);write_data(0x73);init(0x8b);write_data(0x73);init(0x8c);write_data(0x80);init(0x8d);write_data(0x6f); //one init(0x8e);write_data(0x6e);init(0x8f);write_data(0x65);init(0xc0);write_data(0x80);init(0xc1);write_data(0x80);init(0xc2);write_data(0x80);init(0xc3);write_data(0x6b);//keyinit(0xc4);write_data(0x65);init(0xc5);write_data(0x79);init(0xc6);write_data(0x80);init(0xc7);write_data(0x6f);//only init(0xc8);write_data(0x6e);init(0xc9);write_data(0x6c);init(0xca);write_data(0x79);init(0xcb);write_data(0x80);init(0xcc);write_data(0x21);//!init(0xcd);write_data(0x80);init(0xce);write_data(0x80);init(0xcf);write_data(0x80); }break; }}#endifDS18B20单总线多点式测温系统--2 (2011-01-16 00:33:09)转载分类: DS18B20标签:ds18b20程序改进版杂谈说明:较之第一个程序有很大的改善缺点是:闪动的不准确,由于时间待早上改善三个函数,一主函数二个头函数主函数:#include<reg51.h>void delay(unsigned int count)//延时程序{int p;while(count--)for(p=0;p<125;p++);}#include"LCD_Init.h"#include"xuanze.h"unsigned int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39}; unsigned long t;void flcd_1602() //当为负温度时,液晶显示可以高位为0屏蔽.{ LCD_dis_string(1,1,"NO "); //显示字符串LCD_dis_string(5,1,"temperature"); //显示字符串temperatureLCD_dis_string(1,2," is:"); //显示字符串is:if((t/1000)!=0){LCD_write_command(0xc5);LCD_write_data(0x2d);LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}else{LCD_write_command(0xc5);LCD_write_data(0xfe);LCD_write_command(0xc6);LCD_write_data(0x2d);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}LCD_write_command(0xc8);LCD_write_data(0x2e);LCD_write_command(0xc9);LCD_write_data(shu[(t0)/10]);LCD_write_command(0xca);LCD_write_data(shu[t]);LCD_write_command(0xcb);LCD_write_data(0x27);LCD_write_command(0xcc);LCD_write_data(0x43);LCD_write_command(0xcd);LCD_write_data(0x80);LCD_write_command(0xce);LCD_write_data(0x80);LCD_write_command(0xcf);LCD_write_data(0x80);}void lcd_1602() //当为正温度时,液晶显示可以高位为0屏蔽.{LCD_dis_string(1,1,"NO "); //显示字符串LCD_dis_string(5,1,"temperature"); //显示字符串temperatureLCD_dis_string(5,2," is:"); //显示字符串is:if(t/10000!=0){LCD_write_command(0xc5);LCD_write_data(shu[t/10000]);LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}else{ if((t/1000)!=0){LCD_write_command(0xc5);LCD_write_data(0xfe);LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}else{LCD_write_command(0xc5);LCD_write_data(0xfe);LCD_write_command(0xc6);LCD_write_data(0xfe);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}}LCD_write_command(0xc8);LCD_write_data(0x2e);LCD_write_command(0xc9);LCD_write_data(shu[(t0)/10]);LCD_write_command(0xca);LCD_write_data(shu[t]);LCD_write_command(0xcb);LCD_write_data(0x27);LCD_write_command(0xcc);LCD_write_data(0x43);LCD_write_command(0xcd);LCD_write_data(0x80);LCD_write_command(0xce);LCD_write_data(0x80);LCD_write_command(0xcf);LCD_write_data(0x80);}void Init_ds18b20() //初始化,即检测是否存在DS18B20.{ unsigned char k=0;loop:DS=1;DS=0; //主机将总线从高电平拉到低电平del(100); //持续400us~960usDS=1; //然后释放总线del(10); //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。

相关文档
最新文档