STM32控制DS18B20温度传感器获取温度

时间记录:2024/1/28

一、DS18B20温度传感器介绍

(1)测温范围-55℃~+125℃,在-10℃到+85℃范围内误差为±0.4

(2)返回的温度数据为16位二进制数据

(3)STM32和DS18B20通信使用单总线协议,仅通过一个端口即可进行通信

(4)具有掉电保护功能, DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值

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

(6)宽电压供电,电压2.5V~5.5V

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

二、器件引脚图

三、DS18B20内部构成介绍

(1)64位ROM

1.存储独有的序列号,出厂前被光刻好的,每个DS18B20序列号均不相同,可以实现一根总线上挂接多个DS18B20的目的。

(2)高速暂存器

1.温度传感器,字节0保存温度低八位,字节1保存温度高八位;

2.温度上限和下限报警触发器,字节2高温触发器数据,字节3低温触发器数据;

3.配置寄存器,允许设置温度分辨率,9、10、11、12位,对应分辨率为0.5、0.25、0.125、0.0625℃。

(3)存储器

1.由一个高速RAM和一个可擦除的EEPROM组成,EEPROM存储着温度上下限和配置寄存器的数据。

四、时序介绍

(1)复位初始化,单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高总线),等待15-60us后DS18B20会拉低总线,在60-240us内保持低电平表示DS18B20应答,DS18B20拉低总线60-240us后会释放总线为高电平,复位脉冲产生释放总线开始到接收完应答信号时间至少480us。

复位初始化代码

c 复制代码
static u8 xDS18B20Reset(void)
{
    u8 ack=1;
    DQOutMode();
    DQ_OUT=0;//拉低总线
    Delay_Us(500);//拉低总线时间大于480us小于960us
    DQ_OUT=1;//拉高总线
    Delay_Us(20);
    Delay_Us(40);//拉高总线时间15~60us
    DQInMode();
    Delay_Us(40);//等待40us后接收数据,60-240us存在数据
    if(DQ_IN)
        ack=1;
    else
        ack=0;
    Delay_Us(140);//接收时间达到240us,等待DS18B20释放总线
    Delay_Us(300);//接收存在信号至少480us
    return ack;
}

(2)写时序,单片机拉低总线至少1us,然后在15us内改变总线电平,然后DS18B20在15-60us的时间内采样,总线为"1"则向DS18B20写入"1",总线为"0"则向DS18B20写入"0",发送数据"0"时,拉低总线时间需要大于60us小于120us,然后释放总线(拉高总线)至少1us等待下一个数据的发送。

写1字节数据代码,低位先发

c 复制代码
static void vDS18B20WriteOneByte(u8 cmd)
{
    DQOutMode();
    for(u8 i=0;i<8;i++){
        DQ_OUT=0;
        Delay_Us(5);//拉低总线至少1us,15us之内改变电平决定发送1/0
        if(cmd&0x01)//最低位为1,发送"1"
            DQ_OUT=1;
        else
            DQ_OUT=0;
        Delay_Us(10);//到达开始采集电平时间
        Delay_Us(45);//保持电平稳定,等待DS18B20采集结束
        DQ_OUT=1;//释放总线
        Delay_Us(3);//两个写时隙之间时间至少有1us
        cmd>>=1;
    }
}

(3)读时序,单片机拉低总线至少1us,然后释放总线,在15us之内读取DS18B20发送过来的数据,然后再保持45us,使读时序达到最小时间60us,然后拉高总线至少1us(恢复时间)准备读下一位数据。

读一字节数据代码,低位先读

c 复制代码
static u8 xDS18B20ReadOneByte(void)
{
    u8 data=0;
    for(int i=0;i<8;i++){
        data>>=1;
        DQOutMode();
        DQ_OUT=0;
        Delay_Us(2);//拉低总线,至少1us
        DQ_OUT=1;//释放总线
        Delay_Us(5);//延时5us在时间中心读取数据
        DQInMode();
        if(DQ_IN){
            data|=0x80;
        }
        Delay_Us(60);//读时隙至少60us
        DQOutMode();
        DQ_OUT=1;
        Delay_Us(2);//拉高至少1us准备读取下一位数据
    }
    
    return data;
}

五、DS18B20命令介绍

(1)0xCC:跳过ROM

(2)0x44:温度转换指令

(3)0xBE:读暂存器指令

(4)0x33:读ROM

(5)0x55:匹配ROM,发送此命令后,发送64位的ROM编码进行匹配

(6)0xF0:搜索ROM

(7)0xEC:警报搜索

六、读取温度函数和其他代码

(1)读取温度函数

c 复制代码
float xDS18B20ReadTemp(void)
{
    u8 TL,TH;
    float temp;

    xDS18B20Reset();//复位初始化DS18B20
    vDS18B20WriteOneByte(0xCC);//跳过ROM指令
    vDS18B20WriteOneByte(0x44);//温度转换指令
    Delay_Ms(100);//等待温度数据转换完毕
    xDS18B20Reset();//复位初始化DS18B20
    vDS18B20WriteOneByte(0xCC);//跳过ROM指令
    vDS18B20WriteOneByte(0xBE);//读取数据指令
    
    TL=xDS18B20ReadOneByte();
    TH=xDS18B20ReadOneByte();
    
    //转换温度数据
    temp=((TH << 8)|TL)*0.0625;
    return temp;
}

(2)其他代码

初始化

c 复制代码
void vDS18B20Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    
    Delay_Init();
}

头文件

c 复制代码
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"

#define DQ_IN PAin(0)
#define DQ_OUT PAout(0)

#define DQOutMode() {GPIOA->CRL&=0xFFFFFFF0;GPIOA->CRL|=3<<0;}
#define DQInMode() {GPIOA->CRL&=0xFFFFFFF0;GPIOA->CRL|=8<<0;}

//初始化DS18B20
void vDS18B20Init(void);
//读取温度数据
float xDS18B20ReadTemp(void);

#endif
相关推荐
智者知已应修善业1 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
智商偏低7 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen9 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森11 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白11 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D11 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术14 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt15 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘15 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang15 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c