首页主机资讯STM32F407开发板DS18B20应用案例

STM32F407开发板DS18B20应用案例

时间2023-10-21 16:04:03发布访客分类主机资讯浏览530
导读:【1】DS18B20介绍DS18B20是一种数字温度传感器,由Maxim Integrated公司生产。它采用单总线接口,能够在广泛的温度范围内测量温度,并通过数字方式输出温度值,具有较高的精度和稳定性。以下是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应用案例

开发板硬件连接:

【3】源代码

在工程中添加ds18b20.c和ds18b20.h文件。

DS18B20代码如下:

#include "ds18b20.h"

/*
函数功能:DS18b20IO口初始化
硬件连接:PG9
复用表示自动输出数据
通用表示手动输出数据
*/
void DS18B20_Init(void)
{
    
		/*1. 开时钟*/
	  RCC->
    AHB1ENR|=16;
    //使能PORTG时钟
		
		/*2. 初始化IO模式*/
		DS18B20_OUTPUT();
	
}



/*
函数功能:等待DS18B20的回应
返回1:未检测到DS18B20的存在
返回0:存在
*/
u8 DS18B20_Check(void) 	   
{
       
	u8 retry=0;
    
	DS18B20_INPUT()   //设置DS18B20输入模式
  while(DS18B20_IN&
    &
retry200)
	{
    
		retry++;
    
		DelayUs(1);

	}
    ;
    	 
	if(retry>
    =200)return 1;
    
	else retry=0;
    
  while(!DS18B20_IN&
    &
retry240)
	{
    
		retry++;
    
		DelayUs(1);

	}
    ;
    
	if(retry>
    =240)return 1;
    	    
	return 0;

}



/*
从DS18B20读取一个字节
返回值:读到的数据
*/
u8 DS18B20_ReadByte(void)
{
            
	u8 i,data=0;
    
	for(i=0;
    i8;
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;
    i8;
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)TH8)|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&
    =~(0x39*2);
    \
					GPIOG->
    MODER|=0x09*2;
    \
					GPIOG->
    PUPDR&
    =~(0x39*2);
    \
					GPIOG->
    PUPDR|=0x19*2;
\
				}

				
#define DS18B20_OUTPUT() \
				{
    \
					 GPIOG->
    MODER&
    =~(0x39*2);
    \
					 GPIOG->
    MODER|=0x19*2;
    \
					 GPIOG->
    OTYPER&
    =~(0x19);
    \
					 GPIOG->
    OSPEEDR&
    =~(0x39*2);
    \
					 GPIOG->
    OSPEEDR|=0x29*2;
    \
					 GPIOG->
    ODR|=19;
\
				}

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

		}

}
    

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: STM32F407开发板DS18B20应用案例
本文地址: https://pptw.com/jishu/504643.html
解密Docker容器网络 shell ssh远程连接工具

游客 回复需填写必要信息