wire单总线通信

server/2025/2/4 10:05:33/

概述:

1-Wire技术由美国Dallas Semiconductor公司于1989年首次推出,最初的1-Wire标准主要用于便携数据传输模块,减少了设备之间的连接复杂性

1-Wire单总线的核心特点

单线通信

  • 1-Wire协议通过一根信号线实现数据和时钟的双向传输,大大减少了硬件连接的复杂性。
  • 总线上的数据传输是双向的,主机和从机之间的通信通过时序控制来区分数据的发送和接收。

独特的设备识别方式

每个1-Wire从设备都有一个唯一的64位ROM ID,其中:

  • 48位序列号:用于唯一标识设备。
  • 8位家族代码:表示设备的类型或功能。
  • 8位CRC校验码:用于验证ROM ID的正确性。

1-Wire单总线的优缺点

优点

  • 节省I/O口线:仅需一根信号线和地线,大大减少了硬件资源的占用。

  • 结构简单:硬件连接简单,易于实现。

  • 成本低廉:由于硬件需求少,整体成本较低。

  • 易于扩展:可以方便地在总线上添加或移除设备。

  • 设备识别能力强:每个设备都有唯一的ROM ID,便于管理和识别。

缺点

  • 速度较慢1-Wire协议的传输速率相对较低,标准模式下为16.3Kbps,超速模式下为163Kbps,不适合高速数据传输。

  • 时序要求严格:协议对时序控制要求严格,开发和调试时需要精确控制时序。

1-Wire单总线的应用场景

温度传感器:如DS18B20。它可以通过1-Wire总线连接到主机,实现温度数据的采集。多个DS18B20可以连接到同一根1-Wire总线上,主机通过ROM ID区分不同的传感器。

存储设备:1-Wire协议也常用于小型存储设备,如EEPROM,用于存储配置信息或数据记录。

设备识别与管理:由于每个设备都有唯一的ROM ID,1-Wire总线可用于设备的识别和管理,例如在多设备系统中快速定位和配置设备。

时序控制

1-Wire协议对时序要求非常严格,包括复位、应答、写1位、写0位、读1位等时序。

  • 复位时序:主机通过拉低总线至少480μs来发起复位信号,从机在检测到复位信号后,会在15-60μs内发送一个应答脉冲

  • 写1位时序:主机拉低总线至少60μs后释放总线,保持高电平至少60μs。

  • 写0位时序:主机拉低总线至少60μs后继续拉低总线至少60μs。

  • 读1位时序:主机拉低总线15μs后释放总线,并在接下来的15μs内读取总线状态

DS18B20温度传感器介绍

本文将借用DS18B20温度传感器去实现wire单总线通信

The DS18B20 uses Dallas’ exclusive 1-Wire bus protocol that implements bus communication using one control signal. The control line requires a weak pullup resistor since all devices are linked to the bus via a 3-state or open-drain port (the DQ pin in the case of the DS18B20). In this bus system, the microprocessor (the master device) identifies and addresses devices on the bus using each device’s unique 64-bit code. Because each device has a unique code, the number of devices that can be addressed on one bus is virtually unlimited. The 1-Wire bus protocol, including detailed explanations of the commands and “time slots,” is covered in the 1-WIRE BUS SYSTEM section of this datasheet.
DS18B20采用达拉斯公司独有的1-Wire总线协议,通过一个控制信号实现总线通信。由于所有设备都通过三态或开漏端口连接到总线(对于DS18B20来说是DQ引脚),因此控制线需要一个弱上拉电阻。在这种总线系统中,微处理器(主设备)通过每个设备的唯一64位代码来识别和寻址总线上的设备。由于每个设备都有一个唯一的代码,因此理论上一个总线上可以寻址的设备数量是无限的。1-Wire总线协议,包括命令和“时序”的详细说明,将在本数据手册的“1-WIRE总线系统”部分进行介绍。

Another feature of the DS18B20 is the ability to operate without an external power supply. Power is instead supplied through the 1-Wire pullup resistor via the DQ pin when the bus is high. The high bus signal also charges an internal capacitor (CPP), which then supplies power to the device when the bus is
low. This method of deriving power from the 1-Wire bus is referred to as “parasite power.” As an alternative, the DS18B20 may also be powered by an external supply on VDD.

DS18B20的另一个特点是能够无需外部电源运行。相反,当总线处于高电平时,通过DQ引脚从1-Wire上拉电阻供电。高电平的总线信号还会为一个内部电容(CPP)充电,当总线处于低电平时,该电容为设备供电。这种从1-Wire总线获取电源的方法被称为“寄生电源”。作为替代方案,DS18B20也可以通过VDD引脚上的外部电源供电。

DS18B20 原理框图

64位ROM存储了设备的唯一序列码。暂存器(Scratchpad)内存包含2字节的温度寄存器,用于存储温度传感器的数字输出。此外,暂存器还提供了对1字节的上限和下限报警触发寄存器(TH和TL)以及1字节配置寄存器的访问。配置寄存器允许用户将温度到数字转换的分辨率设置为9位、10位、11位或12位。TH、TL和配置寄存器是非易失性的(EEPROM),因此即使设备断电,它们也能保留数据。 

MEASURING TEMPERATURE(温度测量 )

DS18B20的核心功能是其直接数字输出的温度传感器。该温度传感器的分辨率可由用户配置为9位、10位、11位或12位,分别对应0.5℃、0.25℃、0.125℃和0.0625℃的温度增量。上电时的默认分辨率为12位。DS18B20上电后处于低功耗空闲状态;要启动温度测量和模数转换,主设备必须发出“转换温度”(Convert T)[44h]命令。转换完成后,得到的温度数据存储在暂存器内存中的2字节温度寄存器内,DS18B20随后返回空闲状态。

DS18B20输出的温度数据以摄氏度为单位进行校准;对于华氏温度应用,必须使用查找表或转换程序。温度数据以16位带符号扩展的二进制补码形式存储在温度寄存器中。符号位(S)指示温度是正数还是负数:对于正数,S=0;对于负数,S=1。如果DS18B20配置为12位分辨率,则温度寄存器中的所有位都包含有效数据。对于11位分辨率,位0未定义。对于10位分辨率,位1和位0未定义,对于9位分辨率,位2、位1和位0未定义。下表给出了12位分辨率转换的数字输出数据示例及其对应的温度读数。

DS18B20 TRANSACTION SEQUENCE(事务序列)

64位ROM
Each DS18B20 contains a unique 64–bit code (see Figure 6) stored in ROM. The least significant 8 bits of the ROM code contain the DS18B20’s 1-Wire family code: 28h. The next 48 bits contain a unique serial number. The most significant 8 bits contain a cyclic redundancy check (CRC) byte that is calculated from the first 56 bits of the ROM code. A detailed explanation of the CRC bits is provided in the CRC GENERATION section. The 64-bit ROM code and associated ROM function control logic allow the DS18B20 to operate as a 1-Wire device using the protocol detailed in the 1-WIRE BUS SYSTEM section of this datasheet.
每个DS18B20都包含一个唯一的64位代码,存储在ROM中。该代码的最低8位是DS18B20的1-Wire家族代码:28h。接下来的48位是一个独特的序列号。最高8位是一个循环冗余校验(CRC)字节,该字节是根据ROM代码的前56位计算得出的。

 访问DS18B20的事务序列

The transaction sequence for accessing the DS18B20 is as follows:
Step 1. Initialization
Step 2. ROM Command (followed by any required data exchange)
Step 3. DS18B20 Function Command (followed by any required data exchange)
It is very important to follow this sequence every time the DS18B20 is accessed, as the DS18B20 will not respond if any steps in the sequence are missing or out of order. Exceptions to this rule are the Search ROM [F0h] and Alarm Search [ECh] commands. After issuing either of these ROM commands, the master must return to Step 1 in the sequence.

访问DS18B20的事务序列如下:

  1. 初始化

  2. ROM命令(随后进行任何必要的数据交换)

  3. DS18B20功能命令(随后进行任何必要的数据交换)

每次访问DS18B20时,都必须遵循这一序列,因为如果序列中的任何步骤缺失或顺序错误,DS18B20将不会响应。搜索ROM [F0h]和报警搜索 [ECh]命令是这一规则的例外。在发出这两个ROM命令中的任何一个之后,主设备必须返回到事务序列的第1步。

初始化: 
All transactions on the 1-Wire bus begin with an initialization sequence. The initialization sequence consists of a reset pulse transmitted by the bus master followed by presence pulse(s) transmitted by the slave(s). The presence pulse lets the bus master know that slave devices (such as the DS18B20) are on the bus and are ready to operate. Timing for the reset and presence pulses is detailed in the 1-WIRE SIGNALING section.

1-Wire总线上的所有事务都以初始化序列开始。初始化序列包括由总线主设备发送的复位脉冲,随后由从设备发送的存在脉冲。存在脉冲让总线主设备知道从设备(如DS18B20)在总线上并且已经准备好运行。

 ROM命令

在总线主设备检测到存在脉冲后,它可以发出一个ROM命令。这些命令作用于每个从设备的唯一64位ROM代码,并允许主设备在1-Wire总线上存在多个设备时,识别出特定的设备。这些命令还允许主设备确定总线上存在多少个设备以及它们的设备类型,或者是否有任何设备经历了报警条件。共有五个ROM命令,每个命令都是8位长。主设备必须在发出DS18B20功能命令之前发出适当的ROM命令。

 SEARCH ROM [F0h](搜索ROM命令
当系统最初上电时,主设备必须识别总线上所有从设备的ROM代码,这使得主设备能够确定从设备的数量及其设备类型。主设备通过一个逐步淘汰的过程学习ROM代码,该过程需要主设备执行尽可能多次的搜索ROM周期(即搜索ROM命令后跟数据交换),以识别所有从设备。在每个搜索ROM周期之后,总线主设备必须返回到事务序列的第1步(初始化)。
READ ROM [33h](读取ROM命令)
当总线上只有一个从设备时,才能使用此命令。它允许总线主设备在不使用搜索ROM过程的情况下读取从设备的64位ROM代码。如果在总线上存在多个从设备时使用此命令,当所有从设备同时尝试响应时,将发生数据冲突。
MATCH ROM [55h](匹配ROM命令
匹配ROM命令后跟一个64位ROM代码序列允许总线主设备在多点或单点总线上寻址特定的从设备。只有完全匹配64位ROM代码序列的从设备才会响应主设备发出的功能命令;总线上的其他所有从设备将等待复位脉冲。
SKIP ROM [CCh](跳过ROM命令
主机可以使用此命令同时向总线上的所有设备发送命令,而无需发送任何ROM代码信息。
例如,主机可以通过发送跳过ROM命令后跟转换温度命令(Convert T [44h]),让总线上的所有DS18B20同时进行温度转换。需要注意的是,读取暂存器命令(Read Scratchpad [BEh])只有在总线上只有一个从设备时才能跟在跳过ROM命令之后使用。在这种情况下,跳过ROM命令可以节省时间,因为它允许主机在不发送设备的64位ROM代码的情况下从从设备读取数据。但如果总线上有多个从设备,跳过ROM命令后跟读取暂存器命令将导致总线上的数据冲突,因为多个设备会同时尝试传输数据。
ALARM SEARCH [ECh](报警搜索命令
此命令的操作与搜索ROM命令相同,但只有设置了报警标志的从设备才会响应。该命令允许主设备确定是否有任何DS18B20在最近一次的温度转换中触发了报警条件。在每次报警搜索周期(即报警搜索命令后跟数据交换)之后,总线主设备必须返回到事务序列的第1步(初始化)。

DS18B20功能命令

After the bus master has used a ROM command to address the DS18B20 with which it wishes to communicate, the master can issue one of the DS18B20 function commands. These commands allow the master to write to and read from the DS18B20’s scratchpad memory, initiate temperature conversions and determine the power supply mode

在总线主设备使用ROM命令寻址到希望通信的DS18B20之后,主设备可以发出DS18B20的功能命令。这些命令允许主设备向DS18B20的暂存寄存器写入或读取数据,启动温度转换,以及确定供电模式。

CONVERT T [44h] (转换温度命令)

该命令启动一次温度转换。转换完成后,得到的温度数据存储在暂存器内存中的2字节温度寄存器内,DS18B20随后返回低功耗空闲状态。

如果DS18B20由外部电源供电,主设备可以在“转换温度”命令后发出读取时间槽,DS18B20将在温度转换进行时通过发送0响应,转换完成时通过发送1响应。

读取时间槽是一种特殊的1-Wire通信机制,用于查询DS18B20的状态。

WRITE SCRATCHPAD [4Eh](写暂存器命令

该命令允许主设备向DS18B20的暂存器写入3字节数据。第一个数据字节写入TH寄存器(暂存器的字节2),第二个字节写入TL寄存器(字节3),第三个字节写入配置寄存器(字节4)。数据必须从最低有效位开始传输。在主设备发出复位之前,必须写入所有三个字节,否则数据可能会损坏。

READ SCRATCHPAD [BEh](读暂存器命令

该命令允许主设备读取暂存器的内容。数据传输从字节0的最低有效位开始,一直读取到第9字节(字节8 - CRC)。如果只需要部分暂存器数据,主设备可以在任何时间发出复位以终止读取。

COPY SCRATCHPAD [48h](复制暂存器到EEPROM命令

该命令将暂存器中的TH、TL和配置寄存器的内容(字节2、3和4)复制到EEPROM中。如果设备处于寄生电源模式,在发出此命令后的10毫秒(最大值)内,主设备必须按照“DS18B20供电”部分的描述,在1-Wire总线上保持强上拉至少10ms。

RECALL E2 [B8h](从EEPROM召回数据命令) 

该命令从EEPROM召回报警触发值(TH和TL)和配置数据,并将数据分别放置在暂存器内存的字节2、3和4中。主设备可以在“召回EEPROM”命令后发出读取时间槽,DS18B20将在召回进行时通过拉低总线传输0,召回完成时通过保持高电平传输1。召回操作在上电时自动发生,因此设备上电后暂存器中立即有有效数据。

READ POWER SUPPLY [B4h](读取供电模式命令) 

主设备发出此命令后跟一个读取时间槽,以确定总线上的任何DS18B20是否使用寄生电源。在读取时间槽期间,使用寄生电源的DS18B20将拉低总线,而使用外部电源的DS18B20将保持总线高电平。

DS18B20时序控制

The DS18B20 uses a strict 1-Wire communication protocol to insure data integrity. Several signal types are defined by this protocol: reset pulse, presence pulse, write 0, write 1, read 0, and read 1. The bus master initiates all of these signals, with the exception of the presence pulse.

DS18B20采用严格的1-Wire通信协议以确保数据完整性。该协议定义了几种信号类型:复位脉冲、存在脉冲、写0、写1、读0和读1。除了存在脉冲外,总线主设备发起所有这些信号。

INITIALIZATION PROCEDURE(初始化过程)

RESET AND PRESENCE PULSES (复位和存在脉冲)

DS18B20的所有通信都从一个初始化序列开始,该序列包括一个来自主设备的复位脉冲,随后是DS18B20发出的存在脉冲。当DS18B20发送存在脉冲以响应复位脉冲时,它向主设备表明它在总线上并且准备好操作了。

在初始化过程中,总线主设备通过将1-Wire总线拉低至少480微秒来发送复位脉冲(TX)。然后主设备释放总线并进入接收模式(RX)。当总线被释放后,5kΩ的上拉电阻将1-Wire总线拉高。当DS18B20检测到这个上升沿后,它会等待15微秒到60微秒,然后通过拉低1-Wire总线60微秒到240微秒来发送存在脉冲

READ/WRITE TIME SLOTS(读/写时段) 

The bus master writes data to the DS18B20 during write time slots and reads data from the DS18B20 during read time slots. One bit of data is transmitted over the 1-Wire bus per time slot.

总线主设备在写时间槽期间向DS18B20写入数据,在读时间槽期间从DS18B20读取数据。每个时间槽通过1-Wire总线传输1位数据。

“时间槽”(Time Slot)是一个特定的时间段,用于定义数据传输的基本单元。

WRITE TIME SLOTS(写时段) 

存在两种类型的写时间槽:“写1”时间槽和“写0”时间槽。总线主设备使用“写1”时间槽向DS18B20写入逻辑1,使用“写0”时间槽向DS18B20写入逻辑0。所有写时间槽的持续时间必须至少为60微秒,并且在各个写时间槽之间至少需要1微秒的恢复时间。

两种类型的写时间槽都是由主设备将1-Wire总线拉低来启动的。

要生成“写1”时间槽,在将1-Wire总线拉低后,总线主设备必须在15微秒内释放1-Wire总线。当总线被释放时,5kΩ上拉电阻会将总线拉高。

要生成“写0”时间槽,在将1-Wire总线拉低后,总线主设备必须在整个时间槽期间(至少60微秒)持续将总线保持在低电平。

READ TIME SLOTS(读时段)

DS18B20只能在主设备发出读时间槽时向主设备传输数据。

因此,主设备必须在发出“读暂存器”(Read Scratchpad [BEh])或“读取供电模式”(Read Power Supply [B4h])命令后立即生成读时间槽,以便DS18B20能够提供所请求的数据。此外,主设备还可以在发出“转换温度”(Convert T [44h])或“召回EEPROM”(Recall E2 [B8h])命令后生成读时间槽。

所有读时间槽的持续时间必须至少为60微秒,并且在各个读时间槽之间至少需要1微秒的恢复时间。读时间槽由主设备将1-Wire总线拉低至少1微秒,然后释放总线来启动。在主设备启动读时间槽后,DS18B20将开始在总线上传输1或0。

DS18B20通过保持总线高电平来传输1,通过拉低总线来传输0。在传输0时,DS18B20将在时间槽结束前释放总线,总线将由上拉电阻拉回到高电平的空闲状态。

从DS18B20输出的数据在启动读时间槽的下降沿之后的15微秒内有效。因此,主设备必须在时间槽开始后的15微秒内释放总线并采样总线状态。

图15说明了对于一个读时间槽,TINIT(初始化时间)、TRC(恢复时间)和TSAMPLE(采样时间)的总和必须小于15微秒。

图16表明,通过尽可能缩短TINIT和TRC,并将主设备的采样时间定位在读时间槽的15微秒周期的末尾,可以最大化系统时序裕度。

  • 系统时序裕度:在满足时序要求的前提下,留出的时间余量,用于应对时序抖动或误差。

DS18B20 OPERATION EXAMPLE (操作实列) 

上图操作实例是DS18B20数据手册中所给的操作实例,作者只是加以简单阐述:

操作步骤

1.初始化阶段

  • TX Reset:主设备发出复位脉冲,初始化通信。
  • RX Presence:DS18B20响应存在脉冲,表明它们已准备好通信。

2.寻址特定设备

  • TX 55h:主设备发出匹配ROM命令,准备指定一个特定的DS18B20。
  • TX 64-bit ROM code:主设备发送64位ROM代码,指定要通信的DS18B20。

3.启动温度转换

  • TX 44h:主设备发出转换温度命令(Convert T),启动DS18B20的温度转换过程。
  • TX DQ line held high by strong pullup:主设备在转换期间(t_conv)对数据线(DQ)施加强上拉,以提供必要的电源。

4.读取暂存器

  • TX Reset:再次发出复位脉冲,准备新的通信周期。
  • RX Presence:DS18B20再次响应存在脉冲。
  • TX 55h:再次发出匹配ROM命令。
  • TX 64-bit ROM code:再次发送64位ROM代码。
  • TX BEh:主设备发出读取暂存器命令(Read Scratchpad),请求读取DS18B20的暂存器数据。
  • RX 9 data bytes:主设备读取包括CRC在内的整个暂存器数据。然后,主设备重新计算暂存器中前8个字节的CRC,并将其与读取的CRC(第9个字节)进行比较。如果它们匹配,主设备继续执行后续操作;如果不匹配,则重复读取操作。

代码实例 

 下面给出作者实际操作代码:

#include "wire_ds18b20.h"

#ifndef __HEAD_WIRE_DS18B20__
#define __HEAD_WIRE_DS18B20__#include "../../include/imx6ull.h"
#include <stdio.h>
#include <stdint.h>
#include "../uart/uart.h"
#include "../gpt/gpt.h"
#include "../interrupt/interrupt.h"#define DS_OUT_MODE() (GPIO5->GDIR |=(0x1<<2))
#define DS_IN_MODE() (GPIO5->GDIR &= ~(0x1<<2))
#define HIGH_LEVEL 1
#define LOW_LEVEL 0
#define DQ_OUTPUT_LEVEL(level) do{GPIO5->DR &= ~(0x1<<2);GPIO5->DR |=(level << 2);}while(0)extern void test_detection_ds18b20();
#endif

"wire_ds18b20.c" 

#include "wire_ds18b20.h"//GPIO管脚初始化
void gpio_ds18b20_init()
{/*SW_MUX_CTL_PAD_SNVS_TAMPER2 SW MUX Control Register101 ALT5 — Slect mux mode: ALT5 mux port, GPIO5_IO02 of instance - gpio5 */IOMUXC_SW_MUX_CTL_PAD_GPIO5_IO02 &= ~(0xf<<0);IOMUXC_SW_MUX_CTL_PAD_GPIO5_IO02 |= (0x5<<0);
}//读取数据
uint_fast8_t read_ds18b20_data()
{uint_fast8_t level;level = GPIO5->PSR & (0x1<<2);return level?1:0;
}//探测DS18B20设备
uint_fast32_t detection_ds18b20_equipment()
{//复位脉冲DS_OUT_MODE();DQ_OUTPUT_LEVEL(HIGH_LEVEL);gpt_delay_useconds(10);DQ_OUTPUT_LEVEL(LOW_LEVEL);gpt_delay_useconds(450);DS_IN_MODE();//存在脉冲gpt_delay_useconds(80);uint_fast8_t level = read_ds18b20_data();gpt_delay_useconds(400);if(level){uart_printf("detection_ds18b20_failure\r\n");return -1;}else{uart_printf("detection_ds18b20_success\r\n");return 0;}
}void write_ds18b20_bit(uint_fast8_t bit)
{if(bit){DS_OUT_MODE();DQ_OUTPUT_LEVEL(LOW_LEVEL);gpt_delay_useconds(10);DS_IN_MODE();gpt_delay_useconds(45);}else{DS_OUT_MODE();DQ_OUTPUT_LEVEL(LOW_LEVEL);gpt_delay_useconds(60);DS_IN_MODE();}
}void write_ds18b20_byte(uint_fast8_t data)
{int i;for(i=0;i<8;i++){//低位先写write_ds18b20_bit((data<<i) & 1);}
}uint_fast8_t read_ds18b20_bit()
{uint_fast8_t level;DS_OUT_MODE();DQ_OUTPUT_LEVEL(LOW_LEVEL);gpt_delay_useconds(3);DS_IN_MODE();gpt_delay_useconds(5);level = read_ds18b20_data();gpt_delay_useconds(40);return level;
}uint_fast8_t read_ds18b20_byte()
{int i;uint_fast8_t data_byte=0;for(i=0;i<8;i++){uint_fast8_t level = read_ds18b20_bit();if(level){data_byte |= (1<<i); }}return data_byte;
}//读取DS18B20的ROMID
uint_fast8_t read_ds18b20_romid()
{gpio_ds18b20_init();uint_fast32_t result = detection_ds18b20_equipment();if(result == -1){return -1;}/*READ ROM [33h]允许总线主机读取从站的64位ROM码*/write_ds18b20_byte(0x33);//每个DS18B20都包含一个存储在ROM中的唯一64位码uint_fast8_t romid[8];int i;for(i=0;i<8;i++){*(romid+i) = read_ds18b20_byte();}//family codeuart_printf("family code:%4x\r\n",*romid);//serial numberuart_printf("serial number:");for(i=1;i<7;i++){uart_printf("%4x",*(romid+i));}uart_printf("\r\n");uart_printf("crc:%4x\r\n",romid[7]);
}//读取DS18B20的采集温度
uint_fast8_t read_ds18b20_temperature()
{gpio_ds18b20_init();uint_fast32_t result = detection_ds18b20_equipment();if(result == -1){return -1;}/*通过发出SKIP ROM[CCh]命令后跟转换CONVERT T[44h]命令来使总线上的所有DS18B20同时执行温度转换。*/write_ds18b20_byte(0xCC);write_ds18b20_byte(0x44);result = detection_ds18b20_equipment();if(result == -1){return -1;}/*READ SCRATCHPAD [BEh]允许主机读取暂存器的内容*///write_ds18b20_byte(0xCC);write_ds18b20_byte(0xBE); uint_fast8_t temperature[2];int i;for(i=0;i<2;i++){*(temperature+i) = read_ds18b20_byte();}//整数部分uint_fast8_t integer_part = (temperature[1]<<4) | (temperature[0]>>4);//小数部分uint_fast8_t decimal_part = temperature[0] & 0xf;uint_fast16_t temperature_data = ((integer_part & 0xffff)<<4) | (decimal_part & 0xffff);//符号位uint_fast8_t symbol = temperature_data & (1<<7);if(symbol){/*取反+1 eg:+10.125°C 0000 0000 1010 0010-10.125°C 1111 1111 0101 1110*/temperature_data = ~temperature_data+1;}uart_printf("temperature data:%4x\r\n",temperature_data);
}void test_detection_ds18b20()
{//gpio_ds18b20_init();//detection_ds18b20_equipment();//read_ds18b20_romid();read_ds18b20_temperature();
}

结语:

无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力

 


http://www.ppmy.cn/server/164856.html

相关文章

Linux网络 HTTPS 协议原理

概念 HTTPS 也是一个应用层协议&#xff0c;不过 是在 HTTP 协议的基础上引入了一个加密层。因为 HTTP的内容是明文传输的&#xff0c;明文数据会经过路由器、wifi 热点、通信服务运营商、代理服务器等多个物理节点&#xff0c;如果信息在传输过程中被劫持&#xff0c;传输的…

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 导入需要的类# Important: # 你需要通过以下指令把 form.ui转为ui…

Prompt提示词完整案例:让chatGPT成为“书单推荐”的高手

大家好&#xff0c;我是老六哥&#xff0c;我正在共享使用AI提高工作效率的技巧。欢迎关注我&#xff0c;共同提高使用AI的技能&#xff0c;让AI成功你的个人助理。 许多人可能会跟老六哥一样&#xff0c;有过这样的体验&#xff1a;当我们遇到一个能力出众或对事物有独到见解的…

游戏引擎 Unity - Unity 设置为简体中文、Unity 创建项目

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

Debezium Oracle Connector SCN处理优化指南

Debezium Oracle Connector SCN处理优化指南 📌 问题场景 SCN跳跃场景: 起始SCN:15,000(含数据变更)结束SCN:1,000,000(无中间数据)默认批次大小:10,000 → 需执行985次无效查询🚀 优化方案 1. 自适应批次调整 代码位置:LogMinerStreamingChangeEventSource.j…

简单安全策略实验

一.实验准备 1.实验要求 2.实验拓扑图 3.进行交互配置 二.配置需求 开启设备在交换机上进行基础配置&#xff08;1&#xff09;让同一区间可以ping通 划分vlan并放通vlan 配置左侧设备 进入防火墙打开web服务 配置防火墙ip 配置前&#xff1a; 配置后&#xff1a; 按要求做实…

国土安全保障利器,高速巡飞无人机技术详解

高速巡飞无人机作为国土安全保障的利器&#xff0c;其技术特性和应用价值不可小觑。以下是对高速巡飞无人机技术的详细解析&#xff1a; 一、技术原理与关键组件 高速巡飞无人机的工作原理基于先进的飞行控制系统和制导技术。其核心组件主要包括&#xff1a; 1. 动力系统&…

网站快速收录:如何设置robots.txt文件?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/34.html 为了网站快速收录而合理设置robots.txt文件&#xff0c;需要遵循一定的规则和最佳实践。robots.txt文件是一个纯文本文件&#xff0c;它告诉搜索引擎爬虫哪些页面可以访问&#xff…