基于STM32_DS18B20单总线传感器驱动
基于STM32_DS18B20单总线传感器驱动
文章目录
- 基于STM32_DS18B20单总线传感器驱动
- 前言
- 一、BS18B20?
- 二、原理
- 1.复位与检验
- 2.基本命令
- 3.唯一ROM识别码
- 4.温度转换
- 三、驱动代码
- 四、注意事项
前言
本文以一款典型的单总线传感器及其驱动——DS18B20为例,简单对1-Wire总线接口的传感器做个示例讲解,该项目基于硬件平台STM32F407,使用标准库本完成。
一、BS18B20?
DS18B20数字温度计提供9至12位(可配置)温度读数,指示设备的温度。信息通过1-Wire总线接口发送到/从DS18B20,因此只需要从中央微处理器连接到DS18B20的一根线(和接地)。读取、写入和执行温度转换的电源可以从数据线本身获得,而不需要外部电源。每个DS18B20都包含一个唯一的硅序列号,所以多个DS18B20可以存在于同一个1-Wire总线上。这允许在许多不同的地方放置温度传感器。此功能有用的应用包括暖通空调环境控制,感应建筑物,设备或机械内部的温度,以及过程监控和控制。

特点:
1.唯一的1线接口只需要一个端口引脚进行通信
2.多功能简化了分布式温度传感应用
3.不需要外部组件,可从数据线供电。
4.供电范围3.0V至5.5V 零待机电源
5.测量温度范围为-55°C至+125°C。相当于-67°F到+257°F ±0.5°C精度从-10°C到+85°C
6.温度计分辨率可编程从9到12位
二、原理
1.复位与检验
主机发送(TX)复位脉冲(低信号,至少480µs),然后主机释放线路并进入接收模式(RX),线总线通过5k上拉电阻拉到高状态。在检测到DQ引脚上的上升沿后,DS18B20等待15-60µs,然后发送存在脉冲(60-240µs的低电平信号),主机在该时段检测到DQ的低电平信号,表示DS18B20设备存在,否则设备不存在。参见驱动中:void DS18B20_Reset(void)和uint8_t DS18B20_Check(void)函数。

2.基本命令
DS18B20常见的命令及含义如表所示:
| 名称 | 命令码 | 功能 |
|---|---|---|
| Read ROM | 33h | 该命令允许总线主机读取DS18B20的8位族码、唯一的48位序列号和8位CRC。该命令只能在总线上有单个DS18B20时使用。如果总线上有多个从站,当所有从站试图同时传输时,就会发生数据冲突(open drain将产生有线AND结果)。 |
| Match ROM | 55h | match ROM命令,后跟64位ROM序列,允许总线主机在多路总线上寻址特定的DS18B20。只有与64位ROM序列完全匹配的DS18B20才会响应以下内存功能命令。所有与64位ROM序列不匹配的从存储器将等待复位脉冲。该命令可用于总线上的单个或多个设备。 |
| Skip ROM | CCh | 该命令允许总线主机在不提供64位ROM代码的情况下访问内存功能,从而在单丢总线系统中节省时间。如果总线上有一个以上的从站,并且在Skip ROM命令之后发出了Read命令,那么当多个从站同时传输时,总线上就会发生数据冲突(open drain下拉将产生一个有线and结果)。相当于跳过了识别码查验,直接读取温度 |
| Search ROM | F0h | 当系统最初启动时,总线主机可能不知道1-Wire总线上的设备数量或它们的64位ROM代码。搜索ROM命令允许总线主人使用消除过程来识别总线上所有从设备的64位ROM代码。 |
| Read Scratchpad | BEh | 该命令读取刮记本的内容。读取将从字节0开始,并将继续通过刮擦板,直到读取第九个(字节8,CRC)字节。如果不是所有的位置都要读取,主机可以在任何时候发出复位以终止读取。 |
| Search ROM | 44h | 该命令开始温度转换。无需进一步收集数据。温度转换将被执行,然后DS18B20将保持空闲。如果总线主机按照该命令发出读时隙,只要DS18B20忙于进行温度转换,它就会在总线上输出0;当温度转换完成时,它将返回一个1。如果parasitepowered,总线主必须在发出该命令后立即启用一个大于tconv的强上拉。 |
基本操作过程参见官方手册给出的如下流程图

3.唯一ROM识别码
每个DS18B20包含一个64位长的唯一ROM代码。发送0x33命令后可读取改64位识别码,前8位是1-Wire族代码(DS18B20代码为28h)。接下来的48位是唯一的序列号。最后8位是前56位的CRC(CRC = X8 + X5 + X4 + 1),(参见图4)。当有多个DS18B20设备同时挂在1-Wire总线下时,可通过发送0x55匹配命令后发送识别码来匹配ROM识别码来确定控制或读取哪一个DS18B20设备数据。以前的方式是先准确无误得读取每个DS18B20设备唯一ROM识别码并提前写入代码中,如果某个传感器设备损坏,更换传感器设备的同时要更改代码或识别码配置文件。后来手册中给出一个Search ROM命令(暂时没试过)。

4.温度转换
DS18B20的核心功能是其直接数字温度传感器。DS18B20的分辨率是可配置的(9,10,11或12位),12位读数为出厂默认状态。这相当于0.5°C, 0.25°C, 0.125°C或0.0625°C的温度分辨率。在发出Convert T [44h]命令后,执行温度转换,热数据以16位扩展符号的二进制补码格式存储在刮板存储器中。一旦转换完成,可以通过发出Read Scratchpad [BEh]命令在1-Wire接口上检索温度信息。数据通过1-Wire总线传输,首先是LSB总线。温度寄存器的MSB包含“符号”(S)位,表示温度是正的还是负的。表2描述了输出数据与测量温度的确切关系。该表采用12位分辨率。转换方式参见驱动void DS18B20_GetTemp_Main(void)函数。

三、驱动代码
.h文件:
#ifndef __DS18B20_H
#define __DS18B20_H#include "stdio.h"
#include "Config.h"
#include "SysTick.h"/********************************************DS18B20 devier********************************************/
#define DS18B20_IS_READY (1u) //设备存在
#define DS18B20_NOT_READY (0u) //设备不存在#define DS18B20_DQ_IN() {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;} //PG9 输入模式
#define DS18B20_DQ_OUT() {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=1<<9*2;} //PG9 输出模式#define DS18B20_DQ_PORT GPIOG
#define DS18B20_DQ_PIN GPIO_Pin_9#define DS18B20_WAIT_TIMEOUT (uint8_t)240 //等待时间
#define DS18B20_DELAY (uint8_t)5 //延时时间#define DS18B20_DQ_LOW GPIO_ResetBits(DS18B20_DQ_PORT,DS18B20_DQ_PIN) //为设置低电平
#define DS18B20_DQ_HIGH GPIO_SetBits(DS18B20_DQ_PORT,DS18B20_DQ_PIN) //设置为高电平 #define DS18B20_DQ_STATUS GPIO_ReadInputDataBit(DS18B20_DQ_PORT,DS18B20_DQ_PIN) //读取DQ状态#define DS18B20_delay_us(a) SysCtlDelayus(a) //延时函数ustypedef enum
{DS18B20_1 = 0,DS18B20_2,DS18B20_3,DS18B20_4,DS18B20_Num_Counter
}DS18B20_Num;/*DS18B20_SerialNumber
------------------------------------------------------------------------------------
| 8-BIT CRC CODE | 48-BIT SERIAL NUMBER | 8-BIT FAMILY CODE(28h) |
------------------------------------------------------------------------------------
MSB LSB MSB LSB MSB LSB
*/
typedef struct
{uint8_t DS18B20_IndexNumber; //设备编号uint8_t DS18B20_SerialNumber[8]; //ROM唯一识别码short DS18B20_Temperature; //温度数据
}DS18B20_ATTRIB_Type;extern uint8_t DS18B20_Init(void);
extern void DS18B20_Reset(void);
extern short DS18B20_Get_Temperature(uint8_t Index_Num);
extern void DS18B20_GetTemp_Main(void);#endif
.c文件:
#include "DS18B20_Dev.h"//#define DS18B20_MORE_THAN_ONE static DS18B20_ATTRIB_Type DS18B20_Temp[DS18B20_Num_Counter] = {{DS18B20_1,{0x08,0x22,0x70,0xB0,0x9C,0x87,0x28},0u},{DS18B20_2,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u},{DS18B20_3,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u},{DS18B20_4,{0x00,0x00,0x00,0x00,0x00,0x00,0x00},0u}, };static uint8_t DS18B20_Check(void);
static uint8_t DS18B20_Read_Bit(void);
static uint8_t DS18B20_Read_Byte(void);
static void DS18B20_Write_Byte(uint8_t aByte);
static uint8_t DS18B20_Get_RomID(uint8_t *ID_Buffer);/************************************************************************************
*@fuction :DS18B20_Init
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
extern uint8_t DS18B20_Init(void)
{DS18B20_Reset();if(DS18B20_Check() == DS18B20_IS_READY){#ifdef DS18B20_MORE_THAN_ONEDS18B20_Get_RomID(DS18B20_Temp[0].DS18B20_SerialNumber);#elsereturn DS18B20_IS_READY;#endif}
}/************************************************************************************
*@fuction :DS18B20_Start
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
void DS18B20_Start(void)
{DS18B20_Reset(); if(DS18B20_Check() == DS18B20_IS_READY) {DS18B20_Write_Byte(0xCC); //skip romDS18B20_Write_Byte(0x44); //convert}else{//error}
}/************************************************************************************
*@fuction :DS18B20_Reset
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
void DS18B20_Reset(void)
{//DS18B20 复位时序:DQ输出模式 DQ = 0(750us), DQ = 0(20us.DS18B20_DQ_OUT();DS18B20_DQ_LOW;DS18B20_delay_us(750);DS18B20_DQ_HIGH;DS18B20_delay_us(15);
}/************************************************************************************
*@fuction :DS18B20_Check
*@brief :
*@param :--
*@return :1-device ok/0-device error
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
uint8_t DS18B20_Check(void)
{uint8_t wait_time = 0;uint8_t Ready_Dev = 0;//DQ输入模式DS18B20_DQ_IN();//等待DQ脚被DS18B20拉低while((DS18B20_DQ_STATUS) && (wait_time < DS18B20_WAIT_TIMEOUT)){wait_time++;DS18B20_delay_us(1);}if(wait_time >= DS18B20_WAIT_TIMEOUT){//如果等待时间超时,则退出等待return (uint8_t)DS18B20_NOT_READY;}else{//等待DQ脚被DS18B20抬高wait_time = 0;while((!DS18B20_DQ_STATUS) && (wait_time < DS18B20_WAIT_TIMEOUT)){wait_time++;DS18B20_delay_us(1);}if(wait_time >= DS18B20_WAIT_TIMEOUT){//如果等待时间超时,则退出等待return (uint8_t)DS18B20_NOT_READY;}else{//如果未超时,则说明设备存在return (uint8_t)DS18B20_IS_READY; }}
}/************************************************************************************
*@fuction :DS18B20_Write_Byte
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
static void DS18B20_Write_Byte(uint8_t aByte)
{ uint8_t i = 0;uint8_t temp = 0;//将DQ设置为输出模式DS18B20_DQ_OUT();for(i = 0;i < 8;i++){temp = aByte&0x01;aByte = aByte>>1;if(temp){ //最低位为1DS18B20_DQ_LOW;DS18B20_delay_us(2);DS18B20_DQ_HIGH;DS18B20_delay_us(60); }else{ //最低位为0DS18B20_DQ_LOW;DS18B20_delay_us(60);DS18B20_DQ_HIGH;DS18B20_delay_us(2);} }
}/************************************************************************************
*@fuction :DS18B20_Read_Bit
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
static uint8_t DS18B20_Read_Bit(void) //read one bit
{uint8_t Bit_Status;DS18B20_DQ_OUT(); //SET PG9 OUTPUTDS18B20_DQ_LOW; DS18B20_delay_us(2);DS18B20_DQ_HIGH; DS18B20_DQ_IN(); //SET PG9 INPUTDS18B20_delay_us(12); if(DS18B20_DQ_STATUS){Bit_Status = 1;}else{ Bit_Status = 0;} DS18B20_delay_us(50);return Bit_Status;
}
/************************************************************************************
*@fuction :DS18B20_Read_Byte
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
static uint8_t DS18B20_Read_Byte(void)
{uint8_t i = 0 ,Bit_Status = 0,aByte = 0;//DQ为输入模式DS18B20_DQ_IN();for (i = 0; i < 8; i++){//低位先出Bit_Status = DS18B20_Read_Bit();aByte = (Bit_Status << 7) | (aByte >> 1);}return aByte;
}/************************************************************************************
*@fuction :DS18B20_Read_Byte
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
static uint8_t DS18B20_Get_RomID(uint8_t *ID_Buffer)
{//uint8_t RomID[8];uint8_t i = 0;//DS18B20_Start(); // ds1820 start convertDS18B20_Reset();DS18B20_Check(); DS18B20_Write_Byte(0x33); // skip rom//SDA为输入模式DS18B20_DQ_IN();for (i = 0; i < 8; i++){ID_Buffer[i] = DS18B20_Read_Byte();}//return aByte;
}/************************************************************************************
*@fuction :DS18B20_GetTemp_Main
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
void DS18B20_GetTemp_Main(void)
{uint8_t temp;uint8_t TL,TH;short Temperature;DS18B20_Start(); // ds1820 start convertDS18B20_Reset();DS18B20_Check(); DS18B20_Write_Byte(0xCC); // skip romDS18B20_Write_Byte(0xBE); // read TL = DS18B20_Read_Byte(); // LSB TH = DS18B20_Read_Byte(); // MSB if(TH > 7){TH = ~TH;TL = ~TL; temp = 0; //温度为负 }else{ temp = 1; //温度为正} Temperature = TH; //获得高八位Temperature <<= 8; Temperature += TL; //获得低八位Temperature = (double)Temperature * 0.625; //转换 if(temp){DS18B20_Temp[0].DS18B20_Temperature = Temperature; //返回温度值}else {DS18B20_Temp[0].DS18B20_Temperature = -Temperature;}
}/************************************************************************************
*@fuction :DS18B20_Get_Temperature
*@brief :
*@param :--
*@return :void
*@author :_Awen
*@date :2022-12-04
************************************************************************************/
extern short DS18B20_Get_Temperature(uint8_t Index)
{return DS18B20_Temp[0].DS18B20_Temperature;
}
四、注意事项
1.硬件电路中DQ脚外部会加上拉电阻,主机释放总线会被上拉电阻自动上拉,但为保险器件我们将主机释放中线写为主动上拉为高电平
2. .h文件中对延时函数DS18B20_delay_us(a)的定义,关于 SysCtlDelayus(a)实际是ARM汇编的一种延时函数的写法,参见另一篇关于延时函数的博客(汇编延时)https://blog.csdn.net/Yin_w/article/details/130036593?spm=1001.2014.3001.5501
相关文章:
基于STM32_DS18B20单总线传感器驱动
基于STM32_DS18B20单总线传感器驱动 文章目录 基于STM32_DS18B20单总线传感器驱动前言一、BS18B20?二、原理1.复位与检验2.基本命令3.唯一ROM识别码4.温度转换 三、驱动代码四、注意事项 前言 本文以一款典型的单总线传感器及其驱动——DS18B20为例,简单…...
目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型(三)
前言 目标识别如今以及迭代了这么多年,普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性…...
springboot线程池创建与使用
/*** author: zcs* Title: TaskPoolConfig* Description: 线程池配置* date: 2023/10/11 17:52*/ Component public class TaskPoolConfig {Bean(name "threadPoolTaskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor taskExecutor new ThreadP…...
UDP和TCP特点(部分)对比:
传输层的两个主要协议:TCP 和 UDP UDP和TCP特点(部分)对比: UDP:无连接, 不可靠传输, 面向数据报, 全双工。 TCP:有连接, 可靠传输, 面向字节流…...
PostMan环境变量、全局变量、动态参数使用
一、环境准备 postmanmoco [{"description": "登录认证","request": {"uri": "/login","method": "post","forms": {"user": "admin","password": "a123…...
服务器数据恢复-服务器硬盘指示灯黄灯闪烁的数据恢复案例
服务器数据恢复环境: 服务器面板上的硬盘指示灯显示黄色是一种警告,提示指示灯对应的服务器硬盘已经被服务器识别出存在故障,硬盘即将下线。如果出现这种情况,建议服务器管理员/运维人员及时用完好的硬盘替换显示黄色指示灯对应的…...
ts 分发
在 TypeScript 中,"分发"(distributive)是指在条件类型中的联合类型上自动进行类型推断的机制。当使用条件类型操作联合类型时,TypeScript 会自动将联合类型中的每个成员都应用该条件类型。 下面是一个示例:…...
SQL中的group by使用注意事项
在 SQL 中,GROUP BY 语句用于将查询结果按照指定的列进行分组,并对每个分组计算聚合函数(如 SUM、AVG、COUNT 等)的值。一般情况下,如果查询中包含聚合函数,那么就需要使用 GROUP BY 语句将查询结果按照指定…...
矩阵剪辑系统源码----pc/手机端双开发
剪辑系统,剪辑矩阵系统,剪辑矩阵系统主要是针对抖音、快手、bili平台的一个工具,今天就来给大家交流一下这 个产品的主要功能以及构成。剪辑矩阵系统,矩阵剪辑系统源码-这产品主要功能就是一个视频剪辑功能,这个视频剪…...
0基础学习VR全景平台篇 第106篇:认识调色软件Lightroom
上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 正式开讲之前需要先引出一个概念:到底什么是调色? 比如说上面这张照片,你可能会具体的指出照片中的元素有天空、山脉、草地等…… 如果我们跳出我们的固…...
React如何优化减少组件间的重新Render
目前写了不少React的项目,发现React有些特点更灵活和注重细节,很多东西需要有一定的内功才能掌握好;比如在项目中常常遇到的组件重复渲染,有时候组件重复渲染如果内容是纯文本,不打印日志就不容易发现重复渲染了&#…...
mysql面试题44:MySQL数据库cpu飙升的话,要怎么处理?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL数据库cpu飙升的话,要怎么处理呢? 当MySQL数据库的CPU使用率飙升时,可能表示数据库负载过重或存在性能问题。以下是处理MySQL数据库CPU飙…...
动画圆圈文字标志效果
效果展示 CSS 知识点 实现圆圈文字animation 属性回顾 实现思路 从效果的实现思路很简单,其实就是两个圆圈就可以实现。外层大圆(灰色)用于圆圈文字的展示,而内圆(藏青色)主要用于存放 Logo 图片。布局采…...
【数据结构】二叉树--顺序结构及实现 (堆)
目录 一 二叉树的顺序结构 二 堆的概念及结构 三 堆的实现 1 包含所有接口 (Heap.h) 2 初始化,销毁和交换(Heap.c) 3 向上调整(Heap.c) 4 插入(Heap.c) 5 向下调整(Heap.c) 6 删除(Heap.c) 7 打印&#…...
适用于嵌入式单片机的差分升级通用库
转至:痞子衡嵌入式半月刊:第 81 期 1、mcu_bsdiff_upgrade - 适用于嵌入式单片机的差分升级通用库 mcu_bsdiff_upgrade 是一款适用于嵌入式单片机的差分升级库,通用所有单片机,如stm32、华大、复旦微、瑞萨等。适合嵌入式的差分升…...
Exposure Normalization and Compensation for Multiple-Exposure Correction 论文阅读笔记
这是CVPR2022的一篇曝光校正的文章,是中科大的。一作作者按同样的思路(现有方法加一个自己设计的即插即用模块以提高性能的思路)在CVPR2023也发了一篇文章,名字是Learning Sample Relationship for Exposure Correction。 文章的…...
Arduino驱动BMI160 6轴惯性运动传感器(惯性测量传感器篇)
目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序...
数据挖掘实战(3):如何对比特币走势进行预测?
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...
巴以冲突中暴露的摄像头正对安全构成威胁
巴以冲突爆发后,许多配置不当的安全摄像头正暴露给黑客活动分子,使其周遭人员面临巨大安全风险。 Cybernews 研究人员发现,在以色列至少有165 个暴露的联网 RTSP 摄像头,在巴勒斯坦有 29 个暴露的 RTSP 摄像头。在巴勒斯坦&am…...
【Redis】Redis性能优化:理解与使用Redis Pipeline
原创不易,注重版权。转载请注明原作者和原文链接 文章目录 Pipeline介绍原生批命令(MSET, MGET) VS PipelinePipeline的优缺点一些疑问Pipeline代码实现 当我们谈论Redis数据处理和存储的优化方法时,「 Redis Pipeline」无疑是一个不能忽视的重要技术。…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
