2025年2月25日 星期二 甲辰(龙)年 腊月廿五 设为首页 加入收藏
rss
您当前的位置:首页 > 电子 > 开发板/开源硬件

STM32F407开发板DS18B20应用案例

时间:11-08来源:作者:点击数:27
城东书院 www.cdsy.xyz

【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);
  • }
  • }
img
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐