MSP430讨论区
返回
登录/注册
关于多个DS18B20读取温度问题
楼主
WQY900618 于 2011-04-09 11:23:42
关于多个DS18B20读取温度问题
在一条数据线上挂接了两个18b20 首先编写函数分别读出了两个18b20的ROM,然后两个 18b20都挂到一条数据线上 实现两个结点读取温度 现在无法实现
读取温度函数:
unsigned char rom[][8]={{0xc5,0x2a,0xa8,0x02,0x00,0x00,0xd5,0xff},
{0xb3,0x9a,0xa8,0x02,0x00,0x00,0xb0,0xff}
};
void get_tem()
{
unsigned char tem1,tem2,i,j;
for(j=0;j<2;j++) //仅以2路为例,改循环次数即可扩充到8路或更多,
{
reset_18b20(); //调用复位函数
write_b (0x55); //发送ROM匹配命令
for(i=0;i<8;i++)
{
write_b(rom[j][i]); //发送64位序列号
}
write_b(0x44);//温度转换
delay_ms(1000);
reset_18b20();//调用复位函数
write_b (0x55); //发送ROM匹配命令
for(i=0;i<8;i++)
{
write_b(rom[j][i]); //发送64位序列号
}
write_b(0xBE);
tem1=read_b();
tem2=read_b();
}
}
这个函数读出的tem1和tem2 均为oxff 有时还产生错误数值。
希望得到指点···[EM07]
回复
1楼
DC 于 2011-04-09 14:21:39
DS18B20对延时比较敏感,在调这个器件时一定要一步一步多试前后时间宽度才行。如果你的延时碰到临界时间有可能会出现一时是对一时是错这些不统一的值发生。
回复
2楼
WQY900618 于 2011-04-09 16:44:09
首先感谢DC版主能帮助解决问题,问题原因找到了,两片18B20的序列号读取错误,正确的序列号前八位应该是0x28,所以定义数组为
unsigned char rom[][8]={{0x28,0xb3,0x9a,0xa8,0x02,0x00,0x00,0xb0},
{0x28,0xc5,0x2a,0xa8,0x02,0x00,0x00,0xd5}
};
即得到正确结果。
回复
1
电脑版
Page created in 0.0625 seconds width 2 queries.