使用LPC1768做测温,在已知DS118B20的ID序列号情况下,可以使用匹配ROM指令进行温度读取,但是使用Search ROM指令时,读两位只有第一次读上01,之后一直读上来是11,DS18B20器件没有问题,微秒延时也没有问题,读时隙的时序也对着手册看了没有问题,此前在STM32上实现没有问题,但是怎么到1768上就出问题了
算法是借鉴的网路上的代码
uint8_t DS18B20_Read_2Bit(void)
{
unsigned char ch;
unsigned char q ;
for(q=2;q>0;q--)
{
ch=ch<<1;
Ds18b20_DQ_Output();
DQ(0);
Delay1us(2);
DQ(1);
//Delay1us(10);
Ds18b20_DQ_input();
Delay1us(12);
if(DQ_r)
{
ch = ch|0x01 ;
}
Delay1us(50);
}
return (ch);
}
void DS18B20_Search_Rom(void)
{
uint8_t k, l, chongtuwei=0, m, n, num;
uint8_t zhan[5]={0};
uint8_t ss[64];
l = 0;
num = 0;
do
{
Init18B20();
DS18B20_Write_byte(0xF0); // search ROM
for (m = 0; m < 8; m++)
{
uint8_t s = 0;
for (n = 0; n < 8; n++)
{
k = DS18B20_Read_2Bit();
k = k & 0x03;
s >>= 1;
if (k == 0x01)
{
DS18B20_Write_Bit(0);
ss[(m*8 + n)] = 0;
}
else if (k == 0x02)
{
s = s | 0x80;
DS18B20_Write_Bit(1);
ss[(m * 8 + n)] = 1;
}
else if (k == 0x00)
{
chongtuwei = m * 8 + n + 1;
if (chongtuwei > zhan[l])
{
DS18B20_Write_Bit(0);
ss[(m * 8 + n)] = 0;
zhan[++l] = chongtuwei;
}
else if (chongtuwei < zhan[l])
{
s = s | ((ss[(m * 8 + n)] & 0x01) << 7);
DS18B20_Write_Bit(ss[(m * 8 + n)]);
}
else if (chongtuwei == zhan[l])
{
s = s | 0x80;
DS18B20_Write_Bit(1);
ss[(m * 8 + n)] = 1;
l = l - 1;
}
}
else
{
}
}
DS18B20_ID[num][m] = s;
}
num = num + 1;
}
while (zhan[l] != 0 && (num < MaxSensorNum));
DS18B20_SensorNum = num;
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。