导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→--->

* 15721: 闲聊:为什么我的DS18B20读取的温度不正确啊?请高手指教,最好有详细的汇编程序

   ZBW001 
ZBW001发表的帖子 

 --->

#define PRESENCE    0
#define NOTPRESENCE 1

/* ds18b20 常量*/
/* ds18b20 configuration register : Thermometer Resolution */
#define ds18b20_TR_9      0x1f
#define ds18b20_TR_10     0x3f
#define ds18b20_TR_11     0x5f
#define ds18b20_TR_12     0x7f

#define ds18b20_TH_VAL  80
#define ds18b20_TL_VAL  40
#define ds18b20_TR_VAL  ds18b20_TR_9

/* ds18b20 ROM function commands18b20 */
#define ds18b20_ReadR        0x33
#define ds18b20_MatchR       0x55
#define ds18b20_SkipR        0xcc
#define ds18b20_SearchR      0xf0
#define ds18b20_AlarmSearch  0xec

/* ds18b20 memory command function */
#define ds18b20_WriteSP   0x4e
#define ds18b20_ReadSP    0xbe
#define ds18b20_CopySP    0x48
#define ds18b20_ConvertT  0x44
#define ds18b20_RecallE2  0xb8
#define ds18b20_ReadPS    0xb4

//12M晶振0
void delay_100us(uchar opd)
{uchar data i1;
   while(opd)
    {opd--;
     for(i1=0;i1<10;i1++)  _nop_();
    }
}

void delay_10us(uchar opd)
{  while(opd)
    {opd--;_nop_();_nop_();_nop_();_nop_();}
}

void delay_ms(uchar opdata)
{ uchar data i1 ;
  while(opdata)
   {for(i1=0;i1<248;i1++) {_nop_();}
     opdata--;
   }
}

bit ds18b20_reset(void)
{bit ib;
  ds18b20_dq=1;
  ds18b20_dq=0;
  delay_100us(6);
  ds18b20_dq=1;
  delay_10us(6);
  ib=ds18b20_dq;
  delay_10us(20);
  return ib;
}

void ds18b20_bitwrite(uchar opcode)
{ uchar data i1;
  ds18b20_dq=1;
  for(i1=0;i1<8;i1++)
    { ds18b20_dq=0;
      _nop_();_nop_();
      if(opcode & 0x01) {ds18b20_dq=1;}
      else              {ds18b20_dq=0;}
      opcode>>=1;
      delay_10us(6);
      ds18b20_dq=1;
    }
}

uchar ds18b20_bitread(void)
{uchar data i1,i2;
 i2=0;
 ds18b20_dq=1;
 for(i1=0;i1<8;i1++)
     { ds18b20_dq=0;
       _nop_();_nop_();
       i2>>=1;
       ds18b20_dq=1;
       _nop_();_nop_();_nop_();_nop_();_nop_();
       _nop_();_nop_();_nop_();_nop_();_nop_();
       _nop_();_nop_();_nop_();_nop_();_nop_();
       if(ds18b20_dq)  {i2|=0x80;}
       delay_10us(3);
       ds18b20_dq=1;
    }
 return i2;
}


// *********TEMP CONVERT***********

void main(void)
{...............

    {EA=0;
     tempb1=ds18b20_reset();
     if(tempb1==NOTPRESENCE)
      {EA=1;error_flag=ERROR;error_mode=ERROR_PRESENCE;goto markerror;}
     ds18b20_bitwrite(0xcc);  //SKIP ROM
     ds18b20_bitwrite(0xbe);  //READ SP
     i1=ds18b20_bitread();
     i2=ds18b20_bitread();
     ds18b20_reset();
     EA=1;

     i1>>=4;i2<<=4;       // 数据处理 
     i1|=i2;i1++;
     if(i1 & 0x80) {temp_tst=0;}
     else          {temp_tst=i1;}

     EA=0;
     ds18b20_reset();
     ds18b20_bitwrite(0xcc);  //SKIP ROM
     ds18b20_bitwrite(0x44);  //CONVERT TEMP
     EA=1;
     delay_ms(30);     //确保可靠,延时
     }
 
..................
}


发表时间:2002年12月11日16:07:00

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:有没有?
[下一篇帖子]:是呀,上不了了。