DS18B20温度测量程序文件(简单通用)

这篇具有很好参考价值的文章主要介绍了DS18B20温度测量程序文件(简单通用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DS18B20是一个非常简单的温度传感器,对于像我这样单片机萌新是比较友好的。网上关于它的介绍非常多,包括原理、引脚、通信、以及51单片机、STM32的各种代码等等。本人写了一个简单的ds18b20.c库文件分享给大家,该文件内的函数可以实现单个元件的单次测温功能,温度精确到整数。这个程序在STM32F103C8上进行了实际测试,但是稍加修改就可以移植到其他类型的单片机上。

DS18B20的引脚定义、线路连接、工作时序、指令含义等,在他人写的文章中有详细阐述,在这里不再介绍。值得注意的是,经过我多次测试,发现在有VCC供电的情况下,VCC稳定在3.1V以上,才能正常测温;而如果使用数据线供电,在我单片机3.3V的VCC下没法正常测温(或许5V的VCC可以,但我没试验过)所以不推荐这种方法。

首先是头文件ds18b20.h:


#ifndef INC_DS18B20_H_
#define INC_DS18B20_H_


#define DS18_GPIO_Port GPIOB
#define DS18_Pin GPIO_PIN_0


unsigned char ds18b20_Init(void);
char readtemp(void);
void ds18b20start(void);


#endif /* INC_DS18B20_H_ */

头文件中#define 这两行是对ds18b20数据线对应管脚的定义,用户需要根据自己单片机上连接的管脚进行修改。需要注意的是,下面ds18b20_Init()中并没有包含管脚的初始化。用户需要在调用该函数之前先完成对GPIO管脚的初始化操作,将其配置成为开漏输出模式并配置上拉电阻。(我用的STM32Cube,自动生成了对GPIO管脚的初始化函数)

下面三个函数是main函数中需要调用的函数。具体调用方法如下:

  1. 在初始化时调用ds18b20_Init()函数。

  1. 每次测量温度前,都要先调用ds18b20start()函数。

  1. 调用完ds18b20start()后,需要等至少500ms,其测量完温度后再调用readtemp()函数进行读取(单位是摄氏度)。

接下来是这些函数的具体实现,即ds18b20.c:


/*
 * ds18b20.c
 *
 *  Created on: Dec 20, 2021
 *      Author: ASUS
 * 使用前必读
 * 需要修改的部分包括:
 * 1.在DELAY_Us中,修改__NOP()的数量,CPU频率是多少MHz,就用多少个NOP.
 * 2.添加或修改DS18_GPIO_Port,DS18_Pin的重定义内容,使之匹配对应的端口。
 * 3.如HAL_GPIO_WritePin()和HAL_GPIO_ReadPin没有定义,则自己写一个。
 * 4.在主程序中,需要对响应的GPIO端口进行初始化,设置为开漏输出和上拉电阻模式。
 * 本文件只有单次测量温度的程序。调用函数的方法:
 * 开机先用ds18b20_Init(void)初始化。每次测量前先用ds18b20start()开始测温,等大约0.5s后用readtemp()读取结果。
 */

#include "ds18b20.h"
#include "main.h"


void DELAY_Us(unsigned int  count)
{
    while(count--)
    {
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    }
}

unsigned char ds18b20_Init(void)
{
    /*****初始化DS18B20*****/

      unsigned char x=0;
      HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);    //DQ复位
      DELAY_Us(30);    //稍做延时
      HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0);      //单片机将DQ拉低
      DELAY_Us(500);   //精确延时,大于480us
      HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);       //拉高总线
      DELAY_Us(100);
      x=HAL_GPIO_ReadPin(DS18_GPIO_Port,DS18_Pin);      //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
      DELAY_Us(500);
      return x;

}

void ds18b20_Write1byte(unsigned char data)
{
    unsigned char i=0;
    for(i=8;i>0;i--)
    {
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0);
        DELAY_Us(3);
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,data&0x01);
        DELAY_Us(70);
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);
        DELAY_Us(3);
        data>>=1;

    }
    DELAY_Us(30);
}

unsigned char ds18b20_Read1byte(void)
{
    unsigned char i,j,dat;
     dat=0;
    for (i=1;i<=8;i++)
    {
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0);
        DELAY_Us(3);
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);
        DELAY_Us(18);
        j=HAL_GPIO_ReadPin(DS18_GPIO_Port,DS18_Pin);
        DELAY_Us(50);
        dat=(j<<7)|(dat>>1);
    }
    return dat;
}

void ds18b20start(void)
{
    ds18b20_Init();
    ds18b20_Write1byte(0xcc);

    ds18b20_Write1byte(0x44);
}

char readtemp(void)
{
    unsigned char TL=0x01,TH=0x07;
    char temp;
    ds18b20_Init();
    ds18b20_Write1byte(0xcc);
    ds18b20_Write1byte(0xbe);
    TL=ds18b20_Read1byte();
    DELAY_Us(1);
    TH=ds18b20_Read1byte();
    temp=(char)((TH<<4)|TL>>4);
    return temp;
}

这里首先一个函数是微秒级延时函数DELAY_Us()。这里使用了一个简单的__NOP()做延时。这实际上对应着CPU的汇编指令,表示延时一个时钟周期,什么都不做。所以用户需要根据CPU时钟频率修改__NOP()的个数,频率是多少MHz就加多少个__NOP()。当然,不同单片机的指令名称可能有所不同,用户自行替换就行了。

用户还需要修改的一部分是对GPIO端口的读写操作函数。我这里用的STM32HAL库,所以用的是HAL_GPIO_WritePin()和HAL_GPIO_ReadPin()函数。如果大家没有此库函数,就在本文件下面写一个,重新定义一下。

用户修改完上述部分后,就可以在主程序中调用ds18b20.h中的三个函数,进行温度的测量了。测量的结果就可以根据你喜欢的方式进行输出~(不过这就不是本文件需要包含的内容了)

如果有错误,还请在评论区指正。如果想看多点测温,欢迎在评论区留言,想看的人多我就写一写(嘿嘿文章来源地址https://www.toymoban.com/news/detail-452494.html

到了这里,关于DS18B20温度测量程序文件(简单通用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 53、基于STC15W单片机的温度计(DS18B20)(Proteus仿真+程序)

          本设计由STC15W4K32S4单片机+DS18B20温度传感器+1602液晶显示模块+串口模块组成。 1、主控制器是STC15W4K32S4单片机 2、DS18B20温度传感器采集温度,精度0.1摄氏度 3、1602液晶显示温度。 4、测温范围-55~110摄氏度,误差±0.1℃ 5、温度值发送至串口助手显示。 Proteus软件: Proteus

    2024年02月03日
    浏览(68)
  • DS18B20温度传感器工作原理

    目录 管脚描述 综述 访问DS18B20的事件序列 通信时序 VDD:电源引脚,当采用寄生电源的时候,VDD必须连接到地 DQ:单总线运用的数据输入/输出,当采用寄生电源供电时,同时向设备提供电源 GND:地 ①DS18B20片内的ROM中都存在独一无二的64位编码,在后期通信时,是用此编码进

    2024年02月09日
    浏览(43)
  • 【mcuclub】温度传感器DS18B20

        VCC:外接供电电源输入端。 DQ: 数字信号输入/输出端。 GND:电源地线 为什么接上拉电阻: 因为DS18B20的数据口是漏极开路,如果不接上拉电阻,则只能输出低电平和高阻态,不能输出高电平,因此需要外接上拉电阻,否则无法输出1。DS18B20的工作电流约为1mA,VCC一般为

    2023年04月22日
    浏览(44)
  • DS18B20温度传感器——测试环境温度及代码

    醒醒!,还在睡呢,开始干代码了! 单片机通过OneWire协议与DS18B20通信,最终测出环境温度 OneWire 总线的硬件接口很简单,只需要把 DS18B20 的数据引脚和单片机的一个 IO 口接上      说明:GND接地,DQ单引线用于数据的输入,VDD接电源正极(注意正负极不能接反) 通过编程,

    2024年02月09日
    浏览(70)
  • STM32——DS18B20温度传感器

    一、DS18B20介绍 (一)DS18B20技术性能特征 1、独特的单总线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,大大提高了系统的抗干扰性。 2、测温范围  -55°C~+125°C 3、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只

    2024年01月19日
    浏览(45)
  • Linux下ds18b20驱动开发获取温度

    对ds18b20不了解的可以查看这篇文章,讲解的比较详细的:STM32一线协议-DS18B20温度传感器采样实现 源码是根据上一届学长的,想要参考的可以去拜访一下gitee:代码链接 (1)修改设备树 在路径 linux-imx/arch/arm/boot/dts/ 下修改设备树 igkboard.dts : 主节点: 从节点: 在源码路径下

    2023年04月22日
    浏览(78)
  • 【单片机】17-温度传感器DS18B20

    (1)测温度的方式:物理(汞柱,气压),电子(金属电性能随温度变化) (2)早期:热敏电阻(模拟接口---》 A/D转换 ) (3)现代:专用sensor(数字接口,如I2C,DS18B20单总线接口等) DS18B20 可编程分辨率单总线 温度传感器 (1)内置集成ADC,外部数字接口 (2) 单总线

    2024年02月04日
    浏览(53)
  • 基于51单片机的DS18B20温度显示

    本讲内容:       了解温度传感器DS18B20的使用,并通过一个例程展示温度传感器DS18B20测温过程。 DS18B20简介:       DS18B20 是单线数字温度传感器,即“一线器件”,其具有独特的优点:     (1)采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器

    2024年02月12日
    浏览(53)
  • 51单片机温度传感器DS18B20

    实现功能 插上DS18B20温度传感器,数码管显示检测的温度值 单片机型号:STC89C52 DS18B20介绍 1、DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、 适用电压宽、与微处理

    2024年02月01日
    浏览(52)
  • DS18B20温度传感器原理及使用教程

           DS18B20数字温度传感器提供9-Bit到12-Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。DS18B20采用的1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信。该传感器的温度检测范围为-55℃至+125℃,并且在温度范围超过

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包