【1】DS18B20介绍
DS18B20是一种数字温度传感器,由Maxim Integrated公司生产。它采用单总线接口,能够在广泛的温度范围内测量温度,并通过数字方式输出温度值,具有较高的精度和稳定性。
以下是DS18B20温度传感器的主要特点和操作时序:
(1)特点:
- 单总线接口:DS18B20使用单一的数据线进行通信,简化了连接和控制。
- 高精度测量:具有12位的温度分辨率,可测量范围为-55°C至+125°C。
- 数字输出:温度值以二进制形式传输,便于处理和解析。
- 内部存储:传感器可内部存储温度数据和配置信息。
- 低功耗:在非活动状态下,传感器可以进入睡眠模式以降低功耗消耗。
(2)操作时序: DS18B20的操作时序包括复位、写入指令、读取温度等过程。下面是DS18B20的基本操作时序:
a. 复位:
- 主机拉低数据线,持续至少480μs作为复位信号。
- 主机释放数据线,等待15μs以上。
b. 发送指令:
- 主机发出写入指令(如跳过ROM指令或匹配ROM指令)。
- 指令由主机通过数据线逐位发送,每位的有效时间为60μs。
c. 读取温度:
- 主机发出读取温度指令。
- 传感器将温度数据以序列的形式发送给主机,每位的有效时间为60μs。
- 主机在接收到所有数据后,需提供适当的延迟时间进行解析和处理。
【2】硬件连线说明
STM32F407开发板DS18B20应用案例
开发板硬件连接:
【3】源代码
在工程中添加ds18b20.c和ds18b20.h文件。
DS18B20代码如下:
#include "ds18b20.h"
/*
函数功能:DS18b20IO口初始化
硬件连接:PG9
复用表示自动输出数据
通用表示手动输出数据
*/
void DS18B20_Init(void)
{
/*1. 开时钟*/
RCC- >AHB1ENR|=1< < 6;//使能PORTG时钟
/*2. 初始化IO模式*/
DS18B20_OUTPUT();
}
/*
函数功能:等待DS18B20的回应
返回1:未检测到DS18B20的存在
返回0:存在
*/
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_INPUT() //设置DS18B20输入模式
while(DS18B20_IN&&retry< 200)
{
retry++;
DelayUs(1);
};
if(retry >=200)return 1;
else retry=0;
while(!DS18B20_IN&&retry< 240)
{
retry++;
DelayUs(1);
};
if(retry >=240)return 1;
return 0;
}
/*
从DS18B20读取一个字节
返回值:读到的数据
*/
u8 DS18B20_ReadByte(void)
{
u8 i,data=0;
for(i=0;i< 8;i++)
{
DS18B20_OUTPUT(); //初始化为输出模式
DS18B20_OUT=0; //输出0
DelayUs(2);
DS18B20_OUT=1; //上拉总线电平
DS18B20_INPUT() //初始化为输入模式
DelayUs(12);
data >>=1;
if(DS18B20_IN)
{
data|=0x80;
}
DelayUs(50);
}
return data;
}
/*
写一个字节到DS18B20
dat:要写入的字节
*/
void DS18B20_WriteByte(u8 dat)
{
u8 i;
DS18B20_OUTPUT(); //初始化IO为输出模式
for(i=0;i< 8;i++)
{
if(dat&0x01) //先发低位
{
DS18B20_OUT=0;//输出0
DelayUs(2);
DS18B20_OUT=1;//输出1
DelayUs(60);
}
else
{
DS18B20_OUT=0;//输出0
DelayUs(60);
DS18B20_OUT=1;//输出1
DelayUs(2);
}
dat >>=1;
}
}
/*
从ds18b20得到温度值
精度:0.1C
返回值:温度值 (-550~1250)
*/
short DS18B20_Get_Temp(void)
{
u16 temp;
u8 TL,TH;
DS18B20_OUTPUT();
DS18B20_OUT=0;//输出0 //拉低DQ
DelayUs(750); //拉低750us
DS18B20_OUT=1; //输出1 //DQ=1
DelayUs(15); //15US
DS18B20_Check();
DS18B20_WriteByte(0xcc); //跳过芯片ID检测
DS18B20_WriteByte(0x44