STM32F407开发板DS18B20应用案例

发布者:Jinyu2022最新更新时间:2024-05-09 来源: elecfans关键字:DS18B20  温度传感器 手机看文章 扫描二维码
随时随地手机看文章

【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);

 }

 }


关键字:DS18B20  温度传感器 引用地址:STM32F407开发板DS18B20应用案例

上一篇:STM32F103单片机学习笔记(3):串口
下一篇:轻松操作STM32F10X系列单片机的定时器

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved