历史上的今天
返回首页

历史上的今天

今天是:2026年01月09日(星期五)

正在发生

2023年01月09日 | 温度传感器DS18B20原理,附STM32例程代码

2023-01-09 来源:zhihuDS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。 DS18B20原理 传感器参数 测温范围为-55℃到+125℃,在-10

DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

DS18B20原理

传感器参数

测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4°

返回16位二进制温度数值

主机和从机通信使用单总线,即使用单线进行数据的发送和接收

在使用中不需要任何外围元件,独立芯片即可完成工作

掉电保护功能 DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值

每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值

宽电压供电,电压2.5V~5.5V

DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值

传感器引脚及原理图

DS18B20传感器的引脚及封装图如下:



DS18B20一共有三个引脚,分别是:

GND:电源地线

DQ:数字信号输入/输出端

VDD:外接供电电源输入端



单个DS18B20接线方式:VDD接到电源,DQ接单片机引脚,同时外加上拉电阻,GND接地。

注意这个上拉电阻是必须的,就是DQ引脚必须要一个上拉电阻。

DS18B20上拉电阻

首先来看一下什么是场效应管(MOSFET),如下图。



场效应管是电压控制型元器件,只要对栅极施加一定电压,DS就会导通。

漏极开路:MOS管的栅极G和输入连接,源极S接公共端,漏极D悬空(开路)什么也没有接,直接输出 ,这时只能输出低电平和高阻态,不能输出高电平。

那么这个时候会出现三种情况:

下图a为正常输出(内有上拉电阻):场效应管导通时,输出低电位输出低电位,截止时输出高电位

下图b为漏极开路输出,外接上拉电阻:场效应管导通时,驱动电流是从外部的VCC流经电阻通过MOSFET到GND,输出低电位,截止时输出高电位

下图c为漏极开路输出,无外接上拉电阻:场效应管导通时输出低电位,截止呈高阻态(断开)



总结一下:

开漏输出只能输出低电平,不能输出高电平。漏极开路输出高电平时必须在输出端与正电源(VCC)间外接一个上拉电阻。否则只能输出高阻态。

DS18B20 是单线通信,即接收和发送都是这个通信脚进行的。其接收数据时为高电阻输入,其发送数据时是开漏输出,本身不具有输出高电平的能力,即输出0时通过MOS下拉为低电平,而输出1时,则为高阻,需要外接上拉电阻将其拉为高电平。因此,需要外接上拉电阻,否则无法输出1。

外接上拉电阻阻值:

DS18B20的工作电流约为1mA,VCC一般为5V,则电阻R=5V/1mA=5KΩ,所以正常选择4.7K电阻,或者相近的电阻值。

DS18B20寄生电源

DS18B20的另一个特点是不需要再外部供电下即可工作。当总线高电平时能量由单线上拉电阻经过DQ引脚获得。高电平同时充电一个内部电容,当总线低电平时由此电容供应能量。这种供电方法被称为“寄生电源”。另外一种选择是DSl8B20由接在VDD的外部电源供电。



DS18B20内部构成

主要由以下3部分组成:

64 位ROM

高速暂存器

存储器

64位ROM存储独有的序列号,ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。这样就可以实现一根总线上挂接多个DS18B20的目的。

高速暂存器包含:

温度传感器

一个字节的温度上限和温度下限报警触发器(TH和TL)

配置寄存器允许用户设定9位,10位,11位和12位的温度分辨率,分别对应着温度的分辨率为:0.5°C,0.25°C,0.125°C,0.0625°C,默认为12位分辨率

存储器:由一个高速的RAM和一个可擦除的EEPROM组成,EEPROM存储高温和低温触发器(TH和TL)以及配置寄存器的值,(就是存储低温和高温报警值以及温度分辨率)



DS18B20温度读取与计算

DS18B20采用16位补码的形式来存储温度数据,温度是摄氏度。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。

高字节的五个S为符号位,温度为正值时S=1,温度为负值时S=0。

剩下的11位为温度数据位,对于12位分辨率,所有位全部有效,对于11位分辨率,位0(bit0)无定义,对于10位分辨率,位0和位1无定义,对于9位分辨率,位0,位1,和位2无定义。



对应的温度计算:

当五个符号位S=0时,温度为正值,直接将后面的11位二进制转换为十进制,再乘以0.0625(12位分辨率),就可以得到温度值。

当五个符号位S=1时,温度为负值,先将后面的11位二进制补码变为原码(符号位不变,数值位取反后加1),再计算十进制值。再乘以0.0625(12位分辨率),就可以得到温度值。

举两个例子:

数字输出07D0(00000111 11010000),转换成10进制是2000,对应摄氏度:0.0625x2000=125°C

数字输出为 FC90,首先取反,然后+1,转换成原码为:11111011 01101111,数值位转换成10进制是870,对应摄氏度:-0.0625x870=-55°C

温度对应表如下:



上述例子,用C语言来实现的代码,如下:


unsigned int Temp1,Temp2,Temperature; //Temp1低八位,Temp2高八位

unsigned char Minus Flag=0; //负温度标志位


if(Temp2&0xFC)//判断符号位是否为1

{

Minus Flag=l; //负温度标志位置1

Temperature=((Temp2<<8)|Temp1); //高八位第八位进行整合

Temperature=((Temperature)+1); //讲补码转换为原码,求反,补1

Temperature*=0.0625;//求出十进制

}

else //温度为正值

{

Minus Flag=0; //负温度标志位置0

Temperature =((Temp2<<8) |Temp1)*0.0625;

}


DS18B20工作步骤

DS18B20的工作步骤可以分为三步:

初始化DS18B20

执行ROM指令

执行DS18B20功能指令

其中第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。

初始化DS18B20

任何器件想要使用,首先就是需要初始化,对于DS18B20单总线设备,首先初始化单总线为高电平,然后总线开始也需要检测这条总线上是否存在DS18B20这个器件。如果这条总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平。

初始化具体时序步骤如下:

单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)

这时DS8B20检测到请求之后,会拉低信号,大约60~240us表示应答

DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功

DS18B20拉低电平60~240us之后,会释放总线



DS18B20的初始化代码如下:



/*****初始化DS18B20*****/

unsigned int Init_DS18B20(void)

{

unsigned int x=0;

DQ = 1; //DQ复位

delay(4); //稍做延时

DQ = 0; //单片机将DQ拉低

delay(60); //精确延时,大于480us

DQ = 1; //拉高总线

delay(8);

x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败

delay(4);

return x;

}


写时序

总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。每次只传输1位数据。

单片机想要给DS18B20写入一个0时,需要将单片机引脚拉低,保持低电平时间要在60~120us之间,然后释放总线。

单片机想要给DS18B20写入一个1时,需要将单片机引脚拉低,拉低时间需要大于1us,然后在15us内拉高总线。

在写时序起始后15μs到60μs期间,DS18B20处于采样单总线电平状态。如果在此期间总线为高电平,则向DS18B20写入1;如果总线为低电平,则向DSl8B20写入0。

注意:2次写周期之间至少间隔1us。



DS18B20写时序的代码如下:



/*****写一个字节*****/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01; //与1按位与运算,dat最低位为1时DQ总线为1,dat最低位为0时DQ总线为0

delay(4);

DQ = 1;

dat>>=1;

}

delay(4);

}


采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20。如果是单个DS18B20,直接写跳过ROM指令0xCC即可。DS18B20写入ROM功能指令如下表:



DS18B20的一些RAM功能指令如下表。其中常用的是温度转换指令,开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中。另一个常用的是读取温度指令,读取高速暂存器存储的数据。



读时序

读时隙由主机拉低总线电平至少1μs然后再释放总线,读取DS18B20发送过来的1或者0。

DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。



注意:所有读时隙必须至少需要60us,且在两次独立的时隙之间至少需要1ps的恢复时间。

同时注意:主机只有在发送读暂存器命令(0xBE)或读电源类型命令(0xB4)后,立即生成读时隙指令,DS18B20才能向主机传送数据。也就是先发读取指令,再发送读时隙。

最后一点:写时序注意是先写命令的低字节,比如写入跳过ROM指令0xCC(11001100),写的顺序是“零、零、壹、壹、零、零、壹、壹”。

读时序时是先读低字节,在读高字节,也就是先读取高速暂存器的第0个字节(温度的低8位),在读取高速暂存器的第1个字节(温度的高8位) 我们正常使用DS18B20读取温度读取两个温度字节即可。

STM32例程

DS18B20.c代码:


#include "ds18b20.h"

#include "delay.h"


//复位DS18B20

void DS18B20_Rst(void)

{

DS18B20_IO_OUT(); //SET PG11 OUTPUT

DS18B20_DQ_OUT=0; //拉低DQ

delay_us(750); //拉低750us

DS18B20_DQ_OUT=1; //DQ=1

delay_us(15); //15US

}

//等待DS18B20的回应

//返回1:未检测到DS18B20的存在

//返回0:存在

u8 DS18B20_Check(void)

{

u8 retry=0;

DS18B20_IO_IN(); //SET PG11 INPUT

while (DS18B20_DQ_IN&&retry<200)

{

retry++;

delay_us(1);

};

if(retry>=200)return 1;

else retry=0;

while (!DS18B20_DQ_IN&&retry<240)

{

retry++;

delay_us(1);

};

if(retry>=240)return 1;

return 0;

}

//从DS18B20读取一个位

//返回值:1/0

u8 DS18B20_Read_Bit(void)

{

u8 data;

DS18B20_IO_OUT(); //SET PG11 OUTPUT

DS18B20_DQ_OUT=0;

delay_us(2);

DS18B20_DQ_OUT=1;

DS18B20_IO_IN(); //SET PG11 INPUT

delay_us(12);

if(DS18B20_DQ_IN)data=1;

else data=0;

delay_us(50);

return data;

}

//从DS18B20读取一个字节

//返回值:读到的数据

u8 DS18B20_Read_Byte(void)

{

u8 i,j,dat;

dat=0;

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

{

j=DS18B20_Read_Bit();

dat=(j<<7)|(dat>>1);

}

return dat;

}

//写一个字节到DS18B20

//dat:要写入的字节

void DS18B20_Write_Byte(u8 dat)

{

u8 j;

u8 testb;

DS18B20_IO_OUT(); //SET PG11 OUTPUT;

for (j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if (testb)

{

DS18B20_DQ_OUT=0; // Write 1

delay_us(2);

DS18B20_DQ_OUT=1;

delay_us(60);

}

else

{

DS18B20_DQ_OUT=0; // Write 0

delay_us(60);

DS18B20_DQ_OUT=1;

delay_us(2);

}

}

}

//开始温度转换

void DS18B20_Start(void)

{

DS18B20_Rst();

DS18B20_Check();

DS18B20_Write_Byte(0xcc); // skip rom

DS18B20_Write_Byte(0x44); // convert

}



//初始化DS18B20的IO口 DQ 同时检测DS的存在

//返回1:不存在

//返回0:存在

u8 DS18B20_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PORTG口时钟


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PORTG.11 推挽输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOG, &GPIO_InitStructure);



GPIO_SetBits(GPIOG,GPIO_Pin_11); //输出1



DS18B20_Rst();



return DS18B20_Check();

}

//从ds18b20得到温度值

//精度:0.1C

//返回值:温度值 (-550~1250)

short DS18B20_Get_Temp(void)

{

u8 temp;

u8 TL,TH;

short tem;

DS18B20_Start (); // ds1820 start convert

DS18B20_Rst();

DS18B20_Check();

DS18B20_Write_Byte(0xcc); // skip rom

DS18B20_Write_Byte(0xbe); // convert

TL=DS18B20_Read_Byte(); // LSB

TH=DS18B20_Read_Byte(); // MSB


if(TH>7)

{

TH=~TH;

TL=~TL;

temp=0; //温度为负

}else temp=1; //温度为正

tem=TH; //获得高八位

tem<<=8;

tem+=TL; //获得底八位

tem=(float)tem*0.625; //转换

if(temp)return tem; //返回温度值

else return -tem;

}


DS18B20.h代码:



#ifndef __DS18B20_H

#define __DS18B20_H

#include "sys.h"



//IO方向设置

#define DS18B20_IO_IN() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}

#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}

//IO操作函数

#define DS18B20_DQ_OUT PGout(11) //数据端口 PA0

#define DS18B20_DQ_IN PGin(11) //数据端口 PA0


u8 DS18B20_Init(void);//初始化DS18B20

short DS18B20_Get_Temp(void);//获取温度

void DS18B20_Start(void);//开始温度转换

void DS18B20_Write_Byte(u8 dat);//写入一个字节

u8 DS18B20_Read_Byte(void);//读出一个字节

u8 DS18B20_Read_Bit(void);//读出一个位

u8 DS18B20_Check(void);//检测是否存在DS18B20

void DS18B20_Rst(void);//复位DS18B20

#endif


推荐阅读

史海拾趣

Gravitech公司的发展小趣事

对于电子猜数玩具电路的网友可能提出的问题,我整理了一些常见问题及其回答:

一、电路设计相关问题

  1. 问题:电子猜数玩具电路的基本组成部分有哪些?
    回答:电子猜数玩具电路通常由触摸控制器、多谐振荡器、LED驱动电路和受控声、光电路等部分组成。具体来说,包括时基集成电路(如NE555)、非门集成电路(如CD4069)、计数分配器集成电路(如CD4017)、音乐集成电路、继电器、二极管、发光二极管、电阻器、电容器等元器件。

  2. 问题:如何设计电路以确保游戏能够正确运行?
    回答:设计电路时,需要确保各个部分能够协调工作。例如,触摸控制器负责检测玩家的输入,多谐振荡器产生计数脉冲,LED驱动电路控制LED的显示,受控声、光电路则在玩家猜中数字时发出声音和光信号。设计时还需要注意电路的稳定性和可靠性,避免信号干扰和元件损坏。

  3. 问题:电路中的LED如何布局以实现数字显示?
    回答:LED的布局通常根据要显示的数字范围进行设计。例如,如果要显示0-9的数字,可以使用7段LED数码管或分散的LED灯。7段LED数码管内部含有8个LED小灯(7个用于显示数字段,1个用于小数点或原点),通过控制这些LED的亮灭来显示不同的数字。如果是分散的LED灯,则需要根据数字的形状来布置LED,并通过编程控制它们的亮灭。

二、元件选择与参数设置问题

  1. 问题:如何选择适合的集成电路和元器件?
    回答:选择集成电路和元器件时,需要考虑电路的需求、元器件的性能参数以及成本等因素。例如,时基集成电路可以选择NE555,因为它具有成本低、易于获取和使用的优点;非门集成电路可以选择CD4069,因为它提供了多个非门输出,方便电路设计;发光二极管则需要选择高亮度的型号以确保显示效果良好。

  2. 问题:电阻器和电容器的参数如何设置?
    回答:电阻器和电容器的参数设置需要根据电路的具体需求来确定。电阻器的阻值会影响电流的大小和LED的亮度,因此需要根据LED的电流需求和驱动电压来选择合适的阻值。电容器的容量则会影响多谐振荡器的振荡频率和电路的响应时间,需要根据实际需要进行调整。

三、调试与故障排除问题

  1. 问题:如何调试电子猜数玩具电路?
    回答:调试电路时,可以按照以下步骤进行:首先检查电路连接是否正确,包括电源连接、信号连接和地线连接等;然后使用万用表等工具测试电路中的电压和电流是否正常;最后观察LED的显示和声音输出是否符合预期。如果出现问题,可以逐步排查各个部分,找出故障点并进行修复。

  2. 问题:电路中出现LED不亮或声音不响的故障怎么办?
    回答:如果LED不亮或声音不响,首先需要检查电源是否正常供电;然后检查相关元器件是否损坏或接触不良;最后检查控制信号是否正确传输。如果以上都正常,可能是程序设计或电路布局存在问题,需要进一步检查和调整。

四、拓展与改进问题

  1. 问题:如何增加电子猜数玩具的趣味性和挑战性?
    回答:可以通过增加游戏难度、丰富游戏模式或添加互动元素等方式来增加电子猜数玩具的趣味性和挑战性。例如,可以设置不同的难度等级、增加倒计时功能、设置奖励机制或添加与手机等设备的互动功能等。

  2. 问题:如何对电子猜数玩具电路进行改进以降低成本或提高性能?
    回答:降低成本可以通过选择性价比更高的元器件、优化电路设计、减少不必要的元器件数量等方式实现;提高性能则可以通过升级元器件、改进电路设计、优化算法等方式实现。具体改进方案需要根据实际情况和需求进行制定。

磁联达(CND-tek)公司的发展小趣事

磁联达(CND-tek)公司成立于2002年,正值中国电子行业的蓬勃发展期。创始人王雪霞凭借对市场敏锐的洞察力和对技术的深厚理解,决定专注于网络通讯类变压器和滤波器的研发与生产。初创时期,公司面临着资金短缺、技术积累不足和市场竞争激烈等多重挑战。然而,王雪霞带领团队坚持不懈地研发新产品,不断优化生产工艺,逐渐在市场上赢得了客户的认可。

ABB Group公司的发展小趣事

为了进一步扩大市场份额,磁联达(CND-tek)公司决定拓展海外市场。公司组建了一支专业的国际销售团队,积极参加国际电子展会和交流活动,与全球各地的客户建立了紧密的合作关系。同时,公司还加大了对海外市场的投入,设立了多个海外办事处和仓库,为客户提供更加便捷的服务。这些举措使得磁联达(CND-tek)的产品迅速走向全球,赢得了广泛的赞誉。

台湾晶豪(ESMT)公司的发展小趣事

晶豪科技一直将研发作为公司的核心竞争力。公司成功建立了各种容量及接口规格的特定型DRAM产品线,包括SDRAM、DDR I/II/III及PSRAM、低耗电的Mobile DRAM等。这些产品广泛应用于各种电子设备和系统,赢得了市场的广泛认可。此外,公司还针对系统级封装(SiP)的需求,成功开发了所需的“良品晶粒”(Known-Good-Die, KGD)产品及多芯片模块封装(MCP)的解决方案,满足了客户的多样化需求。

ANYSOLAR LTD.公司的发展小趣事

近年来,随着全球能源结构的调整和光伏产业的快速发展,市场竞争日益激烈。ANYSOLAR也面临着来自同行的竞争压力和成本上升的挑战。为了应对这些变革和危机,ANYSOLAR积极调整战略,优化生产流程,降低成本。

同时,公司还加大了对新兴市场的开拓力度,通过参加国际展会、建立海外销售渠道等方式,拓展新的业务增长点。这些措施有效缓解了公司的经营压力,为公司的持续发展注入了新的活力。

艾华集团(AISHI)公司的发展小趣事

2020年,受全球疫情影响,许多中小电容器厂家面临供应链中断、生产受阻等困境。然而,艾华集团凭借其在行业内的深厚积累和强大的研发实力,迅速调整生产策略,优化供应链管理,成功应对了疫情带来的挑战。同时,公司还加大了对新兴市场的开拓力度,进一步巩固了在全球市场的地位。

问答坊 | AI 解惑

开关电源驱动保护电路,请大家看看

开关电源驱动保护电路,请大家看看…

查看全部问答>

TG值的影响因素

各位大虾:     FR-4系列板材的TG值的主要影响因素有哪些?…

查看全部问答>

Microchip最新中文资料下载

PIC24系列参考手册部分章节中文翻译 Section 7. Reset http://ww1.microchip.com/downloads/en/DeviceDoc/39712a_cn.pdf Section 8. Interrupts http://ww1.microchip.com/downloads/en/DeviceDoc/39707a_cn.pdf Section 12. I/O Ports http: ...…

查看全部问答>

关于发帖的呼吁

各位坛友:        我们欢迎大家发原创帖,但不反对分享别人的好帖!每个看问题的角度不一样,对同一问题理解不一样。一个贴别人看来没味道,但或对其他XDJM有帮组。…

查看全部问答>

nRF24L01无线模块PCB图及调试程序

nRF24L01无线模块的PCB图及相关资料,mega16源程序已调试通过…

查看全部问答>

AN 559: High Definition (HD) Video Reference Design (V1)

Introduction The Altera® V-Series of reference designs deliver high-quality up, down, and cross conversion of standard definition (SD), high definition (HD) and 3 gigabits per second (Gbps) video streams in interlaced or pro ...…

查看全部问答>

nk.bin大小

    wince6 R2,MIPS cpu,我用原厂提供的bsp,原厂定制好的平台,编译产生的nk.bin有52M.请问一般产生的nk.bin有多大啊,是否与平台定制有关?…

查看全部问答>

EVC 运行时卡住

我装了EVC  可是在新建一个项目 或者在打开一个工程的时候 它就卡在  loading class  information 那里了 在下没有积分  还请各位好心的大大能帮我解答一下    谢谢~~~~~…

查看全部问答>