搜索
bottom↓
回复: 6

我用18B20做温度检测,当温度上升到40度的时候就出错?温度值达到最高!!!就像没有接温度传

[复制链接]

出0入0汤圆

发表于 2010-12-8 10:55:30 | 显示全部楼层 |阅读模式
我用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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入42汤圆

发表于 2010-12-8 11:34:39 | 显示全部楼层
要单独供电或者空闲时使用强上拉

出0入0汤圆

 楼主| 发表于 2010-12-13 19:15:14 | 显示全部楼层
用了。问题是,读程序的问题,估计,读出值越大,延时不够,越容易出错吧。

出0入96汤圆

发表于 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);
}

出0入0汤圆

发表于 2010-12-13 21:28:05 | 显示全部楼层
换个18B20看看!有可能是18B20 有问题。我碰到过,40度附近有问题,过了这附近,就正常了。

出0入0汤圆

发表于 2010-12-14 21:34:38 | 显示全部楼层
这么邪恶的40度?

出0入0汤圆

发表于 2010-12-14 23:55:30 | 显示全部楼层
回复【2楼】hiolan
用了。问题是,读程序的问题,估计,读出值越大,延时不够,越容易出错吧。
-----------------------------------------------------------------------

这个可能性大,加延时试一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 06:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表