DS18B20是由DALLAS半导体公司推出的一种的“一线总线”接口的温度传感器, 与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。
1.测量温度范围:-55~+125℃
2.精度:±0.5℃
3.数据传输:“一线总线”的数字方式传输
图1 硬件连接图
DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1
1.复位操作:
引脚拉低——延时480-960us——引脚高——延时15-60us
图2 红框为复位操作时序
void DS18B20_Rst(void)
{
DS18B20_IO_OUT();
DS18B20_DQ_OUT=0;
delay_us(750);
DS18B20_DQ_OUT=1;
delay_us(15);
}
2.应答操作
将引脚设置为输入模式——判断引脚低电平时间是否大于60us、小于240us——返回应答结果
图3 红框为应答操作时序
u8 DS18B20_Check(void)
{
u8retry=0;
DS18B20_IO_IN(); //SET PG11 INPUT
while (DS18B20_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
};
if(retry>=200)return1;
elseretry=0;
while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
delay_us(1);
}
if(retry>=240)return1;
return0;
}
3. 读0、读1操作
将引脚设置为输出模式——引脚拉低——延时2us——引脚拉高——设置为输入模式——延时2us——读取引脚状态——返回读取结果
图4 读操作
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;
}
4.写1操作
设置引脚为输出模式——引脚拉低——延时2us——引脚拉高——延时大于60us
图5 红框为写操作
void DS18B20_Write_Zero(void)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
5.写0操作
设置引脚为输出模式——引脚拉低——延时60-120us——引脚拉高——延时2us
图6 红框为写1操作
void DS18B20_Write_One(void)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
DS18B20_DQ_OUT=0;
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
基本的操作完成后,再写4个功能函数
6.读取一个字节
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;
}
7.写一个字节
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_Write_One();
else
DS18B20_Write_Zero();
}
}
8.开始读取数据
void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc); // skiprom
DS18B20_Write_Byte(0x44); //convert
}
9.初始化DS18B20
u8 DS18B20_Init(void)
{
GPIO_Init(); //此引脚需根据相应的单片机进行配置
DS18B20_Rst();
return DS18B20_Check();
}
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); //开始转换
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=(double)tem*0.625;//转换
if(temp)
return tem; //返回温度值
else
return -tem;
}
参考文献:
STM32F103开发指南-标准库版本_V1.1
DS18B20数据手册
如果您喜欢,可关注个人公众号“电子应用学习馆”,获取更多的资料例程。