基于DSB温传感器的设计

上传人:B****n 文档编号:53471845 上传时间:2022-02-10 格式:DOCX 页数:14 大小:232.70KB
返回 下载 相关 举报
基于DSB温传感器的设计_第1页
第1页 / 共14页
基于DSB温传感器的设计_第2页
第2页 / 共14页
基于DSB温传感器的设计_第3页
第3页 / 共14页
点击查看更多>>
资源描述
作者张小波之基于DS18B20温度传感器的设计点名,引言Dallas 公司的数字化温度传感器DS1820是世界上第一片支持一线总线 接口的温度传感器。一线总线独特而且经济的特点, 使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。其测量温度范围为-55C +125C ,在 -10 +85C 范围内 ,精度为 0.5 C。现场温度直接以一线总线 的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。DS18B20可以程序设定912 位的分辨率,精度为0.5 C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM 中,掉电后依然保存。DS18B20 的性能是新一代产品中最好的!性能价格比也非常出色!省略了存储用户定义报警温度、分辨率参数的EEPROM ,精度降低为 2C ,适用于对性能要求不高,成本控制严格的应用,是经济型产品。新课讲授4.1 基于 DS18B20温度传感器的设计表4.1 1 DS18B20技术资料1. DS18B20 的新性能(1) 可用数据线供电,电压范围: 3.0-5.5V ;(2) 测温范围: -55 - +125 ,在 -10 - +85 时精度为 0.5;(3) 可编程的分辨率为912 位,对应的可分辨温度分别为0.5 、 0.25 、 0.125 和 0.0625 ;(4) 12 位分辨率时最多在 750ms 内把温度值转换为数字;(5) 负压特性:电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。2. DS18B20 的外形和内部结构DS18B20 内部结构主要由四部分组成:64 位光刻 ROM 、温度传感器、非挥发的温度报警触发器器。 DS18B20的管脚排列如下:TH和 TL、配置寄存图 4-1-1 DS18B20外形图引脚定义:(1) DQ 为数字信号输入 /输出端;(2) GND 为电源地;(3) VDD 为外接供电电源输入端(在寄生电源接线方式时接地)。内部结构:作者张小波图 4-1-2DS18B20内部结构图DS18B20有 4 个主要的数据部件:( 1)光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该DS18B20 的地址序列码。64 位光刻 ROM 的排列是:开始 8 位(28H )是产品类型标号,接着的 48 位是该 DS18B20 自身的序列号,最后 8 位是前面 56 位的循环冗余校验码( CRC=X8+X5+X4+1 )。光刻 ROM 的作用是使每一个 DS18B20 都各不相同,这样就可以实现一根总线上挂接多个 DS18B20 的目的。( 2) DS18B20中的温度传感器可完成对温度的测量,以 12 位转化为例: 用 16 位符号扩展的二进制补码读数形式提供,以 0.0625 /LSB 形式表达,其中 S 为符号位。表 1 DS18B20 温度值格式表这是 12 位转化后得到的12 位数据,存储在18B20 的两个 8 比特的 RAM 中,二进制中的前面5 位是符号位,如果测得的温度大于0,这 5 位为 0 ,只要将测到的数值乘于0.0625 即可得到实际温度;如果温度小于0 ,这 5 位为 1,测到的数值需要取反加1 再乘于 0.0625 即可得到实际温度。例如 +125 的数字输出为07D0H ,+25.0625 的数字输出为0191H ,-25.0625 的数字输出为FF6FH ,-55的数字输出为 FC90H 。( 3)DS18B20温度传感器的存储器DS18B20 温度传感器的内部存储器包括一个高速暂存RAM 和一个非易失性的可电擦除的EEPRAM, 后者存放高温度和低温度触发器TH 、TL 和结构寄存器。( 4)配置寄存器该字节各位的意义如下:低五位一直都是1 ,TM 是测试模式位,用于设置DS18B20 在工作模式还是在测试模式。在DS18B20 出厂时该位被设置为 0,用户不要去改动。R1 和 R0 用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12 位)表 2配置寄存器结构TMR1R011111表 3温度值分辨率设置表作者张小波R1R0分辨率温度最大转换时间009 位93.75ms0110位187.5ms1011 位375ms1112 位750ms3. 高速暂存存储器高速暂存存储器由9 个字节组成,其分配如表5 所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0 和第 1 个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表 1 所示。对应的温度计算:当符号位S=0 时,直接将二进制位转换为十进制;当S=1 时,先将补码变为原码,再计算十进制值。表2 是对应的一部分温度值。第九个字节是冗余检验字节。表 4 DS18B20暂存寄存器分布寄存器内容字节地址温度值低位0温度值高位1高温限值 TH2低温限值 TL3配置寄存器4保留5保留6保留7CRC检验8根据 DS18B20 的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM 指令,最后发送RAM 指令,这样才能对DS18B20 进行预定的操作。复位要求主CPU 将数据线下拉500 微秒,然后释放, DS18B20收到信号后等待16 60 微秒左右,后发出60 240 微秒的存在低脉冲,主 CPU 收到此信号表示复位成功。表 5 ROM 指令表指 令约定代码功能读 ROM符合 ROM33H55H读 DS1820ROM中的编码(即64 位地址)发出此命令之后,接着发出64 位 ROM 编码,访问单总线上与该编码相对应的DS1820 使之作出响应, 为下一步对该DS1820的读写作准备。用于确定挂接在同一总线上DS1820的个数和识别64 位搜索 ROM0F0HROM 地址。为操作各器件作好准备。忽略 64 位 ROM 地址,直接向DS1820发温度变换命令。跳过 ROM0CCH适用于单片工作。作者张小波告警搜索命令0ECH执行后只有温度超过设定值上限或下限的片子才做出响应。表 6 RAM 指令表指 令约定代码功 能启动 DS1820 进行温度转换,转换时最长为500ms (典型温度变换44H为 200ms )。结果存入内部9 字节 RAM 中。读暂存器0BEH内部 RAM 中 9 字节的内容发出向内部 RAM 的 3、 4字节写上、下限温度数据命令,写暂存器4EH紧跟该命令之后,是传送两字节的数据。复制暂存器48H将 RAM 中第 3 、4 字节的内容复制到EEPROM 中。重调 EEPROM0B8H将 EEPROM中内容恢复到 RAM 中的第 3、4 字节。读 DS1820的供电模式。寄生供电时DS1820发送 “0,”外读供电方式0B4H接电源供电 DS1820 发送 “1。”5. DS1820 使用中注意事项DS1820 虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:(1) 较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820 进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M 、C 等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。(2) 在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题, 容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。当单总线上所挂DS1820 超过 8 个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。(3) 连接DS1820的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m ,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。(4) 在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。测温电缆线建议采用屏蔽4 芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。4.12系统硬件设计硬件结构比较简单,具体连接如图4-1-3所示:作者张小波图 4-1-3硬件系统结构软件系统设计DSl8B20 必须严格按照单总线通信协议,以保证数据的完整性。该协议定义了几种时隙类型:初始化、应答、写 1、写 0、读 1、读 0。除了应答时隙所有这些时隙都是有主机发出。总线上所传输的所有命令和数据都是字节的低位在前。(1)初始化时隙复位时隙和应答时隙。在初始化过程中,主机发送复位脉冲( 最短为 480 s 的低电平信号) 接着,释放总线并进入接收状态。当总线被释放后上拉电阻将总线拉高。 DSl8B20在检测到总线的上升沿之后等待 15-60us 接着发出应答脉冲 ( 低电平持续 60-240 s) 。(2)读和写时隙在写时隙期间,主机向 DS18B20写入数据;而在读时隙期间,主机读入来自 DS18B20的数据。在每一个时隙,总线只能传输一位数据。存在两种写时隙,即写 1 和写 0。主机在写 1 时隙向 DS18B20写入逻辑 1。而在写 0 时隙向 DS18B20写入逻辑 0。所有写时隙至少需要 60 S,而且两次写 l 时隙之间至少需要 l S 的恢复时间。两种写时隙均以主机拉低总线开始。产生写 1 时隙:主机拉低总线后,必须在 15uS内释放总线。然后由上拉电阻将总线拉至高电平。产生写 0 时隙:主机拉低总线后,必须在整个时隙期间保持低电平 ( 至少 60S)。在写时隙开始后的 1 5 60 S 期间, DSl8B20采样总线的状态。如果总线为高电,则逻辑 1 被写入 DSl8B20;如果总线为低电平,则0 逻辑被写入 DSl8B20。读时隙: DSl8B20 只能在主机发出读时隙时才能向主机传送数据。所以主机在发出读数据命令后,必须马上产生读时隙,以便 DSl8B20 能够传送数据。所有读时隙至少 60s,且在两次独立的读时隙之间至少需要 1 S 的恢复时间。作者张小波每次读时隙由主机发起,拉低总线至少1S。在主机发起读时隙之后,DSl8B20 开始在总线上传送 1 或 0。若 DS18B20发送 1,则保持总线为高电平;若发送O,则拉低总线。当传送 0 时, DSl8B20 在该时隙结束时释放总线,再由上拉电阻将总线拉回空闲高电平状态。DS18B20发出的数据在读时隙下降沿起始后的1 5uS 内有效,因此主机必须在读时隙开始后的 15S 内释放总线,并且采样总线状态。其程序流程图如下图所示。图 4-1-3 DS18B20 程序流程所以在软件设计方面,我们主要是读取温度函数和温度显示函数的编写。1 、读取温度函数作者张小波图 4-1-4 读温度子程序流程图图 4-1-5温度转换子程序流程图void Read_Temperature()if(Init_DS18B20()=1) /DS18B20DS18B20_IS_OK=0;故障elseWriteOneByte(0xcc);/跳过读取DS18B20 的系列号WriteOneByte(0x44);/启动温度转换Init_DS18B20();WriteOneByte(0xcc);/跳过读取DS18B20 的系列号WriteOneByte(0xbe);/ 读取温度寄存器Temp_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&0xf8)=0xf8)Temp_Value1 = Temp_Value1;Temp_Value0 = Temp_Value0+1;if(Temp_Value0=0x00)Temp_Value1+;作者张小波/ 负数标识置 1ng = 1;/查表得到温度小数部分Display_Digit0 = df_TableTemp_Value0&0x0f;/获取温度整数部分(高字节中的低3 位和低字节中高4 位,无符号)CurrentT = (Temp_Value0&0xf0)4) | (Temp_Value1&0x07)4);/将整数部分分解为3 位待显示的显示数字Display_Digit3 = CurrentT/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 Current_Temp_Display_Buffer8 Current_Temp_Display_Buffer7= Display_Digit1 + 0;= Display_Digit2 + 0;= 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 else if(Current_Temp_Display_Buffer7 Current_Temp_Display_Buffer7=)= -;=)= -;elseCurrent_Temp_Display_Buffer6= -;/在第一行显示标题Set_LCD_POS(0x00);for(i=0;i16;i+)Write_LCD_Data(Temp_Disp_Titlei);/在第二行显示当前温度Set_LCD_POS(0x40);for(i=0;i16;i+)Write_LCD_Data(Current_Temp_Display_Bufferi);作者张小波/显示温度符号Set_LCD_POS(0x4D);Write_LCD_Data(0x00);Set_LCD_POS(0x4E);Write_LCD_Data(C); 课堂小结这节课我们主要介绍了温度传感器DS18B20的工作特点,控制指令以及应用方法。着重分析了读取温度函数的设计和温度显示函数的编写。为我们学习其他温度传感器打下了一定的基础。完整程序代码#include #include #define uint unsigned int#define uchar unsigned char#define delayNOP() _nop_();_nop_();_nop_();_nop_();sbit DQ = P33;sbit LCD_RS = P20;sbit LCD_RW = P21;sbit LCD_EN = P22;uchar code Temp_Disp_Title=CurrentTemp(zxb);uchar Current_Temp_Display_Buffer= Temp =;/ 温度字符uchar code Temperature_Char8 = 0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00;/温度小数位对照表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_Value=0x00,0x00;/从 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 = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;作者张小波return result;void 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 = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;void LCD_Initialise()Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);void Set_LCD_POS(uchar pos)Write_LCD_Command(pos|0x80);void Delay(uint x)while(-x);uchar Init_DS18B20()/初始化作者张小波uchar status;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;for(i=0;i= 1;void Read_Temperature()/读取温度作者张小波if(Init_DS18B20()=1) /DS18B20DS18B20_IS_OK=0;故障elseWriteOneByte(0xcc);/跳过读取DS18B20的系列号WriteOneByte(0x44);/启动温度转换Init_DS18B20();WriteOneByte(0xcc);/跳过读取DS18B20的系列号WriteOneByte(0xbe);/ 读取温度寄存器Temp_Value0 = ReadOneByte();/温度低 8 位Temp_Value1 = ReadOneByte();/ 温度高 8 位DS18B20_IS_OK=1;void Display_Temperature()/在 LCD上显示当前温度uchar i;/ 延时值和负数标志uchar t = 150, ng = 0;/ 高 5 位全为 1(0XF8 )则为负数,为负数时取反加if(Temp_Value1&0xf8)=0xf8)1,并设置负数标识Temp_Value1 = Temp_Value1;Temp_Value0 = Temp_Value0+1;if(Temp_Value0=0x00)Temp_Value1+;ng = 1; / 负数标识置1/ 查表得到温度小数部分Display_Digit0 = df_TableTemp_Value0&0x0f;/ 获取温度整数部分(高字节中的低3 位和低字节中高4 位,无符号)CurrentT = (Temp_Value0&0xf0)4) | (Temp_Value1&0x07)4);/ 将整数部分分解为 3 位待显示的显示数字Display_Digit3 = CurrentT/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 Current_Temp_Display_Buffer8 Current_Temp_Display_Buffer7= Display_Digit1 + 0;= Display_Digit2 + 0;= 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= -;else if(Current_Temp_Display_Buffer7=)Current_Temp_Display_Buffer7= -;elseCurrent_Temp_Display_Buffer6= -;/ 在第一行显示标题Set_LCD_POS(0x00);for(i=0;i16;i+)Write_LCD_Data(Temp_Disp_Titlei);/ 在第二行显示当前温度Set_LCD_POS(0x40);for(i=0;i16;i+)Write_LCD_Data(Current_Temp_Display_Bufferi);/ 显示温度符号Set_LCD_POS(0x4D);Write_LCD_Data(0x00);Set_LCD_POS(0x4E);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(100);作者张小波
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 各类标准


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!