首页 > 其他分享 >【STM32 标准库】DS18B20温度

【STM32 标准库】DS18B20温度

时间:2024-05-30 20:33:58浏览次数:14  
标签:u8 DS18B20 void .# STM32 InitStructure GPIO 温度

目录

1. DS18B20

1.1 DS18B20简介

1.1.1 特点

1.1.2 内部结构

1.1.3 温度读取

2. 软件配置

3. 硬件设计

4. 软件设计

4.1 功能描述

4.2 软件实现

4.2.1 DS18B20.c

4.2.2 DS18B20.h

4.2.3 main.c

1. DS18B20

1.1 DS18B20简介

1.1.1 特点

        一线总线(单总线)接口传感器(ADC)

  1. 工作电压:3.0-5.5V
  2. 单线接口方式:D0
  3. 多点主网功能(多个DS18B20可以同时连在单总线上面)
  4. 使用不需要任何外围电路
  5. 工作温度:-55-+125℃(其中,当温度在-10~+85℃时,精度为+-0.5℃)
  6. 分辨率可以进行设置:9、10、11、12位等(9位:精度+-0.5℃,读取温度最小间隔93.75ms;10位:0.25;11位:0.125;12位:0.0625,默认12位,读取温度最小间隔750ms)

1.1.2 内部结构

R1、R0设置精度大小:

当温度为正时,高5位S都为0,实际温度=后11位值*分辨率(如12位:0.0625)

当温度为负时,高5位S都为1,实际温度=(后11位值取反+1)*分辨率(如12位:0.0625)

1.1.3 温度读取

1)初始化时序

2)写时序

3)读时序

        DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令(0XCC)→发开始转换命令(0X44)→延时→复位→发送 SKIP ROM 命令(0XCC)→发读存储器命令 (0XBE)→连续读出两个字节数据(即温度)→结束。

2. 软件配置

3. 硬件设计

4. 软件设计

4.1 功能描述

        系统开启时首先检测 DS18B20 温度传感器是否存 在,若存在输出相应的提示信息,然后间隔 500ms 读取一次 DS18B20 的温度,并 通过串口打印输出,最后让 DS0 指示灯不断闪烁,提示系统正常运行。

​​​​​​​4.2 软件实现

  1. 初始化 DS18B20
  2. 编写读取温度函数
  3. 编写主函数

4.2.1 DS18B20.c

1.#include "DS18B20.h"
2.
3.void DS18B20_Set_IN(void)
4.{
5.     // 使能对应GPIO时钟
6.    RCC_APB2PeriphClockCmd(DS18B20_RCC, ENABLE);
7.    // 初始化GPIO
8.    GPIO_InitTypeDef GPIO_InitStructure;
9.    
10.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
11.    GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
12.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13.    GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
14.}
15.
16.
17.void DS18B20_Set_OUT(void)
18.{
19.
20.    // 初始化GPIO
21.    GPIO_InitTypeDef GPIO_InitStructure;
22.    
23.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
24.    GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
25.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
26.    GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
27.}
28.
29.
30.void DS18B20_Reset(void)
31.{
32.    DS18B20_Set_OUT();
33.    DS18B20_OUT=0;
34.    delay_us(750);
35.    DS18B20_OUT=1;
36.    delay_us(15);
37.}
38.
39.u8 DS18B20_Check(void)
40.{
41.    u8 retry=0;
42.    DS18B20_Set_IN();
43.    while(DS18B20_IN&&(retry<200))
44.    {
45.        retry++;
46.        delay_us(1);
47.    }
48.    if(retry>=200)
49.        return 1;
50.    else retry=0;
51.    while((!DS18B20_IN)&&(retry<240))
52.    {
53.        retry++;
54.        delay_us(1);
55.    }
56.    if(retry>=240)
57.        return 1;
58.    return 0;  
59.}
60.
61.u8 DS18B20_Iint(void)
62.{
63.    // 使能对应GPIO时钟
64.    RCC_APB2PeriphClockCmd(DS18B20_RCC, ENABLE);
65.    // 初始化GPIO
66.    GPIO_InitTypeDef GPIO_InitStructure;
67.    
68.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
69.    GPIO_InitStructure.GPIO_Pin = DS18B20_Pin;
70.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
71.    GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
72. 
73.    DS18B20_Reset();
74.    
75.    return DS18B20_Check();
76.}
77.
78.void DS18B20_WriteByte(u8 data)
79.{
80.    u8 i=0;
81.    u8 testb=0;
82.    
83.    DS18B20_Set_OUT();
84.    
85.    for(i=0;i<8;i++)
86.    {
87.        testb=data&0x01;
88.        data=data>>1;
89.        if(testb==1)
90.        {
91.            DS18B20_OUT=0;
92.            delay_us(2);
93.            DS18B20_OUT=1;
94.            delay_us(60);
95.        }
96.        else
97.        {
98.            DS18B20_OUT=0;
99.            delay_us(60);
100.            DS18B20_OUT=1;
101.            delay_us(2);
102.        }
103.    }
104.}
105.
106.u8 DS18B20_ReadBit(void)
107.{
108.    u8 data_bit=0;
109.    DS18B20_Set_OUT();
110.    DS18B20_OUT=0;
111.    delay_us(2);
112.    DS18B20_OUT=1;
113.    
114.    DS18B20_Set_IN();
115.    delay_us(12);
116.    if(DS18B20_IN)
117.    {
118.        data_bit=1;
119.    }
120.    else data_bit=0;
121.    delay_us(50);
122.    
123.    return data_bit;
124.}
125.
126.u8 DS18B20_ReaDByte(void)
127.{
128.    u8 i=0;
129.    u8 data_bit=0;
130.    u8 data_byte=0;
131.    
132.    
133.    for(i=0;i<8;i++)
134.    {
135.        data_bit=DS18B20_ReadBit();
136.        data_byte=(data_bit<<7)|(data_byte>>1);
137.    }
138.    return data_byte;
139.}
140.
141.float DS18B20_GetTemperture(void)
142.{
143.    u8 Low_Byte=0;
144.    u8 High_Byte=0;
145.    u8 value=0;
146.    float temperture_value=0;
147.    
148.    DS18B20_Reset();
149.    DS18B20_Check();
150.    DS18B20_WriteByte(0XCC);
151.    DS18B20_WriteByte(0X44);
152.    DS18B20_Reset();
153.    DS18B20_Check();
154.    DS18B20_WriteByte(0XCC);
155.    DS18B20_WriteByte(0XBE);
156.    Low_Byte=DS18B20_ReaDByte();
157.    High_Byte=DS18B20_ReaDByte();
158.
159.    value=High_Byte<<8;
160.    value=value+Low_Byte;
161.
162.    //value=(High_Byte<<8)+Low_Byte;
163.    
164.    if((value&0xf800)==0xf800)
165.    {
166.        value=(~value)+1;
167.        temperture_value=value*(-0.0625);
168.    }
169.    else
170.    {
171.        temperture_value=value*0.0625;
172.    }
173.    return temperture_value;
174.}

4.2.2 DS18B20.h

1.#ifndef __DS18B20_H
2.#define __DS18B20_H
3.
4.#include "system.h"
5.#include "SysTick.h"
6.
7.#define DS18B20_PORT     GPIOG
8.#define DS18B20_Pin      GPIO_Pin_11
9.#define DS18B20_RCC      RCC_APB2Periph_GPIOG
10.
11.// GPIO位带操作
12.#define DS18B20_OUT                PGout(11)
13.#define DS18B20_IN                 PGin(11)
14.
15.u8 DS18B20_Iint(void);
16.void DS18B20_WriteByte(u8 data);
17.u8 DS18B20_ReaDByte(void);
18.float DS18B20_GetTemperture(void);
19.
20.#endif

4.2.3 main.c

1./* Includes ------------------------------------------------------------------*/
2.#include "system.h"
3.#include "LED.h"
4.#include "SysTick.h"
5.#include "USART.h"
6.#include "DS18B20.h"
7.
8./* 主函数main() --------------------------------------------------------------*/
9.int main()
10.{   
11.    // 自定义变量
12.    u8 i=0;
13.    float temperture=0;
14.    // 初始化
15.    SysTick_Iint(72);
16.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
17.    LED_Init();
18.    USART1_Iint(115200);  
19.    while(DS18B20_Iint())
20.    {
21.        printf("DS18B20初始化失败!\r\n");
22.        delay_ms(500);
23.    }
24.    printf("DS18B20初始化成功!\r\n");
25.    
26.    while(1)
27.    {
28.        i++;
29.        
30.        if(i%50==0)
31.        {
32.            temperture=DS18B20_GetTemperture();
33.            if(temperture<0)
34.            {
35.                printf("检测到的温度为:-");
36.            }
37.            else
38.            {
39.                printf("检测到的温度为: ");
40.            }
41.            printf("%.2f℃\r\n", temperture);
42.        }
43.        delay_ms(10);
44.        
45.  if(i%20==0)
46.  {
47.   LED0=!LED0;
48.  }
49.  
50.  delay_ms(10);
51.    }
52.}

标签:u8,DS18B20,void,.#,STM32,InitStructure,GPIO,温度
From: https://blog.csdn.net/2401_83015491/article/details/139333639

相关文章

  • 学好STM32单片机必备的10件工具
    学会STM32单片机必备10件软硬件工具提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、常用软硬件工具二、软硬件工具的具体介绍1.STM32F103C8T6小系统板2.ST-LINKV2下载调试器3.万用表4.示波器5.电烙铁6.USB转TTL串口通讯模块7.AltiumD......
  • STM32WB55 BLE双核flash擦写程序深度解析
    简介STM32WB55的flash擦除有两种机制,一种是只有单核运行下的flash擦除,这种模式下,flash擦除的步骤同其他STM32的flash擦除一样,直接调用HAL库中flash擦除的库函数即可;另一种是双核运行下的flash擦除,这种模式下,因为两颗CPU内核都会访问地址总线,可能会有访问冲突,为了解决这个问题,ST引......
  • Leecode---栈---每日温度 / 最小栈及栈和队列的相互实现
    栈:先入后出;队列:先入先出一、每日温度Leecode—739题目:给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。单调栈思路:1、新建一个存储......
  • Stm32H7系列定时中断设置HAL库
    Stm32定时中断配置,在我们的日常调试中,想要以一个固定的时钟频率对传感器定时周期采样时往往会直接在main.c函数的While(1)中进行,通过HAL_Delay()来控制采样频率,但是如果多传感器同时采样的话由于HAL_Delay()的方法时效性不是很准确往往会出现一系列的问题,而使用定时中断的话,只需......
  • 玩转STM32-I2C通信协议(详细-慢工出细活)
    文章目录一、I2C总线原理(掌握)1.1硬件构成1.2传输位1.3数据传输格式二、STM32的I2C特性和结构三、STM32的I2C通信实现(硬件实现方式)3.1I2C主模式四、应用实例一、I2C总线原理(掌握)1.1硬件构成I2C总线由串行数据线SDA和串行时钟线CL构成,总线上的每个器件都有一个......
  • Proteus8.0仿真应用设计(九十三)基于STM32CubeMX、STM32F103C8T6 、FREERTOS、MCP4151(SP
    一、简介:        MCP4151是一款SPI接口的7位数字电位器。二、主要特性:电阻值(欧姆)5kΩ、10kΩ、50kΩ、100kΩ抽头数257接口类型SPI通道数1供电电压1.8V~5.5V精度±20%温度系数(典型值)150ppm/℃工作温度-40℃~+125℃三、引脚定义:四、内部逻辑框图:五、时序图......
  • 基于STM32的GPS远程矿山矿场监控系统
    **单片机设计介绍,基于STM32的GPS远程矿山矿场监控系统文章目录一概要二、功能设计设计思路三、软件设计原理图五、程序六、文章目录一概要  基于STM32的GPS远程矿山矿场监控系统概要如下:一、系统概述基于STM32的GPS远程矿山矿场监控系统旨在实现对矿山......
  • STM32软件重启失败
    现象描述stm32使用NVIC_SystemReset()函数软件重启失败解决方法找到NVIC_SystemReset()的定义,继续跳转至__NVIC_SystemReset函数,将其中的SCB_AIRCR_SYSRESETREQ_Msk修改为SCB_AIRCR_VECTRESET_Msk即可。__NO_RETURN__STATIC_INLINEvoid__NVIC_SystemReset(void){......
  • STM32简介
    STM32单片机是由意法半导体公司(ST,STMicroelectronics)研发的32位基于ARM(AdvancedRISCMachine)内核的微控制器(MCU,MicrocontrollerUnit)。STM32系列分为不同的系列,有STM32F,STM32G,STM32H,STM32L,STM32U等这几个系列,如图1所示。图1STM32不同系列展示在STM32的每个系列中又......
  • STM32 IIC读取Eeprom失败问题
    现象描述异常断开产品的电源,会出现产品无法读取eeprom数据,并且iic返回繁忙警告。原因iic再读取eeprom时,出现电源抖动的情况。而该电源能维持芯片不进入关机状态,但是会影响iic通讯问题。解决办法在出现iic忙碌时,将iic复位即可。voidi2c_reset(void){ /*复位I2C*/ /*Res......