【鸿蒙开发】Hi3861学习笔记- DS18B20温度传感器

00. 目录

文章目录

    • 00. 目录
    • 01. DS18B20简介
    • 02. DS18B20引脚及电路
    • 03. DS18B20内部结构框图
    • 04. DS18B20内存映射
    • 05. 硬件设计
    • 06. 软件设计
    • 07. 实验现象
    • 08. 附录

01. DS18B20简介

DS18B20 是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高,多点组网的特点。

DS18B20 数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样。

主要根据应用场合的不同而改变其外观。封装后的 DS18B20 可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测

温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温

和控制领域。温度范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;电压范围:3.0~5.5V;DS18B20 支持多点组网功能,多个

DS18B20 可以并联在唯一的三线上,实现组网多点测温。

DS18B20 不同封装外观实物如下图所示:
在这里插入图片描述

02. DS18B20引脚及电路

在这里插入图片描述

03. DS18B20内部结构框图

在这里插入图片描述

parasite power circuit:是寄生电路部分,也就是说DS18B20可以不用通过VDD来进行供电,通过DQ口接电源也可以进行供电。DQ为高电平时,会对电容CPP进行充电,DQ为低电平时,电容会进行供电。
64-BIT ROM:作为器件地址,用于总线通信的寻址
MEMORY CONTROL LOGIC: 存储控制逻辑,用于控制数据的传输
SCRATCHPAD(暂存器):用于总线的数据交互(RAM)
TEMPERATURE SENSOR:模拟温度传感器
ALARM HIGH TRIGGER REGISTER:报警高位触发寄存器,存储温度上限阈值
ALARM LOW TRIGGER REGISTER: 报警低位触发寄存器,存储温度下限阈值
CONFIGURATION REGISTER:配置寄存器,用于设置分辨率(精度)
EEPROM: 用于保存温度触发阈值和配置参数
8-BIT CRC GENERATOR: 8位CRC生成器(CRC,循环冗余码,一种校验码)

04. DS18B20内存映射

在这里插入图片描述

05. 硬件设计

在这里插入图片描述

由图可知,P1 端子的 DS18B20 脚为 DS18B20 温度传感器控制口,可将该引脚与芯片的 GPIO 连接。

06. 软件设计

bsp_ds18b20.h

#ifndef BSP_DS18B20_H
#define BSP_DS18B20_H#include "cmsis_os2.h"
#include "hi_io.h"
#include "hi_gpio.h"//管脚定义
#define DS18B20_PIN         HI_IO_NAME_GPIO_7
#define DS18B20_GPIO_FUN    HI_IO_FUNC_GPIO_7_GPIO#define DS18B20_DQ_OUT(a)   hi_gpio_set_ouput_val(DS18B20_PIN,a)//函数声明
void ds18b20_io_out(void);
void ds18b20_io_in(void);
void ds18b20_reset(void);
uint8_t ds18b20_check(void);
uint8_t ds18b20_read_bit(void);
uint8_t ds18b20_read_byte(void);
void ds18b20_write_byte(uint8_t dat);
void ds18b20_start(void);
uint8_t ds18b20_init(void);
float ds18b20_gettemperture(void);#endif

bsp_ds18b20.c

#include "bsp_ds18b20.h"
#include <unistd.h>
#include "hi_time.h"//DS18B20输出配置
void ds18b20_io_out(void)
{hi_gpio_init();                                            // GPIO初始化hi_io_set_pull(DS18B20_PIN, HI_IO_PULL_UP);                // 设置GPIO上拉hi_io_set_func(DS18B20_PIN, DS18B20_GPIO_FUN);             // 设置IO为GPIO功能hi_gpio_set_dir(DS18B20_PIN, HI_GPIO_DIR_OUT);             // 设置GPIO为输出模式
}//DS18B20输入配置
void ds18b20_io_in(void)
{hi_io_set_pull(DS18B20_PIN, HI_IO_PULL_NONE);                // 设置GPIO浮空hi_gpio_set_dir(DS18B20_PIN, HI_GPIO_DIR_IN);             // 设置GPIO为输入模式
}/******************************************************* 函数名   :GPIO_GetInputValue* 功能     :获取GPIO输入状态* 输入     :id, *val* 输出     :0/1*******************************************************/
hi_gpio_value DS18B20_DQ_IN = {0};
uint8_t GPIO_GetInputValue(hi_gpio_idx id,hi_gpio_value *val)
{hi_gpio_get_input_val(id,val);return *val;
}//ds18b20复位
void ds18b20_reset(void)	   
{                 hi_gpio_set_dir(DS18B20_PIN, HI_GPIO_DIR_OUT);             // 设置GPIO为输出模式DS18B20_DQ_OUT(0); //拉低DQhi_udelay(750);    //拉低750usDS18B20_DQ_OUT(1); //DQ=1 hi_udelay(15);     //15US
}/*******************************************************************************
* 函 数 名         : ds18b20_check
* 函数功能		   : 检测DS18B20是否存在
* 输    入         : 无
* 输    出         : 1:未检测到DS18B20的存在,0:存在
*******************************************************************************/
uint8_t ds18b20_check(void) 	   
{   uint8_t retry=0;ds18b20_io_in(); while (GPIO_GetInputValue(DS18B20_PIN,&DS18B20_DQ_IN)&&retry<200){retry++;hi_udelay(1);};if(retry>=200)return 1;else retry=0;while ((!GPIO_GetInputValue(DS18B20_PIN,&DS18B20_DQ_IN))&&retry<240){retry++;hi_udelay(1);};if(retry>=240)return 1;	    return 0;
}/*******************************************************************************
* 函 数 名         : ds18b20_read_bit
* 函数功能		   : 从DS18B20读取一个位
* 输    入         : 无
* 输    出         : 1/0
*******************************************************************************/
uint8_t ds18b20_read_bit(void) 			 // read one bit
{uint8_t data;hi_gpio_set_dir(DS18B20_PIN, HI_GPIO_DIR_OUT);DS18B20_DQ_OUT(0); hi_udelay(2);DS18B20_DQ_OUT(1); ds18b20_io_in();hi_udelay(12);if(GPIO_GetInputValue(DS18B20_PIN,&DS18B20_DQ_IN))data=1;else data=0;	 hi_udelay(50);           return data;
}/*******************************************************************************
* 函 数 名         : ds18b20_read_byte
* 函数功能		   : 从DS18B20读取一个字节
* 输    入         : 无
* 输    出         : 一个字节数据
*******************************************************************************/
uint8_t ds18b20_read_byte(void)    // read one byte
{        uint8_t i,j,dat;dat=0;for (i=0;i<8;i++) {j=ds18b20_read_bit();dat=(j<<7)|(dat>>1);}						    return dat;
}/*******************************************************************************
* 函 数 名         : ds18b20_write_byte
* 函数功能		   : 写一个字节到DS18B20
* 输    入         : dat:要写入的字节
* 输    出         : 无
*******************************************************************************/
void ds18b20_write_byte(uint8_t dat)     
{             uint8_t j;uint8_t testb;hi_gpio_set_dir(DS18B20_PIN, HI_GPIO_DIR_OUT);for (j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if (testb) {DS18B20_DQ_OUT(0);// Write 1hi_udelay(2);                            DS18B20_DQ_OUT(1);hi_udelay(60);             }else {DS18B20_DQ_OUT(0);// Write 0hi_udelay(60);             DS18B20_DQ_OUT(1);hi_udelay(2);                          }}
}/*******************************************************************************
* 函 数 名         : ds18b20_start
* 函数功能		   : 开始温度转换
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20_start(void)// ds1820 start convert
{   						               ds18b20_reset();	   ds18b20_check();	 ds18b20_write_byte(0xcc);// skip romds18b20_write_byte(0x44);// convert
} //DS18B20初始化
uint8_t ds18b20_init(void)
{hi_gpio_init();                                            // GPIO初始化hi_io_set_pull(DS18B20_PIN, HI_IO_PULL_UP);                // 设置GPIO上拉hi_io_set_func(DS18B20_PIN, DS18B20_GPIO_FUN);             // 设置IO为GPIO功能hi_gpio_set_dir(DS18B20_PIN, HI_GPIO_DIR_OUT);             // 设置GPIO为输出模式ds18b20_reset();return ds18b20_check();
}/*******************************************************************************
* 函 数 名         : ds18b20_gettemperture
* 函数功能		   : 从ds18b20得到温度值
* 输    入         : 无
* 输    出         : 温度数据
*******************************************************************************/ 
float ds18b20_gettemperture(void)
{uint16_t temp;uint8_t a,b;float value;ds18b20_start();                    // ds1820 start convertds18b20_reset();ds18b20_check();	 ds18b20_write_byte(0xcc);// skip romds18b20_write_byte(0xbe);// convert	    a=ds18b20_read_byte(); // LSB   b=ds18b20_read_byte(); // MSB   temp=b;temp=(temp<<8)+a;if((temp&0xf800)==0xf800){temp=(~temp)+1;value=temp*(-0.0625);}else{value=temp*0.0625;	}return value;    
}

template.c

#include <stdio.h>
#include <unistd.h>#include "ohos_init.h"
#include "cmsis_os2.h"#include "bsp_led.h"
#include "bsp_ds18b20.h"//LED任务
osThreadId_t LED_Task_ID; //led任务IDvoid LED_Task(void)
{led_init();//LED初始化while (1) {LED(1); usleep(200*1000); //200msLED(0);usleep(200*1000); //200ms}
}
//LED任务创建
void led_task_create(void)
{osThreadAttr_t taskOptions;taskOptions.name = "LEDTask";            // 任务的名字taskOptions.attr_bits = 0;               // 属性位taskOptions.cb_mem = NULL;               // 堆空间地址taskOptions.cb_size = 0;                 // 堆空间大小taskOptions.stack_mem = NULL;            // 栈空间地址taskOptions.stack_size = 1024;           // 栈空间大小 单位:字节taskOptions.priority = osPriorityNormal; // 任务的优先级LED_Task_ID = osThreadNew((osThreadFunc_t)LED_Task, NULL, &taskOptions); // 创建任务1if (LED_Task_ID != NULL){printf("ID = %d, Create LED_Task_ID is OK!\n", LED_Task_ID);}
}//控制任务
osThreadId_t DS18B20_Task_ID; //任务IDvoid DS18B20_Task(void)
{static uint8_t i=0;float temper;while(ds18b20_init()){printf("DS18B20检测失败,请插好!\r\n");usleep(500*1000); //500ms}printf("DS18B20检测成功!\r\n");while (1) {i++;if(i%50==0){temper=ds18b20_gettemperture();if(temper<0){printf("检测的温度为:-");}else{printf("检测的温度为: ");}printf("%.1f°C\r\n",temper);}usleep(10*1000); //10ms}
}
//任务创建
void ds18b20_task_create(void)
{osThreadAttr_t taskOptions;taskOptions.name = "ds18b20Task";       // 任务的名字taskOptions.attr_bits = 0;               // 属性位taskOptions.cb_mem = NULL;               // 堆空间地址taskOptions.cb_size = 0;                 // 堆空间大小taskOptions.stack_mem = NULL;            // 栈空间地址taskOptions.stack_size = 1024;           // 栈空间大小 单位:字节taskOptions.priority = osPriorityNormal1; // 任务的优先级DS18B20_Task_ID = osThreadNew((osThreadFunc_t)DS18B20_Task, NULL, &taskOptions); // 创建任务if (DS18B20_Task_ID != NULL){printf("ID = %d, Task Create OK!\n", DS18B20_Task_ID);}
}/*** @description: 初始化并创建任务* @param {*}* @return {*}*/
static void template_demo(void)
{printf("-Hi3861开发板--DS18B20温度传感器实验\r\n");led_task_create();ds18b20_task_create();//任务创建
}
SYS_RUN(template_demo);

07. 实验现象

下载程序前,按照如下接线
在这里插入图片描述

注意:DS18B20 温度传感器不要插反,否则电源短路,容易烧坏开发板。方

向参考下图:
在这里插入图片描述

实验现象:读取 DS18B20 温度数据,并在串口助手上显示。

08. 附录

参考:【51单片机系列】DS18B20温度传感器模块

参考:【51单片机】DS18B20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境大文件传输如何突破延迟与丢包双重困局

一、行业痛点&#xff1a;跨国传输的挑战 在全球化业务场景中&#xff0c;跨境大文件传输常面临网络延迟高、丢包率频发等问题。传统TCP协议因其“先建联再传输”的机制&#xff0c;在高时延、高丢包环境下效率骤降&#xff0c;导致跨国协作、影视渲染、科研数据共享等场景中传…

uni-app——计时器和界面交互API

API 基本概要 概念说明 API&#xff08;应用程序接口&#xff09;是预先定义的方法集合&#xff0c;用于实现特定功能。在 uni-app 中&#xff0c;通过全局对象 uni 调用 API&#xff0c;例如 uni.getSystemInfoSync 获取设备信息。 API 分类与调用规则 事件监听型 以 on 开…

Dify 升级攻略:从0.15.3迈向1.1.0,元数据管理全攻略!

嘿&#xff0c;小伙伴们&#xff01;今天给大家带来一个超实用的干货分享——Dify从0.15.3升级到1.1.0版本的详细攻略。这次升级不仅带来了功能上的更新&#xff0c;还特别强化了元数据管理。相信很多小伙伴和我一样&#xff0c;一直在使用Dify来提升工作效率&#xff0c;但每次…

15.三数之和-力扣(python)

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&a…

numpy学习笔记14:模拟随机游走过程

numpy学习笔记14&#xff1a;模拟随机游走过程 随机游走是一种数学统计模型&#xff0c;其中的每一步方向和大小都是随机的。下面使用 NumPy 模拟一维和二维的随机游走过程&#xff1a; 1.代码示例 import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.s…

YOLOv11 目标检测

本文章不再赘述anaconda的下载以及虚拟环境的配置&#xff0c;博主使用的python版本为3.8 1.获取YOLOv11的源工程文件 链接&#xff1a;GitHub - ultralytics/ultralytics: Ultralytics YOLO11 &#x1f680; 直接下载解压 2.需要自己准备的文件 文件结构如下&#xff1a;红…

dijkstra算法——47. 参加科学大会

卡码网:47. 参加科学大会https://kamacoder.com/problempage.php?pid=1047 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。 小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以…

Rust语言介绍和猜数字游戏的实现

文章目录 Rust语言介绍和猜数字游戏的实现cargo是什么使用Rust编写猜数字 Rust语言介绍和猜数字游戏的实现 Rust语言是一种系统编程语言&#xff0c;核心强调安全性、并发性以及高性能&#xff0c;由类似于C/C的底层控制能力&#xff0c;性能也非常接近&#xff0c;Rust有一些…

Ubuntu下Docker部署Misskey:打造你的去中心化社交平台

引言 在信息爆炸的时代&#xff0c;人们对于社交平台的需求日益增长&#xff0c;同时也更加注重数据的隐私和自由。Misskey作为一个开源的去中心化社交平台&#xff0c;为用户提供了一个全新的选择。本文将详细介绍如何在Ubuntu Linux环境下&#xff0c;利用Docker快速部署Mis…

DeepSeek Chat 自动化交互技术分析

本文将对 DeepSeek Chat 自动化交互脚本进行技术分析&#xff0c;包括代码结构、实现原理以及关键技术点。该脚本使用 Selenium 实现了对 DeepSeek Chat 平台的自动化登录和问答功能。 1. 代码结构概览 该脚本主要由以下几个部分组成&#xff1a; 环境准备与依赖导入&#x…

128. Longest Consecutive Sequence

如果n-1存在于数组中&#xff0c;则以n开头的连续序列可以忽略掉&#xff0c;因为以n-1开头的连续序列的长度肯定至少比以n开头的连续序列长1个元素。这是本题的关键。然后利用哈希表查询元素是否在数组中。 class Solution { public:int longestConsecutive(vector<int>…

《SQL编程思想》中的 MySQL 建表语句和测试数据

《SQL编程思想》中的 MySQL 建表语句 建表语句 -- 创建 4 个示例表和索引 CREATE TABLE department( dept_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 部门编号&#xff0c;自增主键, dept_name VARCHAR(50) NOT NULL COMMENT 部门名称) ENGINEInnoDB COMM…

基于ssm学科竞赛小程序的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息时代的来临&#xff0c;过去的学科竞赛管理方式的缺点逐渐暴露&#xff0c;本次对过去的学科竞赛管理方式的缺点进行分析&#xff0c;采取计算机方式构建学科竞赛小程序。本文通过阅读相关文献&#xff0c;研究国内外相关技术&#xff0c;提出了一种关于竞赛信息…

【redis】什么是持久化之 RDB

什么是持久化 MySQL 的事务&#xff0c;有四个比较核心的特性&#xff1a; 原子性一致性持久性>持久化&#xff08;说的一回事&#xff09; 把数据存储在硬盘上>持久把数据存在内存上>不持久重启进程/重启主机之后&#xff0c;数据是否还存在 隔离性 Redis 是一个内存…

Python 鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

游戏立项时期随笔记录(1)

模拟经营的项目还没有完全结束&#xff0c;这几天又有可能涉及到一个新项目。感想随笔记录一下&#xff0c;防止忘记。今天一天整理这个&#xff0c;搞得今天没时间看数学和AI。 在 Unity3D 游戏前端主程序的立项时期&#xff0c;核心目标是明确技术方向、评估可行性、搭建基础…

Channel-wise Knowledge Distillation for Dense Prediction论文阅读和

paper&#xff1a;https://arxiv.org/pdf/2011.13256.pdf code&#xff1a;https://github.com/open-mmlab/mmrazor 这篇paper主要是商汤开源的mmrazor中提及在detection有效果&#xff0c;我之前记录的几篇sota文章虽然在各自的paper中在detection领域都有提及有增益&#…

hide函数的使用方法

在编程中&#xff0c;我们常常需要控制元素的显示与隐藏。特别是在前端开发中&#xff0c;hide 函数是一个非常常见的操作&#xff0c;尤其是在 JavaScript 和 jQuery 中。它可以让你轻松地将元素从视图中隐藏&#xff0c;进而提升用户交互体验和页面的响应能力。本文将介绍如何…

【MySQL】基本操作 —— DML 与约束

目录 DML 基本介绍DML 常见操作添加数据 insert给指定字段添加数据给全部字段添加数据给指定字段批量添加数据给全部字段批量添加数据 修改数据 update删除数据 delete 约束基本概念约束操作主键约束添加单列主键添加多列主键&#xff08;联合主键&#xff09;修改表结构添加主…

nginx配置转发到另一个网站或另一台服务器的服务

需求背景 在一台服务器上安装了一个服务&#xff0c;不想使用ip:port方式&#xff0c;想使用域名打开这个服务的地址。 1. 配置转发 1.1 参数解释 listen&#xff1a;指定 Nginx 监听的端口。在上面的例子中&#xff0c;Nginx 监听 8888 端口。server_name&#xff1a;用于…