El problema que tienes es que la configuración del scratchpad del DS1820 no es igual que la DS18B20. El primero almacena la temperatura en una variable word, cuyo byte más significativo indica el signo de la medición (del bit 15 al bit 8 ), la temperatura se recoge del bit7 al bit1 y, finalmente, el bit0 indica la parte decimal (resolución de 0,5 grados). En cambio el DS18B20 tiene la siguiente estructura: Del bit15 al bit11 el signo, del bit10 al bit4 la temperatura y del bit3 al bit0 la parte decimal (con una resolución de 0,0625 grados).
Te pongo a continuación un ejemplo realizado con el 18F2550:
'*******************************************************************************
'
' LECTURA DE LA ROM DE UN DISPOSITIVO 1-WIRE™
' ===========================================
'
' En este proyecto se lee y se muestra en un LCD la temperatura de un
' dispositivo DS18B20 con protocolo de comunicación en bus 1-Wire™
' (Dallas Semiconductor 1-Wire™)
'
' La conexión del pin DQ del dispositivo se realiza a través de RC0 del
' microcontrolador y con una resistencia pull-up de 10K
'
' El LCD alfanumérico (HD 44780) 2x16 se conecta por bus de 4 vías a un PIC
' 18F2550, con cristal de 20 Mhz, de la siguiente forma:
'
' Display Pin del Microcontrolador
' ------- ------------------------
' DB4 RB4
' DB5 RB5
' DB6 RB6
' RB7 RB7
' RS RB0
' E RB1
' RW RB2
' BL+ RB4
'
' El contraste del LCD es controlado a través de una resistencia variable de
' 10K conectada en el pin VEE del display.
'
'*******************************************************************************
'
' Autor: ARM
' Fecha: Marzo, 2011
' Compilador: Basic de Proton IDE
' Archivo: DS18B20_18F2550.BAS
'
' Modificaciones:
' ===============
'
'
'*******************************************************************************
'
' DECLARACIONES [DISPOSITIVO, FUSES, ALIAS, VARIABLES Y CONSTANTES]
'-------------------------------------------------------------------------------
Config_Start
PLLDIV = 5 ;Divide by 5 (20 MHz oscillator input)
CPUDIV = OSC1_PLL2 ;[OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
USBDIV = 2 ;USB clock source comes from the 96 MHz PLL divided by 2
FOSC = HSPLL_HS ;XT oscillator, PLL enabled, XT used by USB
FCMEN = OFF ;Fail-Safe Clock Monitor disabled
IESO = OFF ;Oscillator Switchover mode disabled
PWRT = On ;PWRT enabled
BOR = On ;Brown-out Reset enabled in hardware only (SBOREN is
;disabled)
BORV = 3 ;Minimum setting
VREGEN = On ;USB voltage regulator enabled
WDT = OFF ;HW Disabled - SW Controlled
WDTPS = 32768 ;1:32768
MCLRE = On ;MCLR pin enabled; RE3 input pin disabled
LPT1OSC = OFF ;Timer1 configured for higher power operation
PBADEN = OFF ;PORTB<4:0> pins are configured as digital I/O on Reset
STVREN = On ;Stack full/underflow will cause Reset
LVP = OFF ;Single-Supply ICSP disabled
XINST = OFF ;Instruction set extension and Indexed Addressing mode
;disabled (Legacy mode)
Debug = OFF ;Background debugger disabled, RB6 and RB7 configured as
;general purpose I/O pins
CP0 = OFF ;Block 0 (000800-001FFFh) not code-protected
CP1 = OFF ;Block 1 (002000-003FFFh) not code-protected
CP2 = OFF ;Block 2 (004000-005FFFh) not code-protected
CP3 = OFF ;Block 3 (006000-007FFFh) not code-protected
CPB = OFF ;Boot block (000000-0007FFh) not code-protected
CPD = OFF ;Data EEPROM not code-protected
WRT0 = OFF ;Block 0 (000800-001FFFh) not write-protected
WRT1 = OFF ;Block 1 (002000-003FFFh) not write-protected
WRT2 = OFF ;Block 2 (004000-005FFFh) not write-protected
WRT3 = OFF ;Block 3 (006000-007FFFh) not write-protected
WRTB = OFF ;Boot block (000000-0007FFh) not write-protected
WRTC = OFF ;Configuration registers (300000-3000FFh) not
;write-protected
WRTD = OFF ;Data EEPROM not write-protected
EBTR0 = OFF ;Block 0 (000800-001FFFh) not protected from table reads
;executed in other blocks
EBTR1 = OFF ;Block 1 (002000-003FFFh) not protected from table reads
;executed in other blocks
EBTR2 = OFF ;Block 2 (004000-005FFFh) not protected from table reads
;executed in other blocks
EBTR3 = OFF ;Block 3 (006000-007FFFh) not protected from table reads
;executed in other blocks
EBTRB = OFF ;Boot block (000000-0007FFh) not protected from table
;reads executed in other blocks
Config_End
'Esta declarión indica a PROTON en que
'posición de memoria de programa del PIC debe
'comenzar para evitar sobreescribir el
'bootloader:
Declare PROTON_START_ADDRESS = $1000
Device = 18F2550 'Dispositivo utilizado
Declare Xtal = 48 'Frecuencia de oscilación para la CPU en Mhz
Declare All_Digital = True 'Todo digital ( es lo mismo que ADCON1 = 15)
CMCON = 7 'Desactivar comparadores
PortB_Pullups = Off 'Deshabilita las resistencias pull-up
'internas del puerto B
Declare LCD_Type ALPHA 'Tipo de LCD alfanumérico
Declare LCD_DTPin PORTB.4 'se usa el nibble alto (RB4, RB5, RB6 y RB7)
'para el bus de datos
Declare LCD_ENPin PORTB.1 'Pin E del LCD conectado a RB4
Declare LCD_RSPin PORTB.0 'Pin RS del LCD conectado a RB4
Declare LCD_Interface 4 'Bus de 4 vías
Declare LCD_Lines 2 'LCD de dos líneas
Symbol RW = PORTB.2 'A RB2 se conecta el pin R/W del LCD
Symbol BL = PORTB.3 'A RB3 se conecta la retroiluminación del LCD
Symbol DQ = PORTC.0 'El pin "DQ" del One-wire es el PortC.0
Dim Busy As Bit 'Bit de ocupado
Dim temp As Word 'Temperatura leida directamente
Dim Mostrar_int As Word 'Parte entera de la medición
Dim Mostrar_dec As Word 'Parte decimal de la medición
DelayMS 200 'Pausa de 200 milisegundos para inicializar
'el LCD
Low RW 'Se conecta a masa el pin RW del LCD para
'habilitar el modo escritura (Write)
High BL 'Se enciende la retroiluminación (BackLight)
Clear 'Inicializa la RAM (la llena de ceros)
Cls 'Limpia el LCD y pone el cursor en la prime-
'ra linea y en la primera posición
'PROGRAMA PRINCIPAL
'-------------------------------------------------------------------------------
Convertir: 'Comienza conversion
OWrite DQ,1,[$CC,$44] 'Salta la ROM y hace la conversion
Esperar: 'Espera...
ORead DQ,4,[Busy] 'Comprueba si esta ocupado
If Busy = 0 Then Esperar '¿Ocupado? espera otra vez...
OWrite DQ,1,[$CC,$BE] 'Omite consultar la ROM y lee la temperatura
'Lee los primeros 2 bytes de la RAM:
ORead DQ,2,[temp.LowByte,temp.HighByte]
If temp.11 = 1 Then 'Si el bit11 es 1 la temperatura es negativa
Mostrar_int = (~temp >> 4)
Mostrar_dec = (16-(temp.LowByte & %00001111)) * 625
Print At 1,1," Temperatura:"
Print At 2,1," -",Dec Mostrar_int,".",Dec Mostrar_dec Dig 3,_
" ",223,"C"
Else 'Si el bit11 es 0 la temperatura es positiva
Mostrar_int = (temp >> 4)
Mostrar_dec = (temp.LowByte & %00001111) * 625
Print At 1,1," Temperatura:"
Print At 2,1," ",Dec Mostrar_int,".",Dec Mostrar_dec Dig 3,_
" ",223,"C"
EndIf
GoTo Convertir 'Repite todo el proceso indefinidamente
'SUBRUTINAS
'-------------------------------------------------------------------------------
'*******************************************************************************
End 'Fin del programa
'*******************************************************************************