论文部分内容阅读
摘要:本文以1-Wire 器件DS18B20为核心元件,以单片机教学实验仪PHOENIX325为平台,搭建了一套集成度高、扩充空间大的测温网络。该测温网络由4只DS18B20组成,挂接在单片机P1口;软件设计方面,采用二叉树遍历算法,搜索总线上所有家族号为28H的器件,匹配ID号后启动温度转换,将结果送到1-Wire总线上,并对编程思路、1-Wire器件的各种操作作了详细的介绍。
关键词:单片机;二叉树搜索;1-Wire总线;DS18B20;测温网络
DOI: 10.3969/j.issn.1005-5517.2012.10.009
引言
多点测温是重要库所、场站、厂房安全工作的重要环节,多点测温应以实时、精确为原则,在此基础上,电路设计要求尽量简单,程序设计应功能强、效率高,本文采用DS18B20作为核心元件,充分利用该器件分辨率高、所需元件少、宜于组网的特点,以二叉树遍历法为编程算法,构建基于1-Wire总线的测温网络。
方案设计
核心元件的选择
测温元件选用Dallas公司出品的DS18B20,与传统热敏电阻不同,DS18B20是1-Wire总线的数字温度传感器,可直接将被测温度转化成串行数字信号供单片机处理,适用于恶劣环境的现场温度测量[1-2]。
1-Wire器件的特性
DS18B20具有以下特性:测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;可由软件设定9~12位分辨率,对应的测量精度分别为0.5℃、0.25℃、0.125℃和0.0625℃,实现高精度测温;在寄生电源方式下可由数据线供电;独特的单线接口方式,DS18B20在与单片机连接时仅需要一条口线即可实现与单片机的双向通信;支持多点组网,多个DS18B20可以并联在总线上,实现组网测温;测量结果直接输出数字温度信号,同时可传送CRC校验码,具有极强的抗干扰纠错能力[3]。
电路设计
DS18B20供电方式有两种:内部电源和外部电源。采用内部电源供电时,功率由总线提供,此时引脚3接地,引脚2通过上拉电阻接至总线,在总线高电平期间,器件内部的寄生电容充电,总线低电平期间,寄生电容向器件供电;采用外部电源供电时,引脚3接VCC,在温度转换期间总线不用保持高电平,这样在温度转换期间总线上可以进行其他数据往来,本文采用外部电源方式。图1是测温网络电路图。
除测温电路之外,还有LCD显示、USB通信及电源模块,其功能分别为数据显示、程序下载、系统供电,由于这几部分电路通用性强,参考资料较多,故此处省略。
图1 1-Wire总线测温网络
软件编程
二叉树遍历算法
二叉树遍历算法是搜索识别网络中1-Wire器件的编程首选,二叉树遍历算法的要点可归纳为“读2位,写1位”。
编程思路
首先主机向从机发出搜索命令,等待从机向主机发回当前位之后,再读从机发回当前位的反码,这两个位数据的编码存在4种可能:00、01、10和11。
00表示从机在当前位上有位分叉,即0和1两个分支;01表示从机的当前位均为0;10表示从机的当前位均为1;11表示总线上无器件响应。
显然,出现11时搜索应退出。对于前3种情况,根据搜索策略,主机向从机写1位数据,决定继续搜索哪一分支。第2和第3种情况下,搜索仅有一个方向,如果是第1种情况即出现00时,需要选择下一步搜索路径,方法是比较搜索位所在位置和最后一次发生位差异的所在位置,若二者相等,搜索1分支,若前者>后者,搜索0分支,若前者<后者,则采用上一次的搜索路径。
在此有两点需要注意:一是网络上从机发回的位数据呈“线与”关系;二是DS18B20中64位ID码分别标记为第1—64位,而不是0—63位,空出来的0用来表示差异位位置记录的初始状态。
编程要点
1-wire总线既可传输时钟,又可传输数据,并且数据传输是双向的,因此读写时序至关重要,1-wire总线定义了复位脉冲、应答脉冲、写操作、读操作等几种信号类型,所有的1-wire总线命令序列都是由这些基本的信号类型组成。
(1)复位子函数
主机通过拉低总线至少480ms产生复位脉冲,然后释放总线,主机释放总线时,会产生低电平向高电平的跳变,之后延时60ms,等待DS18B20的应答,DS18B20通过拉低总线240ms产生应答脉冲,主机收到器件的应答脉冲后,说明有1-wire器件在线,然后主机就可以对DS18B20进行ROM命令。
(2)读写操作
所有的读写时序至少需要60ms,写时序时,主机在拉低总线15ms之内释放总线,并向1-wire器件写1。1-wire器件仅在主机发出读时序时才向主机传输数据,因此,当主机发出读数据命令后,必须马上产生读时序,以便1-wire器件传输数据[4]。
(3)温度转换
1-wire器件工作时,首先需要进行ROM操作,然后转换温度。编程时需注意三点。
⑴DS18B20ROM命令共5种,读ROM、匹配ROM、跳过ROM、搜索ROM、报警。
⑵增加延时函数,确保温度转换完成。
(3)读出温度数据后,要进行数据转换。读出温度低8位和高8位,把此低8位和高8位转换为1个16位的数,其高5位是相同的,代表符号;低11位,是温度的二进制数,其中高7位是温度整数,低4位是温度小数;如果是负温度,则从温度寄存器读出的是补码,应将补码取反加1得到原码。
DS18B20的小数位可以这样理解:单片机发出读取温度寄存器命令后,DS18B20会返回9组数据,其中第一组数据的低4位代表温度小数部分,换言之,即是把1度分解为16个4位二进制数来表示,则温度小数部分的精度为1/16=0.0625。
与列举ID号编程的比较
列举ID法需要预先储存器件ID号,然后接入全部器件读取温度,实验需分两步进行。储存ID号时,仅允许接入一只器件,此器件操作完成后取下,再接入另一只器件,效率低下,且频繁插拔对电路板及器件均有损伤,因此这种编程方法在实际应用中比较受限。二叉树搜索可以直接读取总线上所有器件温度,功能强大,操作简便,是1-Wire总线器件组网编程的首选[5]。
图2 测温网络在PHOENIX325实验仪上的应用
测试
笔者设计了一款单片机教学实验仪——PHOENIX325,实验仪上集成了由4只DS18B20构成的测温网络,图2是采用二叉树遍历算法测温网络的工作情况,LCD1602显示4只器件的温度值,由于LCD显示存在延时[6],因此拍到的只显示一只器件的测量温度。经实际测试,用本文设计的方法组网进行多点测温,测量精度、响应速度均令人满意。
结论
利用DS18B20的优异特性,采用多只器件构成1-Wire总线网络,外围元件少,结构简单,抗干扰性强,成本低廉,软件编程采用二叉树遍历算法,可搜索总线上所有器件,将具有同一家族号的器件识别出来,读出温度值,从教学实际来看,这种方案灵活性高,测量精度和响应速度都可得到保证,升级空间可自由扩充,是一种行之有效的多点测温模式。
关键词:单片机;二叉树搜索;1-Wire总线;DS18B20;测温网络
DOI: 10.3969/j.issn.1005-5517.2012.10.009
引言
多点测温是重要库所、场站、厂房安全工作的重要环节,多点测温应以实时、精确为原则,在此基础上,电路设计要求尽量简单,程序设计应功能强、效率高,本文采用DS18B20作为核心元件,充分利用该器件分辨率高、所需元件少、宜于组网的特点,以二叉树遍历法为编程算法,构建基于1-Wire总线的测温网络。
方案设计
核心元件的选择
测温元件选用Dallas公司出品的DS18B20,与传统热敏电阻不同,DS18B20是1-Wire总线的数字温度传感器,可直接将被测温度转化成串行数字信号供单片机处理,适用于恶劣环境的现场温度测量[1-2]。
1-Wire器件的特性
DS18B20具有以下特性:测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;可由软件设定9~12位分辨率,对应的测量精度分别为0.5℃、0.25℃、0.125℃和0.0625℃,实现高精度测温;在寄生电源方式下可由数据线供电;独特的单线接口方式,DS18B20在与单片机连接时仅需要一条口线即可实现与单片机的双向通信;支持多点组网,多个DS18B20可以并联在总线上,实现组网测温;测量结果直接输出数字温度信号,同时可传送CRC校验码,具有极强的抗干扰纠错能力[3]。
电路设计
DS18B20供电方式有两种:内部电源和外部电源。采用内部电源供电时,功率由总线提供,此时引脚3接地,引脚2通过上拉电阻接至总线,在总线高电平期间,器件内部的寄生电容充电,总线低电平期间,寄生电容向器件供电;采用外部电源供电时,引脚3接VCC,在温度转换期间总线不用保持高电平,这样在温度转换期间总线上可以进行其他数据往来,本文采用外部电源方式。图1是测温网络电路图。
除测温电路之外,还有LCD显示、USB通信及电源模块,其功能分别为数据显示、程序下载、系统供电,由于这几部分电路通用性强,参考资料较多,故此处省略。
图1 1-Wire总线测温网络
软件编程
二叉树遍历算法
二叉树遍历算法是搜索识别网络中1-Wire器件的编程首选,二叉树遍历算法的要点可归纳为“读2位,写1位”。
编程思路
首先主机向从机发出搜索命令,等待从机向主机发回当前位之后,再读从机发回当前位的反码,这两个位数据的编码存在4种可能:00、01、10和11。
00表示从机在当前位上有位分叉,即0和1两个分支;01表示从机的当前位均为0;10表示从机的当前位均为1;11表示总线上无器件响应。
显然,出现11时搜索应退出。对于前3种情况,根据搜索策略,主机向从机写1位数据,决定继续搜索哪一分支。第2和第3种情况下,搜索仅有一个方向,如果是第1种情况即出现00时,需要选择下一步搜索路径,方法是比较搜索位所在位置和最后一次发生位差异的所在位置,若二者相等,搜索1分支,若前者>后者,搜索0分支,若前者<后者,则采用上一次的搜索路径。
在此有两点需要注意:一是网络上从机发回的位数据呈“线与”关系;二是DS18B20中64位ID码分别标记为第1—64位,而不是0—63位,空出来的0用来表示差异位位置记录的初始状态。
编程要点
1-wire总线既可传输时钟,又可传输数据,并且数据传输是双向的,因此读写时序至关重要,1-wire总线定义了复位脉冲、应答脉冲、写操作、读操作等几种信号类型,所有的1-wire总线命令序列都是由这些基本的信号类型组成。
(1)复位子函数
主机通过拉低总线至少480ms产生复位脉冲,然后释放总线,主机释放总线时,会产生低电平向高电平的跳变,之后延时60ms,等待DS18B20的应答,DS18B20通过拉低总线240ms产生应答脉冲,主机收到器件的应答脉冲后,说明有1-wire器件在线,然后主机就可以对DS18B20进行ROM命令。
(2)读写操作
所有的读写时序至少需要60ms,写时序时,主机在拉低总线15ms之内释放总线,并向1-wire器件写1。1-wire器件仅在主机发出读时序时才向主机传输数据,因此,当主机发出读数据命令后,必须马上产生读时序,以便1-wire器件传输数据[4]。
(3)温度转换
1-wire器件工作时,首先需要进行ROM操作,然后转换温度。编程时需注意三点。
⑴DS18B20ROM命令共5种,读ROM、匹配ROM、跳过ROM、搜索ROM、报警。
⑵增加延时函数,确保温度转换完成。
(3)读出温度数据后,要进行数据转换。读出温度低8位和高8位,把此低8位和高8位转换为1个16位的数,其高5位是相同的,代表符号;低11位,是温度的二进制数,其中高7位是温度整数,低4位是温度小数;如果是负温度,则从温度寄存器读出的是补码,应将补码取反加1得到原码。
DS18B20的小数位可以这样理解:单片机发出读取温度寄存器命令后,DS18B20会返回9组数据,其中第一组数据的低4位代表温度小数部分,换言之,即是把1度分解为16个4位二进制数来表示,则温度小数部分的精度为1/16=0.0625。
与列举ID号编程的比较
列举ID法需要预先储存器件ID号,然后接入全部器件读取温度,实验需分两步进行。储存ID号时,仅允许接入一只器件,此器件操作完成后取下,再接入另一只器件,效率低下,且频繁插拔对电路板及器件均有损伤,因此这种编程方法在实际应用中比较受限。二叉树搜索可以直接读取总线上所有器件温度,功能强大,操作简便,是1-Wire总线器件组网编程的首选[5]。
图2 测温网络在PHOENIX325实验仪上的应用
测试
笔者设计了一款单片机教学实验仪——PHOENIX325,实验仪上集成了由4只DS18B20构成的测温网络,图2是采用二叉树遍历算法测温网络的工作情况,LCD1602显示4只器件的温度值,由于LCD显示存在延时[6],因此拍到的只显示一只器件的测量温度。经实际测试,用本文设计的方法组网进行多点测温,测量精度、响应速度均令人满意。
结论
利用DS18B20的优异特性,采用多只器件构成1-Wire总线网络,外围元件少,结构简单,抗干扰性强,成本低廉,软件编程采用二叉树遍历算法,可搜索总线上所有器件,将具有同一家族号的器件识别出来,读出温度值,从教学实际来看,这种方案灵活性高,测量精度和响应速度都可得到保证,升级空间可自由扩充,是一种行之有效的多点测温模式。