diff --git a/drivers/onewire/ds18x20.py b/drivers/onewire/ds18x20.py
index a2f7f5c3dafdec79a20431cfc5c4ed75e836cf82..342f4b28aed4eb64b44f14e2e6f91b1b35e232a1 100644
--- a/drivers/onewire/ds18x20.py
+++ b/drivers/onewire/ds18x20.py
@@ -93,6 +93,9 @@ class DS18X20(object):
             temp = temp_read - 0.25 + (count_per_c - count_remain) / count_per_c
             return temp
         elif rom0 == 0x28:
-            return (temp_msb << 8 | temp_lsb) / 16
+            temp = (temp_msb << 8 | temp_lsb) / 16
+            if (temp_msb & 0xf8) == 0xf8: # for negative temperature
+                temp -= 0x1000
+            return temp
         else:
             assert False