
#define WIRE_PORT P2_4

#define DS1820_SKIP_ROM             0xCC
#define DS1820_READ_SCRATCHPAD      0xBE
#define DS1820_CONVERT_T            0x44

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  float temper = GetData();
  Serial.print(temper, DEC);
  Serial.println(" Celsius");
  
  delay(1000);
  
} // end loop

// ---- Reset ------------------------------------------------------------------
int ds1820_reset(int pin){
  
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
  
  delayMicroseconds( 480 );
  pinMode( pin, INPUT );

  int bus = digitalRead(pin);
  delayMicroseconds( 480 ); 

  return ( bus );
}
// ---- Read bit ---------------------------------------------------------------
int ds1820_read_bit(int pin){
  
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
  delayMicroseconds( 5 );
  
  pinMode( pin, INPUT );
  delayMicroseconds( 10 );
  
  int value = ( digitalRead( pin ) == HIGH );
  
  delayMicroseconds( 45 );
  return value;
}
// ---- Read bits ---------------------------------------------------------------
int ds1820_read_bits( int pin ){
  
  int i;
  int value = 0;
  
  pinMode( pin, INPUT );
  
  for(i=16; i>0; i--)
  {
    value >>= 1;
    if ( ds1820_read_bit(pin) )
    {
      value |= 0x8000;
    }
  }

  return value;
}
// ---- Write bit ---------------------------------------------------------------
void ds1820_write_bit(int b, int pin){
  
  pinMode(pin, OUTPUT);
  digitalWrite(pin, LOW);
  
  if ( b ) {
    delayMicroseconds( 5 );
   // digitalWrite(pin, HIGH);
    pinMode( pin, INPUT );
    delayMicroseconds( 55 );
  } else {
    delayMicroseconds( 60 );
  //  digitalWrite(pin, HIGH);
    pinMode( pin, INPUT );
  }
  delayMicroseconds( 1 );
}
// ---- Write bits ---------------------------------------------------------------
int ds1820_write_bits( int data, int pin ){
  
  int i;
  
  for(i=8; i>0; i--) {
    if(data & 0x01) {
      ds1820_write_bit(1, pin );
    }
    else {
      ds1820_write_bit(0, pin );
    }
    data >>=1;
  }
  
  return 1;
}

float GetData(void)
{
  int temp;
  ds1820_reset(WIRE_PORT);
  ds1820_write_bits( DS1820_SKIP_ROM , WIRE_PORT );
  ds1820_write_bits( DS1820_CONVERT_T , WIRE_PORT );
  delay(750);
  ds1820_reset(WIRE_PORT);
  ds1820_write_bits( DS1820_SKIP_ROM , WIRE_PORT );
  ds1820_write_bits( DS1820_READ_SCRATCHPAD , WIRE_PORT );
  
  temp = ds1820_read_bits( WIRE_PORT );
  if(temp<0x8000){
    return(temp*0.0625);
  }
  else
  {
    temp=(~temp)+1;
    return(temp*0.0625);
  }
}




