DS18B20传感器
DS18B20是一个使用单总线协议的温度传感器,供电电压是3~5V之间,我们使用的是STM32,所以使用3.3V进行供电。
DS18B20 是一款数字式温度传感器,输出为数字信号,无需外接 A/D 转换器。
每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值。
原理图
数字信号输入输出端(DQ)需要一个上拉电阻:

为什么使用上拉电阻?
上拉电阻 在单总线通信中起着关键作用,它确保总线在空闲时保持高电平,并允许多个设备共享同一条总线。
高速缓存器

DS18B20高速暂存器由9个字节组成:
字节0~1 是温度存储器,用来存储转换好的温度。第0个字节存储温度低8位,第一个字节存储温度高8位
字节2~3 是用户用来设置最高报警和最低报警值(TH和TL)。
字节4 是配置寄存器,用来配置转换精度,可以设置为9~12 位。
字节5~7 保留位。芯片内部使用
字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。
DS18B20采用16位补码的形式来存储温度数据,温度是摄氏度。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
DS18B20采用16位补码的形式来存储温度数据,温度是摄氏度。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
高字节的五个S为符号位,温度为正值时S=1,温度为负值时S=0。
剩下的11位为温度数据位,对于12位分辨率,所有位全部有效,对于11位分辨率,位0(bit0)无定义,对于10位分辨率,位0和位1无定义,对于9位分辨率,位0,位1,和位2无定义。

配置寄存器
在配置寄存器中,我们可以通过R0和R1设置DS18B20的转换分辨率,DS18B20在上电后默认R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留给设备内部使用。

工作代码部分
DS18B20的工作步骤可以分为三步:
1.初始化DS18B20
2.执行ROM指令
3.执行DS18B20功能指令
其中第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。
初始化
首先初始化单总线为高电平,然后总线开始也需要检测这条总线上是否存在DS18B20这个器件。如果这条总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平。即主机发送复位脉冲,从机响应存在脉冲。
GPIO引脚配置成开漏输出,开漏输出的特点便是只有低电平和高阻态两种状态,置0是低电平,置1是高阻态而不是高电平。
void DS18B20_Init()
{
//开启GPIOG时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOGEN,ENABLE);
//配置PG9为开漏输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
- 主机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)。
- 这时DS8B20检测到请求之后,会拉低信号,大约60~240us表示应答。
- DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功。
- DS18B20拉低电平60~240us之后,会释放总线(拉高电平)。
