《基于DS18B20单线多点温度测量系统(35页).doc》由会员分享,可在线阅读,更多相关《基于DS18B20单线多点温度测量系统(35页).doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于DS18B20单线多点温度测量系统-第 30 页目 录第一章 绪论11.1 选题背景和意义11.2 系统概述2第二章 硬件电路的设计32.1 ATmega16单片机32.1.1 ATmega16的主要特性32.1.2 ATmega16引脚介绍42.2 DS18B20芯片62.2.1 DS18B20芯片的特性62.2.2 DS18B20引脚排列72.2.3 DS18B20的内部结构72.2.4 DS18B20芯片各部分介绍82.3单线总线系统112.3.1 处理顺序112.3.2 初始化122.3.3 ROM操作指令122.3.4 DS18B20功能指令12第三章 系统软件设计143.1
2、DSl8B20温度测量143.1.1 单点测量温度143.1.2 多点测量温度153.1.3 DS18B20 ROM搜索算法173.1.4 C语言程序实现213.2 单总线信号时序233.2.1复位脉冲和应答脉冲233.2.2写操作和读操作25第四章 系统仿真调试284.1系统开发环境284.2系统仿真调试29结 论32致 谢33参考文献34基于DS18B20单线多点温度测量系统 专业班级:电子信息工程2班 学生姓名:杜刘乾指导老师:秦玉龙 职 称:讲师摘要 本次毕业设计是基于DS18B20单线多点温度测量系统。以ATmega16单片机为核心,使用温度传感器DS18B20实现温度的采集。论文设
3、计的目的是对DS18B20进行编程,了解其性能特点,通过所学的C语言知识和相关资料提供的指令代码完成单片机与DS18B20的温度监测。DS18B20是一种智能温度传感器,它能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。使用DS18B20可使系统结构更趋简单,抗干扰能力强,适合于恶劣环境下现场温度的测量,可靠性更高,可应用于仓库测温、楼宇空调控制和生产过程监控等领域。单片机对传感器采集来的数据进行处理,通过LCD把各个点的温度给显示出来,另一方面单片机可以通过串口通讯传给上位机,由上位机软件显示出来;该系统可以设定温度上下限值,当温度超出系统设定的范围时,系统
4、会报警提示。关键词:ATmega16 DS18B20 单线 多点 温度测量1-Wire Multi-point temperature measurement system based on DS18B20Abstract The graduation project is 1-Wire Multi-point temperature measurement s-ystem based on DS18B20.ATmega16 microprocessor as the core of it, the temper-ature collection is use of DS18B20. Our
5、experimental purpose is programming to DS18B20 and understand its performance characteristics .The instruction code thro-ugh the C language knowledge and relevant information to complete the DS18B20 temperature measurements.DS18B20 is a smart temperature sensor .The DS18B20 digital thermometer provi
6、des 9-bit to 12-bit Celsius temperature measurements. UseDS18B20 makes the system structure more simple,and higher reliability.The system can be used in many fileds such as the temperature measurement system of war-ehouse,the air conditioning control of building and the monitor of productive process
7、.The temperature data is conversed to digital signals in the sensor and then is tran-smitted to MCU, which processes the data from sensor acquisition and displays thetemperature on various points through the LCD. On the other hand MCU can pass-through the serial port communications PC, from PC softw
8、are displayed. The syste-m can set temperature limits from top to bottom, when the temperature exceeds t-e limits set by system, the system will prompt the police.Key words ATmega16 DS18B20 1-wire multi-point temperature measurement第一章 绪论1.1 选题背景和意义温度是日常生活、工业、医学、环境保护、化工、石油等领域中不可缺少的物理量。温度的测量和控制在这些领域中
9、就显得尤其重要。传统的温度检测是使用诸如热电偶、热电阻、半导体PN结之类的模拟传感器,经信号取样电路、放大电路和模数转换电路处理,获取表示温度值的数字信号,再交由微处理器或DSP处理。因为监测环境复杂,测量点多,信号传输距离远及各种干扰的影响,使得传统测量系统的稳定性和可靠性下降。随着社会的进步和工业技术的发展,温度因素在社会生活的各个方面都起到了重要的作用。由于许多产品对温度范围的要求严格,而目前市场上普遍存在的温度检测仪器大多都是单点测量,同时有温度信息传递不及时、精度度不够高的缺点,不利于工业生产根据温度的变化及时做出决定。在这样的前提下,开发一种能够同时测量多点,并且实时性高、精度度高
10、,能够综合处理多点温度信息的测量系统就很有必要。国外对温度检测技术研究较早,始于20世纪70年代。先是采用模拟式的组合仪表采集现场信息并进行指示、记录和控制,80年代末出现了分布式控制系统,目前正开发和研制计算机数据采集控制系统的多因子综合控制系统。现在世界各国的温度检测技术发展很快,一些国家在实现自动化的基础上正向着完全自动化、无人化的方向发展。我国对于温度检测技术的研究较晚,始于20世纪80年代。近年来,我国引进了多达16个国家和地区的工厂环境控制系统,在总体上,正从消化吸收、简单应用阶段向实用化、综合性应用阶段过渡和发展,对推动工厂温度自动检测产生了积极的作用。与此同时,我国的温度测控设
11、施计算机应用以单片机控制的单参数单回路系统居多,尚无真正意义上的多参数综合控制系统。在生产实际中仍然有许多问题困扰着我们,比如环境控制水平落后,软硬件资源不能共享和可靠性差等缺点。与发达国家相比,还存在较大的差距。近年来随着单片机的发展和传感器技术的革新,温度检测领域也完成了从模拟信号到数字信号的转变。DS18B20温度传感器的广泛应用更是推动了这一领域的发展。我们可以基于ATmega16单片机,利用液晶显示器件以及DS18B20 温度传感器等器件,通过温度传感器在单片机下的硬件连接,软件编程即可设计DS18B20温度传感器系统。该系统可以方便的实现单线多点温度的测量,并可以根据需要任意设定上
12、下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。DS18B20与ATmega16的结合实现了最简温度监测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。1.2 系统概述 本文详细介绍了基于DS18B20单线多点温度测量系统的构成。大致可分为硬件电路设计、软件程序设计和仿真设计。第二章介绍了硬件电路的设计,包括ATmega16单片机、DS18B20传感器的介绍以及电路的连接;第三章介绍了软件的设计,包括DS18
13、b20温度传感器的使用过程以及如何在一条线上实现单点和多点温度的测量;第四章介绍了如何通过软件平台得出仿真图。关于各个模块的流程图和相关原程序代码将在下面的章节中一一介绍。第二章 硬件电路的设计该电路是通过ATmega16单片机和DS18B20传感器连接而成的温度测量系统。单片机除了可以测量电信号外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度监测、温度控制系统已广泛应用。单片机的接口信号时数字信号,要用单片机作为控制其测量温度,用温度传感器将温度信息转换为电流或电压信号输出,如果转化的信号是模拟信号,还需要进行A/D转化,以满足单片机接口的需要。可以采用温度传感器DS18B2
14、0,此传感器可以直接获取测温值,进行转换,成功采集温度后,利用单片机进行数据处理,通过LCD显示温度。以下是系统组成框图。 ATmega16单片机报警显示液晶显示按键控制DS18B20DS18B20图1-1 系统组成框图2.1 ATmega16单片机ATmega16是基于增强的AVR RISC结构的低功耗8位CMOS微控制器。由于其先进的指令集以及单时钟周期指令执行时间,ATmega16的数据吞吐率高达1 MIPS/MHz,从而可以减缓系统在功耗和处理速度之间的矛盾。ATmega16 内核具有丰富的指令集和32个通用工作寄存器。所有的寄存器都直接与运算逻单元(ALU)相连接,使得一条指令可以在
15、一个时钟周期内同时访问两个独立的寄存器。这种结构大大提高了代码效率,并且具有比普通的CISC微控制器最高至10倍的数据吞吐率。2.1.1 ATmega16的主要特性 (1)先进的RISC结构 - 16K字节的系统内可编程Flash,擦写寿命:10,000次 - 512字节的EEPROM,擦写寿命:100,000次- 1K字节的片内SRAM (2)JTAG接口(与IEEE1149.1标准兼容) - 符合 JTAG 标准的边界扫描功能- 支持扩展的片内调试功能- 通过JTAG接口实现对Flash、 EEPROM、熔丝位和锁定位的编程(3)外设特点- 两个具有独立预分频器和比较器功能的8位定时器/计
16、数器- 一个具有预分频器、比较功能和捕捉功能的16位定时器/计数器- 具有独立振荡器的实时计数器RTC -四通道PWM - 8路10位ADC - 8个单端通道- 面向字节的两线接口- 两个可编程的串行USART - 可工作于主机/从机模式的SPI串行接口- 具有独立片内振荡器的可编程看门狗定时器- 片内模拟比较器 (4)I/O和封装 - 32个可编程的I/O口- 40引脚PDIP封装,44引脚TQFP封装,与44引脚MLF封装 2.1.2 ATmega16引脚介绍图1-2 ATmega16引脚图(1)VCC:供电电压(2)GND:接地(3)端口A(PA7PA0):端口A做为A/D转换器的模拟输
17、入端。端口A为8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口A处于高阻状态。(4)端口B(PB7PB0):端口B为8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口B处于高阻状态。 (5)端口C(PC7PC0):端口C为8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称
18、的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口C处于高阻状态。如果JTAG接口使能,即使复位出现引脚 PC5(TDI)、PC3(TMS)与 PC2(TCK)的上拉电阻被激活。(6)端口D(PD7PD0):端口D为8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口D处于高阻状态。(7)RESET:复位输入引脚。持续时间超过最小门限时间的低电平将引
19、起系统复位。持续时间小于门限间的脉冲不能保证可靠复位。 (8)XTAL1:反向振荡放大器与片内时钟操作电路的输入端。 (9)XTAL2:反向振荡放大器的输出端。 (10)AVCC:AVCC是端口A与A/D转换器的电源。不使用ADC时,该引脚 应直接与VCC连接。使用ADC时应通过一个低通滤波器与VCC连接。 (11)AREF:A/D的模拟基准输入引脚。 2.2 DS18B20芯片DS18B20是美国DALLAS公司推出的单总线数字化测温集成电路,它具有独特的单线接口方式,将非电模拟量温度值转换为数字信号串行输出,仅需占用1位I/O端口,能够直接读取被测现场的温度值。它的体积小,电压适用范围宽(
20、3V5V),并且可以通过编程实现912位的温度读数,即具有可调的温度分辨率,因此实用性和可靠性较高,在许多行业中被广泛应用。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。由于其耐磨耐碰,体积小,使用方便,封装形式多样的特点,也适用于各种狭小空间设备数字测温和控制领域。 2.2.1 DS18B20芯片的特性DS18B
21、20单线数字温度传感器,即“一线器件”,其具有独特的优点:(1)采用单总线的接口方式,与微处理器连接时,仅需要一条口线即可实现微处理器与DS18B20的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。(2)测量温度范围宽,测量精度高DS18B20的测量范围为-55+125 ;在-10+85范围内,精度为0.5。(3)在使用中不需要任何外围元件。(4)持多点组网功能,多个DS18B20可以并联在惟一的单线上,实现多点测温。(5)供电方式灵活,DS18B20可以通过内部寄生电路从数据线上获取电源。
22、因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。(6)测量参数可配置DS18B20的测量分辨率可通过程序设定912位。(7)负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。(8)掉电保护功能,DS18B20内部含有EEPROM,在系统断电以后,它仍可保存分辨率及报警温度的设定值。2.2.2 DS18B20引脚排列图1-3 DS18B20引脚排列1.GND为接地。2.DQ为数字信号输入/输出端。3.VDD为外接供电电源输入口。2.2.3 DS18B20的内部结构DSl8B20的内部主要包括寄生电源、温度传感器、64位激光ROM单线接口
23、、存放中间数据的高速暂存器、温度报警触发器TH和TL用于存储用户写入报警上下限的报警触。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8X5X41)。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。HIGH TEMPERATURE TRIGGER.THTEMPRATURE SENSOR64-BIT ROM AND1-WIRE PORTPOWER SUPPLY SENSEMEMORY AND CONTROL LOGICS
24、CRATCHPAD8-BIT CRC GENERATORLOW TEMPERATURE TRIGGER.TLDQINTERNAL VDDVDD图1-4 DS18B20方框图2.2.4 DS18B20芯片各部分介绍(1)64位激光ROM 每个DS18B20都有一个唯一储存在ROM中的64位编码。最前面8位是单线产品系列编码:28h。接着的48位是一个唯一的序列号。最后8位是以上56位的CRC编码。64位ROM和ROM操作控制区允许DS18B20作为单总线器件并按照单总线协议工作。8位CRC编码48位序列号8位产品系列编码图1-5 64位激光ROM码(2)高速暂存存储贮器高速暂存存储器由9个字节组
25、成,其分配如下图所示。字节0和字节1为测得温度信息的LSB和MSB,这两个字节是只读的。字节2和字节3是TH和TL的拷贝。字节4包含配置寄存器数据,详细介绍如下图所示。字节5、6 和7被器件保留,禁止写入。这些数据在读回时全部表现为逻辑1。高速暂存器的位8是只读的,包含以上八个字节的CRC码,CRC的执行方式如CRC发生器节所述。 TEMPERATURE LSBTEMPERATURE MSBTH/USERBYTE1TL/USERBYTE2RESERVEDRESERVEDCOUNT REMAINCOUNT PERCRCSCRATCHPADBYTE012345678EERAMTH/USERBYTE
26、1TL/USERBYTE2图1-6 高速暂存存储器映象存储器的第4位为配置寄存器。用户可以通过按下图所示设置R0和R1位来设定DS18B20的精度。上电默认设置:R0=1,R1=1(12位精度)。注意:精度和转换时间之间有直接的关系。暂存器的位7和位0-4被器件保留,禁止写入;在读回数据时,它们全部表现为逻辑1。bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit00R1R011111图1-7 配置寄存器表1-1 温度分辨率配置R1R0精度最大转换时间009-bit93.75msTconv/80110-bit187.5msTconv/41011-bit375msTcon
27、v/21112-bit750msTconv (3)温度传感器DS18B20中的温度传感器可完成对温度的测量。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如图所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。23 22 21 20 2-1 2-2 2-3 2-4S S S S S 26 25 24BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0LS BYTEBIT15 BIT14 BIT
28、13 BIT12 BIT11 BIT10 BIT9 BIT8MS BYTES=SIGN图1-8 DS18B20温度寄存器格式表1-2 温度/数据关系温度/二进制表示十六进制表示+12500000111 1101000007D0H+25.062500000001 100100010191H+10.12500000000 1010001000A2H+0.500000000 000010000008H000000000 000000000000H-0.511111111 11111000FFF8H-10.12511111111 01011110FF5EH-25.062511111110 011011
29、11FE6FH-5511111100 10010000FC90H(4)CRC发生器CRC字节作为DS18B20 64位ROM的一部分存储在存储器中。CRC码由ROM的前56位计算得到,被包含在ROM的重要字节当中。CRC由存储在存储器中的数据计算得到,因此当存储器中的数据发生改变时,CRC的值也随之改变。CRC能够在总线控制器读DS18B20时进行数据校验。为校验数据是否被正确读取,总线控制器必须用接受到的数据计算出一个CRC值,和存储在DS18B20的64位ROM 中的值(读ROM时)或DS18B20内部计算出的8位CRC值(读存储器时)进行比较。如果计算得到的CRC值和读取出来的CRC值相
30、吻合,数据被无错传输。CRC值的比较以及是否进行下一步操作完全由总线控制器决定。XORXORXORINPUT(MSB)(LSB)图1-9 CRC生成2.3单线总线系统单总线系统只有一条定义的信号线。每一个总线上的器件必须是漏极开路或三态输出。这样的系统允许每一个挂在总线上的区间都能在适当的时间驱动它。DS18B20的单总线端口(DQ引脚)是漏极开路式的,单总线需要一个约5K的外部上拉电阻;单总线的空闲状态是高电平。无论任何理由需要暂停某一执行过程时,如果还想恢复执行的画,总线必须停留在空闲状态。在恢复期间,如果单总线处于非活动(高电平)状态,位与位间的恢复时间可以无限长。如果总线停留在低电平超
31、过480us,总线上的所有器件都将被复位。5UATypRXTX+5V4.7K100MOSFETRX图1-10 DS18B20电路连接2.3.1 处理顺序经过单线总线接口访问DS18B20的协议如下:步骤1:初始化步骤2:ROM操作指令步骤3:DS18B20功能指令2.3.2 初始化通过单总线的所有执行操作处理都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和其后由从机发出的存在脉冲。存在脉冲让总线控制器知道DS18B20在总线上且已准备好操作。2.3.3 ROM操作指令一旦总线控制器探测到一个存在脉冲,它就发出一条ROM指令。如果总线上挂有多只DS18B20,这些指令将基于
32、器件独有的64位ROM片序列码使得总线控制器选出特定要进行操作的器件。这些指令同样也可以使总线控制器识别有多少个什么型号的器件挂在总线上,同样,它们也可以识别哪些器件已经符合报警条件。ROM指令有5条,都是8位长度。总线控制器在发起一条DS18B20功能指令之前必须先发出一条ROM指令。表2-3 ROM操作指令指令名称指令代码指令功能读ROM33H读DS18B20 ROM中的编码(即读64位地址编码)ROM匹配55H发出此命令之后,接着发出64位ROM编码,访问单总线上与编码相对应DS18B20使之作出响应,为下一步对该DS18B20的读写作准备搜索ROM0F0H用于确定接在同一总线上DS18
33、B20的个数和识别64位ROM地址,为操作各器件作好准备跳过ROM0CCH忽略64位ROM地址,直接向DS18B20发温度变换命令,适用于单片机工作报警搜索0ECH该指令执行后,只有温度超过设定值上限或下限的片子才做出响应2.3.4 DS18B20功能指令在总线控制器发给欲连接的DS18B20一条ROM命令后,跟着可以发送一条DS18B20功能指令。这些命令允许总线控制器读写DS18B20的暂存器,发起温度转换和识别电源模式。DS18B20功能指令如下图所示:表2-4 DS18B20功能指令指令名称指令代码指令功能温度变换44H启动DS18B20进行温度转换,转换时间最长为500ms(典型为2
34、00ms),结果存入内部9字节RAM中读暂存器0BEH读内部RAM中9字节的内容写暂存器4EH发出向内部RAM的第3,4字节写上,下限温度数据命令,紧跟着该命令之后是传送两字节的数据复制暂存器48H将RAM的第3,4字节的内容复制到EEPROM中重调EEPROM0B8HEEPROM中的内容恢复到RAM中的第3,4字节读供电方式0B4H读DS18B20的供电模式,寄生供电时DS18B20发送“0”,外接供电时DS18B20发送“1”第三章 系统软件设计整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。从软件的功能不同可分为两大类:一是监控软件(主程序),它
35、是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、报警等。每一个执行软件也就是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。各执行模块规划好后,就可以规划监控程序了。以下是系统软件结构图:主程序液晶显示子程序温度测量子程序中断程序控制键盘扫描选择程序图3-1 系统软件结构图3.1 DSl8B20温度测量3.1.1 单点测量温度如果总线上只有一个器件, 则不需要识别器件的编码, 直接访问该器件即可。访问流程图如下:初始化DS18B20开始发Skip ROM命令温度转换延时
36、500ms等待温度转换初始化DS18B20发Skip ROM命令发读温度命令读DS18B20返回EEPROM中的内容,顺序从字节0的LSB位开始读两次,即读出温度值的高低两字将二进制温度转换成十进制温度取整数部分的7位至ACC各位中以实现温度转换结束图3-2单点温度测量流程图3.1.2 多点测量温度多点测量温度中需每一片DSl8B20在ROM中都存有唯一的序列号, 在出厂前己写入片内ROM中,主机在进入操作程序前必须逐一接入DS18B20用读ROM(33H)命令将该DS18B20的序列号读出并登录。当主机需要对众多在线DS18B20的某一个进行操作时, 首先要发出匹配ROM命令(55H),紧接
37、着主机提供64位序列号,之后的操作就是针对该DS18B20的。而所谓跳过ROM命令即为:之后的操作是对所有DS18B20的。框图中先有跳过ROM,即是启动所有DS18B20进行温度变换,之后通过匹配ROM,再逐一地读回每个DS18B20的温度数据。在DS18B20组成的测温系统中,主机在发出跳过ROM命令之后, 再发出统一的温度转换启动码44H, 就可以实现所有DS18B20的统一转换,再经过1秒后,就可以用很少的时间去逐一读取。开始结束初始化DS18B20发送搜索ROM命令读在线DS18B20序列号初始化DS18B20存在一个DS18B20发送温度转换命令发送匹配ROM命令发送匹配温度传感器
38、序列号所有传感器温度读取完毕读取温度NYNNY图3-3 多点温度测量流程图3.1.3 DS18B20 ROM搜索算法搜索算法采用的是二叉树型结构,搜索过程沿各分节点进行,直到找到器件的ROM码即叶子为止;后续的搜索操作沿着节点上的其它路径进行,按照同样的方式直到找到总线上的所有器件代码。搜索算法首先通过复位(reset)和在线应答脉冲(presencepulse)时隙将1-Wire总线上的所有器件复位;成功地执行该操作后,发送1个字节的搜索命令;搜索命令使1-Wire器件准备就绪、开始进行搜索操作。搜索命令分为两类:标准搜索命令(F0 hex)用来搜索连接到网络中所有器件;报警或有条件搜索命令
39、(EC hex)只用来搜索那些处于报警状态下的器件,这种方式缩小了搜索范围,可以快速查找到所需要注意的器件。当单线总线上挂有多个DS18B20时,系统对总线上器件的数量和每个器件的ROM的识别与搜索是通过DS18820 ROM搜索命令与算法配合来实现的。下面具体介绍ROM搜索命令的工作过程。对64位ROM编码识别从最低位开始,ROM编码的每一位搜索过程可总结为“两读一写”:读一位,读该位补码;写一位。总线主机在ROM编码每一位上完成这三步就可以获得一个器件的ROM编码。 (1)读两位 总线主机发布ROM搜索命令后执行一次读,总线上所有器件就把它们各自ROM编码的第一位放到总线来作出响应。这次读
40、获得的数据是所有器件放在总线上数据的“与”。再执行一次读,因为ROM搜索命令正在执行所以总线上所有器件把各自ROM编码的第一位的补码放在总线上,第二次读获得的数据也是所有器件放在总线上数据的“与”。对第一位的“两读”就此完成。之后主机再次进行的“两读”则是针对ROM编码的第二位,以此类推。从“两读”获得的数据有以下解释,如下表所列。表3-1 “两读”数据解释“两读”数据“两读”数据解释00有器件的总线上,总线上所有器件再次数据位上发生冲突01有器件的总线上,总线上所有器件再次数据位均为010有器件的总线上,总线上所有器件再次数据位均为111没有器件在总线上(2)写一位 对ROM编码的某一位“两
41、读”之后,对该位进行“一写”操作。“一写”操作写的数据要根据“两读”获得的数据来确定。如果“两读”数据为00,则表示总线上器件在该位上数据发生冲突,“一写”写的数据此种情况下具有“排除”的作用,如果器件ROM编码在该位上的数据与“一写”写的数据相同,则继续保持与总线的联系。如果不相同则此器件从总线上“排除”,不再响应主机发布的命令,直到主机进行下一次复位。如果“两读”数据为01,则表示总线上所有器件在该位上均位0,为保持器件与总线的联系,“一写”操作主机应写0。同理,如“两读”数据为10,主机则应写1。执行1-Wire复位信号检测到应答脉冲Last-Device Flag=1?是否是2否设id
42、_bit_number值为1设last_zero值为0发送搜索命令(F0或ECh设id_bit_number值为1设last_zero值为0)22发送搜索命令(F0或ECh)id_bit=cmp_id_bit=1?2是否id_bit=cmp_id_bit=0?=0?id_bit_number=LastDiscrepancy?id_bit_number=LastDiscrepancy?是否否否是是将search_direction设置为id bit的值y?设search_direction数据位值为1设search_direction数据位值为0将ROM_NO中第id_bit_number位的值
43、赋给search_directionsearch-direction=0?将ROM_NO中第id_bit_number位的值赋给search_direction否是将当前的id_bit_number值赋给last_zerosearch-direction=0?将search_direction位赋给ROM_NO中的第id_bit_number位;并向1-Wire总线上参与搜索的器件发送该位递增id_bit_number的值id_bit-number64?否是将last_zero的值赋给LastDiscrepancylast-discrepancy=0?设置LastDeviceFlag标记为已找
44、到最后一个器件last_zero9?否是将last_zero的值赋给LastFamily-Discrepancy是3否ROM_NO中CRC正确吗?3是将返回值设置为TRUE结束否搜索过程复位LastDiscrepancy=0LastFamilyDiscrepancy=0LastDeviceFlag=02将返回值设置为FALSE图3-4.ROM搜索算法流程3.1.4 C语言程序实现根据上述规则,DS18B20的ROM码搜索识别C语言程序如下,Search One ROM()的功能是进行一次搜索,若搜索成功,ROM码存储在ROM8数组中,且返回值为TRUE,若搜索失败,则返回FALSE。/ def
45、initions#define FALSE 0#define TRUE 1/ global search stateunsigned char ROM_NO8;int LastDiscrepancy;int LastFamilyDiscrepancy;int LastDeviceFlag;unsigned char crc8;/ Find the first devices on the 1-Wire bus/ Return TRUE : device found, ROM number in ROM_NO buffer/ FALSE : no device presentint OWFirst() / reset the search state LastDiscrepancy = 0; LastDeviceFlag = FALSE; LastFamilyDisc