我用18B20做温度检测,当温度上升到40度的时候就出错?温度值达到最高!!!就像没有接温度传
我用18B20做温度检测,当温度上升到40度的时候就出错?温度值达到最高!!!就像没有接温度传感器一样,前面的数据都正常?请教高手指点。程序如下:
/*******************************************************
*函数名称:delay_10us
*函数功能:延时程序 46个时钟
*******************************************************/
void delay_10us(void)
{
unsigned char i=3;
while(i--)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
void delay_5us(void)
{
unsigned char i=1;
while(i--)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
/*******************************************************
*函数名称:delay_100us
*函数功能:延时程序
*******************************************************/
void delay_100us(unsigned char i)
{
unsigned char temp1;
while(i--)
{
temp1=8;
while(temp1--)
{
delay_10us();
}
}
}
/*******************************************************
*函数名称:delay_ms
*函数功能:延时程序
*******************************************************/
void delay_ms(unsigned char i)
{
unsigned char temp1;
while(i--)
{
temp1=85;
while(temp1--)
{
delay_10us();
}
}
}
unsigned char RES_DS18B20()
{
unsigned char i;
DS18B20_OUT_SET;
DS18B20_OUT_H;
_NOP();
DS18B20_OUT_L;
delay_100us(8);
for(i=3;i>0;i--)//-----------------------------------------------------------
delay_10us();
DS18B20_OUT_H;
_NOP();
for(i=5;i>0;i--)
delay_10us();
DS18B20_IN_SET;
flag_T=DS18B20_IN_DA&BIT1;
delay_100us(2);
return flag_T;
}
void Write_Byte(unsigned char Data)
{
unsigned char i;
for(i=0;i<8;i++)
{
DS18B20_OUT_SET;
DS18B20_OUT_L;
delay_5us();
delay_10us();
delay_10us();
delay_10us();//--------------------------------------------------------------
if(Data&0x01==1)
{
DS18B20_OUT_H;
}
else
{
DS18B20_OUT_L;
}
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
DS18B20_OUT_H;
delay_5us();
Data=Data/2;
}
}
unsigned char Read_Byte()
{
unsigned char i;
unsigned char Data_d;
for(i=0;i<8;i++)
{
DS18B20_OUT_SET;
DS18B20_OUT_L;
delay_5us();
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
Data_d>>=1;
DS18B20_OUT_H;
DS18B20_IN_SET;
if(DS18B20_IN_DA&BIT1)
{
Data_d|=0x80;
}
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
_NOP();
}
return Data_d;
}
unsigned Get_Temp()
{
unsigned char Tmep_H,Tmep_L;
RES_DS18B20();
Write_Byte(0xcc);
Write_Byte(0x44);
RES_DS18B20();
Write_Byte(0xcc);
Write_Byte(0xbe);
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
delay_10us();//--------------------------------------------------------------
Tmep_L=Read_Byte();
Tmep_H=Read_Byte();
Tmep_Da=(Tmep_H<<4)|(Tmep_L>>4);
return Tmep_Da;
} 要单独供电或者空闲时使用强上拉 用了。问题是,读程序的问题,估计,读出值越大,延时不够,越容易出错吧。 unsigned int GetTempValue(void)
{
unsigned char i,j;
unsigned int T;
SkipROMCode();
WriteDS1820(0xBE);
i=ReadDS1820();
j=ReadDS1820();
StartADC();
T=i+j*256;
if (T==0xffff) return 0xffff;
if (T>0x8000)
{
T=-T;
return (0x8000+T*5/8);
}
else
return (T*5/8);
} 换个18B20看看!有可能是18B20 有问题。我碰到过,40度附近有问题,过了这附近,就正常了。 这么邪恶的40度? 回复【2楼】hiolan
用了。问题是,读程序的问题,估计,读出值越大,延时不够,越容易出错吧。
-----------------------------------------------------------------------
这个可能性大,加延时试一下
页:
[1]