您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > DS18B20详解及程序
DS18B20数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20产品的特点:(1)、只要求一个I/O口即可实现通信。(2)、在DS18B20中的每个器件上都有独一无二的序列号。(3)、实际应用中不需要外部任何元器件即可实现测温。(4)、测量温度范围在-55到+125℃之间;在-10~+85℃范围内误差为±5℃;(5)、数字温度计的分辨率用户可以从9位到12位选择。将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。DS18B20引脚分布图DS18B20详细引脚功能描述:1、GND地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路,常太下高电平.通常要求外接一个约5kΩ的上拉电阻.3、VDD可选择的VDD引脚。电压范围:3~5.5V;当工作于寄生电源时,此引脚必须接地。DS18B20存储器结构图暂存储器的头两个字节为测得温度信息的低位和高位字节;第3,4字节是TH和TL的易失性拷贝,在每次电复位时都会被刷新;第5字节是配置寄存器的易失性拷贝,同样在电复位时被刷新;第9字节是前面8个字节的CRC检验值.配置寄存器的命令内容如下:0R1R011111MSBLSBR0和R1是温度值分辨率位,按下表进行配置.默认出厂设置是R1R0=11,即12位.温度值分辨率配置表R1R0分辨率最大转换时间(ms)009bit93.75(tconv/8)0110bit183.50(tconv/4)1011bit375(tconv/2)1112bit750(tconv)4种分辨率对应的温度分辨率为0.5℃,0.25℃,0.125℃,0.0625℃(即最低一位代表的温度值)12位分辨率时的两个温度字节的具体格式如下:低字节:2^32^22^12^02^-12^-22^-32^-4高字节:SSSSS2^62^52^4其中高字节前5位都是符号位S,若分辨率低于12位时,相应地使最低为0,如:当分辨率为10位时,低字节为:2^32^22^12^02^-12^-200,高字节不变....一些温度与转换后输出的数字参照如下:温度数字输出换成16进制+125℃000001111101000007D0H+85℃00000101010100000550H+25.0625℃00000001100100010191H+10.125℃000000001010001000A2H+0.5℃00000000000010000008H0℃00000000000000000000H-0.5℃1111111111111000FFF8H-10.125℃1111111101011110FFE5H-25.0625℃1111111001101111FF6FH-55℃1111110010010000FC90H由上表可看出,当输出是负温度时,使用补码表示,方便计算机运算(若是用C语言,直接将结果赋值给一个int变量即可).DS18B20的使用方法:由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序(dsInit()实现)、读时序(readByte())、写时序(writeByte())。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20与单片机连接电路图:利用软件模拟DS18B20的单线协议和命令:主机操作DS18B20必须遵循下面的顺序1.初始化单线总线上的所有操作都是从初始化开始的.过程如下:1)请求:主机通过拉低单线480us以上,产生复位脉冲,然后释放该线,进入Rx接收模式.主机释放总线时,会产生一个上升沿脉冲.DQ:1-0(480us+)-12)响应:DS18B20检测到该上升沿后,延时15~60us,通过拉低总线60~240us来产生应答脉冲.DQ:1(15~60us)-0(60~240us)3)接收响应:主机接收到从机的应答脉冲后,说明有单线器件在线.至此,初始化完成.DQ:02.ROM操作命令当主机检测到应答脉冲,便可发起ROM操作命令.共有5类ROM操作命令,如下表命令类型命令功能字节ReadRom读ROM33H读取激光ROM中的64位,只能用于总线上单个DS18B20器件情况,多挂时会发生数据冲突MatchRom匹配ROM55H此命令后跟64位ROM序列号,寻址多挂总线上的对应DS18B20.只有序列号完全匹配的DS18B20才能响应后面的内存操作命令,其他不匹配的将等待复位脉冲.可用于单挂或多挂两种情况.SkipRom跳过ROMCCH可无须提供64位ROM序列号即可运行内存操作命令,只能用于单挂.SearchRom搜索ROMF0H通过一个排除法过程,识别出总线上所有器件的ROM序列号AlarmSearch告警搜索ECH命令流程与SearchRom相同,但DS18B20只有最近的一次温度测量时满足了告警触发条件的,才会响应此命令.3.内存操作命令在成功执行ROM操作命令后,才可使用内存操作命令.共有6种内存操作命令:命令类型命令字节功能WriteScratchpad写暂存器4EH写暂存器中地址2~地址4的3个字节(TH,TL和配置寄存器)在发起复位脉冲之前,3个字节都必须要写.ReadScratchpad读暂存器BEH读取暂存器内容,从字节0~一直到字节8,共9个字节,主机可随时发起复位脉冲,停止此操作,通常我们只需读前5个字节.CopyScratchpad复制暂存器48H将暂存器中的内容复制进EERAM,以便将温度告警触发字节存入非易失内存.如果此命令后主机产生读时隙,那么只要器件还在进行复制都会输出0,复制完成后输出1.ConvertT温度转换44H开始温度转换操作.若在此命令后主机产生时隙,那么只要器件还在进行温度转换就会输出0,转换完成后输出1.RecallE2重调E2暂存器B8H将存储在EERAM中的温度告警触发值和配置寄存器值重新拷贝到暂存器中,此操作在DS18B20加电时自动产生.ReadPowerSupply读供电方式B4H主机发起此命令后每个读数时隙内,DS18B20会发信号通知它的供电方式:0寄生电源,1外部供电.4.数据处理DS18B20要求有严格的时序来保证数据的完整性.在单线DQ上,有复位脉冲,应答脉冲,写0,写1,读0,读1这6种信号类型.除了应答脉冲外,其它都由主机产生.数据位的读和写是通过读、写时隙实现的.1)写时隙:当主机将数据线从高电平拉至低电平时,产生写时隙.所有写时隙都必须在60us以上,各写时隙间必须保证1us的恢复时间.写1:主机将数据线DQ先拉低,然后释放15us后,将数据线DQ拉高;写0:主机将DQ拉低并至少保持60us以上.2)读时隙:当主机将数据线DQ从高电平拉至低电平时,产生读时隙.所有读时隙最短必须持续60us,各读时隙间必须保证1us的恢复时间.读:主机将DQ拉低至少1us,.此时主机马上将DQ拉高,然后就可以延时15us后,读取DQ即可.源代码:(测量范围:0~99度)DS18B201#includereg51.H2//通过DS18B20测试当前环境温度,并通过数码管显示当前温度值3sbitwela=P2^7;//数码管位选4sbitdula=P2^6;//数码管段选5sbitds=P2^2;6//0-F数码管的编码(共阴极)7unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,80x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};9//0-9数码管的编码(共阴极),带小数点10unsignedcharcodetableWidthDot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,110x87,0xff,0xef};1213//延时函数,例i=10,则大概延时10ms.14voiddelay(unsignedchari)15{16unsignedcharj,k;17for(j=i;j0;j--)18{19for(k=125;k0;k--);20}21}2223//初始化DS18B2024//让DS18B20一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动25voiddsInit()26{27//一定要使用unsignedint型,一个i++指令的时间,作为与DS18B20通信的小时间间隔28//以下都是一样使用unsignedint型29unsignedinti;30ds=0;31i=103;32while(i0)i--;33ds=1;34i=4;35while(i0)i--;36}3738//向DS18B20读取一位数据39//读一位,让DS18B20一小周期低电平,然后两小周期高电平,40//之后DS18B20则会输出持续一段时间的一位数据41bitreadBit()42{43unsignedinti;44bitb;45ds=0;46i++;47ds=1;48i++;i++;49b=ds;50i=8;51while(i0)i--;52returnb;53}5455//读取一字节数据,通过调用readBit()来实现56unsignedcharreadByte()57{58unsignedinti;59unsignedcharj,dat;60dat=0;61for(i=0;i8;i++)62{63j=readBit();64//最先读出的是最低位数据65dat=(j7)|(dat1);66}67returndat;68}6970//向DS18B20写入一字节数据71voidwriteByte(unsignedchardat)72{73unsignedinti;74unsignedcharj;75bitb;76for(j=0;j8;j++)77{78b=dat&0x01;79dat=1;80//写1,让低电平持续2个小延时,高电平持续8个小延时81if(b)82{83ds=0;84i++;i++;85ds=1;86i=8;while(i0)i--;87}88else//写0,让低电平持续8个小延时,高电平持续2个小延时89{90ds=0;91i=8;while(i0)i--;92ds=1;93i++;i++;94}95}96}9798//向DS18B20发送温度转换命令99voidsendChangeCmd()100{101dsInit();//初始化DS18B20102delay(1);//延时1ms103writeByte(0xcc);//写入跳过序列号命令字104writeByte(0x44);//写入温度转换命令字105}106107//向DS18B20发送读取数据命令108voidsendReadCmd()109{110dsInit();111delay(1);112writeByte(0xcc);//写入跳过序列号命令字113writeByte(0xbe);//写入读取数据令字114}115116//获取当前温度值117unsignedintgetTmpValue()118{119unsignedintvalue;//存放温度数值120fl
本文标题:DS18B20详解及程序
链接地址:https://www.777doc.com/doc-2910391 .html