历史上的今天
返回首页

历史上的今天

今天是:2025年06月20日(星期五)

正在发生

2018年06月20日 | 关于DS18B20温度传感器的时序详解及代码分析

2018-06-20 来源:eefocus

简要说明测温工作**:**DS18B20的核心功能是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量 
递增。在上电状态下默认的精度为12位(所以最后获取的数据要乘以0.0625得到实际温度)。DS18B20启动后保持低功耗等待状态; 
当需要执行温度测量(和AD转换)时,总线控制器必须发出[44h]命令。在那之后, 
产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中(所以后期获取数据时,必须连续读取两次数据),下面介绍时序及相应代码(以12MHz的晶振为例,数据线定义为DQ) 
,其中DS18B20的所有通信都是以由复位脉冲组成的初始化序列开始的,并采用的是单总线协议。 
操作顺序:初始化——>写相应的控制指令(用写数据函数完成)——>读取DS18B20所采集到的数据(用读数据函数完成)———>把采集的数据转化成实际的温度。

延时函数: (15+15*z)us 的延时

void delay_us(uint z)

{

    for(z;z>0 ; z--)

    {

        _nop_();    _nop_();

        _nop_();    _nop_();

    }   

    _nop_();    _nop_();

}


*时序图及代码分析如下:*

一、初始化(见下图)

在初始化序列期间,总线控制器拉低总线并保持480us(改延时可以在480~960us之间,但需要在480us以内释放总线)以发出一个复位脉 
冲,然后释放总线,进入接收状态(等待DS18B20应答)。总线释放后,单总线由上拉电阻拉到高电平。当DS18B20探测到I/O引脚上的上升沿后,等待15-60us,然后其以拉低总线60-240us的方式发出存在脉冲。至此,初始化时序完毕。 
这里写图片描述

初始化代码: 
带返回值,有利于检验。

bit DS18B20_init()

{

    bit ack = 1;

    DQ = 0;         //主机拉低总线

    delay_us(32);   //延时495us

    DQ = 1;        //释放总线,同时IO口产生的上升沿能被DS18B20所检测到

    delay_us(4);    //延时大于60us,确保接下来DS18B20能发出60~240us的存在脉冲应答

    ack = DQ;      //在此60~240us之内DQ被DS18B20所占用,若存在,则其会发送一个低电平信号,DQ被DS18B20拉低,则ack为0,反之为1

    delay_us(15);  //延时达240us,让DS18B20释放总线

    DQ = 1;        

    return(ack);

}

初始化代码写至此,其实我们便可以用数码管显示来检验初始化是否成功(即DS18B20有应答),数码管显示”0“,初始化失败,显示”1“,则初始化成功。

二、DS18B20的写时序(见下图): 
主机在写时隙向DS18B20写入数据,其中分为写”0”时隙,和写”1”时隙。总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0.所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。两种写时隙都通过主机拉低总线产生(见下图)为了产生写1时隙。 
在拉低总线后主机必须在15μs内释放总线。在总线被释放后,由于上拉电阻将总线恢复为高电平。为了产生写”0”时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。 
在主机产生写时隙后,DS18B20会在其后的15~60us的一个时间段内采样单总线(DQ)。在采样的时间窗口内,如果总线为高电平,主机会向DS18B20写入1;如果总线为低电平,主机会向DS18B20写入0。 
综上所述,所有的写时隙必须至少有60us的持续时间。相邻两个写时隙必须要有最少1us的恢复时间。所有的写时隙(写0和写1)都由拉低总线产生。

这里写图片描述

DS18B20的写时序代码 
写字节函数、由低位至高位,向DS18B20写入一个字节的数据。 
无返回值。 
形参byte是待写入的字节数据,读取8次,移位8次,保证每位都传输至DQ

void DS18B20_write_byte(uchar byte)

{

    uchar i;

    for(i=0 ; i<8 ; i++)

    {

        DQ = 0;           //拉低总线,产生写时隙

        _nop_();

        _nop_();          //大于1us的延时

        DQ = 1;           //15us之内释放总线

        _nop_();

        _nop_();          //适当延时

        DQ = byte & 0x01; //将字节低位写入单总线

        delay_us(3);      //在15~60us内等待DS18B20来采集信号

        DQ = 1;          //释放总线

        byte >>= 1;       //每次讲要读取的数据位移至最低位,

    }

}

三、DS18B20的读时序(见下图) 
主机发起读时序时,DS18B20仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令[0xBE]或读电源模式指令[0xB4]后必须立刻开始读时序,DS18B20可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令[0x44] (或召回EEPROM指令[0xB8])之后读时序,详见DS18B20 的芯片手册上的功能指令。 
所有读时序必须最少60us,包括两个读周期间至少1us的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。DS18B20 通过拉高或拉低总线上来传输”1”或”0”。当传输逻辑”0”结束后,总线将被释放,通过上拉电阻回到上升沿状态。从DS18B20输出的数据在读时序的下降沿出现后15us 内有效。因此,总线控制器在读时序开始后必须停止把I/O口驱动为低电15us,以读取I/O口状态。

这里写图片描述

DS18B20的读时序的代码 
读字节函数、由低位至高位,读取DS18B20所采集到的数据。 
带返回值,可结合前面的写时序,对写、读数据函数进行检验(后面会提到检验过程及效果) 
byte 是读取到的字节数据。其中,此函数读取8次,移位7次(实际移位8次)

uchar DS18B20_read_write()

{

    uchar i;

    uchar byte;         //byte为要接收到的数据

    for(i=0 ; i<8 ; i++)

    {

        DQ = 0;         //产生读时序

        _nop_();

        _nop_();        //简单延时

        DQ = 1;        //释放总线,有从机DS18B20占用

        byte >>= 1;     //先进行移位

        if(DQ)          //让DS18B20占用总线,发出采集到的信号

            byte |= 0x80;  //若DQ=1,则让当前byte最高位为1,在下次循环中移位至次高位,最后达到从低位到高位接收的目的;若DQ=0,则可跳过此语句,直接在下次循环对byte进行移位补0。以上操作15us以内完成

        delay_us(3);    //延时60us

        DQ = 1;        //释放总线

        _nop_(); 

    }

}

下面简单说说如何检验写、读时序的程序: 
检验写、读的程序,本人采用DS18B20中特有的64位光刻ROM存储器(其中涉及一些指令,具体请见芯片的数据手册)。数据手册上说明,“64位光刻ROM的排列是:开始(最低)8位是产品类型标号,对于DS18B20来说都是(28H),接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

这里写图片描述

因为写函数刚好是从最低位开始读,所以我们先: 
调用函数:DS18B20_write_byte(0xcc); 
接着再调用函数:DS18B20_read_byte(); 
用数码管,或者液晶,将读函数的返回值显示出来,正确的显示应该为:40。 
这样,我们便能确定我们的写,读函数的正误了。


推荐阅读

史海拾趣

思博科技(Cybermax)公司的发展小趣事

在2005年的一个阳光明媚的春天,思博科技(Cybermax)公司在硅谷正式成立。创始人李明,一位经验丰富的电子工程师,看准了当时电子市场蓬勃发展的机遇,决定创办自己的公司。起初,公司只有几名员工,主要致力于研发和生产高性能的电子元器件。通过不懈的努力和优质的产品,思博科技逐渐在市场上崭露头角。

博巨兴公司的发展小趣事

博巨兴公司始终秉持开放合作的理念,积极与高校和研究机构展开产学研合作。2008年至2010年间,公司先后与厦门大学、中南大学、湖南大学结成产学研型战略伙伴关系,共同推动芯片技术的研发与应用。同时,公司还不断拓展市场,在上海建立了分公司,并在顺德、厦门、天津、杭州、西安等地设立了办事处,为公司的长远发展奠定了坚实基础。

这些故事虽然基于虚构,但反映了博巨兴公司在电子行业发展中不断探索、创新、合作与拓展的历程。通过这些努力,博巨兴公司逐渐在芯片代理和研发领域取得了显著成绩,为电子行业的发展做出了积极贡献。

BK Precision公司的发展小趣事

BK Precision一直将品质管理视为企业发展的核心。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、出厂等各个环节都进行严格把控。同时,公司还注重持续创新,不断推出符合市场需求的新产品。通过引进先进的生产设备和技术手段,BK Precision不断提高生产效率和产品质量,为客户提供更优质的产品和服务。

Glenair公司的发展小趣事
如果电路的供电电源不稳定或电压不足,也可能影响电路的正常工作。
Advanced Components Industries Inc公司的发展小趣事

在快速发展的过程中,ACI始终注重品质管理。公司建立了严格的质量检测体系,确保每一件产品都符合高标准的质量要求。同时,ACI还积极推行持续改进的理念,不断优化生产流程,提高生产效率。

这些努力使得ACI的产品在市场上赢得了良好的口碑。客户对公司的产品和服务给予了高度评价,纷纷表示愿意与ACI建立长期合作关系。这些正面的反馈进一步推动了ACI的发展。

CAROLCABLE公司的发展小趣事

在激烈的市场竞争中,CAROLCABLE公司深知技术创新是企业发展的核心动力。因此,公司不断加大研发投入,引进先进的生产设备和技术人才,推动技术创新和产业升级。经过多年的努力,CAROLCABLE成功研发出了一系列具有自主知识产权的高性能线缆产品,这些产品在传输速度、稳定性和耐用性等方面均达到了行业领先水平。

随着产品技术的不断升级,CAROLCABLE开始积极拓展国内外市场。公司参加了多个国际电子线缆展会,与全球同行交流学习,寻找合作机会。同时,CAROLCABLE还加强与国内大型电子企业的合作,为其提供定制化的线缆解决方案。这些举措不仅为公司带来了更多的商机,也进一步巩固了CAROLCABLE在电子线缆行业的领先地位。

这两个故事仅是对CAROLCABLE公司发展起来的简要描述,实际上,公司的成长历程中还有许多值得探讨的细节和里程碑事件。如需了解更多关于CAROLCABLE公司的故事,建议查阅相关新闻报道或公司官方资料。

问答坊 | AI 解惑

LPCXpresso1343-VB-USB

之前见到有人发帖“lpc1343之三:通过USB接口控制开发板LED闪烁速度并读取AD转换结果”,详见https://bbs.eeworld.com.cn/thread-106706-1-2.html,作者很牛很有实力,1343的C源码至今我还没有完全看懂,但鄙人用VB做软件,最近挤出点时间解决了VB ...…

查看全部问答>

系统是WINCE5.0+Pxa300,WIFI是用的Marvell的8686

系统是WINCE5.0+Pxa300,WIFI是用的Marvell的8686  这是用于干什么的系统?是类似于xp的系统还是嵌入式开发系统…

查看全部问答>

电路板发热,电源芯片LT1085发热

我的电路板用一个1085-5V芯片转换成5V,用一个1085-3.3V转换成3.3V,5V给AD等外围芯片供电,3.3主要给核心板供电,我的程序运行一会,核心板,电源芯片就会很烫,电源芯片带的底板也很烫。功率也满足要求。请问各位高手该如何解决发热问题?…

查看全部问答>

求助一道很简单的题目

将内存单元1000-1030H中的内容复制到3000-3030H单元中去,原地址清0 我的代码在下面,下载地址1000H,自修改代码,他说改下载地址,自己内存放点东西,他要看到结果,不放东西全部是0,复制过去也没效果。老师很BT,要求十分严格。EMBESTIDE环境 ...…

查看全部问答>

请问:在嵌入式(wince)下如何通过GPRS模块利用手机卡提供的GPRS上网

各位前辈大家好。 请问:在嵌入式(wince)下如何通过GPRS模块利用手机卡提供的GPRS上网,我买了个嵌入式开发板utu-s3c2440-s和GSM/GPRS/CDMA-MODEM模块,现在连接上之后,可以实现给其他手机发送信息和拨打电话,但不知怎么实现通过它实现无线上 ...…

查看全部问答>

socket的建立

在vxworks下想实现socket的通讯,建立了一个虚拟机,里面跑的是vxworks,是服务端 在windows下,用VC实现的客户端。 问题是发现服务端的socket无法建立,不知是不是写错了,代码如下: netInit() {         struct sockad ...…

查看全部问答>

嵌入式技术交流群 24992320 欢迎加入啊

嵌入式技术交流群 24992320 欢迎加入啊 …

查看全部问答>

请问ST32复位时IO口处于什么状态?

                                 如题。我说的是复位过程中,而不是复位后。谢谢!!!…

查看全部问答>

为什么程序加while(1),运行起来程序还是会跳出while执行上面的初始化呢?

为什么程序加while(1),运行起来程序还是会跳出while执行它上面的初始化呢? 我是触摸屏加ADC采样,触摸屏是GPIO低电平产生中断,ADC是定时器触发中断。两个一起用,触摸液晶屏总是会死掉,没一点反应,还有就是会跳出while(1),执行上面的ADC初 ...…

查看全部问答>

TI群星系列的一点资料

 网上找到的一些关于TI的CM3和ST的CM3的一点区别和前几天参加TI的CM4研讨会了解到的TI的CM4和ST的CM4的一点区别:CM3系列:1. TI 的以太网接口是MAC+PHY,ST的需要扩展PHY2. TI只有3个串口,ST有5个,STM32F2达到了6个3. TI的ADC是10位的,而S ...…

查看全部问答>