pipdaivd 2024-08-05 17:41 采纳率: 0%
浏览 20
已结题

看了正点原子的ds18b20自己跟着写完发现读出来全是1,查了一天找不出原因快哭了

感觉唯一有点差别的就是我把主机对DQ读写的封装了一下

img


然后剩下的读写时序我基本就是照抄过来的

img

img


但就是读出来全是1,我感觉是读那个地方应该有问题,但我看了下时序也没啥毛病啊'π_π

  • 写回答

12条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-08-05 17:42
    关注

    🕒下午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:落花人独立,微雨燕双飞。

    DS18B20 读取温度始终为1的解决方法

    你遇到的问题很常见,DS18B20 读取温度始终为 1 ,通常是以下几个方面的问题:

    1. 硬件连接错误:
      • 确认 DS18B20 的 VCC、GND、DQ 引脚连接正确,特别是 DQ 引脚要连接到 MCU 的 GPIO 引脚。
      • DS18B20 需要上拉电阻,通常为 4.7kΩ,连接在 DQ 和 VCC 之间。
    2. 时序问题:
      • 你对 DQ 读写的封装方式可能存在问题,导致时序不满足 DS18B20 的要求。DS18B20 对时序要求比较严格,特别是写 0 和写 1 的时序差别很大。
      • 你提供的代码中 Delay us() 函数的精度是否足够?DS18B20 的时序要求在微秒级别,如果延时函数精度不够,会导致时序错误。
    3. 代码逻辑错误:
      • 除了读写时序,其他代码逻辑也可能存在问题,例如:
        • 初始化 DS18B20 的步骤是否正确?
        • 读取温度命令发送是否正确?
        • 读取温度数据的处理是否正确?

    解决步骤

    1. 检查硬件连接: 仔细检查硬件连接,确保 DS18B20 的 VCC、GND、DQ 引脚连接正确,并确认 4.7kΩ 上拉电阻已连接。
    2. 使用逻辑分析仪: 使用逻辑分析仪抓取 MCU 与 DS18B20 之间的通信波形,与 DS18B20 的时序图对比,查看是否存在时序错误。
    3. 简化代码: 为了排除其他代码逻辑错误,建议你先尝试使用最简单的代码实现 DS18B20 的温度读取功能,例如:
    #include <reg52.h>  // 根据你的单片机型号修改头文件
    
    sbit DS18B20_DQ = P1^0;  // 将 DS18B20 的 DQ 引脚连接到 P1^0
    
    void Delay_1us(void)  // 1us 延时函数,根据你的晶振频率修改
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
    
    void Delay_us(unsigned int t)  // us 延时函数
    {
        while(t--)
            Delay_1us();
    }
    
    void DS18B20_WriteBit(bit dat)
    {
        DS18B20_DQ = 0;  // 主机拉低 DQ
        Delay_us(10);
        DS18B20_DQ = dat;  // 发送数据位
        Delay_us(50);
        DS18B20_DQ = 1;  // 主机释放 DQ
    }
    
    bit DS18B20_ReadBit(void)
    {
        bit dat;
        DS18B20_DQ = 0;  // 主机拉低 DQ
        Delay_us(1);
        DS18B20_DQ = 1;  // 主机释放 DQ
        Delay_us(12);
        dat = DS18B20_DQ;  // 读取数据位
        Delay_us(50);
        return dat;
    }
    
    void DS18B20_WriteByte(unsigned char dat)
    {
        unsigned char i;
        for (i=0;i<8;i++)
        {
            DS18B20_WriteBit(dat&0x01);  // 发送一个字节的每一位
            dat>>=1;
        }
    }
    
    unsigned char DS18B20_ReadByte(void)
    {
        unsigned char i, dat=0;
        for (i=0;i<8;i++)
        {
            dat>>=1;
            if(DS18B20_ReadBit())
                dat|=0x80;  // 读取一个字节的每一位
        }
        return dat;
    }
    
    bit DS18B20_Reset(void)  // DS18B20 复位信号
    {
        bit presence;
        DS18B20_DQ = 0;  // 主机拉低 DQ
        Delay_us(480);
        DS18B20_DQ = 1;  // 主机释放 DQ
        Delay_us(80);
        presence = DS18B20_DQ;  // 读取 DS18B20 的响应信号
        Delay_us(400);
        return presence;
    }
    
    void main(void)
    {
        unsigned char TL, TH;
        while(1)
        {
            DS18B20_Reset();  // 复位 DS18B20
            DS18B20_WriteByte(0xCC);  // 跳过 ROM 操作
            DS18B20_WriteByte(0x44);  // 启动温度转换
            Delay_ms(750);  // 等待温度转换完成
    
            DS18B20_Reset();  // 复位 DS18B20
            DS18B20_WriteByte(0xCC);  // 跳过 ROM 操作
            DS18B20_WriteByte(0xBE);  // 读取温度数据
    
            TL = DS18B20_ReadByte();  // 读取低字节温度数据
            TH = DS18B20_ReadByte();  // 读取高字节温度数据
    
            // 处理温度数据,例如:
            // int temp = (TH<<8) | TL;  // 合并高低字节
            // float temperature = temp * 0.0625;  // 计算实际温度
    
            // 在这里添加显示温度或其他操作
        }
    }
    

    注意: 以上代码仅供参考,你需要根据你的实际硬件平台和编译器进行修改。

    如果以上步骤都无法解决问题,请提供以下信息以便进一步分析:

    • MCU 型号
    • 编译器版本
    • 完整的代码
    • 逻辑分析仪抓取的通信波形图

    祝你好运!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月7日
  • 创建了问题 8月5日

悬赏问题

  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数