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

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

3天内不再提示

STM32F407入门开发: DS18B20温度传感器应用

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-28 13:41 次阅读

一、DS18B20硬件原理图与功能介绍

DS18B20是数字温度传感器,单总线接口,读取温度只需要一个IO口,还有不同的封装形式,支持不同的环境。每个DS18B20还有64位的光刻ROM序列号,支持一个IO口上挂载多个DS18B20时,区分设备,也就是支持级联,非常方便,不费IO口。

下面就介绍在STM32F407上面如果驱动DS18B20读取温度,代码采用keil编写,采用多文件的形式,代码分为3个部分:

  1. DS18B20.c文件,主要是核心函数的实现。
  2. DS18B20.h文件,函数的声明。
  3. main.c文件。主函数,调用DS18B20读取文件,并换算之后打印出来。

下面是DS18B20在开发板上的原理图:

image.pngimage.png

二、DS18B20核心代码

2.1 DS18B20.c源码

#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);
	}
}
复制代码

温度读取效果

image.png

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

    关注

    48

    文章

    2897

    浏览量

    155816
  • DS18B20
    +关注

    关注

    10

    文章

    778

    浏览量

    80648
  • STM32F407
    +关注

    关注

    15

    文章

    187

    浏览量

    29339
收藏 人收藏

    评论

    相关推荐

    基于STM32DS18B20温度传感器设计

    DS18B20内置了64位产品序列号,方便识别身份,在一根线上可以挂接多个DS18B20传感器,通过64位身份验证,可以分别读取来至不同传感器采集的
    的头像 发表于 03-07 11:44 1.3w次阅读
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>DS18B20</b><b class='flag-5'>温度</b><b class='flag-5'>传感器</b>设计

    [MicroPython]stm32f407控制DS18B20检测温度

    元器件 F407Micropython开发板1块 数据线1条 DS18b20温度传感器1个 DS18B2
    发表于 08-13 16:42

    DS18B20温度传感器实验

    单片机驱动DS18B20温度传感器实现温度的串口打印显示,本实验中STM32基于HAL库开发。本
    发表于 08-18 07:44

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

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

    数字温度传感器DS18B20的设计及应用

    数字温度传感器DS18B20的设计及应用 1引言 DS18B20是DALLAS公司生产的一线式数字温度
    发表于 04-02 18:00 2786次阅读
    数字<b class='flag-5'>温度</b><b class='flag-5'>传感器</b><b class='flag-5'>DS18B20</b>的设计及应用

    DS18B20完成温度检测的技巧

    介绍了DS18B20 温度传感器 的结构和特点以及用DS18B20温度传感器进行
    发表于 08-23 10:44 190次下载
    <b class='flag-5'>DS18B20</b>完成<b class='flag-5'>温度</b>检测的技巧

    DS18B20数字温度传感器

    本设计基于单片机STM32开发板,对DS18B20数字温度传感器进行控制,有源代码
    发表于 05-11 14:54 42次下载

    温度传感器DS18B20

    温度传感器DS18B20 51例程,亲测可用
    发表于 06-14 15:36 20次下载

    智能温度传感器DS18B20的原理与应用

    DS18B20是DALLAS公司生产的单线数字温度传感器,他具有独特的单线总线接口方式。文章详细的介绍了单线数字温度传感器
    发表于 10-11 18:19 48次下载

    ds18b20的特性_ds18b20温度传感器应用

    本文首先介绍了ds18b20的特性,其次介绍了DS18B20工作原理,最后介绍了ds18b20温度传感器应用。
    发表于 04-24 09:10 1.1w次阅读
    <b class='flag-5'>ds18b20</b>的特性_<b class='flag-5'>ds18b20</b><b class='flag-5'>温度</b><b class='flag-5'>传感器</b>应用

    STM32入门开发: 编写DS18B20温度传感器驱动(读取环境温度、支持级联)

    一、环境介绍编程软件: keil5操作系统: win10STM32编程方式: 寄存开发 (方便程序移植到其他单片机)温度传感器
    发表于 11-21 11:51 46次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>入门开发</b>:  编写<b class='flag-5'>DS18B20</b><b class='flag-5'>温度</b><b class='flag-5'>传感器</b>驱动(读取环境<b class='flag-5'>温度</b>、支持级联)

    STM32F207 DS18B20数字式温度传感器调试记录

    STM32F207 DS18B20数字式温度传感器调试记录平台:STM32F207 HAL库。调试内容:通过
    发表于 11-25 11:21 16次下载
    <b class='flag-5'>STM32F</b>207 <b class='flag-5'>DS18B20</b>数字式<b class='flag-5'>温度</b><b class='flag-5'>传感器</b>调试记录

    STM32CubeMX系列|DS18B20温度传感器

    DS18B20温度传感器1. DS18B20简介2. 硬件设计3. 软件设计3.1 STM32CubeMX设置3.2 MDK-ARM编程4.
    发表于 01-18 10:04 18次下载
    <b class='flag-5'>STM32</b>CubeMX系列|<b class='flag-5'>DS18B20</b><b class='flag-5'>温度</b><b class='flag-5'>传感器</b>

    STM32 DS18B20温度传感器实验(HAL库)

    单片机驱动DS18B20温度传感器实现温度的串口打印显示,本实验中STM32基于HAL库开发。本
    发表于 01-18 10:08 47次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>DS18B20</b><b class='flag-5'>温度</b><b class='flag-5'>传感器</b>实验(HAL库)

    ds18b20温度传感器如何使用

    DS18B20是一款广泛使用的数字温度传感器,它具有高精度、低功耗和易于使用的特点。 DS18B20温度
    的头像 发表于 09-03 16:51 490次阅读