可以帮我看一下这个温度读出来为什么是0吗
本帖最后由 好学天上 于 2024-5-29 17:56 编辑按照老师的一样写的,只是有些函数变量命名大小写不一样,不知道为什么读取出来温度都是0
也许存在一些很低级的错误吗只是我看了两三遍还没看出来{:dizzy:}
请把整个Keil项目打包再上传
你现在只上传了个Keil项目 Lkck8210 发表于 2024-5-29 17:12
请把整个Keil项目打包再上传
你现在只上传了个Keil项目
好的我上传了压缩包 好学天上 发表于 2024-5-29 17:16
好的我上传了压缩包
你的DS18B20 时序不对。
用这个可以读到。
#include "ds18b20.h"
u16 temp;//温度值
bit minusflag; //温度正负,0正1负
/*
void Delay480us() //@22.1184MHz
{
unsigned long i;
i = 2653UL;
while (i) i--;
}
void Delay60us() //@22.1184MHz
{
unsigned long i;
_nop_();
_nop_();
i = 330UL;
while (i) i--;
}
void Delay1us() //@22.1184MHz
{
unsigned long i;
_nop_();
i = 4UL;
while (i) i--;
}
*/
void delay_us(u8 us)
{
unsigned long edata i;
do{
//usrNOP();
//usrNOP();
_nop_();
i = 4UL;
while (i) i--;
}while(--us);
}
/*
void ds18b20_Reset(void)//复位
{
bit flag = 1;
while(flag)
{
DQ = 0;
Delay480us();
DQ = 1;
Delay60us();
flag = DQ;
Delay480us();
}
}
void ds18b20_Write_0(void)//写逻辑0码
{
DQ = 0;
Delay60us();
DQ = 1;
Delay1us();
Delay1us();
}
void ds18b20_Write_1(void) //写逻辑1码
{
DQ = 0;
Delay1us();
Delay1us();
DQ = 1;
Delay60us();
}
bit ds18b20_Read(void) //读取电平
{
bit state;
DQ = 1;
Delay1us();
Delay1us();
DQ = 0;
Delay1us();
Delay1us();
DQ = 1;
Delay1us();
Delay1us();
state = DQ;
Delay60us();
return state;
}
void ds18b20_WriteByte(u8 dat)//写一个字节
{
u8 i;
for(i=0;i<8;i++)
{
if(dat&0x01)
ds18b20_Write_1();
else
ds18b20_Write_0();
dat >>= 1;
}
}
u8 ds18b20_ReadByte(void) //读取一个字节
{
u8 i;
u8 dat = 0;
for(i=0;i++;i<8)
{
dat >>= 1;
if(ds18b20_Read())
dat |= 0x80;
}
return dat;
}
*/
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
CY = 1;
while (CY)
{
DQ = 0; //送出低电平复位信号
delay_us(240); //延时至少480us
delay_us(240);
DQ = 1; //释放数据线
delay_us(60); //等待60us
CY = DQ; //检测存在脉冲
delay_us(240); //等待设备释放数据线
delay_us(180);
}
}
/**************************************
从DS18B20读1字节数据
**************************************/
u8 DS18B20_ReadByte()
{
u8 i;
u8 dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
delay_us(1); //延时等待
DQ = 1; //准备接收
delay_us(1); //接收延时
if (DQ) dat |= 0x80; //读取数据
delay_us(60); //等待时间片结束
}
return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(u8 dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
{
DQ = 0; //开始时间片
delay_us(1); //延时等待
dat >>= 1; //送出数据
DQ = CY;
delay_us(60); //等待时间片结束
DQ = 1; //恢复数据线
delay_us(1); //恢复延时
}
}
u16 ds18b20_ReadTemp(void) //读取并换算温度,并返回值
{
u8 tempH;
u8 tempL;
u16 temperature;
ds18b20_Reset();
ds18b20_WriteByte(0xCC);
ds18b20_WriteByte(0x44);
while(!DQ);
ds18b20_Reset();
ds18b20_WriteByte(0xCC);
ds18b20_WriteByte(0xBE);
tempL = ds18b20_ReadByte();
tempH = ds18b20_ReadByte();
if(tempH & 0xF8)
{
minusFlag = 1;
temperature = ((tempH<<8) | tempL);
temperature = (~temperature)+1;
temperature = temperature*10*0.0625;
}
else
{
minusFlag = 0;
temperature = ((tempH<<8) | tempL);
temperature = temperature*10*0.0625;
}
temp = temperature;
return temperature;
}
找到了。
u8 ds18b20_ReadByte(void) //读取一个字节
{
u8 i;
u8 dat = 0;
for(i=0;i++;i<8) for(i=0;i<8;i++)
{
dat >>= 1;
if(ds18b20_Read())
dat |= 0x80;
}
return dat;
}
angmall 发表于 2024-5-29 21:39
找到了。
真是细心啊{:4_250:} angmall 发表于 2024-5-29 21:39
找到了。
哎呀还真是 我就知道肯定是我敲代码的时候又思维乱飞了 感谢感谢如此细心的你{:handshake:} 好学天上 发表于 2024-5-30 08:57
哎呀还真是 我就知道肯定是我敲代码的时候又思维乱飞了 感谢感谢如此细心的你 ...
很高兴能帮得到你。
敲代码要持之以恒,虚心诚恳的去观察。 angmall 发表于 2024-5-30 19:30
很高兴能帮得到你。
敲代码要持之以恒,虚心诚恳的去观察。
【乖巧点头】{:biggrin:}
页:
[1]