感觉唯一有点差别的就是我把主机对DQ读写的封装了一下
然后剩下的读写时序我基本就是照抄过来的
但就是读出来全是1,我感觉是读那个地方应该有问题,但我看了下时序也没啥毛病啊'π_π
感觉唯一有点差别的就是我把主机对DQ读写的封装了一下
🕒下午好,题主!目前:🟢[在线]
📢参考通义千问、由郭老师整理提供!
📣今日诗号:落花人独立,微雨燕双飞。
你遇到的问题很常见,DS18B20 读取温度始终为 1 ,通常是以下几个方面的问题:
Delay us()
函数的精度是否足够?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; // 计算实际温度
// 在这里添加显示温度或其他操作
}
}
注意: 以上代码仅供参考,你需要根据你的实际硬件平台和编译器进行修改。
如果以上步骤都无法解决问题,请提供以下信息以便进一步分析:
祝你好运!