Clion开发Stm32之温湿度传感器(DS18B20)驱动编写和测试

前言

涵盖之前文章:

  1. Clion开发STM32之HAL库GPIO宏定义封装(最新版)
  2. Clion开发stm32之微妙延迟(采用nop指令实现)
  3. Clion开发STM32之日志模块(参考RT-Thread)

DSP18B20驱动文件

头文件

/*******************************************************************************Copyright (c) [scl]。保留所有权利。* 存储的温度是16 位的带符号扩展的二进制补码形式* 当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位*         |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----|* 低字节  | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |*         |-----符号位:0->正  1->负-------|-----------整数-----------|* 高字节  |  s  |  s  |  s  |  s  |    s   |   2^6  |   2^5  |   2^4  |* 温度 = 符号位 + 整数 + 小数*0.0625******************************************************************************/
#ifndef F1XX_TEMPLATE_MODULE_DS18B20_H
#define F1XX_TEMPLATE_MODULE_DS18B20_H#include "sys_core.h"/*** @memberof input_mode_set 输入模式配置* @memberof out_mode_set 输出模式配置* @memberof send_data 发送数据* @memberof us_delay 微秒延迟*/
typedef struct {void (*input_mode_set)(void);void (*out_mode_set)(void);void (*send_data)(uint32_t status);uint32_t (*read_data)(void);void (*us_delay)(uint32_t us);
} DS18B20_conf_t;void DS18B20_conf_set(DS18B20_conf_t *cnf);bool DS18B20_Driver_Init(void);void DS18B20_readId(uint8_t *ds18b20_id);float DS18B20_GetTemp_SkipRom(void);float DS18B20_GetTemp_MatchRom(const uint8_t *ds18b20_id);#endif //F1XX_TEMPLATE_MODULE_DS18B20_H

源文件

/*******************************************************************************Copyright (c) [scl]。保留所有权利。******************************************************************************/
#include "ds18b20/module-ds18b20.h"#define DBG_ENABLE
#define DBG_SECTION_NAME "ds18b20"
#define DBG_LEVEL DBG_LOG // DBG_LOG DBG_INFO DBG_WARNING DBG_ERROR#include "sys_dbg.h"static DS18B20_conf_t *conf_ptr = NULL;
#define DS18B20_DQ_0 conf_ptr->send_data(0)
#define DS18B20_DQ_1 conf_ptr->send_data(1)static void DS18B20_WriteByte(uint8_t dat);static uint8_t DS18B20_ReadByte(void);static bool DS18B20_Presence(void);void DS18B20_conf_set(DS18B20_conf_t *cnf) {conf_ptr = cnf;}static void DS18B20_Rst(void) {conf_ptr->out_mode_set();DS18B20_DQ_0;/* 主机至少产生480us的低电平复位信号 */conf_ptr->us_delay(750);/* 主机在产生复位信号后,需将总线拉高 */DS18B20_DQ_1;/*从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/conf_ptr->us_delay(15);
}
/*** 驱动初始化* @return*/
bool DS18B20_Driver_Init(void) {if (conf_ptr == NULL) return false;conf_ptr->out_mode_set();DS18B20_DQ_1;DS18B20_Rst();return DS18B20_Presence();
}/*** @brief  在匹配 ROM 情况下获取 DS18B20 温度值* @param ds18b20_id :用于存放 DS18B20 序列号的数组的首地址*/
void DS18B20_readId(uint8_t *ds18b20_id) {if (conf_ptr == NULL) return;uint8_t uc;DS18B20_WriteByte(0x33);       //读取序列号for (uc = 0; uc < 8; uc++)ds18b20_id[uc] = DS18B20_ReadByte();
}/***** @brief 在跳过匹配 ROM 情况下获取 DS18B20 温度值* @return*/
float DS18B20_GetTemp_SkipRom(void) {uint8_t tpmsb = 0, tplsb = 0;short s_tem = 0;float f_tem = 0;/* -------------跳过 ROM-START---------- */DS18B20_Rst();DS18B20_Presence();DS18B20_WriteByte(0XCC);/* -------------跳过 ROM-END---------- */DS18B20_WriteByte(0X44);                /* 开始转换 *//* -------------跳过 ROM-START---------- */DS18B20_Rst();DS18B20_Presence();DS18B20_WriteByte(0XCC);        /* 跳过 ROM *//* -------------跳过 ROM-END---------- */DS18B20_WriteByte(0XBE);                /* 读温度值 */tplsb = DS18B20_ReadByte();tpmsb = DS18B20_ReadByte();s_tem = tpmsb << 8;s_tem = s_tem | tplsb;if (s_tem < 0)        /* 负温度 */f_tem = (~s_tem + 1) * 0.0625;elsef_tem = s_tem * 0.0625;return f_tem;
}float DS18B20_GetTemp_MatchRom(const uint8_t *ds18b20_id) {uint8_t tpmsb, tplsb, i;short s_tem;float f_tem;/* -------------匹配 ROM-START---------- */DS18B20_Rst();DS18B20_Presence();DS18B20_WriteByte(0X55);/* -------------匹配 ROM-END---------- */DS18B20_Rst();DS18B20_Presence();DS18B20_WriteByte(0X55);        /* 匹配 ROM */for (i = 0; i < 8; i++)DS18B20_WriteByte(ds18b20_id[i]);DS18B20_WriteByte(0X44);                /* 开始转换 *//* -------------匹配 ROM-START---------- */DS18B20_Rst();DS18B20_Presence();DS18B20_WriteByte(0X55);/* -------------匹配 ROM-END---------- */for (i = 0; i < 8; i++)DS18B20_WriteByte(ds18b20_id[i]);DS18B20_WriteByte(0XBE);                /* 读温度值 */tplsb = DS18B20_ReadByte();tpmsb = DS18B20_ReadByte();s_tem = tpmsb << 8;s_tem = s_tem | tplsb;if (s_tem < 0)        /* 负温度 */f_tem = (~s_tem + 1) * 0.0625;elsef_tem = s_tem * 0.0625;return f_tem;}static void DS18B20_WriteByte(uint8_t dat) {uint8_t i, testb;conf_ptr->out_mode_set();for (i = 0; i < 8; i++) {testb = dat & 0x01;dat = dat >> 1;/* 写0和写1的时间至少要大于60us */if (testb) {DS18B20_DQ_0;/* 1us < 这个延时 < 15us */conf_ptr->us_delay(8);DS18B20_DQ_1;conf_ptr->us_delay(58);} else {DS18B20_DQ_0;/* 60us < Tx 0 < 120us */conf_ptr->us_delay(70);DS18B20_DQ_1;/* 1us < Trec(恢复时间) < 无穷大*/conf_ptr->us_delay(2);}}
}/** 从DS18B20读取一个bit*/
static uint8_t DS18B20_ReadBit(void) {uint8_t dat;/* 读0和读1的时间至少要大于60us */conf_ptr->out_mode_set();/* 读时间的起始:必须由主机产生 >1us <15us 的低电平信号 */DS18B20_DQ_0;conf_ptr->us_delay(10);/* 设置成输入,释放总线,由外部上拉电阻将总线拉高 */conf_ptr->input_mode_set();//DHT11_DELAY_US(2);if (conf_ptr->read_data() == 1)dat = 1;elsedat = 0;/* 这个延时参数请参考时序图 */conf_ptr->us_delay(45);return dat;
}/** 从DS18B20读一个字节,低位先行*/
static uint8_t DS18B20_ReadByte(void) {uint8_t i, j, dat = 0;for (i = 0; i < 8; i++) {j = DS18B20_ReadBit();dat = (dat) | (j << i);}return dat;
}static bool DS18B20_Presence(void) {uint8_t pulse_time = 0;/* 主机设置为上拉输入 */conf_ptr->input_mode_set();/* 等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号* 如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/while (conf_ptr->read_data() && pulse_time < 100) {pulse_time++;conf_ptr->us_delay(1);}/* 经过100us后,存在脉冲都还没有到来*/if (pulse_time >= 100)return 1;elsepulse_time = 0;/* 存在脉冲到来,且存在的时间不能超过240us */while (!conf_ptr->read_data() && pulse_time < 240) {pulse_time++;conf_ptr->us_delay(1);}if (pulse_time >= 240)return false;elsereturn true;
}

测试配置

/*******************************************************************************Copyright (c) [scl]。保留所有权利。******************************************************************************/
#include "app_conf.h"#define APP_CONF_ENABLE_DS18B20 (1)
#if APP_CONF_ENABLE_DS18B20#include "ds18b20/module-ds18b20.h"#define DBG_ENABLE
#define DBG_SECTION_NAME "DS18B20"
#define DBG_LEVEL DBG_LOG // DBG_LOG DBG_INFO DBG_WARNING DBG_ERROR#include "sys_dbg.h"/*-********************************************DS18B20变量定义******************************************-*/
static DS18B20_conf_t ds18b20_conf;
static stm_pin_define_t *ds18b20_pin_ptr = NULL;static void out_mode_set(void) { stm32_pin_define_mode_set(ds18b20_pin_ptr, pin_mode_output); }static void input_mode_set(void) { stm32_pin_define_mode_set(ds18b20_pin_ptr, pin_mode_input); }static void send_data(uint32_t status) { stm32_pin_define_set(ds18b20_pin_ptr, status); }static uint32_t read_data(void) { return stm32_pin_define_read(ds18b20_pin_ptr); }/*-********************************************DS18B20_pre_init******************************************-*/
static void DS18B20_pre_init() {ds18b20_pin_ptr = stm_get_pin(PE6);ds18b20_conf.us_delay = bsp_us_delay_nop;ds18b20_conf.out_mode_set = out_mode_set;ds18b20_conf.input_mode_set = input_mode_set;ds18b20_conf.send_data = send_data;ds18b20_conf.read_data = read_data;DS18B20_conf_set(&ds18b20_conf);
}sys_pre_init_export(DS18B20, DS18B20_pre_init);/*-********************************************DS18B20_init******************************************-*/
static void DS18B20_init() {while (!DS18B20_Driver_Init()) {};LOG_D("DS18B20_Driver_Init ok");}sys_init_export(DS18B20, DS18B20_init);/*-***********************************************DS18B20_after_init***************************************-*/
static void DS18B20_after_init() {uint8_t uc, ucDs18b20Id[8];DS18B20_readId(ucDs18b20Id); // 读取 DS18B20 的序列号os_ps("DS18B20_readId:");for (int i = 0; i < 8; ++i) {os_ps("%X", ucDs18b20Id[i]);}os_ps("\r\n");while (true) {float temp = DS18B20_GetTemp_MatchRom(ucDs18b20Id);LOG_D("TEMP is %0.3f", temp);HAL_Delay(1000);}
}sys_after_init_export(DS18B20, DS18B20_after_init);/*-**************************************DS18B20内部使用************************************************-*/#endif //APP_CONF_ENABLE_DS18B20

结果

在这里插入图片描述

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

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

相关文章

OAuth机制_web站点接入微软azure账号进行三方登录

文章目录 ⭐前言⭐微软三方登录流程&#x1f496; web站点获取微软账号流程&#x1f496; node封装微软登录接口&#x1f496; webapp 自定义code换token&#x1f496; 调用 Microsoft Graph API&#x1f496; 前端唤醒authlink进行登录回调逻辑 ⭐结束 ⭐前言 大家好&#xf…

sublime配置less的一些坑(1)

仅在sublime的Install Package安装保存less报错 在sublime的Install Package安装less 打开sublime软件,按住CtrlShiftP组合键,弹出的界面中选择Install Package 选中后enter或者回车。等会弹出一个弹窗,大致意思是说你已经成功安装了package control。如果你在此之前已经安装了…

【论文精读】MemSum: 基于历史决策的多步长文本抽取式摘要方法

前言 论文分享 来自2022ACL的长文本抽取式摘要方法论文 MemSum: Extractive Summarization of Long Documents Using Multi-Step Episodic Markov Decision Processes 自动文本摘要抽取可以分为抽取式(extractive)和抽象性式(abstractive)&#xff0c;抽取式方法将摘要抽取任…

【Uniapp】支付链转二维码

前言 提示&#xff1a;这个是一个很小的项目&#xff0c;大概30分钟就能搞定 实现方式&#xff1a;输入支付代码&#xff0c;存储到对应的数据库表中&#xff0c;二维码访问一个PHP文件通过id来进行重定向&#xff0c;这样就可以使每张二维码都是固定的&#xff0c;替换二维码…

11-矩阵的运算_加减法_数乘_转置

矩阵的运算 加法&#xff0c;数乘&#xff0c;减法&#xff0c;转置 矩阵的加减 矩阵的加法就是矩阵的对应位置相加&#xff0c;减法也是一样就是对应位置相减 数乘 转置 转置的操作和向量是一样的&#xff0c;就是把 aij 变成 aji&#xff0c;把行和列互换一下 对于矩阵而…

【Android常见问题(五)】- Flutter项目性能优化

文章目录 知识回顾前言源码分析1. 渲染过程2. 分析工具3. 优化方法合理使用const关键词合理使用组件管理着色器编译垃圾 知识回顾 前言 项目迭代开发一定程度后&#xff0c;性能优化是重中之重&#xff0c;其中包括了包体积&#xff0c;UI 渲染、交互等多个方面。 通过 Flutt…

Zotero ubuntu2023安装 关联 ubuntu文献翻译

一、准备下载的软件&#xff1a; Zotero | Downloads 1. Zotero-6.0.26_linux-x86_64.tar.bz2 下面是插件 zotfile-5.1.2-fx.xpi zotero-pdf-translate.xpi jasminum-v0.2.6.xpi 2.2.5 Tampermonkey 4.11.crx 所准备的文件&#xff0c;都已经在这个链接的压缩包下面 …

动态内存管理学习分享

动态内存管理学习分享 1. 为什么存在动态内存分配2. 动态内存函数的介绍2.1 [malloc](https://legacy.cplusplus.com/reference/cstdlib/malloc/?kwmalloc)和[free](https://legacy.cplusplus.com/reference/cstdlib/free/?kwfree)2.1.1 实例 2.2 [calloc](https://legacy.cp…

小程序----配置原生内置编译插件支持sass

修改project.config.json配置文件 在 project.config.json 文件中&#xff0c;修改setting 下的 useCompilerPlugins 字段为 ["sass"]&#xff0c; 即可开启工具内置的 sass 编译插件。 目前支持三个编译插件&#xff1a;typescript、less、sass 修改之后可以将原.w…

持续贡献开源力量,棱镜七彩加入openKylin

近日&#xff0c;棱镜七彩签署 openKylin 社区 CLA&#xff08;Contributor License Agreement 贡献者许可协议&#xff09;&#xff0c;正式加入openKylin 开源社区。 棱镜七彩成立于2016年&#xff0c;是一家专注于开源安全、软件供应链安全的创新型科技企业。自成立以来&…

【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多&#xff0c;新手可以看下 《【MQTT】Esp32数据上传采集&#xff1a;最新mqtt插件&#xff08;支…

使用3ds Max粒子系统创建飞天箭雨特效场景

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 设置箭头 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 我使用多边形建模技术制作了一个简单的箭头&#xff0c;我将 在教程中使用。.max您可以从 下载部分。 箭头.max 步骤 3 将此箭头重命名为静态…

【计算复杂性理论】证明复杂性(八):命题鸽巢原理(Propositional Pigeonhole Principle)的指数级归结下界

往期文章&#xff1a; 【计算复杂性理论】证明复杂性&#xff08;Proof Complexity&#xff09;&#xff08;一&#xff09;&#xff1a;简介 【计算复杂性理论】证明复杂性&#xff08;二&#xff09;&#xff1a;归结&#xff08;Resolution&#xff09;与扩展归结&#xff…

CentOS 7.6使用yum安装stress,源码安装stree-ng 0.15.06,源码安装sysstat 12.7.2

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64 yum install stress sysstat -y安装stress和sysstat。 使用pidstat -u 5 1没有%wait项&#xff1a; 原因是CentOS 7仓…

13.7 CentOS 7 环境下大量创建帐号的方法

13.7.1 一些帐号相关的检查工具 pwck pwck 这个指令在检查 /etc/passwd 这个帐号配置文件内的信息&#xff0c;与实际的主文件夹是否存在等信息&#xff0c; 还可以比对 /etc/passwd /etc/shadow 的信息是否一致&#xff0c;另外&#xff0c;如果 /etc/passwd 内的数据字段错…

用C语言构建一个手写数字识别神经网络

(原理和程序基本框架请参见前一篇 "用C语言构建了一个简单的神经网路") &#xff11;&#xff0e;准备训练和测试数据集 从http://yann.lecun.com/exdb/mnist/下载手写数字训练数据集, 包括图像数据train-images-idx3-ubyte.gz 和标签数据 train-labels-idx1-ubyte.…

芯片制造详解.光刻技术与基本流程.学习笔记(四)

本篇文章是看了以下视频后的笔记提炼&#xff0c;欢迎各位观看原视频&#xff0c;这里附上地址 芯片制造详解04&#xff1a;光刻技术与基本流程&#xff5c;国产之路不容易 芯片制造详解.光刻技术与基本流程.学习笔记 四 一、引子二、光刻(1).光掩膜(2).光刻机(3).光刻胶(4).挖…

宝塔设置云服务器mysql端口转发,实现本地电脑访问云mysql

环境&#xff1a;centos系统使用宝塔面板 实现功能&#xff1a;宝塔设置云服务器mysql端口转发&#xff0c;实现本地电脑访问mysql 1.安装mysql、PHP-7.4.33、phpMyAdmin 5.0 软件商店》搜索 mysql安装即可 软件商店》搜索 PHP安装7.4.33即可&#xff08;只需要勾选快速安装&…

按键消抖(有/无状态机)

一&#xff0c;理论概念 按键抖动 按键抖动&#xff1a;按键抖动通常的按键所用开关为机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子断开。因而在闭…

数据结构: 线性表(顺序表实现)

文章目录 1. 线性表的定义2. 线性表的顺序表示:顺序表2.1 概念及结构2.2 接口实现2.2.1 顺序表初始化 (SeqListInit)2.2.2 顺序表尾插 (SeqListPushBack)2.2.3 顺序表打印 (SeqListPrint)2.2.6 顺序表销毁 (SeqListDestroy)2.2.5 顺序表尾删 (SeqListPopBack)2.2.6 顺序表头插 …