void onewire_reset(void) 
{
  OUT_DQ(); 
  CLR_DQ();
  clock_delay_usec(480);
  SET_DQ();
  clock_delay_usec(60);
  IN_DQ();
  clock_delay_usec(10);
  while(!(GET_DQ()));
  OUT_DQ();
  SET_DQ();
}
Example #2
0
/*
 *    读数据函数
 *    输入参数:  无
 *    输出参数:  无
 *    返回参数:  读取的数据
 *
 */
unsigned char DS18B20_Read(void)
{
    unsigned char rdData;     //读出的数据
    unsigned char i, dat;     //临时变量
    
    rdData = 0;               //读出的数据初始化为0     
    
    /* 每次读一位,读8次 */
    for(i=0; i<8; i++)
    {
        CL_DQ();            //IO拉低
        SET_DQ();           //IO拉高
        SET_IN();           //设置IO方向为输入 DS18B20->CC2540
        dat = DQ;           //读数据,从低位开始
        
        if(dat)
        {
          rdData |= (1<<i); //如果读出的数据位为正
        }
        else
        {
          rdData &= ~(1<<i);//如果读出的数据位为负
        }
        
        delay_nus(70);      //保持60~120us
        SET_OUT();          //设置IO方向为输出 CC2540->DS18B20

    }
    return (rdData);        //返回读出的数据
}
Example #3
0
/*
 *    DS18B20初始化/复位函数
 *    输入参数:  无
 *    输出参数:  无
 *    返回参数:  无
 *
 */
void DS18B20_Init(void)
{
    SET_OUT();
    SET_DQ();         //IO口拉高
    CL_DQ();          //IO口拉低
    delay_nus(550);   //IO拉低后保持一段时间 480-960us
    SET_DQ();         //释放
    SET_IN();         //IO方向为输入 DS18B20->CC2540
    delay_nus(40);    //释放总线后等待15-60us
    
    /* 等待DQ变低 */
    while(DQ)
    {
        ; 
    }
    delay_nus(240);   //检测到DQ 变低后,延时60-240us
    SET_OUT();        //设置IO方向为输出 CC2540->DS18B20
    SET_DQ();         //IO拉高
}
Example #4
0
/*
 *    写命令函数
 *    输入参数:  命令(DS18B20.H中定义)
 *    输出参数:  无
 *    返回参数:  无
 *
 */
void DS18B20_Write(unsigned char cmd)
{
    unsigned char i;
    SET_OUT();                  //设置IO为输出,2530->DS18B20
    
    /*每次一位,循环8次*/
    for(i=0; i<8; i++)
    {
        CL_DQ();              //IO为低    
        if( cmd & (1<<i) )    //写数据从低位开始
        {
          SET_DQ();           //IO输入高电平
        }
        else
        {
          CL_DQ();            //IO输出低电平
        }
        delay_nus(40);        //保持15~60us
        SET_DQ();             //IO口拉高
    }
    SET_DQ();                 //IO口拉高
}
uint8_t onewire_read(void)
{
  uint8_t data = 0;
  int i;

  for (i = 0; i < 8; i++)
    {
      OUT_DQ();
      CLR_DQ();
      data = data >> 1;
      SET_DQ();
      IN_DQ();
      clock_delay_usec(8);
      if(GET_DQ())
        data |= 0x80;
      OUT_DQ();
      SET_DQ();
      clock_delay_usec(60);
    }

  return data;
}
void onewire_write(uint8_t data)
{
  uint8_t i;

  OUT_DQ();
  SET_DQ();
  clock_delay_usec(16);

  for(i = 0; i < 8; i++)
    {
      CLR_DQ();
      if(data & 0x01)
        {
          SET_DQ();
        }
      else
        {
          CLR_DQ();
        }
      data = data >> 1;
      clock_delay_usec(40);  //65
      SET_DQ();
    }
}