自DS18B20的输出数据在读时隙下降沿之后15us内有效,所有读时隙最短必须持续60us,两时隙之间最少保持1us的回复时间。 三.写操作
主机将数据线从高电平拉至低电平时产生写时隙,DS18B20在DQ变低的后的15~60us进行采样,为高就写\为低就写\。
对DS18B20的存储器操作命令都是通过写操作实现的,如表3-1所示。
表3-1 DS18B20的写操作命令 指令名称 写存储器 读存储器 复制存储器 温度转换 重新调出 读电源 代码 [4EH] [BEH] [48H] [44H] [B8H] [B4H] 功能 主机向存储器中写数据 主机连续读0~8存储器内容 复制TH、TL等存储器的内容到EEPROM中 启动温度转换 从EEPROM调出TH、TL等数据到存储器中 器件向主机传送它的供电方式 四.ROM操作
64位光刻ROM记录了器件的识别信息。每一个DS18B20包括一个唯一的64位的光刻ROM。开始的8位是单线产品系列编码。接着的48位是唯一的系列号。最后的8位是开始56位的CRC校验数据。主机通过发出匹配ROM命令后,可向其发出特定的操作指令。ROM操作指令如表3-2所示。
表3-2 DS18B20的ROM操作命令 指令名称 读ROM 匹配ROM 跳过ROM 搜索ROM 搜索报警 代码 [33H] [55H] [CCH] [F0H] [ECH] 功能 在口线上接一个器件时读其ROM码 找出某个指定的ROM码的器件 对口线上所有器件的操作 口线上有多个器件时,找出每个器件的ROM码 找出各器件是否超限 读ROM命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下使用。如果总线上存在多于一个的从属器件,那么当所有从片企图同时发送时将发生数据冲突的现象。
15
在使用匹配ROM命令后,继续发送64位的ROM数据系列,允许总线主机对多点总线上特定的DS18B20寻址。只有与64位ROM序列严格相符的DS18B20才能对后继的存储器操作命令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此命令在总线上有单个或多个器件的情况下均可使用。 跳过ROM命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。如果在总线上存在多个DS18B20时,由于以后的操作是对所有器件有效的,所以在执行完跳过ROM命令后,多个器件同时发送数据时会在总线上发生数据冲突,而当确实是想要对所有器件进行操作或只有单只器件在线时,这一命令将变得十分有用。 五.读存储器 DS18B20的存储器由9个字节组成,如图3-3。
图3-3 DS18B20的存储器结构图[31]
byte0用于存储温度的高字节,byte1用于存储温度的低字节,其存储格式如图3-4所示。
图3-4 DS18B20的温度存储格式[31]
byte2、byte3是TH和TL的易失性拷贝,在每一次上电复位时被刷新,
16
温度值与贮存在TH与TL内的触发值相比较。因为这些寄存器仅仅是8位,所以0.5℃位在比较时被忽略。TH或TL的最高有效位直接对应于16位温度寄存器的符号位。如果温度测量的结果高于TH或低于TL,那么器件内告警标志将置位。每次温度测量更新次标志。只要告警标志位置位,DS18B20将对告警搜索命令作出响应。这允许并联许多的DS18B20,同时进行温度测量。如果某处温度超过极限,那么可以识别出正在告警的器件并立即将其读出而不必读出非告警的器件。 六.CRC校验 在ROM的高8位和存储器的第九个字节存储了8位的CRC校验数据,在接收完毕后可以通过CRC校验数据检验接收的正确性。 七.分辨率的调整 DS18B20提供了四种分辨率的调整,如图3-5,通过设置配位寄存器R1、R0的值可以调整不同的分辨率,同时不同的分辨率也对应不同的温度转换时间,如表3-3所示。
图3-5 DS18B20的分辨率位置[31] 表3-3 DS18B20的分辨率与寄存器对照表 R1 0 0 1 1 R0 0 1 0 1 分辨率 9-bit 10-bit 11-bit 12-bit 转换时间 93.75ms 187.5ms 375ms 750ms 3.2.2 串行口收发程序设计
单片机与计算机的通信协议如图3-1所示。
单片机每次调用发送函数时发送4个字节:第一个字节为起始位,用大写英文字母“S”表示,用于上位机判断所接收到数据的顺序;第二个字节为温度正负标识位,数字“0”表示正数,数字“1”表示负数,用于上位机判断温度的正负;第三个字节和第四个字节分别是温度值的整数部分和小数部分。
17
单片机每次接收的控制命令包含在一个字节内:低两位为温度精度,单片机通过提取低两位的信息来调整测温器件DS18B20的测温分辨率;3、4、5位用于选择测温通道,本课题共有5个测温通道,单片机将通道数据读出后,使用“匹配ROM”命令选择将要在总线上传送温度的器件,最后将读取的温度数据发送出去。
3.2.3 LED显示模块
LED显示模块采用5个移位寄存器74LS164控制5个共阴极数码管实现,采用这种显示方式的优点是占用单片机引脚较少,并且容易实现静态显示,使得数码管的亮度较高。
3.3 上位机程序分块介绍
上位机主要用于接收下位机传送的温度数据,然后进行相应的处理并能够保存在计算机上,另外还具有相应的设置及报警等功能。
3.3.1 MSComm控件的用法与详细介绍
MSComm控件是Visual Basic6.0中用于计算机串口通信的一个控件。它一般不会直接显示在VB左边的控件栏里边,可以通过选择上面菜单栏里边的“工程—部件”,然后在弹出的部件对话框里选择“Microsoft Comm Control 6.0”,点击确定后就会在左边的控件栏里显示出一个电话样式的图标,这就是MSComm控件。
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi与 C#等语言中均可使用。MSComm控件是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。
18
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
3.3.2 界面设计
上位机程序主界面如图3-6所示。整个主界面按功能可分为菜单栏、控制部分和显示部分,剩余的还包括一个用于串口通信的MSComm控件和三个Timer控件。其中MSComm控件和Timer控件在程序运行时不可见。 菜单栏包括“文件”、“工具”和“关于”三个菜单[3]。其中“文件”菜单包括“保存文档”、“保存曲线”和“关闭”三个选项,分别用于保存采集的温度列表、保存绘制好的温度曲线和退出程序;“工具”菜单包括一个读取测温器件DS18B20的小工具;“关于”菜单是关于本软件的介绍。 控制部分包括通道选择、阈值设置、采集时长与间隔设置、精度控制部分和对温度列表的功能控制部分。其中通道选择功能是使用一个ComboBox控件实现的;阈值设置与采集时间设置是分别使用一个Frame控件、两个Label控件和两个TextBox控件实现的;精度控制部分使用的是一个Frame控件和四个OptionButton控件;而温度列表控制部分使用的是一个TextBox控件、一个Label控件和三个CommandButton控件。 显示部分包括温度显示、曲线绘制和温度列表三个部分。其中温度显示部分使用了五个Image控件组成的控件数组、两个Label控件和一个Frame控件;曲线绘制部分值使用了一个PictureBox控件;温度列表使用了一个TextBox控件[4]。
19