|
手把手教你使用PIC单片机做数字温度显示实验(C语言版)——站长原创,如需引用请注明出处
随着现代化信息技术的飞速发展和传统工业改造的逐步实现,能独立工作的温度检测系统已广泛应用于各种不同领域。传统的温度检测系统大多采用热敏电阻作为传感器。采用热敏电阻作为传感器的传统的温度检测系统必须经过专门的接口电路转换成数字信号后才能由微处理器进行处理,存在可靠性差、成本高、精度低等诸多缺点,现在很多温度检控场合已广泛使用单总线的温度传感器,使整个系统简单可靠。
1、单总线技术简介
目前单片机外设的接口形式主要有单总线接口、IIC接口、SPI接口、PS2接口等。SPI接口与单片机通信需要三根线,IIC接口也要两根线,而单总线器件与单片机间数据通信只要一根线。美国DALLAS公司推出的单总线(1 Wire BUS)技术与IIC、SPI、PS2总线不同,它采用单根信号线,既可以传输时钟信号又可以传送数据信号,而数据又可双向传送,因而这种总线技术具有线路简单、成本低廉、便于扩展和维护等优点。 单总线适用于单主机系统,能够控制一个或多个从机设备。主机可以是微处理器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。当只有一个从机设备时,系统可按单节点系统操作;当有多个从设备时,系统则按多节点系统操作。主机或从机通过一个漏极开路或三态端口连接到这个数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线,其内部等效电路图如图9-14所示。单总线通常要求接一个约为4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。主机和从机之间的通信可以通过三个步骤完成,分别是初始化单总线器件、识别单总线器件、数据交换。由于它们是主从结构,只有主机呼号从机时,从机才能应答,因此主机访问单总线器件时都必须严格遵循单总线命令序列。如果出现序列混乱,单总线器件将不响应主机。
9-14 内部等效电路图
所有的单总线器件都要遵循严格的通信协议,以保证数据的完整性。单总线协议定义了复位信号、应答信号、写“0”、读“0”、写“1”、读“1”的几种时序信号类型。所有的单总线命令序列都是由这些基本的信号类型组成的。在这些信号中,除了应答脉冲外,其它均由主机发出同步信号,并且发送的所有命令和数据都是字节的低位在前。 所有单总线器件的读、写时序至少需要60uS,且每两个独立的时序间至少需要1uS的恢复时间。在写时序中,主机将在拉低总线15uS之内释放总线,并向单总线器件写“1”;如果主机拉低总线后能保持至少60uS的低电平,则向总线器件写“0”。单总线器件仅在主机发出读时序时才向主机传输数据,所以,当主机向单总线器件发出读数据命令后,必须马上产生读时序,以便单总线器件能传输数据。
2、单总线温度传感器DS18B20简介
在多点温度测量系统中,单总线数字温度传感器因其体积小、构成的系统结构简单等优点,应用越来越广泛。每一个数字温度传感器内均有唯一的64位序列号(最低8位是产品代码,其后48位是器件序列号,最后8位是前56位循环冗余校验码),只有获得该序列号后才可能对其进行操作,也才能在多传感器系统中将它们一一识别。 DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适用于远距离多点温度检测系统。 DS18B20还具有以下新特性: 独特的单线接口仅需一个端口引脚进行通讯 简单的多点分布应用 无需外部器件 可通过数据线供电 零待机功耗 测温范围-55~+125℃,以0.5℃递增。华氏器件-67~+2570F,以0.90F 递增 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃ 温度数字量转换时间200ms(典型值),12位分辨率时最多在750ms内把温度值转换为数字 用户可定义的非易失性温度报警设置 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统 负压特性:电源极性接反时,温度计不会因发热而烧毁,但不能正常工作
3、DS18B20外形及引脚说明
外形及引脚如图9-15所示:
 9-15 管脚排列图
在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下: 1(GND):地 2(DQ):单线运用的数据输入输出引脚 3(VDD):可选的电源引脚
4、DS18B20的内部结构
 9-16 内部结构
DS18B20内部结构如图9-16所示,主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位激光ROM从高位到低位依次为8位CRC、48位序列号和8位家族代码(28H)组成。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。非易失性温度报警触发器TH和TL可通过软件写入用户报警上下限值。配置寄存器为高速暂存存储器中的第五个字节。DS18B20在工作时按此寄存器中的分辨率将温度转换成相应精度的数值,其各位定义如图9-17所示。其中,TM:测试模式标志位,出厂时被写入0,不能改变;R0、R1:温度计分辨率设置位,其对应四种分辨率见配置寄存器与分辨率关系表。出厂时R0、R1置为缺省值:R0=1,R1=1(即12位分辨率),用户可根据需要改写配置寄存器以获得合适的分辨率。
 9-17 寄存器各位定义图
 9-18 配置寄存器与分辨率关系表
5、DS18B20工作过程及时序
DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。 高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。 初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。 初始时,计数器1预置的是与-55℃相对应的一个预置值。以后计数器1每一个循环的预置数都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。 DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5℃,四舍五入最大量化误差为±1/2LSB,即0.25℃。 温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。 DS18B20测量温度时使用特有的温度测量技术。DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打开时,DS18B20进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累加器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。 DS18B20工作过程一般遵循以下协议:初始化——ROM操作命令——存储器操作命令——处理数据 ① 初始化 单总线上的所有处理均从初始化序列开始。初始化序列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。存在脉冲让总线控制器知道DS1820 在总线上且已准备好操作。
② ROM操作命令 一旦总线主机检测到从属器件的存在,它便可以发出器件ROM操作命令之一。所有ROM操作命令均为8位长。这些命令列表如下: Read ROM(读ROM)[33h] 此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下可以使用。如果总线上存在多于一个的从属器件,那么当所有从片企图同时发送时将发生数据冲突的现象(漏极开路会产生线与的结果)。 Match ROM( 符合ROM)[55h] 此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。只有与64位ROM序列严格相符的DS18B20才能对后继的存贮器操作命令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此命令在总线上有单个或多个器件的情况下均可使用。 Skip ROM( 跳过ROM )[CCh] 在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。如果在总线上存在多于一个的从属器件而且在Skip ROM命令之后发出读命令,那么由于多个从片同时发送数据,会在总线上发生数据冲突(漏极开路下拉会产生线与的效果)。 Search ROM( 搜索ROM)[F0h] 当系统开始工作时,总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。 Alarm Search(告警搜索)[ECh] 此命令的流程与搜索ROM命令相同。但是,仅在最近一次温度测量出现告警的情况下,DS18B20才对此命令作出响应。告警的条件定义为温度高于TH 或低于TL。只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值或者改变TH或TL的设置,使得测量值再一次位于允许的范围之内。贮存在EEPROM内的触发器值用于告警。
③ 存储器操作命令 Write Scratchpad(写暂存存储器)[4Eh] 这个命令向DS18B20的暂存器中写入数据,开始位置在地址2。接下来写入的两个字节将被存到暂存器中的地址位置2和3。可以在任何时刻发出复位命令来中止写入。 Read Scratchpad(读暂存存储器)[BEh] 这个命令读取暂存器的内容。读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。 Copy Scratchpad(复制暂存存储器)[48h] 这条命令把暂存器的内容拷贝到DS18B20的E2存储器里,即把温度报警触发字节存入非易失性存储器里。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又正在忙于把暂存器拷贝到E2存储器,DS18B20就会输出一个“0”,如果拷贝结束的话,DS18B20 则输出“1”。如果使用寄生电源,总线控制器必须在这条命令发出后立即起动强上拉并最少保持10ms。 Convert T(温度变换)[44h] 这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS18B20保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。 Recall E2(重新调整E2)[B8h] 这条命令把贮存在E2中温度触发器的值重新调至暂存存储器。这种重新调出的操作在对DS18B20上电时也自动发生,因此只要器件一上电,暂存存储器内就有了有效的数据。在这条命令发出之后,对于所发出的第一个读数据时间片,器件会输出温度转换忙的标识:“0”=忙,“1”=准备就绪。 Read Power Supply(读电源)[B4h] 对于在此命令发送至DS18B20之后所发出的第一读数据的时间片,器件都会给出其电源方式的信号:“0”=寄生电源供电,“1”=外部电源供电。
④ 处理数据 DS18B20的高速暂存存储器由9个字节组成,其分配如图9-19所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
 9-19 高速暂存存储器分配图
|
温度/0C |
二进制表示 |
十六进制表示 |
|
符号位(5位) |
数据位(11位) |
|
+125 |
0 0 0 0 0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
07D0H |
|
+25.0625 |
0 0 0 0 0 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0191H |
|
+10.125 |
0 0 0 0 0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
00A2H |
|
+0.5 |
0 0 0 0 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0008H |
|
0 |
0 0 0 0 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0000H |
|
-0.5 |
1 1 1 1 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
FFF8H |
|
-10.125 |
1 1 1 1 1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
FF5EH |
|
-25.625 |
1 1 1 1 1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
FE6FH |
|
-55 |
1 1 1 1 1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
FC90H |
DS18B20 温度数据表
上表是DS18B20温度采集转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于或等于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
温度转换计算方法举例: 例如当DS18B20采集到+125℃的实际温度后,输出为07D0H,则: 实际温度=07D0H╳0.0625=2000╳0.0625=1250C。 例如当DS18B20采集到-55℃的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则: 实际温度=370H╳0.0625=880╳0.0625=550C。
⑤ 时序 主机使用时间隙(time slots)来读写DS18B20的数据位和写命令字的位。初始化及读写时序图如下:
9-20 初始化时序
 9-21 读写时序
下面是增强型PIC实验板DS18B20温度传感器使用实验实例及增强型PIC实验板DS18B20接口电路图。
接口电路 把附件DS18B20插到增强型PIC实验板上去,注意,三个引脚的方向不能反了,否则器件烧毁。
 上电后,通过“PIC仿真烧写器”进行仿真或烧入程序调试,实验板数码管显示当前温度值,精度为4位小数,如图中所示温度值为:24.1500摄氏度。
 25.0000摄氏度温度值显示。
 我们测试时,使用电烙铁来进行加温实验,可以看到,数码管显示的温度值马上上升,当前值为41.2500摄氏度。
 电铬铁头拿开后,温度出现下降,当前值约为35摄氏度。
|