DS18B20温度传感器

64-BITROM:作为器件地址,用于总线通信的寻址,是唯一的,不可更改
SCRATCHPAD(暂存器):用于总线的数据交互
EEPROM:用于保存温度触发阈值和配置参数
暂存器

单总线
单总线(1-Wire BUS)是由Dallas公司开发的一种通用数据总线
一根通信线:DQ
异步、半双工
单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供
电时,还可以省去设备的VDD线路,此时,供电加通信只需要DQ
和GND两根线
单总线线路规范
设备的DQ均要配置成开漏输出模式
DQ添加一个上拉电阻,阻值一般为4.7KΩ左右
若此总线的从机采取寄生供电,则主机还应配一个强上拉输出电路

单总线时序结构
初始化
主机将总线拉低至少480us,然后释放总线,,等待15~60us后,
存在的从机会拉低总线60~240us以响应主机,之后从机将释放总线

  // 单总线初始化函数
u8 OneWire_Init()
{
    u8 i; 
   u8 AckBit;
    OneWire_DQ = 1; // 拉高总线
    OneWire_DQ = 0; // 产生复位脉冲
    i          = 227;
    while (--i); // 延迟500us
    OneWire_DQ = 1; // 释放总线
    i          = 29;
    while (--i); // 延迟70us
    AckBit = OneWire_DQ; // 读取从机响应
    i      = 227;
    while (--i); // 延迟500us
    return AckBit; // 返回响应位
} 
 
 
 
发送一位
主机将总线拉低60~120us,然后释放总线,表示发送0;主机将总线拉低1~15us,然后释放总线,表示发送1.从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60us

// 发送一位数据
void OneWire_SendBit(u8 bit1)
{
    u8 i;
    OneWire_DQ = 0; // 拉低总线
    i          = 4;
    while (--i); // 短暂延迟
    OneWire_DQ = bit1; // 发送数据位
    i          = 22;
    while (--i); // 延迟
    OneWire_DQ = 1; // 释放总线
} 
 
 
接收一位
主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),读取为低电平则为接收0,高电平则为接受1,整个时间片应大于60us

// 接收一位数据
u8 OneWire_ReceiveBit()
{
    u8 i;
    u8 bit2;
    OneWire_DQ = 0; // 拉低总线
    i          = 2;
    while (--i); // 短暂延迟
    OneWire_DQ = 1; // 释放总线
    i          = 2;
    while (--i); // 延迟
    bit2 = OneWire_DQ; // 读取数据位
    i   = 22;
    while (--i); // 延迟
    return bit2; // 返回数据位
} 
 
发送一个字节,接收一个字节(低位在前)

// 发送一个字节的数据
void OneWire_SendByte(u8 byte)
{
    u8 i;
    for (i = 0; i < 8; i++) {
        OneWire_SendBit((byte >> i) & 0x01); // 逐位发送字节
    }
}
// 接收一个字节的数据
u8 OneWire_ReceiveByte()
{
    u8 i;
    u8 byte = 0x00;
    for (i = 0; i < 8; i++) {
        if (OneWire_ReceiveBit()) {
            byte |= (0x01 << i); // 逐位接收字节
        }
    }
    return byte; // 返回接收到的字节
} 
 
操作流程
初始化:从机复位,主机判断从机是否响应
ROM操作:ROM指令+本指令需要的读写操作
功能操作:功能指令+本指令需要的读写操作

数据帧
温度变换

// 启动温度转换
void DS18B20_ConvertT()
{
   OneWire_Init(); // 初始化单总线
   OneWire_SendByte(DS18B20_SKIP_ROM); // 跳过ROM命令
   OneWire_SendByte(DS18B20_CONVERT_T); // 启动温度转换命令
} 
 
 
温度读取

// 读取温度值
float DS18B20_ReadT()
{
  u16 temp;  
  u8 TLSB, TMSB;
  float T;
   OneWire_Init(); // 初始化单总线
   OneWire_SendByte(DS18B20_SKIP_ROM); // 跳过ROM命令
   OneWire_SendByte(DS18B20_READ_SCRATCHPAD); // 读取暂存器命令
   TLSB = OneWire_ReceiveByte(); // 读取温度低字节
   TMSB = OneWire_ReceiveByte(); // 读取温度高字节
   temp = TMSB << 8 | TLSB; // 合并高低字节为16位温度值
   T = (float)temp / 16.0; // 转换为实际温度值
   return T; // 返回温度值
} 
                









![[系统安全] 六十一.恶意软件分析 (12)LLM赋能Lark工具提取XLM代码的抽象语法树(初探)](https://i-blog.csdnimg.cn/direct/df0705d85e37494f8937be2210ad0a7a.png#pic_center)








