DSB温传感器的设计_第1页
DSB温传感器的设计_第2页
免费预览已结束,剩余25页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、封面作者: PanHongliang仅供个人学习学习情境4-温度传感器的设计之 基于DS18B20温度传感器的设计 点名,引言Dallas 公司的数字化温度传感器 DS1820 是世界上第一片支持 一线总线接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地 组建传感器网络,为测量系统的构建引入全新概念。其测量温度范围为 - 55 C+125C,在-10+85 C 范围内,精度为0.5 C。现场温度直接以 一线总线 的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境 的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。DS18B20 可以程序设定 912 位的分辨

2、率,精度为0.5 C。可选更 小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温 度存储在EEPROM 中,掉电后依然保存。 DS18B20 的性能是新一代产品 中最好的!性能价格比也非常出色!省略了存储用户定义报警温度、分辨 率参数的 EEPROM,精度降低为坐C,适用于对性能要求不高,成本控 制严格的应用,是经济型产品。 新课讲授4.1 基于 DS18B20 温度传感器的设计表4.11 DS18B20 技术资料1. DS18B20 的新性能(1) 可用数据线供电,电压范围: 3.0-5.5V ;测温范围:-55 - +125C,在-10 - +85C时精度为0.5C;可编程的

3、分辨率为 912 位,对应的可分辨温度分别为 0.5C、0.25C、0.125C和 0.0625C ;(4) 12 位分辨率时最多在 750ms 内把温度值转换为数字;(5) 负压特性:电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。2. DS18B20 的外形和内部结构DS18B20 内部结构主要由四部分组成: 64 位光刻 ROM 、温度传感器、非挥 发的温度报警触发器 TH 和 TL、配置寄存器。DS18B20 的管脚排列如下:图 4-1-1DS18B20 外形图引脚定义:(1)DQ 为数字信号输入 / 输出端;(2)GND 为电源地;(3)VDD 为外接供电电源输入端(在寄生电

4、源接线方式时接地)。内部结构:图 4-1-2 DS18B20 内部结构图DS18B20 有 4 个主要的数据部件:(1 )光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 D S18B20的地址序列码。64 位光刻 ROM 的排列是:开始 8 位(28H )是产品 类型标号,接着的48 位是该 DS18B20 自身的序列号,最后 8 位是前面 56 位 的循环冗余校验码( CRC=X8+X5+X4+1 )。光刻 ROM 的作用是使每一个 D S18B20 都各不相同,这样就可以实现一根总线上挂接多个 DS18B20 的目 的。(2)DS18B20 中的温度传感器可完成对温度

5、的测量,以 12 位转化为例: 用 16位符号扩展的二进制补码读数形式提供,以 0.0625C/LSB 形式表达,其 中 S 为符号位。表 1 DS18B20 温度值格式表这是 12 位转化后得到的 12 位数据,存储在 18B20 的两个 8 比特的 RAM 中,二进制中的前面 5 位是符号位,如果测得的温度大于 0,这 5 位为 0,只 要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位为 1,测到的数值需要取反加 1 再乘于 0.0625 即可得到实际温度。例如+125C的数字输出为 07D0H, +25.0625C的数字输出为 0191H, - 25.06

6、25C的数字输出为 FF6FH,-55C的数字输出为 FC90H。(3) DS18B20 温度传感器的存储器DS18B20 温度传感器的内部存储器包括一个高速暂存 RAM 和一个非易失 性的可电擦除的 EEPRAM,后者存放高温度和低温度触发器 TH、TL 和结构寄存 器。(4) 配置寄存器该字节各位的意义如下:低五位一直都是 1 ,TM 是测试模式位,用于设置 DS18B20 在工作模式还是 在测试模式。在 DS18B20 出厂时该位被设置为 0,用户不要去改动。R1 和 R0 用来设置分辨率,如下表所示:(DS18B20 出厂时被设置为 12 位)表 2 配置寄存器结构TMR1R01111

7、1表 3 温度值分辨率设置表R1R0分辨率温度最大转换时间009 位93.75ms0110 位187.5ms1011 位375ms1112 位750ms3.高速暂存存储器高速暂存存储器由 9 个字节组成,其分配如表 5 所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0 和第 1 个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在 后,数据格式如表 1 所示。对应的温度计算:当符号位 S=0 时,直接将二进制 位转换为十进制;当 S=1 时,先将补码变为原码,再计算十进制值。表 2 是对 应的一部分温度值。第九个字节是冗余检验字节。表 4 DS

8、18B20 暂存寄存器分布寄存器内容字节地址温度值低位0温度值咼位1高温限值 TH2低温限值 TL3配置寄存器4保留5保留6保留7CRC 检验8根据 DS18B20 的通讯协议,主机控制 DS18B20 完成温度转换必须经过 三个步骤:每一次读写之前都要对 DS18B20 进行复位,复位成功后发送一条 ROM 指令,最后发送 RAM 指令,这样才能对 DS18B20 进行预定的操作。复 位要求主 CPU 将数据线下拉 500 微秒,然后释放,DS18B20 收到信号后等待 1660 微秒左右,后发出60240 微秒的存在低脉冲,主 CPU 收到此信号表 示复位成功。表 5 ROM 指令表指令约

9、定代码功能读 ROM33H读 DS1820ROM 中的编码(即 64 位地址)符合 ROM55H发出此命令之后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对 该DS1820 的读写作准备。搜索 ROM0F0H用于确定挂接在同一总线上 DS1820的个数和识别 64 位ROM 地址。为操作各器件作好准备。跳过 ROM0CCH忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命 令。适用于单片工作。告警搜索命令0ECH执行后只有温度超过设定值上限或下限的片子才做出响 应。表 6 RAM 指令表指令约定代码功能温度变换44H启动

10、DS1820 进行温度转换,转换时最长为500ms (典型为 200ms )。结果存入内部 9 字节 RAM 中。读暂存器0BEH内部 RAM 中 9 字节的内容写暂存器4EH发出向内部 RAM 的 3、4 字节写上、下限温度数据命令, 紧跟该命令之后,是传送两字节的数据。复制暂存器48H将 RAM 中第 3、4 字节的内容复制到 EEPROM 中。重调 EEPROM0B8H将 EEPROM 中内容恢复到 RAM 中的第 3、4 字节。读供电方式0B4H读 DS1820 的供电模式。寄生供电时DS1820 发送“0”,外接电源供电 DS1820 发送“1”5. DS1820 使用中注意事项DS

11、1820 虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:(1)较小的硬件开销需要相对复杂的软件进行补偿,由于 DS1820 与微处 理器间采用串行数据传送,因此,在对 DS1820 进行读写编程时,必须严格的 保证读写时序,否则将无法读取测温结果。在使用 PL/M、C 等高级语言进行 系统程序设计时,对DS1820 操作部分最好采用汇编语言实现。在 DS1820 的有关资料中均未提及单总线上所挂 DS1820 数量问题, 容易使人误认为可以挂任意多个 DS1820, 在实际应用中并非如此。 当单总线 上所挂 DS1820超过 8 个时,就

12、需要解决微处理器的总线驱动问题,这一点在 进行多点测温系统设计时要加以注意(3) 连接 DS1820 的总线电缆是有长度限制的。实验中,当采用普通信号 电缆传输长度超过 50m 时,读取的测温数据将发生错误。当将总线电缆改为 双绞线带屏蔽电缆时,正常通讯距离可达 150m ,当采用每 M 绞合次数更多的 双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布 电容使信号波形产生畸变造成的。因此,在用 DS1820 进行长距离测温系统设 计时要充分考虑总线分布电容和阻抗匹配问题。(4) 在 DS1820 测温程序设计中,向 DS1820 发出温度转换命令后,程序 总要等待 DS18

13、20 的返回信号,一旦某个 DS1820 接触不好或断线,当程序读 该 DS1820时,将没有返回信号,程序进入死循环。这一点在进行 DS1820 硬 件连接和软件设计时也要给予一定的重视。测温电缆线建议采用屏蔽 4 芯双绞线, 其中一对线接地线与信号线, 另一组 接 VCC和地线,屏蔽层在源端单点接地。4.1 2 系统硬件设计硬件结构比较简单,具体连接如图 4-1-3 所示:图 4-1-3 硬件系统结构4.1.3 软件系统设计DSl8B20 必须严格按照单总线通信协议,以保证数据的完整性。该协议定 义了几种时隙类型:初始化、应答、写 1 、写 0、读 1 、读 0。除了应答时隙所 有这些时隙

14、都是有主机发出。总线上所传输的所有命令和数据都是字节的低位 在前。1)初始化时隙复位时隙和应答时隙。在初始化过程中,主机发送复位脉冲(最短为480 pS的低电平信号 )接着,释放总线并进入接收状态。当总线被释放后上拉电阻将总 线拉高。 DSl8B20 在检测到总线的上升沿之后等待 15-60uS 接着发出应答脉冲 (低电平持续 60-240pS)。(2)读和写时隙在写时隙期间,主机向 DS18B20 写入数据;而在读时隙期间,主机读入 来自DS18B20 的数据。在每一个时隙,总线只能传输一位数据。存在两种写时隙,即写 1 和写 0。主机在写 1 时隙向 DS18B20 写入逻辑1。而在写 0

15、 时隙向 DS18B20 写入逻辑 0。所有写时隙至少需要 60 必,而且 两次写I 时隙之间至少需要 IPS 的恢复时间。两种写时隙均以主机拉低总线开 始。产生写 1 时隙:主机拉低总线后,必须在 15uS 内释放总线。然后由上拉 电阻将总线拉至高电平。产生写 0 时隙:主机拉低总线后,必须在整个时隙期间保持低电平 (至少60pS)。在写时隙开始后的 1 560pS 期间,DSI8B20 采样总线的状态。如果总线为高电,则逻辑 1 被写入 DSI8B20 ;如果总线为低电平,则 0 逻辑被写入DSI8B20 。读时隙: DSI8B20 只能在主机发出读时隙时才能向主机传送数据。所以主 机在发

16、出读数据命令后,必须马上产生读时隙,以便 DSI8B20 能够传送数据。 所有读时隙至少 60ps,且在两次独立的读时隙之间至少需要1PS 的恢复时每次读时隙由主机发起,拉低总线至少 1Q。在主机发起读时隙之后, DSI8B20开始在总线上传送 1 或 0。若 DS18B20 发送 1,则保持总线为高电 平;若发送 0,则拉低总线。当传送 0 时,DSI8B20 在该时隙结束时释放总 线,再由上拉电阻将总线拉回空闲高电平状态。 DS18B20 发出的数据在读时隙 下降沿起始后的 1 5uS 内有效,因此主机必须在读时隙开始后的 15 必内释放 总线,并且采样总线状态。其程序流程图如下图所示。图

17、 4-1-3DS18B20 程序流程所以在软件设计方面,我们主要是读取温度函数和温度显示函数的编写。1 、 读取温度函数图 4-1-4 读温度子程序流程图图 4-1-5 温度转换子程序流程图void Read_Temperature()if(Init_DS18B20()=1) /DS18B20DS18B20_IS_0K=0 。eIseWrite0neByte(0 xcc) 。Write0neByte(0 x44) 。Init_DS18B20() 。Write0neByte(0 xcc) 。故障/ 跳过读取 DS18B20 的系列号/ 启动温度转换/ 跳过读取 DS18B20 的系列号Temp_

18、Value0 = ReadOneByte() 。 / 温度低 8 位Temp_Value1 = ReadOneByte() 。 / 温度高 8 位 DS18B20_IS_OK=1 。上述代码中,未读取 DS18B20 的系列号。2、 温度显示函数void Display_Temperature()uchar i 。/ 延时值和负数标志uchar t = 150, ng = 0 。/ 高 5 位全为 1(0XF8 )则为负数,为负数时取反加 1,并设置 负数标识if(Temp_Value1&0 xf8)=0 xf8)Temp_Value1 = Temp_Value1。Temp_Value

19、0 = Temp_Value0+1。if(Temp_Value0=0 x00)Temp_Value1+ 。/ 负数标识置 1ng = 1WriteOneByte(0 xbe)/ 读取温度寄存器/ 查表得到温度小数部分Display_Digit0 = df_TableTemp_Value0&0 x0f。/ 获取温度整数部分(高字节中的低 3 位和低字节中高 4 位,无 符号)CurrentT = (Temp_Value0&0 xf0)4) | (Temp_Value1&0 x07)4) 。/ 将整数部分分解为 3 位待显示的显示数字Display_Digit3 = Cur

20、rentT/100。Display_Digit2 = CurrentT%100/10。Display_Digit1 = CurrentT%10。/ 刷新 LCD 显示缓冲Current_Temp_Display_Buffer11 = Display_Digit0 + 0 。Current_Temp_Display_Buffer10 = . 。Current_Temp_Display_Buffer9 = Display_Digit1 + 0。Current_Temp_Display_Buffer8 = Display_Digit2 + 0。Current_Temp_Display_Buffer7

21、 = Display_Digit3 + 0。/ 高位为零时不显示if(Display_Digit3 = 0)Current_Temp_Display_Buffer7 = 。if(Display_Digit2 = 0&Display_Digit3=0)Current_Temp_Display_Buffer8 = 。/ 负数符号显示在恰当的位置if(ng)if(Current_Temp_Display_Buffer8 = )Current_Temp_Display_Buffer8 = - elseif(Current_Temp_Display_Buffer7 = )Current_Temp

22、_Display_Buffer7 = - elseCurrent_Temp_Display_Buffer6 = -/ 在第一行显示标题Set_LCD_POS(0 x00) 。for(i=0。i16。i+)Write_LCD_Data(Temp_Disp_Titlei) 。/ 在第二行显示当前温度Set_LCD_POS(0 x40) 。for(i=0 。 i16 。 i+)Write_LCD_Data(Current_Temp_Display_Bufferi)/ 显示温度符号Set_LCD_POS(Ox4D)。Write_LCD_Data(OxOO)。Set_LCD_POS(0 x4E)。 Wr

23、ite_LCD_Data(C) 。 课堂小结这节课我们主要介绍了温度传感器 DS18B2O 的工作特点,控制指令以 及应用方法。着重分析了读取温度函数的设计和温度显示函数的编写。为 我们学习其他温度传感器打下了一定的基础。 完整程序代码#include #include #define uint unsigned int#define uchar unsigned char#define delayNOP() _nop_()。 _nop_() 。 _nop_() 。 _nop_() 。sbit DQ = P3A3。sbit LCD_RS =卩2人0 。sbit LCD_RW = P2A1 。s

24、bit LCD_EN = P2A2 。uchar code Temp_Disp_Title=CurrentTemp(zxb)。uchar Current_Temp_Display_Buffer= Temp = / 温度字符uchar code Temperature_Char8 = 0 x0c,0 x12,0 x12,0 x0c,0 x00,0 x00,0 x00,0 x00 / 温度小数位对照表uchar code df_Table=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 。uchar CurrentT = 0。 / 当前读取的温度整数部分uchar Temp_Val

25、ue=0 x00,0 x00。 / 从 DS18B20 读取的温度值uchar Display_Digit=0,0,0,0 。 / 待显示的各温度数位bit DS18B20_IS_OK = 1 。 / 传感器正常标志void DelayXus(uint x)uchar i 。while(x-)for(i=0 。i200。i+)。bit LCD_Busy_Check()bit result 。LCD_RS = 0 。LCD_RW = 1 。LCD_EN = 1delayNOP() 。result = (bit)(P0&0 x80)。LCD_EN=0 。return result 。voi

26、d Write_LCD_Command(uchar cmd)while(LCD_Busy_Check() 。LCD_RS = 0 。LCD_RW = 0 。LCD_EN = 0 。_nop_() 。_nop_() 。P0 = cmd 。delayNOP() 。LCD_EN = 1 。delayNOP() 。LCD_EN = 0 。void Write_LCD_Data(uchar dat)while(LCD_Busy_Check()LCD_RS = 1LCD_RW = 0 。LCD_EN = 0 。P0 = dat 。delayNOP() 。LCD_EN = 1 。delayNOP() 。LC

27、D_EN = 0 。void LCD_Initialise()Write_LCD_Command(0 x01)Write_LCD_Command(0 x38)Write_LCD_Command(0 x0c)Write_LCD_Command(0 x06)void Set_LCD_POS(uchar pos)Write_LCD_Command(pos|0 x80)void Delay(uint x)DelayXus(5) 。DelayXus(5) 。DelayXus(5) 。DelayXus(5) 。while(-x) 。uchar Init_DS18B20()/ 初始化uchar status

28、 。DQ = 1 。Delay(8) 。DQ = 0 。Delay(90) 。DQ = 1 。Delay(8) 。status= DQ 。Delay(100) 。DQ = 1 。return status 。uchar ReadOneByte()/ 读一个字节uchar i,dat=0 。DQ = 1 。 _nop_() 。for(i=0 。i= 1 。DQ = 1 。_nop_() 。 _nop_() 。if(DQ)dat |= 0X80 。Delay(30) 。DQ = 1 。return dat 。void WriteOneByte(uchar dat) / 写一个字节uchar i 。

29、for(i=0 。i= 1 。void Read_Temperature()/ 读取温度if(Init_DS18B20()=1) /DS18B20DS18B20_IS_OK=0 。elseInit_DS18B20() 。WriteOneByte(0 xcc) 。/ 跳过读取 DS18B20的系列号WriteOneByte(0 x44) 。/ 启动温度转换WriteOneByte(0 xcc) 。/ 跳过读取 DS18B20的系列号WriteOneByte(0 xbe)/读取温度寄存器Temp_Value0 = ReadOneByte()Temp_Value1 = ReadOneByte()DS

30、18B20_IS_OK=1 。void Display_Temperature()/uchar i 。/ 延时值和负数标志uchar t = 150, ng = 0。 / 温度低 8 位。 / 温度高 8 位在 LCD 上显示当前温度故障/ 高 5 位全为 1 ( 0XF8 )则为负数,为负数时取反加 1,并设置负数标识if(Temp_Value1&0 xf8)=0 xf8)Temp_Value1 = Temp_Value1。Temp_Value0 = Temp_Value0+1。if(Temp_Value0=0 x00)Temp_Value1+ 。ng = 1 。 / 负数标识置 1

31、/ 查表得到温度小数部分Display_Digit0 = df_TableTemp_Value0&0 x0f。/ 获取温度整数部分(高字节中的低 3 位和低字节中高 4 位,无符号)CurrentT = (Temp_Value0&0 xf0)4) | (Temp_Value1&0 x07)4)/ 将整数部分分解为 3 位待显示的显示数字Display_Digit3 = CurrentT/100。Display_Digit2 = CurrentT%100/10。Display_Digit1 = CurrentT%10。/ 刷新 LCD 显示缓冲Current_Temp_D

32、isplay_Buffer11 = Display_Digit0 + 0。Current_Temp_Display_Buffer10 = .。Current_Temp_Display_Buffer9 = Display_Digit1 + 0。Current_Temp_Display_Buffer8 = Display_Digit2 + 0Current_Temp_Display_Buffer7 = Display_Digit3 + 0/ 高位为零时不显示if(Display_Digit3 = 0)Current_Temp_Display_Buffer7 = 。if(Display_Digit2

33、 = 0&Display_Digit3=0)Current_Temp_Display_Buffer8 = 。/ 负数符号显示在恰当的位置if(ng)if(Current_Temp_Display_Buffer8 = )Current_Temp_Display_Buffer8 = -else if(Current_Temp_Display_Buffer7 = )Current_Temp_Display_Buffer7 = - elseCurrent_Temp_Display_Buffer6 = -/ 在第一行显示标题Set_LCD_POS(0 x00) 。for(i=0 。i16。i+)

34、Write_LCD_Data(Temp_Disp_Titlei)/ 在第二行显示当前温度Set_LCD_POS(0 x40) 。for(i=0 。i16。i+)Write_LCD_Data(Current_Temp_Display_Bufferi)/ 显示温度符号Set_LCD_POS(0 x4D) 。Write_LCD_Data(0 x00) 。Set_LCD_POS(0 x4E) 。Write_LCD_Data(C) 。void main()LCD_Initialise() 。Read_Temperature() 。Delay(50000) 。Delay(50000) 。while(1)Read_Temperature() 。if(DS18B20_IS_OK)Display_Temperature()DelayXus(IOO)。版权申明本文部分内容,包括文字、图片、以及设计等在网上搜集整 理。版权为潘宏亮个人所有This article in elude

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论