# Termometro Digital con PIC



## yukardo (Nov 7, 2007)

Saludos

Estoy diseñando un termometro digital usando el PIC 16F876A, estoy trabajando con el lenguaje Mbasic.

Me gustaria saber como comenzar ya que lo quiero hacer usando 3 displays 7 segmentos.

Espero su colaboracion. Gracias de antemano.


----------



## mabauti (Nov 7, 2007)

podrias utilizar el DS1820 como sensor , o el Lm335 ya que el 876 tiene ADC y quiza te convenga mas utilizar tablas de datos.


----------



## Leon Elec (Nov 7, 2007)

Hola yukardo. En el foro www.todopic.com.ar hay varias temas tratando esto mismo.

Si te aparece bad gateway al intentar entrar, preciona F5 hasta que logres entrar.

Saludos.


----------



## yukardo (Nov 7, 2007)

yo estoy usando el lm335


----------



## aerodesliza (Nov 8, 2007)

Con el LM35 es buena opcion solo necesitas el A/D del PIC, en verdad es bien facil de hacer, te sugiero que utilizes MikroC

Saludos


----------



## bucanero72 (Sep 20, 2010)

el LM35 soporta como máximo 150ºC. ¿Algún sensor para 200ºC? Gracias.


----------



## Aadrians (Oct 22, 2014)

¿Qué tal amigos? Llevo rato intentando y simplemente no me sale, he buscado información y no me funciona mucho.
Estoy programando en ensamblador con el mplab por que así me lo estipuló el maestro.
Logré conseguir que en el proteus mi programa jale pero físicamente no hace nada, ni el adc manda señal!!

Anexo mi código, aún le falta, tengo que cambiarlo también a farenheit. que me lo muestre en la linea 2 del lcd, y ponerle un rango de temperatura mínima y temperatura máxima donde encienda un led.

```
processor 16f877a
  include <p16f877a.inc>

  ;Variable para el DELAY del ADC
val equ h20

  ;Variables para el DELAY del ENABLE LCD
val2 equ 0x30
val1 equ 0x31
R_ContA equ 0x41
R_ContB equ 0x42
  ;Variables para separar el resultado de ADC
  ; en valor BCD
Unidades equ 0x32     
Decenas equ 0x33      
Centenas equ 0x34   
Resto equ 0x35

  ;Variables para separar la convercion en farenheit del adc
  ; en valor BCD
UnidadesF equ 0x36
DecenasF  equ 0x37
CentenasF equ 0x38
RestoF    equ 0x39
Tempf      equ 0x40
  org 0h
  goto INICIO
  org 05h

INICIO:
      clrf PORTA        ;Limpia el puerto A
      clrf PORTB        ;Limpia el puerto B
      clrf PORTC        ;Limpia el puerto C    
      clrf PORTD        ;Limpia el puerto D
      bsf STATUS,RP0    
      bcf STATUS,RP1    ;Cambio al banco 1
      
      ;Configuración de puertos C-D para el LCD
      clrf TRISC        ;Configura PORTC como salida
      clrf TRISD        ;Configura PORTD como salida
      
      ;Configuración del puerto A para ADC
      movlw 0         
      movwf ADCON1      ;Configura puerto A y E como analógicos
      movlw 3fh         
      movwf TRISA       ;Configura el puerto A como entrada
      movlw 0
      
      ;Configuración del puerto B para mostrar el resultado ADC
      movwf TRISB       ;Configura puerto B como salida
      bcf STATUS,RP0    ;Regresa al banco 0
      
      ;Inicio del programa
START
      call START_LCD   ;Inicializa LCD
      call START_ADC   ;Comienza la lectura del Conv. A/D
      call PRINT_TEMP
      call START_ADC
      call PRINT_TEMPF
      ;Inicia LCD
START_LCD:
      bcf PORTC,0      ; RS=0 MODO INSTRUCCION
      movlw 0x01       ; 0x01 limpia la pantalla en el LCD
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      movlw 0x0C       ; Selecciona la primera línea
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      movlw 0x3C       ; Se configura el cursor
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      bsf PORTC, 0     ; Rs=1 MODO DATO
      return
      
      ;Rutina para enviar un dato
ENVIA:
      bsf PORTC, 0    ; RS=1 MODO DATO
      call COMANDO    ; Se da de alta el comando
      return 
       
      ;Rutina para enviar comandos
COMANDO:
      bsf PORTC, 1    ; Pone la señal ENABLE en 1
      call DELAY2     ; Tiempo de espera
      bcf PORTC, 1    ; ENABLE=0    
      call DELAY2
      return     
      
      ;Rutina para limpar pantalla LCD  
ERASE_LCD
      bcf PORTC,0      ; RS=0 MODO INSTRUCCION
      movlw 0x01       ; 0x01 limpia la pantalla en el LCD
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      bsf PORTC, 0     ; Rs=1 MODO DATO
      return
      
      ;Configuración Convertidor A/D
START_ADC
      movlw b'11000001' ;ConfiguraciÃ³n ADCON0 
      movwf ADCON0      ;ADCS1=1 ADCS0=1 CHS2=0 CHS1=0 
                        ;CHS0=0 GO/DONE=0 - ADON=1

CICLO: bsf ADCON0,2      ;Conversión en progreso GO=1
       call DELAY1       ;Espera que termine la conversión
ESPERA btfsc ADCON0,2    ;Pregunta por DONE=0?(Terminó conversión)
       goto ESPERA       ;No, vuelve a preguntar
       movf ADRESH,0     ;Si
       movwf PORTB       ;Muestra el resultado en PORTB
       return

       ;Rutina que muestra temperatura
PRINT_TEMP
       call ERASE_LCD    ;Limpia LCD
       movlw 'T'
       movwf PORTD
       call ENVIA
       movlw '='
       movwf PORTD
       call ENVIA

       call READ_TEMP    ;Llamada a rutina que obtine el 
                         ;valor de la temperatura a partir
                         ;del  resultado del Conv a/D

       movf Centenas,W   ;Imprime el dígito de las centenas
       movwf PORTD
       call ENVIA
       movf Decenas,W    ;Imprime el dígito de las decenas
       movwf PORTD
       call ENVIA
       movf Unidades,W   ;Imprime el dígito de las unidades
       movwf PORTD
       call ENVIA
       movlw hDF      ;Imprime el simbolo "°"
       movwf PORTD
       call ENVIA 
       movlw 'C\
       movwf PORTD
       call ENVIA
       movlw ' '
       movwf PORTD
       call ENVIA
        RETURN

PRINT_TEMPF        ;Rutina que muestra la temperatura en Farenheit
       movlw 'T'
       movwf PORTD
       call ENVIA
       movlw '='
       movwf PORTD
       call ENVIA
       
       call READ_TEMPF

       movf CentenasF,W   ;Imprime el dígito de las centenas
       movwf PORTD
       call ENVIA
       movf DecenasF,W    ;Imprime el dígito de las decenas
       movwf PORTD
       call ENVIA
       movf UnidadesF,W   ;Imprime el dígito de las unidades
       movwf PORTD
       call ENVIA
       movlw ' '
       movwf PORTD
       call ENVIA
       movlw hDF       ;Imprime el simbolo "°"
       movwf PORTD
       call ENVIA 
       movlw 'F'
       movwf PORTD
       call ENVIA
       
       goto START        ;Repite el ciclo de lectura ADC

       ;Rutina que obtine el valor de la temperatura
       ;a partir del  resultado del Conv a/D
READ_TEMP:
       clrf Centenas
       clrf Decenas
       clrf Unidades
      
       movf ADRESH,W   
       addwf ADRESH,W     ;Dupilca el valor de ADRESH para 
                          ;obtener un valor de temperatura real aprox
       movwf Resto       ;Guarda el valor de ADRESH en Resto   
       ;Comienza el proceso de otención de valores BCD 
       ;para Centenas, Decenas y unidades atraves de restas
       ;sucesivas.
CENTENAS1
       movlw d'100'      ;W=d'100'
       subwf Resto,W     ;Resto - d'100' (W)
       btfss STATUS,C    ;Resto menor que d\'100\'?
       goto DECENAS1     ;SI
       movwf Resto       ;NO, Salva el resto
       incf Centenas,1   ;Incrementa el contador de centenas BCD
       goto CENTENAS1    ;Realiza otra resta
DECENAS1
       movlw d\'10\'       ;W=d'10'
       subwf Resto,W     ;Resto - d\'10\' (W)
       btfss STATUS,C    ;Resto menor que d\'10\'?
       goto UNIDADES1    ;Si
       movwf Resto       ;No, Salva el resto
       incf Decenas,1    ;Incrementa el contador de centenas BCD
       goto DECENAS1     ;Realiza otra resta
UNIDADES1
       movf Resto,W      ;El resto son la Unidades BCD
       movwf Unidades
       clrf Resto

       ;Rutina que obtiene el equivalente en ASCII       
OBTEN_ASCII
       movlw h30
       iorwf Unidades,f      
       iorwf Decenas,f
       iorwf Centenas,f
       return

READ_TEMPF:
      clrf CentenasF
       clrf DecenasF
       clrf UnidadesF
      
       movf ADRESH,W   
       addwf ADRESH,W     ;Dupilca el valor de ADRESH para 
       ;obtener un valor de temperatura real aprox
       movwf RestoF        ;Guarda el valor de ADRESH en Resto  
       
       ;Comienza el proceso de otención de valores BCD 
       ;para Centenas, Decenas y unidades atraves de restas
       ;sucesivas.
CENTENAS2
       movlw d'100'      ;W=d'100'
       subwf RestoF,W     ;Resto - d'100' (W)
       btfss STATUS,C    ;Resto menor que d\'100\'?
       goto DECENAS2     ;SI
       movwf RestoF       ;NO, Salva el resto
       incf CentenasF,1   ;Incrementa el contador de centenas BCD
       goto CENTENAS2    ;Realiza otra resta
DECENAS2
       movlw d'10'       ;W=d'10'
       subwf RestoF,W     ;Resto - d'10' (W)
       btfss STATUS,C    ;Resto menor que d'10'?
       goto UNIDADES2    ;Si
       movwf RestoF       ;No, Salva el resto
       incf DecenasF,1    ;Incrementa el contador de centenas BCD
       goto DECENAS2     ;Realiza otra resta
UNIDADES2
       movf RestoF,W      ;El resto son la Unidades BCD
       movwf UnidadesF
       clrf RestoF
;Rutina que obtiene el equivalente en ASCII       
OBTEN_ASCII2
       movlw h30
       iorwf Unidades,f      
       iorwf Decenas,f
       iorwf Centenas,f
       return

;Rutina que genera un Delay de 20 microSeg aprox.
;para el Conv. A/D
DELAY1:             
       movlw h30
       movwf val
Loop   decfsz val,1
       goto Loop
       return
;Configuración Lineal 2 LCD
LINEA2:
        bcf PORTC, 0    ; RS=0 MODO INSTRUCCION
        movlw 0xc0        ; Selecciona linea 2 pantalla en el LCD
        movwf PORTD
        call COMANDO    ; Se da de alta el comando
        return
;Subrutina de retardo para ENABLE_LCD 
DELAY2:            
Retardo_50ms                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'50'            ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms
Retardos_ms
    movwf    R_ContB            ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
    movlw    d'250'            ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA            ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
    nop                ; Aporta KxMx1 ciclos máquina.
    decfsz    R_ContA,F        
    goto    R1ms_BucleInterno
    decfsz    R_ContB,F    
    goto    R1ms_BucleExterno
    return
    end
```


----------

