当前位置:首页阅读

数字温度传感器(DS18B20)详解

数字温度传感器(DS18B20)详解

温度传感器

数字温度传感器(DS18B20)详解

返回16位二进制温度数值

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

电源可以使用数据线本身提供而不需要外部电源,但在实际应用过程中,确保DS18B20能够获得充足的驱动电流,成为能够返回二进制温度数值的关键。接线模式下文介绍。

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

DS18B20的测温范围也极其宽泛,测温范围为-55到+125,每秒增量为0.5

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

数字温度传感器(DS18B20)详解_WWW.XUNWANGBA.COM

返回温度值正负与绝对值区分布返回二进制温度值分布

数字温度传感器(DS18B20)详解_WWW.XUNWANGBA.COM

封装形式

数字温度传感器(DS18B20)详解_WWW.XUNWANGBA.COM

引脚功能描述二、DS18B20的工作过程即时序

DS18B20所有的操作都是从器件初始化开始

ROM操作指令:

Read ROM(读 ROM) [33H]

Match ROM(匹配 ROM) [55H]

Skip ROM(跳过 ROM] [CCH]

Search ROM(搜索 ROM) [F0H]

Alarm search(告警搜索) [ECH]

数字温度传感器(DS18B20)详解_WWW.XUNWANGBA.COM

读时序

数字温度传感器(DS18B20)详解_WWW.XUNWANGBA.COM

写时序

存储器操作指令:

Write Scratchpad(写暂存存储器) [4EH]

Read Scratchpad(读暂存存储器) [BEH]

Copy Scratchpad(复制暂存存储器) [48H]

Convert Temperature(温度变换) [44H]

Recall EPROM(重新调出) [B8H]

Read Power supply(读电源) [B4H]

三、常见接线方式

单只DS18B20接线示意图

数字温度传感器(DS18B20)详解_WWW.XUNWANGBA.COM

vpU提供单片机输出电压 3.3v

多只DS18B20接线示意图

数字温度传感器(DS18B20)详解_WWW.XUNWANGBA.COM

VPU提供单片机输出电压3.3V

寄生电源模式接线示意图

数字温度传感器(DS18B20)详解_WWW.XUNWANGBA.COM

不需要额外供电只需要数据线提供驱动电流四、详细程序

//复位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_INretry200)

{

retry++;

delay_us(1);

};

if(retry=200)return 1;

else retry=0;

while (!DS18B20_DQ_INretry240)

{

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=(j7)|(dat1);

}

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=dat0x01;

dat=dat1;

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_InitTypeDefGPIO_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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_1);//输出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(TH7)

{

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得到序列号

void DS18B20_Get_Code(u8 *code)

{

DS18B20_Start ();// ds1820 start convert

DS18B20_Rst();

delay_ms(1);

DS18B20_Write_Byte(0x33);// convert

for(int i=0;i8;i++)

{

*(code+i)=DS18B20_Read_Byte();

}

}

//获得温度,匹配序列号

u16Get_Temp_U16_Match_Code(u8 *code)

{

u16 temp;

u8 TL,TH;

DS18B20_Start();// ds1820 start convert

DS18B20_Rst();

delay_ms(2);

DS18B20_Write_Byte(0x55);// 匹配序列号命令

for(int i=0;i8;i++)

{

DS18B20_Write_Byte(code[i]);

}

DS18B20_Write_Byte(0xbe);// convert

TL=DS18B20_Read_Byte(); // LSB

TH=DS18B20_Read_Byte(); // MSB

temp= (u16)TH8;

temp |= TL;

return temp;

}

//获得温度,匹配序列号

shortGet_Temp_Match_Code(u8 *code)

{

u16 temp;

u8 TL,TH;

short tem;

DS18B20_Rst();

DS18B20_Start ();// ds1820 start convert

DS18B20_Rst();

delay_ms(1);

DS18B20_Write_Byte(0x55);// 匹配序列号命令

for(int i=0;i8;i++)

{

DS18B20_Write_Byte(code[i]);

}

DS18B20_Write_Byte(0xbe);// convert

TL=DS18B20_Read_Byte(); // LSB

TH=DS18B20_Read_Byte(); // MSB

if(TH7)

{

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的使用过程中,所遇到的诸多问题如下

多个DS18B20挂载在一条总线,再通过ROM搜索时会存在单个或者多个DS18B20初始化不成功,需要不断更换DS18B20直至,能够通过ROM搜索完成所有DS18B20温度数值的读取,这种挂载同根总线上的DS18B20无法顺利使用任意多个DS18B20实现,实在让人困扰

以上就是(数字温度传感器(DS18B20)详解)全部内容,收藏起来下次访问不迷路!