0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F407开发板DS18B20应用案例

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-07-06 14:35 次阅读

【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应用案例

开发板硬件连接:

img

img

【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); //转换一次温度
 
     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(0xbe);// 读取转换成功的温度数据
     TL=DS18B20_ReadByte();  // LSB   
     TH=DS18B20_ReadByte();  // MSB  
     temp=((u16)TH< < 8)|TL;
 return temp;
 }
 ​
 ​

Ds18b20.h代码示例

#ifndef _DS18B20_H
 #define _DS18B20_H
 #include "stm32f4xx.h"#include "sys.h"
 #include "delay.h"
 void DS18B20_Init(void);
 short DS18B20_Get_Temp(void);
 #define DS18B20_IN PGin(9)
 #define DS18B20_OUT PGout(9)#define DS18B20_INPUT()  \\
 {\\
 GPIOG- >MODER&=~(0x3< < 9*2);\\
 GPIOG- >MODER|=0x0< < 9*2;\\
 GPIOG- >PUPDR&=~(0x3< < 9*2);\\
 GPIOG- >PUPDR|=0x1< < 9*2;\\
 }
 
 #define DS18B20_OUTPUT() \\
 {\\
  GPIOG- >MODER&=~(0x3< < 9*2);\\
  GPIOG- >MODER|=0x1< < 9*2;\\
  GPIOG- >OTYPER&=~(0x1< < 9);\\
  GPIOG- >OSPEEDR&=~(0x3< < 9*2);\\
  GPIOG- >OSPEEDR|=0x2< < 9*2;\\
  GPIOG- >ODR|=1< < 9;\\
 }
 #endif

Main.c文件示例

#include "stm32f4xx.h" // Device header
 #include "led.h"
 #include "delay.h"
 #include "key.h"
 #include "usart.h"
 #include "sys.h"
 #include "exti.h"
 #include "timer.h"
 #include "pwm.h"
 #include "ds18b20.h"int main(void)
 {
 short temp;
 unsigned short intT,decT;   //温度值的整数和小数部分
 LED_Init();
 KEY_Init();
 USART1_Init(84,115200);
 KEY_EXTI_Init();
 DS18B20_Init();
   while(1)
 {
   /*读取温度信息*/
 temp=DS18B20_Get_Temp();
 intT = temp > > 4;             //分离出温度值整数部分
 decT = temp & 0xF;            //分离出温度值小数部分
 printf("DS18B20: %d.%d *C\\r\\n",(int)intT,(int)decT);
 DelayMs(1000);
 }
 }
 ​
 ​

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48129

    浏览量

    740189
  • DS18B20
    +关注

    关注

    10

    文章

    765

    浏览量

    80104
  • 开发板
    +关注

    关注

    25

    文章

    4437

    浏览量

    94084
  • STM32F407
    +关注

    关注

    15

    文章

    187

    浏览量

    29001
收藏 人收藏

    评论

    相关推荐

    基于STM32神舟三号开发板DS18B20温度传感器

    自己改的一个神舟三号开发板使用DS18B20模块的代码
    发表于 05-16 16:29

    stm32开发板原理图PCB工程源文件,stm32f103zet6,stm32f407

    板子完整工程连接:http://www.cirmall.com/circuit/7 ... F%EF%BC%81#/detailsSTM32F103/STM32F407通用开发板主要的
    发表于 10-16 14:24

    [MicroPython]stm32f407控制DS18B20检测温度

    元器件 F407Micropython开发板1块 数据线1条 DS18b20温度传感器1个 DS18B20测温模块(不含DS18B20)1个
    发表于 08-13 16:42

    GPIO外设读取温度传感器DS18B20的数据

    的是一个工业DTU,主控芯片为STM32103RBT6。DS18B20DTU开发板板载一颗DS18B20温度传感器。3. 使用STM32Cu
    发表于 08-12 07:32

    stm32f407+DS18B20读出的温度显示在TFT屏幕上

    stm32f407 + DS18B20 碰出不一样的火花,DS18B20相关知识以及单总线协议。 最后将读出的温度显示在 TFT 屏幕上。
    发表于 08-24 06:34

    DS18B20简介

    开发板相关模块电路图如下:2、DS18B20的温度转换规则DS18B20可以直接读出数字的温度数值。温度传感器的精度为用户可编程的9、10、11或12位,分别以0.5℃,0.25℃,0.125
    发表于 11-22 07:21

    DS18B20的相关资料分享

    一、环境介绍编程软件: keil5操作系统: win10STM32编程方式: 寄存器开发 (方便程序移植到其他单片机)温度传感器: DS1820DS18B20是一个数字温度传感器,采用的是单总线时序
    发表于 11-30 06:22

    ds18b20初始化失败是什么原因导致的?

    ds18b20初始化失败,引脚对应是正确的,我两块stm32f407都试过了 都不成功,硬件应该没问题,就是这个if语句没有进去。
    发表于 02-21 11:37

    ds18b20初始化失败的原因?如何解决?

    ds18b20初始化失败,引脚对应是正确的,我两块stm32f407都试过了 都不成功,硬件应该没问题,就是这个if语句没有进去。
    发表于 09-03 10:57

    STM32F407 开发板原理图

    STM32F407 开发板原理图
    发表于 09-22 16:12 387次下载
    <b class='flag-5'>STM32F407</b> <b class='flag-5'>开发板</b>原理图

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解

    STM32F407开发板用户手册】第13章 STM32F407启动过程详解
    发表于 11-23 18:06 70次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发板</b>用户手册】第13章 <b class='flag-5'>STM32F407</b>启动过程详解

    STM32F407开发板用户手册】第14章 STM32F407的电源,复位和时钟系统

    STM32F407开发板用户手册】第14章 STM32F407的电源,复位和时钟系统
    发表于 12-02 16:21 39次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发板</b>用户手册】第14章 <b class='flag-5'>STM32F407</b>的电源,复位和时钟系统

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作

    STM32F407开发板用户手册】第1章   初学STM32F407的准备工作
    发表于 12-04 13:36 73次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发板</b>用户手册】第1章   初学<b class='flag-5'>STM32F407</b>的准备工作

    STM32F407开发板用户手册】第8章 STM32F407的终极调试组件Event Recorder

    STM32F407开发板用户手册】第8章 STM32F407的终极调试组件Event Recorder
    发表于 12-04 14:21 17次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发板</b>用户手册】第8章 <b class='flag-5'>STM32F407</b>的终极调试组件Event Recorder

    STM32F407开发板用户手册】第19章 STM32F407的GPIO应用之按键FIFO

    STM32F407开发板用户手册】第19章 STM32F407的GPIO应用之按键FIFO
    发表于 12-05 15:21 32次下载
    【<b class='flag-5'>STM32F407</b><b class='flag-5'>开发板</b>用户手册】第19章 <b class='flag-5'>STM32F407</b>的GPIO应用之按键FIFO