打印
[STM32F4]

STM32F407开发板DS18B20应用案例

[复制链接]
198|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【1】DS18B20介绍
DS18B20是一种数字温度传感器,由Maxim Integrated公司生产。它采用单总线接口,能够在广泛的温度范围内测量温度,并通过数字方式输出温度值,具有较高的精度和稳定性。

以下是DS18B20温度传感器的主要特点和操作时序:

(1)特点:

单总线接口:DS18B20使用单一的数据线进行通信,简化了连接和控制。
高精度测量:具有12位的温度分辨率,可测量范围为-55°C至+125°C。
数字输出:温度值以二进制形式传输,便于处理和解析。
内部存储:传感器可内部存储温度数据和配置信息。
低功耗:在非活动状态下,传感器可以进入睡眠模式以降低功耗消耗。

使用特权

评论回复
沙发
尽快回复过|  楼主 | 2023-8-27 17:53 | 只看该作者
(2)操作时序: DS18B20的操作时序包括复位、写入指令、读取温度等过程。下面是DS18B20的基本操作时序:

a. 复位:

主机拉低数据线,持续至少480μs作为复位信号。
主机释放数据线,等待15μs以上。

使用特权

评论回复
板凳
尽快回复过|  楼主 | 2023-8-27 17:53 | 只看该作者
b. 发送指令:

主机发出写入指令(如跳过ROM指令或匹配ROM指令)。
指令由主机通过数据线逐位发送,每位的有效时间为60μs。

使用特权

评论回复
地板
尽快回复过|  楼主 | 2023-8-27 17:54 | 只看该作者
c. 读取温度:

主机发出读取温度指令。
传感器将温度数据以序列的形式发送给主机,每位的有效时间为60μs。
主机在接收到所有数据后,需提供适当的延迟时间进行解析和处理。

使用特权

评论回复
5
尽快回复过|  楼主 | 2023-8-27 17:54 | 只看该作者
【2】硬件连线说明
STM32F407开发板DS18B20应用案例

使用特权

评论回复
6
尽快回复过|  楼主 | 2023-8-27 17:54 | 只看该作者
开发板硬件连接:

使用特权

评论回复
7
尽快回复过|  楼主 | 2023-8-27 17:54 | 只看该作者

使用特权

评论回复
8
尽快回复过|  楼主 | 2023-8-27 17:54 | 只看该作者
【3】源代码
在工程中添加ds18b20.c和ds18b20.h文件。

DS18B20代码如下:

使用特权

评论回复
9
尽快回复过|  楼主 | 2023-8-27 17:54 | 只看该作者
#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;
}


使用特权

评论回复
10
尽快回复过|  楼主 | 2023-8-27 17:55 | 只看该作者
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

使用特权

评论回复
11
尽快回复过|  楼主 | 2023-8-27 17:55 | 只看该作者
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);
                }
}


使用特权

评论回复
12
尽快回复过|  楼主 | 2023-8-27 17:55 | 只看该作者

使用特权

评论回复
13
Stahan| | 2023-9-2 23:42 | 只看该作者
这个不是对时序要求严格吗

使用特权

评论回复
14
MessageRing| | 2023-9-3 21:16 | 只看该作者
Stahan 发表于 2023-9-2 23:42
这个不是对时序要求严格吗

时序很好控制的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

443

帖子

0

粉丝