DS18B20温度 STM32代码

本文详细介绍了DS18B20温度传感器的工作原理,并提供了C语言的例程代码,包括初始化、写入数据、读取数据以及测量温度等关键操作,用于确保传感器的正常运行。
摘要由CSDN通过智能技术生成

DS18B20温度传感器原理详解及例程代码
封装运行正常,仅用作代码记录

#ifndef _DS18B20_H
#define _DS18B20_H
#include "main.h"
#include "my_sys.h"

//引脚初始化
#define		DS18B20_DQ_OUT_H			HAL_GPIO_WritePin(DS18B20_DQ_GPIO_Port,DS18B20_DQ_Pin,GPIO_PIN_SET)
#define		DS18B20_DQ_OUT_L		    HAL_GPIO_WritePin(DS18B20_DQ_GPIO_Port,DS18B20_DQ_Pin,GPIO_PIN_RESET)
#define		DS18B20_DQ_IN		        HAL_GPIO_ReadPin (DS18B20_DQ_GPIO_Port,DS18B20_DQ_Pin)

#define   false   0
#define   true    1

void DS18B20_Reset(void);//传感器复位函数
u8 DS18B20_Check(void);//等待传感器响应函数
u8 DS18B20_init(void);//传感器初始化
void DS18B20_write(u8 data);//向传感器写数据
u8 DS18B20_Read_Bit(void);//从传感器读取一个BIT数据
u8 DS18B20_Read_Byte(void);//从传感器读取一个字节数据
void DS18B20_Start(void);//向传感器发送指令,测量温度
float DS18B20_Get_Temp(void);//读取温度值

#endif

#include "DS18B20.h"
#include "main.h"

static void  DS18B20_delay(u16 D)  //delay(word D) //延时__near
{
	u8  E;
	for(; D > 0; D--)
	{
		for(E = 5; E > 0; E--)
		{
			;
		}
  }
}
void DS18B20_Reset(void)//传感器复位函数
{
  DS18B20_DQ_OUT_L;
  DS18B20_delay(480);
  DS18B20_DQ_OUT_H;
  DS18B20_delay(15);
}
u8 DS18B20_Check(void)//等待传感器响应函数
{
  u8 retry =0;
  while(DS18B20_DQ_IN)
  {
    if(retry++ >60)
    {
        return  false;
    }
    else
    {
        DS18B20_delay(10);
    }  
  }
  retry=0;
  while(!DS18B20_DQ_IN)
  {
    if(retry++ >240)
    {
        return  false;
    }
    else
    {
        DS18B20_delay(10);
    }  
  } 
   return true;
}
u8 DS18B20_init(void)//传感器初始化
{
    DS18B20_Reset();
    return DS18B20_Check();
}
void DS18B20_write(u8 data)//向传感器写数据
{
    for(u8 i=0; i<8; i++)
    {
      if(data&0x01)
      {
          DS18B20_DQ_OUT_L;
          DS18B20_delay(2);
          DS18B20_DQ_OUT_H;
          DS18B20_delay(60);
      }
      else
      {
          DS18B20_DQ_OUT_L;
          DS18B20_delay(60);
          DS18B20_DQ_OUT_H;
          DS18B20_delay(2);
      }
       data >>=1;
    }
}
u8 DS18B20_Read_Bit(void)//从传感器读取一个BIT数据
{
    u8 data;
    DS18B20_DQ_OUT_L;
    DS18B20_delay(2);
    DS18B20_DQ_OUT_H;
    DS18B20_delay(2);
    data = DS18B20_DQ_IN;
    DS18B20_delay(50);
    return data;
}
u8 DS18B20_Read_Byte(void)//从传感器读取一个字节数据
{
    u8 data=0;
    for(u8 i=0; i<8;i++)
     {
       data>>=1;
       if(DS18B20_Read_Bit())
       {
          data |=0x80;
       }
     }
     return data;
}
void DS18B20_Start(void)//向传感器发送指令,测量温度
{
    DS18B20_Reset();
    DS18B20_Check();
    DS18B20_write(0xCC);
    DS18B20_write(0x44);
}
float DS18B20_Get_Temp(void)//读取温度值
{
    float data;
    DS18B20_Start();
    DS18B20_Reset();
    DS18B20_Check();
    DS18B20_write(0xCC);
    DS18B20_write(0xBE);
    data = ((u16)DS18B20_Read_Byte() | DS18B20_Read_Byte()<<8)*0.0625f;
    return data;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值