温度采集DS18B20LCD
数字温度传感器DS18B20简介
DS18B20 支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822 的精度较差为±
2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V 的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20的内部结构
DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列如下:
1、 GND为电源地
2、 DQ为数字信号输入/输出
3、VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
ds18b20 ROM指令表
RAM指令表。
数字温度传感器ds18b20的原理与应用
数字温度传感器DS18B20的原理与应用1. 概述数字温度传感器DS18B20是一种广泛应用于工业控制、计算机温控等领域的传感器。
本文将介绍DS18B20的原理和应用,并对其工作原理、特点以及应用场景进行详细阐述。
2. DS18B20的工作原理DS18B20采用了数字式温度传感器技术,其工作原理基于温度对半导体材料电阻值的变化进行测量。
具体工作原理如下:1. DS18B20内部包含一个温度传感器、位移寄存器(DS)和一个多功能I/O口。
2. 温度传感器由多个晶体管组成,当温度发生变化时,晶体管的导电能力发生变化。
3. DS18B20通过I/O口与外部控制器进行通信,并将温度数据以数字形式传输。
3. DS18B20的特点DS18B20作为一种数字温度传感器,具有许多独特的特点,包括: - 高精度:DS18B20具有高精度的温度测量能力,精确到0.5°C。
- 数字输出:DS18B20通过数字信号输出温度数据,方便与其他数字设备进行连接与通信。
- 单总线接口:DS18B20采用了单总线接口通信,可以通过一根数据线与外部控制器进行连接,简化了接线工作。
- 可编程分辨率:DS18B20的分辨率可以通过配置进行调整,可以根据具体应用需求选择不同的分辨率。
4. DS18B20的应用场景DS18B20由于其特点和功能的优势,在许多领域得到了广泛应用,包括但不限于以下场景:4.1 工业控制DS18B20可以用于工业控制系统中,用于监测和控制温度。
例如,在生产线上使用DS18B20传感器实时监测设备温度,当温度超出设定范围时,及时采取控制措施,以保证生产过程的稳定性和安全性。
4.2 计算机温控DS18B20可以作为计算机温度监测的传感器,用于检测计算机主板、CPU和其他关键部件的温度。
通过DS18B20传感器的数据,可以实时监测计算机的温度状况,并进行相应的温度调控,以提高计算机的稳定性和使用寿命。
Ds18b20百度百科
DS18B20DS-18B20 数字温度传感器本公司最新推出TS-18B20数字温度传感器,该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
1: 技术性能描述1.1 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
1.2 测温范围-55℃~+125℃,固有测温分辨率0.5℃。
1.3 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温1.4 工作电源: 3~5V/DC1.5 在使用中不需要任何外围元件1.6 测量结果以9~12位数字量方式串行传送1.7 不锈钢保护管直径Φ61.8 适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备测温1.9 标准安装螺纹M10X1, M12X1.5, G1/2”任选1.10 PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
2:应用范围2.1 该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域2.2 轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制。
2.3 汽车空调、冰箱、冷柜、以及中低温干燥箱等。
2.5 供热/制冷管道热量计量,中央空调分户热能计量和工业领域测温和控制3:产品型号与规格型号测温范围安装螺纹电缆长度适用管道TS-18B20 -55~125 无 1.5 mTS-18B20A -55~125 M10X1 1.5m DN15~25TS-18B20B -55~125 1/2”G 接线盒DN40~ 604:接线说明特点独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源测量温度范围为-55 °C至+125 ℃。
DS18B20与LCD1602结合显示温度汇总
二、DS18B20存储器结构
DS18B20的内部有64位的ROM单元,和9字节的暂存器单元。
1、64位(激)光刻只读存储器
每只DS18B20都有一个唯一存储在ROM中的64位编码(跟人的身份证号类似,一人一个身份证号),这是出厂时被光刻好的。最前面8位是单线系列编码:28h。接着的48位是一个唯一的序列号。最后8位是以上56位的CRC编码。64-位的光刻ROM又包括5个ROM的功能命令:读ROM,匹配ROM,跳跃ROM,查找ROM和报警查找。ROM的作用是使每个DS18B20各不相同,这样就可以实现一根总线上挂接多个DS18B20以实现多点监测。
图3
表2
4)、CRC发生器
CRC字节作为DS18B2064位ROM的一部分存储在存储器中。CRC码由ROM的前56位计算得到,被包含在ROM的重要字节当中的数据发生改变时,CRC的值也随之改变。
CRC能够在总线控制器读取DS18B20时进行数据校验。为校验数据是否被正确读取,总线控制器必须用接受到的数据计算出一个CRC值,和存储在DS18B20的64位ROM中的值(读ROM时)或DS18B20内部计算出的8位CRC值(读存储器时)进行比较。如果计算得到的CRC值和读取出来的CRC值相吻合,数据被无错传输。CRC值的比较以及是否进行下一步操作完全由总线控制器决定。当在DS18B20中存储的或由其计算到CRC值和总线控制器计算的值不相符时,DS18B20内部并没有一个能阻止命令序列进行的电路。
2)、非挥发的温度报警触发器TH和TL
位于第2和第3字节,用于写入温度报警值,实际上就是设定温度的最高和最低界限。
DS18B20的工作原理
DS18B20的工作原理DS18B20是一种数字温度传感器,广泛应用于各种温度测量场景。
它采用一线数字接口,能够通过单一的数据线进行通信和供电。
本文将详细介绍DS18B20的工作原理。
DS18B20传感器由三个主要部份组成:温度传感器、数字转换器和串行总线接口。
温度传感器采用了高精度的摹拟传感器,能够实时测量环境温度。
数字转换器将摹拟信号转换为数字信号,并通过串行总线接口传输给主控设备。
DS18B20传感器的工作原理如下:1. 供电:DS18B20传感器通过数据线从主控设备获取供电。
主控设备向数据线发送一个脉冲信号,传感器通过检测脉冲信号的持续时间来判断供电电压的高低。
2. 温度测量:一旦传感器接收到供电信号,它开始测量环境温度。
传感器内部的摹拟传感器将环境温度转换为电压信号。
传感器通过内部电路对电压信号进行放大和滤波处理,以确保测量结果的精确性和稳定性。
3. 数字转换:经过放大和滤波处理后,摹拟信号被传递给数字转换器。
数字转换器将摹拟信号转换为二进制码,表示当前环境的温度值。
转换后的温度值以16位的形式存储在传感器内部的寄存器中。
4. 串行通信:DS18B20传感器通过串行总线接口将温度值传输给主控设备。
传感器将温度值按照一定的通信协议通过数据线发送给主控设备。
主控设备通过解析接收到的数据,可以获取到当前环境的温度值。
DS18B20传感器具有以下特点:1. 高精度:DS18B20传感器具有高达±0.5℃的温度测量精度,可以满足大多数应用的要求。
2. 数字接口:传感器采用一线数字接口,只需要一个数据线进行通信和供电,简化了系统设计和布线。
3. 多节点连接:多个DS18B20传感器可以通过串行总线接口连接到同一个主控设备,实现多点温度测量。
4. 低功耗:传感器在待机状态下功耗极低,惟独几微瓦,适适合于电池供电的应用场景。
5. 高可靠性:传感器具有内置的温度补偿和故障检测功能,能够提高系统的可靠性和稳定性。
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温度传感器的工作原理:
1. 单线总线通信:DS18B20传感器使用单一的数据总线进行通信。
该总线不仅用于传输数据,还用于为传感器提供电源。
通过这种方式,可以减少传感器的引脚数量,使其适用于各种微控制器和嵌入式系统。
2. 温度测量:传感器内部有一个温度传感器,该传感器可以测量实时环境温度。
它使用精确的电阻和温度-电压转换技术,以确保温度测量的准确性和稳定性。
3. 数据转换:DS18B20传感器将温度测量结果转换为数字信号。
传感器内部的模数转换器将模拟信号转换为数字码,以便于传感器与主控制器之间的通信和处理。
4. ROM存储器:每个DS18B20传感器都有一个唯一的64位ROM存储器。
这个ROM存储器包含传感器的唯一序列号、制造商信息和其他相关信息。
这些信息可以用来识别传感器并设置其工作参数。
5. 通信协议:DS18B20传感器使用一种称为1-Wire协议的通信协议与主控制器进行通信。
该协议在传感器和主控制器之间建立一种基于时间的序列通信方式,主控制器上的软件可以通过这种协议与传感器进行数据传输、配置和控制。
总而言之,DS18B20温度传感器通过单一的数据总线进行通信,并使用内部的温度传感器和数字转换器测量环境温度。
它通过ROM存储器保存唯一的序列号和其他信息,使用1-Wire 协议与主控制器进行通信。
ds18b20温度传感器工作原理
ds18b20温度传感器工作原理DS18B20温度传感器是一种数字温度传感器,它可以实现远距离测温,并且具有高精度和可靠性。
它的工作原理主要是基于热敏电阻的温度测量原理,结合数字信号输出和单总线通信技术,使得其在各种工业和消费电子产品中得到了广泛的应用。
DS18B20温度传感器采用了微型封装技术,其外形小巧,安装方便,适用于各种恶劣环境。
其工作原理主要包括三个方面,温度测量原理、数字信号输出和单总线通信。
首先,DS18B20温度传感器的温度测量原理是基于热敏电阻的特性。
当温度发生变化时,热敏电阻的电阻值也会相应发生变化。
DS18B20内部集成了一个精密的模拟-数字转换器(ADC),可以将热敏电阻的电阻值转换为数字信号输出。
通过这种方式,DS18B20可以实现对温度的准确测量。
其次,DS18B20温度传感器通过数字信号输出来实现温度数据的传输。
它采用了1-Wire总线协议,通过一根数据线即可实现数据的传输和通信。
这种设计使得DS18B20在布线和连接方面更加简单和灵活。
最后,DS18B20温度传感器通过单总线通信来与主控设备进行数据交互。
它采用了独特的ROM存储器结构,每个传感器都有一个唯一的64位串行号码,可以通过这个号码来对传感器进行寻址和识别。
同时,DS18B20还具有多点测量、多传感器串联等特性,可以实现对多个传感器的同时管理和控制。
总的来说,DS18B20温度传感器的工作原理基于热敏电阻的温度测量原理,结合数字信号输出和单总线通信技术,实现了远距离、高精度、可靠性的温度测量和数据传输。
它在工业控制、环境监测、家用电器等领域都有着广泛的应用前景。
希望通过本文的介绍,能够更好地理解DS18B20温度传感器的工作原理和特性,为相关领域的应用提供参考和指导。
ds18b20温度传感器工作原理
ds18b20温度传感器工作原理
DS18B20温度传感器是一种数字温度传感器,它基于热电效
应来测量温度。
该传感器由一个精密的温度传感器和一个数字转换器组成。
以下是DS18B20温度传感器的工作原理:
1. 热电效应:DS18B20温度传感器利用热电效应来测量温度。
当两个不同材料的接触点形成温度梯度时,就会产生电动势。
传感器中的温度传感器部分采用的材料对温度变化非常敏感,因此产生的电动势可以反映出温度的变化。
2. 温度传感器:DS18B20温度传感器中的温度传感器部分是
由一个特殊的材料制成的。
该材料具有温度敏感性,当温度变化时,该材料会产生电动势。
这个电动势可以通过传感器的引脚进行读取和转换。
3. 数字转换器:DS18B20温度传感器具有内置的数字转换器。
这个数字转换器可以将从温度传感器获得的电压信号转换为数字信号。
数字信号可以直接读取和处理,而无需进行模拟信号转换。
4. 串行总线通信:DS18B20温度传感器通过一种称为One-
Wire总线的串行通信协议与主控制器进行通信。
传感器和主
控制器之间只需使用单一的数据线进行通信,使得传感器的连接变得简单方便。
总结起来,DS18B20温度传感器工作原理是利用热电效应测
量温度,并通过温度传感器和数字转换器来转换和读取温度信号。
该传感器通过One-Wire总线与主控制器进行通信。
ds18b20工作原理
ds18b20工作原理DS18B20是一种数字温度传感器,它可以通过一根数据线进行温度的采集和传输。
DS18B20工作原理的核心是利用温度对半导体材料电阻的影响来实现温度的测量。
接下来,我们将详细介绍DS18B20的工作原理。
首先,DS18B20内部包含了一个温度传感器芯片,该芯片采用了数字信号输出的方式。
在DS18B20内部,有一个模拟-数字转换器(ADC),它可以将模拟信号转换为数字信号。
当DS18B20受到温度的影响时,芯片内部的电阻会发生变化,进而改变了电压信号的大小。
ADC会将这个模拟信号转换为数字信号,然后通过数据线输出给外部设备。
其次,DS18B20采用了一种叫做“单总线”(One Wire)的通信协议。
这意味着DS18B20只需要一根数据线就可以完成温度的采集和传输。
在通信过程中,DS18B20会将温度数据以数字信号的形式发送给外部设备。
外部设备可以通过读取数据线上的数字信号来获取温度信息。
此外,DS18B20还具有一些特殊的功能,比如温度的精度调节、温度报警功能等。
通过这些功能,DS18B20可以满足不同场景下的温度监测需求。
总的来说,DS18B20的工作原理是基于半导体材料电阻随温度变化的特性,利用ADC将模拟信号转换为数字信号,并通过单总线通信协议将温度数据传输给外部设备。
同时,DS18B20还具有一些特殊的功能,可以满足不同场景下的温度监测需求。
在实际应用中,DS18B20被广泛应用于各种温度监测系统中,比如智能家居、工业自动化等领域。
由于其简单、稳定、精准的特点,DS18B20在温度监测领域具有很高的性价比,受到了广泛的认可和应用。
综上所述,DS18B20是一种基于半导体材料电阻特性的数字温度传感器,其工作原理是通过ADC将模拟信号转换为数字信号,并通过单总线通信协议将温度数据传输给外部设备。
在实际应用中,DS18B20具有简单、稳定、精准的特点,被广泛应用于各种温度监测系统中。
基于51单片机——Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)
TEMP_ZH EQU 24H ;实测温度值存放单元TEMPL EQU 25HTEMPH EQU 26HTEMP_TH EQU 27H ;高温报警值存放单元TEMP_TL EQU 28H ;低温报警值存放单元TEMPHC EQU 29H ;正、负温度值标记TEMPLC EQU 2AHTEMPFC EQU 2BHK1 EQU P1.4 ;查询按键K2 EQU P1.5 ;设置/调整键K3 EQU P1.6 ;调整键K4 EQU P1.7 ;确定键BEEP EQU P3.7 ;蜂鸣器RELAY EQU P1.3 ;指示灯LCD_X EQU 2FH ;LCD 字符显示位置LCD_RS EQU P2.0 ;LCD 寄存器选择信号 LCD_RW EQU P2.1 ;LCD 读写信号LCD_EN EQU P2.2 ;LCD 允许信号FLAG1 EQU 20H.0 ;DS18B20是否存在标志 KEY_UD EQU 20H.1 ;设定按键的增、减标志 DQ EQU P3.3 ;DS18B20数据信号ORG 0000HLJMP MAINORG 0030HMAIN: MOV SP,#60HMOV A,#00HMOV R0,#20H ;将20H~2FH 单元清零MOV R1,#10HCLEAR: MOV @R0,AINC R0DJNZ R1,CLEARLCALL SET_LCDLCALL RE_18B20START: LCALL RST ;调用18B20复位子程序JNB FLAG1,START1 ;DS1820不存在LCALL MENU_OK ;DS1820存在,调用显示正确信息子程序MOV TEMP_TH,#055H ;设置TH初值85度MOV TEMP_TL,#019H ;设置TL初值25度LCALL RE_18B20A ;调用暂存器操作子程序LCALL WRITE_E2 ;写入DS18B20LCALL TEMP_BJ ;显示温度标记JMP START2START1: LCALL MENU_ERROR ;调用显示出错信息子程序 LCALL TEMP_BJ ;显示温度标记SJMP $START2: LCALL RST ;调用DS18B20复位子程序JNB FLAG1,START1 ;DS18B20不存在MOV A,#0CCH ;跳过ROM匹配命令LCALL WRITEMOV A,#44H ;温度转换命令LCALL WRITELCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#0BEH ;读温度命令LCALL WRITELCALL READ ;调用DS18B20数据读取操作子程序LCALL CONVTEMP ;调用温度数据BCD 码处理子程序LCALL DISPBCD ;调用温度数据显示子程序LCALL CONV ;调用LCD显示处理子程序LCALL TEMP_COMP ;调用实测温度值与设定温度值比较子程序LCALL PROC_KEY ;调用键扫描子程序SJMP START2 ;循环;*************************** 键扫描子程序*****************************PROC_KEY:JB K1,PROC_K1LCALL BEEP_BLJNB K1,$MOV DPTR,#M_ALAX1MOV A,#1LCALL LCD_PRINTLCALL LOOK_ALARMJB K3,$LCALL BEEP_BLJMP PROC_K2PROC_K1: JB K2,PROC_ENDLCALL BEEP_BLJNB K2,$MOV DPTR,#RST_A1MOV A,#1LCALL LCD_PRINTLCALL SET_ALARMLCALL RE_18B20 ;将设定的TH,TL值写入DS18B20LCALL WRITE_E2PROC_K2: LCALL MENU_OKLCALL TEMP_BJPROC_END:RET;*************************** 设定温度报警值TH、TL ***************************SET_ALARM:LCALL LOOK_ALARMAS0: JB K1,AS00LCALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWN 标记AS00: JB 20H.1,ASZ01 ;20H.1=1,增加JMP ASJ01 ;20H.1=0,减小ASZ01: JB K2,ASZ02 ;TH值调整(增加)LCALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: LCALL LOOK_ALARMLCALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03 ;TL值调整(增加) LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00HASZ021: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0 ;确定调整LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02 ;TH值调整(减少) LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011ASJ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ02: JB K3,ASJ03 ;TL值调整(减少)LCALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: LCALL LOOK_ALARM ;MOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB " SET ALERT CODE " ,0;*********************** 实测温度值与设定温度值比较子程序**********************TEMP_COMP:MOV A,TEMP_THSUBB A,TEMP_ZH ;减数>被减数,则JC CHULI1 ;借位标志位C=1,转 MOV A,TEMPFCCJNE A,#0BH,COMPSJMP CHULI2COMP: MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC CHULI2 ;借位标志位C=1,转MOV DPTR,#BJ5LCALL TEMP_BJ3CLR RELAY ;点亮指示灯RETCHULI1: MOV DPTR,#BJ3LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RETCHULI2: MOV DPTR,#BJ4LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RET;-----------------------------------------TEMP_BJ3: MOV A,#0CEHLCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB ">H"BJ4: DB "<L"BJ5: DB " !";;**************************** 显示温度标记子程序***************************TEMP_BJ: MOV A,#0CBHLCALL WCOMMOV DPTR,#BJ1 ;指针指到显示消息MOV R1,#0MOV R0,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1: DB 00H,"C";******************************** 显示正确信息子程序***************************MENU_OK: MOV DPTR,#M_OK1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_OK2 ;指针指到显示消息MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_OK1: DB " DS18B20 OK ",0M_OK2: DB " TEMP: ",0;******************************** 显示出错信息子程序***************************MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_ERROR2 ;指针指到显示消息1MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_ERROR1: DB " DS18B20 ERROR ",0M_ERROR2: DB " TEMP: ---- ",0;****************************DS18B20复位子程序*****************************RST: SETB DQNOPCLR DQMOV R0,#6BH ;主机发出延时复位低脉冲MOV R1,#04HTSR1: DJNZ R0,$MOV R0,#6BHDJNZ R1,TSR1SETB DQ ;拉高数据线NOPNOPNOPMOV R0,#32HTSR2: JNB DQ,TSR3 ;等待DS18B20回应DJNZ R0,TSR2JMP TSR4 ; 延时TSR3: SETB FLAG1 ; 置1标志位,表示DS1820存在JMP TSR5TSR4: CLR FLAG1 ; 清0标志位,表示DS1820不存在 JMP TSR7TSR5: MOV R0,#06BHTSR6: DJNZ R0,$ ; 时序要求延时一段时间TSR7: SETB DQRET;************************ DS18B20暂存器操作子程序***************************RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEWR_SCRAPD:MOV A,#4EH ;写暂器LCALL WRITEMOV A,TEMP_TH ;TH(报警上限)LCALL WRITEMOV A,TEMP_TL ;TL(报警下限)LCALL WRITEMOV A,#7FH ;12位精度LCALL WRITERET;************************ 复制暂存器子程序*******************************WRITE_E2:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#48H ;把暂存器里的温度报警值拷贝到EEROMLCALL WRITERET;*********************** 重读EEROM子程序********************************READ_E2:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器LCALL WRITERET;************************ 将自定义字符写入LCD的CGRAM中*********************STORE_DATA:MOV A,#40HLCALL WCOMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA: MOV A,R3MOVC A,@A+DPTRLCALL WDATA ;写入数据INC R3DJNZ R2,S_DATARETD_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H;*********************** DS18B20数据写入操作子程序************************WRITE: MOV R2,#8 ;一共8位数据CLR CWR1: CLR DQ ;开始写入DS18B20总线要处于复位(低)状态MOV R3,#07DJNZ R3,$ ;总线复位保持16微妙以上RRC A ;把一个字节DATA 分成8个BIT 环移给CMOV DQ,C ;写入一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙SETB DQ ;重新释放总线NOPDJNZ R2,WR1 ;写入下一位SETB DQRET;********************** DS18B20数据读取操作子程序**************************READ: MOV R4,#4 ;将温度低位、高位、TH、TL从DS18B20中读出MOV R1,#TEMPL ;存入25H、26H、27H、28H单元RE00: MOV R2,#8RE01: CLR CYSETB DQNOPNOPCLR DQ ;读前总线保持为低NOPNOPNOPSETB DQ ;开始读总线释放MOV R3,#09 ;延时18微妙DJNZ R3,$MOV C,DQ ;从DS18B20总线读得一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙RRC A ;把读得的位值环移给ADJNZ R2,RE01 ;读下一位MOV @R1,AINC R1DJNZ R4,RE00RET;************************ 温度值BCD 码处理子程序*************************CONVTEMP: MOV A,TEMPH ;判温度是否零下ANL A,#08HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AMOV TEMPHC,#0BH ;负温度标志MOV TEMPFC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ;正温度标志MOV TEMPFC,#0AHTEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分 BCDMOV A,TEMPL ;整数部分ANL A,#0F0H ;取出高四位SWAP AMOV TEMPL,AMOV A,TEMPH ;取出低四位ANL A,#0FHSWAP AORL A,TEMPL ;重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW = 十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI = 个位数BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEMPC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI = 百位数BCDANL A,#0FHORL A,R4MOV TEMPHC,ATEMPC12: RET;************************ 二-十进制转换子程序*****************************HEX2BCD1: MOV B,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABSWAP AORL A,BRETTEMPDOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H ; 小数部分码表DB 05H,05H,06H,06H,07H,08H,08H,09H;********************** 查询温度报警值子程序***************************LOOK_ALARM: MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2 ;显示在第二行LCALL LCD_PRINTMOV A,#0C6HLCALL TEMP_BJ1MOV A,TEMP_TH ;加载TH数据MOV LCD_X,#3 ;设置显示位置LCALL SHOW_DIG2H ;显示数据MOV A,#0CEHLCALL TEMP_BJ1MOV A,TEMP_TL ;加载TL数据MOV LCD_X,#12 ;设置显示位置LCALL SHOW_DIG2L ;显示数据RETM_ALAX1: DB " LOOK ALERT CODE",0M_ALAX2: DB "TH: TL: ",0TEMP_BJ1: LCALL WCOMMOV DPTR,#BJ2 ;指针指到显示信息区 MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRLCALL WDATADJNZ R0,BBJJ2RETBJ2: DB 00H,"C";************************** LCD显示子程序**********************************SHOW_DIG2H: MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XLCALL LCDP2INC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RETSHOW_DIG2L: MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;************************ 显示区BCD 码温度值刷新子程序**********************DISPBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,A ;小数位MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;个位MOV A,TEMPHCANL A,#0FHMOV 72H,A ;十位MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;百位DISPBCD2: RET;*************************** LCD 显示数据处理子程序*************************CONV: MOV A,73H ;加载百位数据MOV LCD_X,#6 ;设置位置CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#"-" ;"-"号显示JMP CONV111CONV11: MOV A,#" " ;"+"号不显示CONV111: MOV B,LCD_XLCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2 ;显示数据CONV3: INC LCD_XMOV A,72H ;十位LCALL SHOW_DIG2INC LCD_XMOV A,71H ;个位LCALL SHOW_DIG2INC LCD_XMOV A,#'.'MOV B,LCD_XLCALL LCDP2MOV A,70H ;加载小数点位INC LCD_X ;设置显示位置LCALL SHOW_DIG2 ;显示数据RET;*************************** 第二行显示数字子程序*************************SHOW_DIG2:ADD A,#30HMOV B,LCD_XLCALL LCDP2RET;*************************** 第二行显示数字子程序*************************LCDP2: PUSH ACCMOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;*************************** 对LCD 做初始化设置及测试*************************SET_LCD: CLR LCD_ENLCALL INIT_LCD ;初始化 LCDLCALL STORE_DATA ;将自定义字符存入LCD的CGRAM RET;****************************** LCD初始化***********************************INIT_LCD: MOV A,#38H ;2行显示,字形5*7点阵LCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#0CH ;开显示,显示光标,光标不闪烁 LCALL WCOMLCALL DELAY1MOV A,#01H ;清除 LCD 显示屏LCALL WCOMLCALL DELAY1RET;***************************** 清除LCD的第一行字符**************************CLR_LINE1:MOV A,#80H ;设置 LCD 的第一行地址LCALL WCOMMOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDLCALL WDATA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;************************* LCD的第一行或第二行显示字符**********************LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置 LCD 的第一行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置 LCD 的第一行地址LCALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置 LCD 的第二行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置 LCD 的第二行地址LCALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: LCALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;*************************** 清除1行LCD 的字符****************************CLR_LINE: MOV R0,#24CL1: MOV A,#' 'LCALL WDATADJNZ R0,CL1RETDE: MOV R7,#250DJNZ R7,$RET;**************************** LCD 间接控制方式命令写入*************************WCOM: MOV P0,A ;写入命令CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲 CLR LCD_RWSETB LCD_ENLCALL DELAY1CLR LCD_ENRET;**************************** LCD 间接控制方式数据写入*************************WDATA: MOV P0,A ;写入数据SETB LCD_RSCLR LCD_RWSETB LCD_ENLCALL DELCALL DERET;************************** 在LCD的第一行显示字符**************************LCDP1: PUSH ACCMOV A,B ;设置显示地址ADD A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;****************************** 声光报警子程序*******************************BEEP_BL: MOV R6,#100BL2: LCALL DEX1CPL BEEPCPL RELAYDJNZ R6,BL2MOV R5,#10RETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RET;****************************** 延时子程序*******************************DELAY: MOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: MOV R6,#25 ;延时5毫秒DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETEND。
DS18B20测量温度液晶1602显示
DS18B20测量温度液晶1602显示DS18B20温度传感器简介DS18B20是一种数字温度传感器。
它输出的是数字信号,同时具有体积小,硬件资源耗费少,抗干扰能力强,精度高等特点。
DS18B20温度传感器特点1、单线接口:DS18B20仅需一条线可实现与微处理器双向通信。
2、测温范围: DS18B20温度传感器的测温范围可达-55℃~+125℃,在-10℃到+85℃范围内误差为±0.4°。
3、支持多点组网功能:多个DS18B20温度传感器可以并联在一条数据线上,最多可以并联8个,实现多点测温。
4、工作电源: 3.0~5.5V/DC ,DS18B20温度传感器可以采用外部独立电源供电,也可以用数据线寄生电源供电。
5、DS18B20温度传感器在应用过程中不需要任何外围元件。
6、DS18B20测量温度的结果以9~12位数字量方式串行传送。
7、掉电保护功能, DS18B20温度传感器内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度。
在DS18B20温度传感器掉电以后仍可保存分辨率及报警温度的设定值。
8、DS18B20温度传感器返回16位二进制数代表此刻探测的温度值,其高五位代表正负。
如果高五位全部为1,则代表返回的温度值为负值。
如果高五位全部为0,则代表返回的温度值为正值。
后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。
DS18B20温度传感器引脚说明DS18B20温度传感器接口电路液晶1602接口电路DS18B20测量温度程序源代码/*****************DS18B20测量温度,用1602显示温度值******************* 单片机:51单片机* 开发环境:keil* 功能: DS18B20测量温度,并在LCD1602中显示出来**********************************************************************/#include <reg51.h>#define LCD_Data P0#define Busy 0x80#define uchar unsigned char#define uint unsigned intuchar code table0[] = {" SL-51A "};uchar code table1[] = {" TEMP: XX.X "};uchar temperature[5]; //温度值uint temp;sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_E = P2^5;sbit DS = P2^2;void Delay5Ms(void);void delay(uint count);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Info_display(void);void dsreset(void);bit tmpreadbit(void);uchar tmpread(void);void tmpwritebyte(uchar dat);void tmpchange(void);uint tmp();void delay(uint count){uint i;while(count){i=200;while(i>0)i--;count--;}}void dsreset(void) //发复位命令{uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}bit tmpreadbit(void) //读取一位{uint i;bit dat;DS=0;i++;DS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);}uchar tmpread(void) //读取一个字节{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面 }return(dat);}void tmpwritebyte(uchar dat) //向ds18b20写入一个字节{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0;i=8;while(i>0)i--;DS=1;i++;i++;}}}void tmpchange(void) //DS18B20开始转换{dsreset();delay(1);tmpwritebyte(0xcc); //命令的含义可以查18b20的手册 tmpwritebyte(0x44);}uint tmp() //获取温度值{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8;temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;}/*************************5ms延时函数***************************/void Delay5Ms(void){unsigned int TempCyc = 3552;while(TempCyc--);}/**************************写数据函数***************************/void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_E = 0; //若晶振速度太高可以在这后加小的延时 LCD_E = 0; //延时LCD_RS = 1;LCD_RW = 0;LCD_E = 1;LCD_E = 0;}/*************************写指令函数****************************/void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data = WCLCD;LCD_E = 0;LCD_E = 0;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 0;}/**************************读状态函数***************************/unsigned char ReadStatusLCD(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;while (LCD_Data & Busy); //检测忙信号return(LCD_Data);}/***************************LCD初始化***************************/void LCDInit(void) //LCD初始化{LCD_Data = 0;WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置, 开始要求每次检测忙信号WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}/**********************按指定位置显示一个字符*********************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}/***********************按指定位置显示一串字符********************/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符ListLength++;X++;}}}/*****************************************************************/ void temp_display(unsigned int temp) //显示程序{unsigned char A1,A2,A2t,A3;A1=temp/100; //百位A2t=temp%100;A2=A2t/10; //十位A3=A2t%10; //个位temperature[1]=A1 + 0x30;temperature[2]=A2 + 0x30;temperature[3]=A3 + 0x30;DisplayOneChar(9,1,temperature[1]);DisplayOneChar(10,1,temperature[2]);DisplayOneChar(12,1,temperature[3]);}/******************************************************************/ void init(){LCDInit();DisplayListChar(0,0,table0);DisplayListChar(0,1,table1);}void main(){int i;init();while(1){tmpchange();for(i=0;i<=10;i++){if(i==10){temp_display(tmp());}}}}。
基于DS18B20的多点温度采集系统设计(LCD)
To cons cienti ously sum up t he Olympic security control s, pr omoting i ntegrated manageme nt to a higher l evel, hig her sta ndar ds, a higher l evel of dev elopment. Empl oyees, today i s lunar cal endar on De cember 2 4, the ox Bell is a bout to ring , at this time of pulse of the XX pow er generati on compa ny to flourish, to more clearly hear XX power ge neration compa nies mature a nd symmetry breathi ng. Recalli ng past one
数字式温度传感器DS18B20
第三步:存储器操作命令
温度转换(44H):启动在线DS18B20作温度A/D转换。 读数据(BEH):从暂存器读12位温度值和CRC值。 写数据(4EH):将数据写入暂存器的第2和第3字 节 复制(48H):将暂存器的第3和第4字节复制到 EERAM中。 读EERAM(B8H):将EERAM内容写入暂存器的 第2和第3字节。 读电源供电方式(B4H):了解DS18B20的供电方 式。
读出的数据为16进制,可以根据自己程 序中需要进行处理,例如格式转换、存 储、显示、运算等等。
例程-硬件和软件流程
引脚排列
具有两种封装形式: 引脚说明: GND 地 DQ 数字输入输出 VDD 可选的VDD NC 空引脚 DNC 不连接
DS18B20的三个主要数据部件
1、64位激光(lasered)ROM 2、温度灵敏元件 3、非易失性温度告警触发器TH和TL
关于寄生电容
当I/O或VDD引脚为高电平时,这个电路取得 电源。只要符合指定的定时和电压要求,I/O 将提供足够的功率。 寄生电源的优点是双重的: 1)利用此引脚,远程温度检测无需本地电源 2)缺少正常电源条件下也可以读ROM
存储器结构
存储器由一个便签式暂 存RAM和一个非易失性、 电可擦除EERAM组成, 见右图。
关于CONFIG存储器的说明
实际上,DS18B20的精度可以设定,9~12位,是 由CONFIG存储器来决定的。定义如下:
0 R1 R0 1 1 1 1 1
温度数据与温度的关系
第四步:处理数据
DS18B20简介
DS18B20是美国DALLAS公司生产的单线数 字温度传感器,具有如下特点: 1、一线制器件——独特的接口,使分布式温度 检测得以简化。 2、每片DS18B20都有唯一的产品号(64位) 3、温度测量范围为-55˚C~+125˚C。 4、可达12位的数字值,分辨率为0.0625˚C 5、用户可定义的,非易失性的温度告警设置
ds18b20温度传感器工作原理
ds18b20温度传感器工作原理DS18B20温度传感器工作原理。
DS18B20温度传感器是一种数字式温度传感器,它具有高精度、数字输出、可编程分辨率和多路传感器等特点,因此在许多领域得到了广泛的应用。
那么,DS18B20温度传感器是如何工作的呢?接下来我们将详细介绍其工作原理。
首先,DS18B20温度传感器采用了数字信号输出,它内部集成了温度传感器和A/D转换器,并且具有唯一的64位ROM编码。
在工作时,DS18B20通过单总线接口与主控器相连,主控器向DS18B20发送指令,DS18B20将温度数据以数字信号的形式传输给主控器。
其次,DS18B20温度传感器采用了单总线通信协议,这意味着在同一总线上可以连接多个DS18B20传感器,每个传感器都有唯一的64位ROM编码,主控器可以通过ROM编码来识别和操作不同的传感器。
这种多路传感器的设计可以方便地实现对多个温度传感器的监测和控制。
此外,DS18B20温度传感器采用了数字式温度转换技术,它可以实现9至12位的可编程分辨率,因此可以满足不同应用对温度测量精度的要求。
在温度转换过程中,DS18B20会自动对温度进行采样和转换,并将转换后的数字信号传输给主控器,主控器可以通过计算和处理这些数字信号来获取温度值。
最后,DS18B20温度传感器内部集成了温度传感器和A/D转换器,温度传感器可以实时监测环境温度,并将温度转换为电压信号,A/D转换器将电压信号转换为数字信号输出。
这种集成设计可以减少外部元器件的使用,降低系统成本,提高系统稳定性和可靠性。
总的来说,DS18B20温度传感器通过数字信号输出、单总线通信、数字式温度转换和内部集成等技术实现了高精度、可编程分辨率和多路传感器的特点,其工作原理简单而有效,使其在各种温度测量和控制应用中得到了广泛的应用。
希望通过本文的介绍,能够让大家更加深入地了解DS18B20温度传感器的工作原理。
ds18b20温度采集气体浓度采集加lcd显示程序
#include<reg51.h>#include<intrins.h>#include <absacc.h>#include <math.h>#define uchar unsigned char#define uint unsigned int#define BUSY 0x80 //常量定义#define DATAPORT P0//ADC0832的引脚sbit ADCS =P3^5; //ADC0832 chip seclectsbit ADDI =P3^7; //ADC0832 k insbit ADDO =P3^7; //ADC0832 k outsbit ADCLK =P3^6; //ADC0832 clock signalsbit LCM_RS=P2^0;sbit LCM_RW=P2^1;sbit LCM_EN=P2^2;sbit DQ=P1^4;uchar ad_data; //采样值存储sbit Alarm_led_red =P1^5; //超过压力表量程最大值红色led报警定义sbit Alarm_led_green=P1^6; //低于压力表量程最小值绿色led报警定义//adc采样值存储单元char press_data; //标度变换存储单元unsigned char ad_alarm; //报警值存储单元unsigned char press_bai=0; //显示值百位unsigned char press_shi=0; //显示值十位unsigned char press_ge=0; //显示值个位unsigned char press_dot=0; //显示值十分位uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志uchar code str0[]={"Press: . kpa. "};void delay(uint);void lcd_wait(void);void delay_LCM(uint); //LCD延时子程序void initLCM( void); //LCD初始化子程序void lcd_wait(void); //LCD检测忙子程序Void WriteCommandLCM(ucharWCLCM,ucharBusyC); //写指令到ICM子函数Void WriteDataLCM(ucharWDLCM); //写数据到LCM子函数void DisplayOneChar(uchar X,ucharY,ucharDData); 显示指定坐标的一个字符子函数void DisplayListChar(uchar X,uchar Y,uchar code*DData); //显示指定坐标的一串字符子函数Void display(void); //系统显示子函数uchar Adc0832(unsigned char channel);void alarm(void);void data_pro(void);void delay_18B20(unsigned int i);void ds1820rst(); /*ds1820复位*/uchar ds1820rd(); /*读数据*/void ds1820wr(uchar wdata); /*写数据*/void ds1820disp(); //温度值显示/**********main funcation************/void main(void){delay(500); //系统延时500ms启动// ad_data=0; //采样值存储单元初始化为0initLCM( );WriteCommandLCM(0x01,1); //清显示屏DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);while(1){ad_data =Adc0832(0); //采样值存储单元初始化为0data_pro();read_temp();//读取温度display();}}/*********延时K*1ms,12.000mhz**********/void delay(uint k){uint i,j;for(i=0;i<k;i++){for(j=0;j<60;j++){;}}}/**********写指令到ICM子函数************/ void WriteCommandLCM(uchar WCLCM,uchar BusyC) {if(BusyC)lcd_wait();DATAPORT=WCLCM;LCM_RS=0; // 选中指令寄存器LCM_RW=0; // 写模式LCM_EN=1;_nop_();_nop_();_nop_();LCM_EN=0;}/**********写数据到LCM子函数************/ void WriteDataLCM(uchar WDLCM){DATAPORT=WDLCM;LCM_RS=1; // 选中数据寄存器LCM_RW=0; // 写模式LCM_EN=1;_nop_();_nop_();_nop_();LCM_EN=0;}/***********lcm内部等待函数*************/void lcd_wait(void){DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色LCM_EN=1;LCM_RS=0;LCM_RW=1;_nop_();_nop_();_nop_();while(DATAPORT&BUSY){ LCM_EN=0;_nop_();_nop_();LCM_EN=1;_nop_();_nop_();}LCM_EN=0;}/**********LCM初始化子函数***********/void initLCM( ){delay(15);WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号delay(5);WriteCommandLCM(0x38,0);delay(5);WriteCommandLCM(0x38,0);delay(5);WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号WriteCommandLCM(0x08,1); //关闭显示,检测忙信号WriteCommandLCM(0x01,1); //清屏,检测忙信号WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号}/****显示指定坐标的一个字符子函数****/void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40X|=0x80; //指令码为地址码+0X80WriteCommandLCM(X,0);WriteDataLCM(DData);}/*******显示指定坐标的一串字符子函数*****/void DisplayListChar(uchar X,uchar Y,uchar code *DData){uchar ListLength=0;Y&=0x01;X&=0x0f;while(X<16){ListLength++;X++;}}/*****************系统显示子函数*****************/void display(void){uchar flagdat;WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(7,0,press_bai+0x30);DisplayOneChar(8,0,press_shi+0x30);DisplayOneChar(9,0,press_ge +0x30);DisplayOneChar(11,0,press_dot+0x30);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;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}WriteCommandLCM(0xc3);WriteDataLCM(flagdat);//显示符号?WriteDataLCM(disdata[0]);//显示百位WriteCommandLCM(0xc5);WriteDataLCM(disdata[1]);//显示十位WriteCommandLCM(0xc6);WriteDataLCM(disdata[2]);//显示个位WriteCommandLCM(0xc7);WriteDataLCM(0x2e);//显示小数点WriteCommandLCM(0xc8);WriteDataLCM(disdata[3]);//显示小数位delay(1000); //稳定显示}/************读ADC0832函数************/uchar Adc0832(unsigned char channel) //AD转换,返回结果{uchar i=0;uchar j;uint dat=0;uchar ndat=0;if(channel==0)channel=2;if(channel==1)channel=3;ADDI=1;_nop_();_nop_();ADCS=0;//拉低CS端_nop_();_nop_();ADCLK=1;//拉高CLK端_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿1_nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=channel&0x1;ADCLK=0;//拉低CLK端,形成下降沿2 _nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=(channel>>1)&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束_nop_();_nop_();dat=0;for(i=0;i<8;i++){dat|=ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();dat<<=1;if(i==7)dat|=ADDO;}for(i=0;i<8;i++){j=0;j=j|ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();ndat=ndat|j;if(i<7)ndat>>=1;}ADCS=1;//拉低CS端ADCLK=0;//拉低CLK端ADDO=1;//拉高数据端,回到初始状态dat<<=8;dat|=ndat;return(dat); //return ad k}void data_pro(void){unsigned int temp;float press;if(14<ad_data<243) //当压力值介于15kpa到115kpa之间时,遵循线性变换{int vary=ad_data; //y=(115-15)/(243-13)*X+15kpapress=((10.0/23.0)*vary)+9.3; //测试时补偿值为9.3temp=(int)(press*10); //放大10倍,便于后面的计算press_bai=temp/1000; //取压力值百位press_shi=(temp%1000)/100; //取压力值十位press_ge=((temp%1000)%100)/10; //取压力值个位press_dot=((temp%1000)%100)%10; //取压力值十分位}}/*****************报警子函数*******************/unsigned int a;void alarm(void){if(ad_data>=243) //如果当前压力值大于115kpa,{ Alarm_led_red=0;while(a--);{}Alarm_led_red=1;a=10000;while(a--);{}}Else //则启动red led报警{Alarm_led_red=1;} //关闭red led 报警if(ad_data<=14) //如果当前压力值小于16kpa{Alarm_led_green=0;a=10000;while(a--);{}Alarm_led_green=1; //则启动green led报警a=10000;while(a--);{}}else{Alarm_led_green=1; //关闭green led 报警} //关闭green led 报警}/****************************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);}。
温度传感器ds18b20
温度传感器ds18b20温度传感器DS18B201. 简介温度传感器DS18B20是一种数字温度传感器,可用于测量环境温度。
该传感器由Maxim Integrated公司生产,并在许多应用中得到了广泛的应用,如家庭自动化、气象站、工业控制等。
DS18B20采用了数字化接口,并具有高精度、可编程分辨率和低功耗等特点。
2. 技术规格DS18B20的技术规格如下:- 工作电源:3.0V至5.5V- 测量范围:-55°C至+125°C- 分辨率:可编程为9、10、11或12位- 精度:±0.5°C(在-10°C至+85°C范围内)- 通信接口:一线式数字接口3. 工作原理DS18B20采用了一线式数字接口,这意味着它只需要一根数据线进行通信。
传感器从控制器接收命令,并通过数据线将温度数据发送回控制器。
传感器的数据线同时起到了供电的作用。
DS18B20通过内部的精密温度传感器测量环境温度。
传感器将温度转换为数字信号,并通过数据线将其发送给控制器。
传感器的分辨率可以根据需要进行编程,从而在精度和响应速度之间进行平衡。
4. 使用方法使用DS18B20温度传感器非常简单。
首先,将传感器的电源引脚连接到可用的电源引脚,并将数据线连接到控制器的GPIO引脚。
然后,通过控制器向传感器发送命令,请求温度数据。
传感器将在一段时间后将温度数据发送回控制器,控制器可以读取这些数据并进行相应的处理。
DS18B20还具有一些特殊的命令,如启动温度转换、复位传感器和读取ROM代码等。
这些命令可以通过与控制器的通信来实现。
5. 应用领域温度传感器DS18B20在许多应用中得到了广泛的应用。
以下是一些常见的应用领域:- 家庭自动化:DS18B20可以用于监测室内温度,从而实现智能化的温控系统。
- 气象站:DS18B20可以用于监测室外温度,并将数据发送到气象站系统进行分析和显示。
数字温度传感器DS18B20详解
数字温度传感器DS18B20详解一、概述传统的温度检测大多以热敏电阻为传感器,采用热敏电阻,可满足40℃至90℃测量范围,但热敏电阻可靠性差,测量温度准确率低,对于小于1℃的温度信号是不适用的,还得经过专门的接口电路转换成数字信号才能由微处理器进行处理。
目前常用的微机与外设之间进行的数据通信的串行总线主要有I2C总线,SPI总线等。
其中I2C总线以同步串行2线方式进行通信(一条时钟线,一条数据线),SPI总线则以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线)。
这些总线至少需要两条或两条以上的信号线。
而单总线( 1-wire bus ),采用单根信号线,既可传输数据,而且数据传输是双向的,CPU 只需一根端口线就能与诸多单总线器件通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
因而,这种单总线技术具有线路简单,硬件开销少,成本低廉,软件设计简单,便于总线扩展和维护。
同时,基于单总线技术能较好地解决传统识别器普遍存在的携带不便,易损坏,易受腐馈,易受电磁干扰等不足,因此,单总线具有广阔的应用前景,是值得关注的一个发展领域。
单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。
主机或从机通过一个漏极开路或三态端口连至数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线。
单总线通常要求外接一个约为 4.7K 的上拉电阻,这样,当总线闲置时其状态为高电平。
DS18B20数字式温度传感器,与传统的热敏电阻有所不同的是,使用集成芯片,采用单总线技术,其能够有效的减小外界的干扰,提高测量的精度。
同时,它可以直接将被测温度转化成串行数字信号供微机处理,接口简单,使数据传输和处理简单化。
部分功能电路的集成,使总体硬件设计更简洁,能有效地降低成本,搭建电路和焊接电路时更快,调试也更方便简单化,这也就缩短了开发的周期。
DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点:( 1 )采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
温度传感器ds18b20
温度传感器ds18b20温度传感器DS18B20摘要:温度传感器DS18B20是一款数字温度传感器,具有较高的精度和稳定性。
本文将介绍DS18B20传感器的原理、特点、应用领域以及使用方法。
第一部分:引言温度传感器是一种广泛应用于各个领域的传感器,用于测量和监控环境中的温度变化。
DS18B20是一款数字温度传感器,具有高精度、数字输出、单总线操作等特点,因此在各个领域得到了广泛的应用。
本文将对DS18B20传感器进行详细的介绍。
第二部分:DS18B20传感器的原理DS18B20是基于热敏电阻技术的温度传感器,其原理是利用材料的特性,在温度变化时改变电阻值。
DS18B20采用了目前常用的数字温度传感器技术,通过读取电阻值来得到准确的温度测量结果。
第三部分:DS18B20传感器的特点1. 高精度:DS18B20传感器具有高达±0.5℃的精度,可满足多种应用场景对温度测量的要求。
2. 数字输出:DS18B20采用数字信号输出,易于与各种微控制器和芯片进行通信和集成。
3. 单总线操作:DS18B20可以通过单总线进行操作和通信,简化了传感器与控制系统之间的连接。
4. 多项配置选项:DS18B20传感器支持多种配置选项,可以根据需要调整分辨率、工作模式等参数。
5. 低功耗:DS18B20传感器具有低功耗特性,适合长时间运行。
第四部分:DS18B20传感器的应用领域1. 家用电器:DS18B20传感器可以用于家用电器中的温度控制和监测,例如空调、电冰箱等。
2. 工业自动化:DS18B20传感器在工业自动化领域中广泛应用于温度监测和控制,例如工厂、仓库等环境。
3. 农业温控:DS18B20传感器可用于农业温控系统,例如温室、畜舍等。
4. 医疗仪器:DS18B20传感器在医疗仪器中可用于体温检测和监控,例如体温计、输液器等。
5. 汽车电子:DS18B20传感器可以用于汽车电子系统中的温度监控和控制,例如发动机温度监测。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE
sbit DQ = P2^3; //DS18B20数据口
unsigned char TMPH,TMPL;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
void delays()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(uint N)
{
int i;
for(i=0; i<N; i++)
;
}
uchar Reset(void)
{
uchar deceive_ready;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
deceive_ready = DQ;
delay(25);
return(deceive_ready);
}
uchar read_bit(void)
{
uchar i;
DQ = 0;
DQ = 1;
for(i=0; i<3; i++);
return(DQ);
}
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
uchar read_byte(void)
{
uchar i,m,receive_data;
m = 1;
receive_data = 0;
for(i=0; i<8; i++)
{
if(read_bit())
{
receive_data = receive_data + (m << i);
}
delay(6);
}
return(receive_data);
}
void write_byte(uchar val)
{
uchar i,temp;
for(i=0; i<8; i++)
{
temp = val >> i;
temp = temp & 0x01;
write_bit(temp);
delay(5);
}
}
bit Busy(void)
{
bit busy_flag = 0;
RS = 0;
RW = 1;
E = 1;
delays();
busy_flag = (bit)(P0 & 0x80);
E = 0;
return busy_flag;
}
void wcmd(uchar del)
{
while(Busy());
RS = 0;
RW = 0;
E = 0;
delays();
P0 = del;
delays();
E = 1;
delays();
E = 0;
}
void wdata(uchar del)
{
while(Busy());
RS = 1;
RW = 0;
E = 0;
delays();
P0 = del;
delays();
E = 1;
delays();
E = 0;
}
void L1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
void L1602_char(uchar hang,uchar lie,char sign) {
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
wcmd(a);
wdata(sign);
}
void L1602_string(uchar hang,uchar lie,uchar *p) {
uchar a,b=0;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
while(1)
{
wcmd(a++);
if((*p == '\0')||(b==16)) break;
b++;
wdata(*p);
p++;
}
}
void main()
{
uint temp;
L1602_init();
L1602_string(1,1," The temperature is");
L1602_char(2,9,'`');
L1602_char(2,10,'C');
while(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL = read_byte();
TMPH = read_byte();
temp = TMPL / 16 + TMPH * 16;
L1602_char(2,7,temp/10%10+48);
L1602_char(2,8,temp%10+48);
}
}。