历史上的今天
返回首页

历史上的今天

今天是:2025年06月25日(星期三)

正在发生

2021年06月25日 | 51单片机开发之DS18B20温度传感器

2021-06-25 来源:eefocus

4.5 DS18B20温度传感器

4.5.1 原理图介绍

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-5-1

 

实验板上的DS18B20模块接在单片机的P3.7 IO口上,在插入DS18B20芯片时,圆弧朝上插入,具体效果可以看上面图片。


4.5.2 DS18B20温度传感器介绍

DS18B20是常用的数字温度传感器,其输出的是数字信号,它的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。

DS18B20的主要特征如下:

(1)、全数字温度转换及输出。

(2)、先进的单总线数据通信。(一根线即可采集温度)

(3)、最高 12 位分辨率,精度可达土 0.5 摄氏度。

(4)、12 位分辨率时的最大工作周期为 750 毫秒。

(5)、可选择寄生工作方式。

(6)、检测温度范围为–55° C ~+125° C (–67° F ~+257° F)

(7)、内置 EEPROM,限温报警功能。

(8)、64位光刻 ROM,内置产品序列号,方便多机挂接。(支持一根线操作多个芯片)

(9)、多样封装形式,适应不同硬件系统,封装可以看下面的图片。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-5-3


图片里芯片的引脚功能:GND电压地 、DQ单数据总线、VDD电源电压、NC 空引脚


4.5.3  DS18B20的工作原理介绍

DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。


它的一个工作周期可分为两个部分,温度检测和数据处理。


DS18B20内部有三种形态的存储器:

 (1) ROM只读存储器:用于存放 DS18B20ID 编码,其前 8 位是单线系列编码(DS18B20 的编码是19H),后面 48 位是芯片唯一的序列号,最后8位是以上56的位的 CRC 码(冗余校验),数据在芯片出厂时设置不可由用户更改。DS18B20 共 64 位 ROM(8+48+8)。

(2) RAM数据暂存器:用于内部计算和数据存取,数据在掉电后丢失,DS18B20 共 9 个字节 RAM,每个字节为 8 位。第 1、 2 个字节是温度转换后的数据值信息,第 3、 4 个字节是用户 EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。第 6、 7、 8 个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第 9 个字节为前 8 个字节的 CRC 码。

(3) EEPROM非易失性记忆体:用于存放长期需要保存的数据。比如: 上下限温度报警值和校验数据,DS18B20共有3个字节的EEPROM,并在 RAM 都存在镜像,以方便用户操作。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-5-4


DS18B20默认工作在12位分辨率模式,转换后得到的12位数据,存储在DS18B20的两个8比特的RAM中(最前面的两个字节),二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。


数据提取也可以使用位运算,读取出来的数据是2个字节一共16位(H和L),最低4位是小数位,剩下的是整数位。如果读取的数据是负数,需要-1再取反即可得到真实数据。


例如:

(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

 

int temp=0;temp=DS18B20_ReadTemp(); //读取一次DS18B20采集的温度(返回H+L位)if(temp<0) //如果温度是负数{    temp=temp-1;    temp=~temp;    printf("DS18b20=-%d.%drn",temp>>4,temp&0xF);}else{printf("DS18b20=%d.%drn",temp>>4,temp&0xF);}


4.5.4  DS18B20操作ROM/RAM的常用指令介绍

1. 读取64位ROM编码指令:0x33

这个命令允许总线控制器读到DS18B20的64位ROM。只有当总线上只存在一个 DS18B20的时候才可以使用此指令,如果挂接不只一个,当通信时将会发生数据冲突。


2. 匹配芯片指令:0x55

这个指令后面紧跟着由控制器发出的64 位序列号,当总线上有多只 DS18B20 时,只有与控制发出的序列号相同的芯片才可以做出反应,其它芯片将等待下一次复位。这条指令适应单芯片和多芯片挂接。


3. 跳过ROM编码匹配:0xCC

这条指令使芯片不对 ROM 编码做出反应,在单总线的情况之下,为了节省时间则可以选用此指令。如果在多芯片挂接时使用此指令将会出现数据冲突,导致错误出现。


4. 启动温度转换:0x44

收到此指令后芯片将进行一次温度转换,将转换的温度值放入 RAM 的第 1、 2 地址。此后由于芯片忙于温度转换处理,当控制器发一个读时间隙时,总线上输出“0”,当储存工作完成时,总线将输出“1”。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持 500MS,来维持芯片工作。


5. 从RAM中读数据指令:0xBE

此指令将从 RAM中读数据,读地址从地址0开始,一直可以读到地址 9,完成整个 RAM 数据的读出。芯片允许在读过程中用复位信号中止读取,即可以不读后面不需要的字节以减少读取时间。


4.5.5 DS18B20时序图

(1).  DS18B20复位与应答时序图

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-5-5 复位及应答时序图

 

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-5-6

 

每一次与DS18B20通信之前都必须进行复位,复位的时间、等待时间、回应时间应严格按时序编程。

 

(2) 写数据时序

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-5-7 写数据时序图

 

上面的时序图是向DS18B20写数据的时序图,该图分为两部分,左边部分是发送数据0的时序图,右边部分是发送数据1的时序图。


根据时序图提示(右边部分),每次发送数据之前(不管是数据0还是数据1)都需要先将总线拉低至少1us。


如果接下来发送的数据是0,那么需要将数据线拉低至少60us的时间,DS18B20对总线的采样时间在15~60us内;在采样时间内,如果总线为低电平,则表示写0,如果总线为高电平,则表示写1。


如果接下来发送的数据是1,那么也需要将数据线拉低至少60us的时间,DS18B20对总线的采样时间在15~60us内;在采样时间内,如果总线为低电平,则表示写0,如果总线为高电平,则表示写1。


注意: 在通信时,是以一个字节为单位向DS18B20进行传输,字节的读或者写是从低位开始的。


(3) 读数据时序

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-5-8 读数据时序图

 

上面的时序图是从DS18B20读取数据的时序图,该图分为两部分展示,左边部分是读取数据0时,总线电平变化过程,右边部分是读取数据1时,总线电平的变化过程。


根据时序图提示(右边部分),每次读取数据之前(不管是数据0还是数据1),总线都需要由主机拉低至少1us,然后再释放总线(拉高);


随后需要等待15us的时间,才可以读取总线数据。DS18B20会在随后的45us内维持总线的电平,这段时间内读取总线的数据都是有效数据。


注意: 再总线拉低1us之后,必须等待15us之后才可以读取总线数据,这样才能保证总线数据是准确的。


在通信过程中,DS18B20输出的数据是从低位开始传输的。


4.5.6 读取温度的步骤

总线上只有单只DS18B20的情景(读取一次DS18B20的温度):

1.  向总线发送复位脉冲并检测DS18B20的响应信号(可以确保DS18B20硬件没有问题)

2.  发送指令跳过ROM编号检查 (指令0xCC)

3.  发送温度转换命令(指令0x44)

(DS18B20在转换温度的过程中,总线会一直保持高电平状态,不会响应总线命令)

4.  向总线发送复位脉冲并检测DS18B20的响应信号

5.  发送指令跳过ROM编号检查 (指令0xCC)

6.  发送读取温度的指令(指令 0xBE)

7.  接着读取温度数据低8位

8.  接着读取温度数据高8位


4.5.7 读取DS18B20温度示例代码(单只DS18B20情景)

下面代码演示了循环读取DS18B20温度的过程,在主函数里1秒的间隔读取一次温度。


在编写DS18B20时序代码时,要注意时间的把控。


当前实验板的环境:采用STC90C516RD单片机,晶振是12MHZ,工作在12T模式下,代码中执行一条i++语句大概消耗的时间是12us。程序中的延时时间,都是通过该时间推算的,如果程序要移植到其他单片机上,要注意时间的问题。


示例代码:

(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)


#include /*DS18B20硬件接口: P3.7*/sbit DS18B20_GPIO=P3^7;int DS18B20_ReadTemp(void);/*说明: 在12MHZ晶振下,12T模式下,i++消耗的时间差不多是12us*//*函数名称:u8 DS18B20_Init(void)函数功能:向DS18B20发送复位脉冲,并检测应答信号返 回 值:1表示失败,0表示成功说明: 51单片机IO口默认输出高电平*/u8 DS18B20_ResetSignal(void){    u8 i=0;    //1. 发送复位信号    DS18B20_GPIO=0;//将总线拉低480us    i=50;       while(i--){}   //延时600us ,最少480us    i=0;    DS18B20_GPIO=1;//然后释放(拉高)总线,如果DS18B20做出反应会将在15us~60us后总线拉低    //2. 等待DS18B20拉低总线    while(DS18B20_GPIO)    {        i++;        if(i>10)return 1;//失败 ,大概120us

    }    //3. 等待DS18B20释放总线    i=0;    while(DS18B20_GPIO==0) //60us~240us    {        i++;        if(i>20)return 1;//失败,大概240us    }    return 0;//初始化成功}/*函数名称:u8 DS18B20_WriteByte(void)函数功能:向DS18B20写入一个字节的数据函数形参:写入的字节数据*/void DS18B20_WriteByte(u8 byte){    u16 i=0,j=0;    for(j=0;j<8;j++)    {        DS18B20_GPIO=0;//每写入一位数据之前先把总线拉低1us        i++; //+1消耗的时间是12us        DS18B20_GPIO=byte&0x01;//然后写入一个数据,从最低位开始        i=6;        while(i--){}//持续时间最少60us,这里大概72us        DS18B20_GPIO=1;//然后释放总线        byte>>=1;//继续发送    }}/*函数名称:u8 DS18B20_ReadByte(void)函数功能:从DS18B20读取一个字节的数据返 回 值:读到的数据*/u8 DS18B20_ReadByte(void){    u8 byte=0;    u16 i=0,j=0;        for(j=0;j<8;j++)    {        DS18B20_GPIO=0;//先将总线拉低1us        i++;//+1消耗的时间是12us        DS18B20_GPIO=1;//然后释放总线        i++;         i++;//至少等待15us的时间,在读取数据        byte>>=1; //先从低位开始接收数据        if(DS18B20_GPIO)byte|=0x80;                           i=4; //读取完之后等待48us再接着读取下一个数据        while(i--){}    }                   return byte;}/*函数名称:u16 DS18B20_ReadTemp(void)函数功能:读取一次DS18B20的温度数据返 回 值:读取的温度值注意: 返回值要使用有符号的数据类型,因为温度可以返回负数。*/int DS18B20_ReadTemp(void){    int temp=0;//存放温度数据    u8 TH,TL;    //第一步: 启动温度转换    DS18B20_ResetSignal(); //发送复位脉冲并检测应答信号    DS18B20_WriteByte(0xcc);//跳过ROM操作命令          DS18B20_WriteByte(0x44);//温度转换命令    //第二步: 读取温度    DS18B20_ResetSignal();//发送复位脉冲并检测应答信    DS18B20_WriteByte(0xcc);//跳过ROM操作命令    DS18B20_WriteByte(0xbe);//发送读取温度命令    TL=DS18B20_ReadByte();//读取温度值共16位,先读低字节    TH=DS18B20_ReadByte();//再读高字节    temp=TH<<8|TL; //合并成16位    return temp;}int main(){    int temp=0;    UART_Init();        //初始化串口波特率为4800    while(1)    {        temp=DS18B20_ReadTemp();        if(temp<0) //如果温度是负数        {            temp=temp-1;            temp=~temp;            printf("DS18b20=-%d.%drn",temp>>4,temp&0xF);        }        else        {            printf("DS18b20=%d.%drn",temp>>4,temp&0xF);        }        DelayMs(1000);    }}


推荐阅读

史海拾趣

Alpha 3 Manufacturing公司的发展小趣事

Alpha 3 Manufacturing公司深知产品质量是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格的把控。同时,公司还引入了先进的生产设备和检测仪器,确保产品的质量和性能达到国际先进水平。此外,公司还定期对生产过程进行审查和改进,不断提高生产效率和产品质量。

承兴(CX)公司的发展小趣事

进入21世纪,承兴公司不满足于现状,开始寻求跨界合作的机会。2000年,承兴成为诺基亚中国区合作伙伴,共同推出了一系列定制化的电子产品。这一合作不仅提升了承兴的品牌影响力,也为其带来了更多的商业机会。随后,承兴还与中国石油、建设银行等大型企业和金融机构建立了合作关系,进一步拓展了其业务范围。

BUSSMANN公司的发展小趣事

1914年,Bussmann五兄弟在家中地下室开始了他们的创业之旅。那时的电子行业正处于起步阶段,熔断器作为电路保护的关键部件,市场需求巨大但供应不足。五兄弟凭借对电子技术的热情和家族传承的工匠精神,不断尝试、创新,终于成功制造出了高质量的熔断器。他们凭借出色的产品质量和口碑,逐渐赢得了市场的认可,业务也从小小的地下室扩展到了一间小型厂房。

FERYSTER公司的发展小趣事

FERYSTER公司的创始人在一次国际电子展览会上,被一款新型半导体芯片技术深深吸引。他意识到这项技术将引领电子行业的新一轮革命。于是,他果断决定投入大量资金和资源,组建研发团队,对该技术进行深入研究。经过数年的努力,FERYSTER公司成功掌握了这项技术,并推出了基于该技术的全新产品系列。这些产品以其卓越的性能和稳定性,迅速在市场上取得了成功,为公司的快速发展奠定了坚实基础。

GSN Electronics公司的发展小趣事

FERYSTER公司的创始人在一次国际电子展览会上,被一款新型半导体芯片技术深深吸引。他意识到这项技术将引领电子行业的新一轮革命。于是,他果断决定投入大量资金和资源,组建研发团队,对该技术进行深入研究。经过数年的努力,FERYSTER公司成功掌握了这项技术,并推出了基于该技术的全新产品系列。这些产品以其卓越的性能和稳定性,迅速在市场上取得了成功,为公司的快速发展奠定了坚实基础。

GSME Electronics公司的发展小趣事

随着生产设备的引进和技术团队的壮大,GSME Electronics开始专注于半导体器件的研发与生产。公司产品线逐渐丰富,涵盖了片式各种系列表面贴装的小信号三极管、中功率驱动三极管、肖特基、开关二极管及小功率可控硅等多种半导体分立器件。这些产品广泛应用于移动通信、计算机、消费类电子信息产品、家用电器、工业自动化控制设备等领域,满足了市场的多样化需求,推动了公司业务的快速增长。

问答坊 | AI 解惑

xds100原理图和制作设置

最近比较忙,上来这儿比较少了。今天上个xds100的制作原理图和设置。 制作成本好像也比较高,有的东西可以省掉的,自己看着办…

查看全部问答>

迎接数字世界的挑战需要测试先行

        以计算机、通信和消费电子为代表的3C融合正在改变人们的生活和工作方式,从手机、 数字电视、 PDA、游戏机,到自动售货机、汽车音响、通信网络,半导体器件已经变得无处不在。数字技术与网络技术的融合,将 ...…

查看全部问答>

protel库转allegro库方法及工具下载

注意:Layout2Allegro工具转换的文档也是有版本之分的。 并不是将其放在当前版本转换后就是当前版本的。 1. Layout2Allegro.rar这个版本估计在15.2之上(虽然cadence可查看版本,但太笼统),    因转换后有的可用15.2打开,有的需用 ...…

查看全部问答>

Crosstar嵌入式学院“Minicom -- Linux下的超级终端”

 Linux下可以使用minicom通过串口对开发板进行配置,就像Windows下的超级终端一样,功能更强大。 输入minicom命令进入minicom界面, 按CTRL-A Z(同时按Ctrl和A, 然后按Z), 然后按O 选择cOnfigure Minicom进入minicom的配置界面(也可以输入minicom - ...…

查看全部问答>

串行通信只能接收到设备的初始化信息,不能发送命令

正在使用卓立汉光的MC400电控台。 用串口连接,用串口调试助手发送接收命令。 mc400电控台开机后,能自动发送初始化信息到计算机,串口调试助手能接收到。 但是,用调试助手发送命令到电控台,却不成功,返回ER。只会在电控台重新开机,调试助手 ...…

查看全部问答>

SIRIUS 无线模块

SIRIUS  ISR3500介绍:…

查看全部问答>

Linux2.6 安装java虚拟机

项目需要,想在s3c6410 Linux2.6 安装java虚拟机,没有这方面的经验,不知道是否可行,望各位给意见,谢谢!…

查看全部问答>

QQ2440、GEC2440、GEC2410开发板专诚代理

QQ2440开发板(S3C2440)+4DVD嵌入式linux视频教程==650 GEC2410开发板(S3C2410)+培训教程+4DVD嵌入式linux视频教程==850 QQ2440开发板(S3C2440)+NEC3.5寸触摸屏+4DVD嵌入式linux视频教程==1050 GEC2410开发板(S3C2410)+三星3.5寸触摸屏+培训教程+ ...…

查看全部问答>

2553串口通信发送的数据怎么显示在液晶上

//串口通信,通信协议默认 #include #include \"LCD_12864.H\" volatile unsigned char DATE; void init_uart()                                  &n ...…

查看全部问答>

尴尬了。LUAUCHPAD外部供电问题!来个大神指导下!

学校有TI的LP2950-33芯片,给LUAUNCHPAD外部供电比稳压电路抗干扰是好点的。但是我昨晚把这个三极管,就IN接5V 中间脚接地 OUT接示波器显示OUT是3.3V完全符合LUAUNCHPAD要求,但是今天下午重新这样接就变成4.5V,起初以为芯片坏了后来问老师拿了个 ...…

查看全部问答>