ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:145.81KB ,
资源ID:3788397      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3788397.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于DS18B20温度传感器的设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于DS18B20温度传感器的设计.docx

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

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

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

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位数

5、据,存储在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)配置寄存器

6、该字节各位的意义如下:低五位一直都是1 ,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位) 表2 配置寄存器结构TMR1R011111表3 温度值分辨率设置表R1R0分辨率温度最大转换时间009位93.75ms0110位187.5ms1011位375ms1112位750ms3. 高速暂存存储器高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单

7、线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表2是对应的一部分温度值。第九个字节是冗余检验字节。表4 DS18B20暂存寄存器分布寄存器内容字节地址温度值低位0温度值高位1高温限值TH2低温限值TL3配置寄存器4保留5保留6保留7CRC检验8根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CP

8、U将数据线下拉500微秒,然后释放,DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。表5 ROM指令表指 令约定代码功 能读ROM33H读DS1820ROM中的编码(即64位地址)符合ROM55H发出此命令之后,接着发出64位ROM编码,访问单总线上和该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。搜索ROM0F0H用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。为操作各器件作好准备。跳过ROM0CCH忽略64位ROM地址,直接向DS1820发温度变换命令。适用于单片工作。告警搜索命

9、令0ECH执行后只有温度超过设定值上限或下限的片子才做出响应。表6 RAM指令表指 令约定代码功 能温度变换44H启动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

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

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

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

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

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

15、在主机发起读时隙之后,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() i

16、f(Init_DS18B20()=1) /DS18B20故障 DS18B20_IS_OK=0; else WriteOneByte(0xcc); /跳过读取DS18B20的系列号 WriteOneByte(0x44); /启动温度转换 Init_DS18B20(); WriteOneByte(0xcc); /跳过读取DS18B20的系列号 WriteOneByte(0xbe); / 读取温度寄存器 Temp_Value0 = ReadOneByte(); /温度低8位 Temp_Value1 = ReadOneByte(); / 温度高8位 DS18B20_IS_OK=1; 上述代码中,未读取

17、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+; /负数标识置1 ng = 1; /查表得到温度小数部分 Display_Digit0 = df_TableTemp_

18、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_

19、Buffer10 = .; Current_Temp_Display_Buffer9 = Display_Digit1 + 0; Current_Temp_Display_Buffer8 = Display_Digit2 + 0; Current_Temp_Display_Buffer7 = Display_Digit3 + 0; /高位为零时不显示 if(Display_Digit3 = 0) Current_Temp_Display_Buffer7 = ; if(Display_Digit2 = 0&Display_Digit3=0) Current_Temp_Display_Buffer

20、8 = ; /负数符号显示在恰当的位置 if(ng) if(Current_Temp_Display_Buffer8 = ) Current_Temp_Display_Buffer8 = -; else if(Current_Temp_Display_Buffer7 = ) Current_Temp_Display_Buffer7 = -; else Current_Temp_Display_Buffer6 = -; /在第一行显示标题 Set_LCD_POS(0x00); for(i=0;i16;i+) Write_LCD_Data(Temp_Disp_Titlei); /在第二行显示当前温

21、度 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 unsigne

22、d 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,

23、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()

24、 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(u

25、char 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); voi

26、d 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

27、; _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) /DS18B20故障 DS18B20_IS_OK=0; else WriteOneByte(0xcc); /跳过读取DS18B20的系列号 WriteOneByte(0x44); /启动温度转换 Init_DS18B20(); WriteOn

28、eByte(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)则为负数,为负数时取反加1,并设置负数标识 if(Temp_Value1&0xf8)=0xf8) 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

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1