hiolan 发表于 2010-12-8 10:55:30

我用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;
}

ccstc 发表于 2010-12-8 11:34:39

要单独供电或者空闲时使用强上拉

hiolan 发表于 2010-12-13 19:15:14

用了。问题是,读程序的问题,估计,读出值越大,延时不够,越容易出错吧。

gallle 发表于 2010-12-13 20:08:01

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);
}

OurAvrFan 发表于 2010-12-13 21:28:05

换个18B20看看!有可能是18B20 有问题。我碰到过,40度附近有问题,过了这附近,就正常了。

Autostep 发表于 2010-12-14 21:34:38

这么邪恶的40度?

wandy2010 发表于 2010-12-14 23:55:30

回复【2楼】hiolan
用了。问题是,读程序的问题,估计,读出值越大,延时不够,越容易出错吧。
-----------------------------------------------------------------------

这个可能性大,加延时试一下
页: [1]
查看完整版本: 我用18B20做温度检测,当温度上升到40度的时候就出错?温度值达到最高!!!就像没有接温度传