数字温度传感器 DSB 详解
数字温度传感器(DS18B20)参数信息介绍
返回16位二进制温度数值
主机和从机通信使用单总线one-wire,即使用单线进行数据的发送和接收
电源可以使用数据线本身提供而不需要外部电源,但在实际应用过程中,确保DS18B20能够获得充足的驱动电流,成为能够返回二进制温度数值的关键。接线模式下文介绍。
DS18B20的测温范围也极其宽泛,测温范围为-55到+125,每秒增量为0.5
DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625即可获得此时的温度值。
返回温度值正负与绝对值区分布返回二进制温度值分布
封装形式
引脚功能描述DS18B20的工作过程即时序
DS18B20所有的操作都是从器件初始化开始
ROM操作指令:
Read ROM(读 ROM) [33H]
Match ROM(匹配 ROM) [55H]
Skip ROM(跳过 ROM] [CCH]
读时序
写时序
存储器操作指令:
Write Scratchpad(写暂存存储器) [4EH]
Read Scratchpad(读暂存存储器) [BEH]
Copy Scratchpad(复制暂存存储器) [48H]
Convert Temperature(温度变换) [44H]
Recall EPROM(重新调出) [B8H]
Read Power supply(读电源) [B4H]
常见接线方式
单只DS18B20接线示意图
vpU提供单片机输出电压 3.3v
多只DS18B20接线示意图
VPU提供单片机输出电压3.3V
寄生电源模式接线示意图
不需要额外供电只需要数据线提供驱动电流详细程序
//复位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的使用过程中,所遇到的诸多问题如下
|数字温度传感器、DSB、详解
ds18b20 数字温度传感器 详解