原创 DS18B20

2010-3-12 23:56 2450 10 10 分类: MCU/ 嵌入式

//******write1820********
void write1820(uchar a,uchar wrdq)
{
    uchar i;
 for(i=0;i<8;i++)
 {
  if(a & 0x01)  //低位在前,1;
  {
   if(wrdq==0)
    DQ = 0;    //结束Recovery time;
   else
    DQ1 = 0;
   _nop_();
   _nop_();
  // _nop_();
   if(wrdq==0)
    DQ = 1;    //结束Recovery time;
   else
    DQ1 = 1;  
  } //发送数据;
  else    //0
  { 
   if(wrdq==0)
    DQ = 0;    //结束Recovery time;
   else
    DQ1 = 0;    //结束Rec time;
  }
  _nop_();
  _nop_();
 // _nop_(); 
  //DQ = 0;  } //发送数据;
  delay_us(30);  //等待Slave Device采样;
  if(wrdq==0)
   DQ = 1;    //结束Recovery time;
  else
   DQ1 = 1;      //Recovery;
  _nop_();      //Recovery Time Start;
  a >>= 1;
 }
 
}


/*******************************************************************************
*** 函 数 名: static unsigned char read1820(void)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输  入: NO
*** 输  出: tmp: 8bit

*** 函数说明:
/******************************************************************************/


//*******read1820************
uint read1820(uchar rddq)
{
 uint i;
 uint tmp="0";
 if(rddq==0)
  DQ = 1;    //结束Recovery time;
 else
  DQ1 = 1;
 _nop_();     //准备读;
 for(i=0;i<8;i++)
 {
  tmp >>= 1;    //低位先发;
  if(rddq==0)
  {
   DQ = 0;      //Read init;
  // _nop_();
   _nop_();     //2ms;
   DQ = 1;      //必须写1,否则读出来的将是不预期的数据;
   delay_us(2);   //延时9us;
   _nop_();
   if(DQ)      //在12us处读取数据;
    tmp |= 0x80;
   delay_us(30);  //延时65us;
   DQ = 1; 
  }
  else
  {
   DQ1 = 0;      //Read init;
   _nop_();
   _nop_();     //2ms;
   DQ1 = 1;      //必须写1,否则读出来的将是不预期的数据;
   delay_us(2);   //延时9us;
   _nop_();
   if(DQ1)      //在12us处读取数据;
    tmp |= 0x80;
   delay_us(30);  //延时65us;
   DQ1 = 1;
  }
  
  _nop_();   //恢复One Wire Bus;
  delay_us(2);   //延时9us;
 }
 return tmp;
}


/*******************************************************************************
*** 函 数 名: tatic void init1820(void)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输  入: NO
*** 输  出: NO
*** 创 建 人:qingdao_mcu  日期:2007-12-5
*** 修 改 人:           日期:2007-12-5
*** 函数说明:
/******************************************************************************/
//*******initial**********
void init1820(uchar initdq)
{
 uint init_i=0;
 if(initdq==0)
 {
  DQ = 1;
  _nop_();
  DQ = 0;      //拉低数据线,准备Reset OneWire Bus;
 }
 else
 {
  DQ1 = 1;
  _nop_();
  DQ1 = 0;      //拉低数据线,准备Reset OneWire Bus;
 }
 delay_us(125);  //延时510us,Reset One-Wire Bus.
// delay_us(125);
 if(initdq==0)
 {
        DQ = 1;      //提升数据线;
  delay_us(5);  //延时35us;
  while(DQ)     //等待Slave 器件Ack 信号;
  {
   if(init_i<0x1000)
    init_i++;
   else
    DQ=0;
  }
 }
 else
 {
        DQ1 = 1;      //提升数据线;
  delay_us(5);  //延时35us;
  while(DQ1)     //等待Slave 器件Ack 信号;
  {
  }
 }
 delay_us(60);  //延时125us;
 
 if(initdq==0)
  DQ = 1;      //提升数据线;
 else
  DQ1 = 1;      //提升数据线;
}


//*** 函 数 名: void gettemp(void)
//*******************DS18B20***************获得温度******************


uint gettemp(uchar getdq)         //读取温度函数

 unsigned int tp,tp0;
 init1820(getdq);
 write1820(0xcc,getdq);   //跳过 ROM
 write1820(0x44,getdq);  //温度变换
 delay_ms(30);
    init1820(getdq);
 write1820(0xcc,getdq);
 write1820(0xbe,getdq);   //读暂存存储器
 
 tp0=read1820(getdq)>>4;
 tp=read1820(getdq)<<4;
 
 return tp+tp0;
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条