willianchanlovegithub/ds18b20

DS18B20 init failed! Please check the connection! 需要外接上拉电阻?

qiaowei361 opened this issue · 11 comments

image

需要外接上拉电阻? 作者提供的事例跑不起来,引脚已经修改成自己的引脚IO

你接的是单个 DS18B20 传感器呢?还是接的是 DS18B20 模块?如果是后者的话一般上面已经有上拉电阻的,如果是前者,则需要自己在 DS18B20 数据 IO 口上接一个上拉电阻。同时需要确保 DS18B20 的 VCC 和 GND 没有接反,如果接反了则会把传感器烧坏,后面再继续用也不能正常工作的。

你接的是单个 DS18B20 传感器呢?还是接的是 DS18B20 模块?如果是后者的话一般上面已经有上拉电阻的,如果是前者,则需要自己在 DS18B20 数据 IO 口上接一个上拉电阻。同时需要确保 DS18B20 的 VCC 和 GND 没有接反,如果接反了则会把传感器烧坏,后面再继续用也不能正常工作的。

使用的DS18B20是头部带不锈钢,有黑色尾巴线,分成三根不同颜色的 VCC GND DATA线,我这个是前者吗?

image

这个你需要联系厂家,或者看看数据手册上的说明,看是否已经接了上拉电阻。

这个你需要联系厂家,或者看看数据手册上的说明,看是否已经接了上拉电阻。

这个说明说不需要,为何连接失败?

单步调试,扒寄存器看

单步调试,扒寄存器看

我用万能表测VCC和 GND线不是导通的,是不是说明这个传感器坏的?

单步调试,扒寄存器看

我用万能表测VCC和 GND线不是导通的,是不是说明这个传感器坏的?

VCC 和 GNC 两者肯定是不相通的呀.... 建议你换一个 DS18B20 试试看,排除硬件故障导致软件提示错误。

单步调试,扒寄存器看

我用万能表测VCC和 GND线不是导通的,是不是说明这个传感器坏的?

VCC 和 GNC 两者肯定是不相通的呀.... 建议你换一个 DS18B20 试试看,排除硬件故障导致软件提示错误。

感谢您的回复,刚说错了,万通表调在二极管档位,测试DS18B20的VCC和GND始终为1不变,而我测试AM2320B传感器的VCC和GND的数值会1会有变动。我现在再尝试购买一个试一下,卖家说距离远需要上拉电阻..

厂家提供的不锈钢美信DS18B20 的读写时序代码,作者你的读写时序是这样的吗?

` Write_Match_Rom(group,0xB8); //从EE拷回暂存器
Write_Match_Rom(group,0x44); //温度转换
Delay_ms(750);

            Write_Match_Rom(group,0xBE);
	p_wendu_thtl[num_18b20][3] = Read_One_Char(group);//温度低8位
	p_wendu_thtl[num_18b20][2] = Read_One_Char(group);//温度高8位
	p_wendu_thtl[num_18b20][0] = Read_One_Char(group);//TH
	p_wendu_thtl[num_18b20][1] = Read_One_Char(group);//TL
	Read_One_Char(group);
	Read_One_Char(group);
	Read_One_Char(group);
	Read_One_Char(group);
	Read_One_Char(group);
            wendu = (p_wendu_thtl[num_18b20][2] << 8) + p_wendu_thtl[num_18b20][3];

void Write_Match_Rom(u8 group,u8 command)
{
u8 i = 0;
u8 (* p_rom)[8] = NULL;//指向ROM数组的指针
switch (group)
{
case 1:{p_rom = ROM_1;break;}
case 2:{p_rom = ROM_2;break;}
case 3:{p_rom = ROM_3;break;}
case 4:{p_rom = ROM_4;break;}
case 5:{p_rom = ROM_5;break;}
case 6:{p_rom = ROM_6;break;}
case 7:{p_rom = ROM_7;break;}
case 8:{p_rom = ROM_8;break;}
default:break;
}
Chip_18b20_Init(group);
Write_One_Char(group,0x55);
for (i=0; i<8;i++)
Write_One_Char(group,p_rom[num_18b20][i]);
Write_One_Char(group,command);
}enableInterrupts();

/* 芯片初始化程序*****************************************************************/
u8 Chip_18b20_Init(u8 group)
{
u8 temp = 1;

switch (group)
{
	case 1:{SLOTTIME = SLOTTIME_1;break;}
	case 2:{SLOTTIME = SLOTTIME_2;break;}
	case 3:{SLOTTIME = SLOTTIME_3;break;}
	case 4:{SLOTTIME = SLOTTIME_4;break;}
	default:break;
}
DQ_Weak_Pull_On(group);		  //弱上拉开
Delay_us(9);          			//延时9+1=10us
DQ_Weak_Pull_Off(group);		//弱上拉关
                          //拉低,出现下降沿,初始化信号
DQ_Pull_Down_On(group); 		//下拉开
Delay_us(32*SLOTTIME); 			//延时32个slottime 32*15=480us
DQ_Pull_Down_Off(group);	  	//下拉关

DQ_Weak_Pull_On(group);	  		//弱上拉开
Delay_us(SLOTTIME); 			    //延时1个slottime
DQ_Weak_Pull_Off(group);	  	//弱上拉关

Delay_us(10);
temp = DQ_Read(group);
if (temp)
{
DQ_Weak_Pull_On(group); //弱上拉开
Delay_us(249); //延时250us
DQ_Weak_Pull_Off(group); //弱上拉关
}
else
{
DQ_Pull_Down_On(group); //下拉开
Delay_us(249); //延时250us0
DQ_Pull_Down_Off(group); //下拉关
}

DQ_Weak_Pull_On(group);	  		//弱上拉开
Delay_us(29);          			//延时9+1=10us
DQ_Weak_Pull_Off(group);	    //弱上拉关

return temp; 	

}
/读一位程序******************************************************调时序/
u8 Read_One_Bit(u8 group)
{
u8 temp = 0;

DQ_Pull_Down_On(group);		//下拉开
Delay_us(*time);          		//延时4+1=5us
DQ_Pull_Down_Off(group);	//下拉关

DQ_Weak_Pull_On(group);	  	//弱上拉开
 Delay_us(*(time+1));      //4us
DQ_Weak_Pull_Off(group);	//弱上拉关	
Delay_us(*(time+2));    
temp = DQ_Read(group);

if (temp)
{
DQ_Weak_Pull_On(group);	  	//弱上拉开
Delay_us(45);          		//延时45us
DQ_Weak_Pull_Off(group);	//弱上拉关		
}
else
{
DQ_Pull_Down_On(group);	  	//下拉开
Delay_us(45);          		//延时45us
DQ_Pull_Down_Off(group);	//下拉开		
}

DQ_Weak_Pull_On(group);
Delay_us(40);          		//延时40us/45us
DQ_Weak_Pull_Off(group);	 

return temp;

}

/*读一个字节程序*****************************************************调时序/
u8 Read_One_Char(u8 group)
{
u8 temp = 0;
u8 i = 0;

for (i=0; i<8; i++)
{
	temp >>= 1;
	if (Read_One_Bit(group))
		temp |= 0x80;
}

return temp;

}
/写一位程序********************************************************调时序/
void Write_One_Bit(u8 group, u8 dat)
{
DQ_Pull_Down_On(group); //下拉开
Delay_us(9); //延时9+1=10us
DQ_Pull_Down_Off(group); //下拉关

if (dat)
{
	DQ_Weak_Pull_On(group);	  		//弱上拉开
	Delay_us(79); 		  			//延时79+1=80us 79
	DQ_Weak_Pull_Off(group);	    //弱上拉关
}
else
{
	DQ_Pull_Down_On(group);	  		//下拉开
	Delay_us(79);          			//延时79+1=80us 79
	DQ_Pull_Down_Off(group);	    //下拉关
}
DQ_Weak_Pull_On(group);	  			//弱上拉开
Delay_us(49);          				//延时4+1=5us  49
DQ_Weak_Pull_Off(group);	  		//弱上拉关

}

/写一个字节********************************************************调时序/
void Write_One_Char(u8 group, u8 dat)
{
u8 i =0;
for (i=0; i<8; i++)
{
Write_One_Bit(group,dat&0x01);
dat >>= 1;
}
}
`

今天又买了一个DS18B20 加了一个终端,都可以读取到数据了。

终端照片如下,不知道里面有没有上拉电阻。

image

厂家提供的不锈钢美信DS18B20 的读写时序代码,作者你的读写时序是这样的吗?

` Write_Match_Rom(group,0xB8); //从EE拷回暂存器 Write_Match_Rom(group,0x44); //温度转换 Delay_ms(750);

            Write_Match_Rom(group,0xBE);
	p_wendu_thtl[num_18b20][3] = Read_One_Char(group);//温度低8位
	p_wendu_thtl[num_18b20][2] = Read_One_Char(group);//温度高8位
	p_wendu_thtl[num_18b20][0] = Read_One_Char(group);//TH
	p_wendu_thtl[num_18b20][1] = Read_One_Char(group);//TL
	Read_One_Char(group);
	Read_One_Char(group);
	Read_One_Char(group);
	Read_One_Char(group);
	Read_One_Char(group);
            wendu = (p_wendu_thtl[num_18b20][2] << 8) + p_wendu_thtl[num_18b20][3];

void Write_Match_Rom(u8 group,u8 command) { u8 i = 0; u8 (* p_rom)[8] = NULL;//指向ROM数组的指针 switch (group) { case 1:{p_rom = ROM_1;break;} case 2:{p_rom = ROM_2;break;} case 3:{p_rom = ROM_3;break;} case 4:{p_rom = ROM_4;break;} case 5:{p_rom = ROM_5;break;} case 6:{p_rom = ROM_6;break;} case 7:{p_rom = ROM_7;break;} case 8:{p_rom = ROM_8;break;} default:break; } Chip_18b20_Init(group); Write_One_Char(group,0x55); for (i=0; i<8;i++) Write_One_Char(group,p_rom[num_18b20][i]); Write_One_Char(group,command); }enableInterrupts();

/* 芯片初始化程序*****************************************************************/ u8 Chip_18b20_Init(u8 group) { u8 temp = 1;

switch (group)
{
	case 1:{SLOTTIME = SLOTTIME_1;break;}
	case 2:{SLOTTIME = SLOTTIME_2;break;}
	case 3:{SLOTTIME = SLOTTIME_3;break;}
	case 4:{SLOTTIME = SLOTTIME_4;break;}
	default:break;
}
DQ_Weak_Pull_On(group);		  //弱上拉开
Delay_us(9);          			//延时9+1=10us
DQ_Weak_Pull_Off(group);		//弱上拉关
                          //拉低,出现下降沿,初始化信号
DQ_Pull_Down_On(group); 		//下拉开
Delay_us(32*SLOTTIME); 			//延时32个slottime 32*15=480us
DQ_Pull_Down_Off(group);	  	//下拉关

DQ_Weak_Pull_On(group);	  		//弱上拉开
Delay_us(SLOTTIME); 			    //延时1个slottime
DQ_Weak_Pull_Off(group);	  	//弱上拉关

Delay_us(10); temp = DQ_Read(group); if (temp) { DQ_Weak_Pull_On(group); //弱上拉开 Delay_us(249); //延时250us DQ_Weak_Pull_Off(group); //弱上拉关 } else { DQ_Pull_Down_On(group); //下拉开 Delay_us(249); //延时250us0 DQ_Pull_Down_Off(group); //下拉关 }

DQ_Weak_Pull_On(group);	  		//弱上拉开
Delay_us(29);          			//延时9+1=10us
DQ_Weak_Pull_Off(group);	    //弱上拉关

return temp; 	

} /读一位程序******************************************************调时序/ u8 Read_One_Bit(u8 group) { u8 temp = 0;

DQ_Pull_Down_On(group);		//下拉开
Delay_us(*time);          		//延时4+1=5us
DQ_Pull_Down_Off(group);	//下拉关

DQ_Weak_Pull_On(group);	  	//弱上拉开
 Delay_us(*(time+1));      //4us
DQ_Weak_Pull_Off(group);	//弱上拉关	
Delay_us(*(time+2));    
temp = DQ_Read(group);

if (temp)
{
DQ_Weak_Pull_On(group);	  	//弱上拉开
Delay_us(45);          		//延时45us
DQ_Weak_Pull_Off(group);	//弱上拉关		
}
else
{
DQ_Pull_Down_On(group);	  	//下拉开
Delay_us(45);          		//延时45us
DQ_Pull_Down_Off(group);	//下拉开		
}

DQ_Weak_Pull_On(group);
Delay_us(40);          		//延时40us/45us
DQ_Weak_Pull_Off(group);	 

return temp;

}

/*读一个字节程序*****************************************************调时序/ u8 Read_One_Char(u8 group) { u8 temp = 0; u8 i = 0;

for (i=0; i<8; i++)
{
	temp >>= 1;
	if (Read_One_Bit(group))
		temp |= 0x80;
}

return temp;

} /写一位程序********************************************************调时序/ void Write_One_Bit(u8 group, u8 dat) { DQ_Pull_Down_On(group); //下拉开 Delay_us(9); //延时9+1=10us DQ_Pull_Down_Off(group); //下拉关

if (dat)
{
	DQ_Weak_Pull_On(group);	  		//弱上拉开
	Delay_us(79); 		  			//延时79+1=80us 79
	DQ_Weak_Pull_Off(group);	    //弱上拉关
}
else
{
	DQ_Pull_Down_On(group);	  		//下拉开
	Delay_us(79);          			//延时79+1=80us 79
	DQ_Pull_Down_Off(group);	    //下拉关
}
DQ_Weak_Pull_On(group);	  			//弱上拉开
Delay_us(49);          				//延时4+1=5us  49
DQ_Weak_Pull_Off(group);	  		//弱上拉关

}

/写一个字节********************************************************调时序/ void Write_One_Char(u8 group, u8 dat) { u8 i =0; for (i=0; i<8; i++) { Write_One_Bit(group,dat&0x01); dat >>= 1; } } `

压根不用看代码
你直接把你的传感器引线 VCC与DATA之间加个10K电阻再试
不用怀疑作者的代码
我已经跑过了
基本读取没有问题
除了读写时序偶会被 其它线程打乱 读出错误值