Sensor de temperatura con lm35 y pic 16f877a

La explicación que nos da FRICK es de gran utilidad, yo la utilize para crear un sensor de temperatura con un LM35, un PIC16F877A y que se mostrara en °C en una LCD, cuando llegara a una temperatura igual o mayor a 23°C se debería activar un LED. En la imagen de abajo se muestra el resultado obtenido y el codigo generado en Ccompiler.:)
#include "16f877A.h"
#device adc=10
#fuses XT, NOWDT
#use delay (clock=4000000)
#include <math.h> //Necesaria para los cálculos matemáticos
#include <lcd.c>
#use standard_IO(B)

void main() {

int16 ADC;
float conv;

lcd_init();
setup_port_a(AN0);
setup_adc (ADC_CLOCK_INTERNAL);

set_adc_channel(0);
delay_ms(200);
do{
ADC=Read_ADC();
conv= (float)ADC;
conv=conv/3.413333333;
if(conv>=23)
output_high(PIN_B0);
else
output_low(PIN_B0);

//printf(lcd_putc, "\nT=%04.2fC", temp);

printf(lcd_putc, "\nT=%04.2fC",conv);

}while(TRUE);

jejeje las conecciones no son del todo bien:oops:
 

Adjuntos

  • sensor.jpg
    sensor.jpg
    182.7 KB · Visitas: 121
Última edición:
hola tengo una consulta yo estoy haciendo una simulacion en proteus del termometro digital con lm35 y el pic 16f877a con lcd pero quisiera que en el LCD apareciera el voltaje del lm35 con una etapa amplificadora para que me de de 0 a 5v y aparte tambien en la misma pantalla LCD 16x2 en las 2 lineas salga la variable de temperatura algo asi:
voltaje: 3.5v
temperatura: 52ºC
y como poder hacer para que en el salidas del pic 16f877a el puerto D salgan datos binarios del voltaje de entrada para asi poder añadirle un DAC para con un voltimetro poder comprobar el voltaje del sensor.
les agradeceria si me ayudaran a poder programarlo con NIPLE. aqui adjuntare mi esquema en proteus.
 

Adjuntos

  • lm35amplyconv.rar
    19.1 KB · Visitas: 178
Hola a todos, estoy iniciandome en el Conversor A/D de los PIC, y debido a ello tengo algunos problemitas para la programación. Quiero hacer un termómetro digital con un sensor LM35, PIC16F877A y 2 Displays de 7 Segmentos, si fuera posible quisiera utilizar 3, uno de los displays como decimal, pero por ahora me quiero concentrar en los números enteros para no hacer todo tan difícil. Además quiero hacer la salida del PIC en binario, o sea, utilizar un puerto completo para cada display, a fin de hacer las cosas un poco más fácil (perdón por mis desastrosas expresiones :oops:)

También me han dicho que use un Display LCD, ya que sería mucho mas fácil, pero quiero utilizar los de 7 segmentos porque aún no hice ningún proyecto con ellos y me parece muy "brusco" saltar de la nada a un Display LCD.

Mi problema está en que no sé como "adaptar" la lectura del ADC a los displays. El programa que tengo hecho es una recopilación de algunos que vi en la Web, sumado a retoques míos.
Código:
#include <16F877A.h>
#device adc=10
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOWRT,NOBROWNOUT
#use delay(clock=4000000)

void main ()
{
int16 q;
float p;
unsigned int Unidad, Decena;
int Numeros[10] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111};

setup_adc_ports (AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);

Unidad=(int)p%10;
Decena=(int)p/10;

      while(true){
      q=read_adc();
      p=5.0*q/1024.0;
      delay_ms(100);
      output_b(Numeros[Decena]);
      output_d(Numeros[Unidad]);
  }
 
}

Bueno, obviamente mi programa tiene muchos errores, y me gustaría que me digan cuales son y de ser posible cómo solucionarlos.

Espero no haberme olvidado de nada, y por las dudas dejo el DSN para el Isis Proteus

Desde ya, muchas gracias!
 

Adjuntos

  • Diseño.rar
    16.5 KB · Visitas: 181
Bueno amigos, les comento que estuve hablando con un amigo estudiante de electrónica y me ayudó y me hizo razonar sobre como programar y conectar los componentes. Aún no lo hice en la vida real, solo lo simulé en Isis Proteus. Terminé usando un OpAmp (Amplificador Operacional) para aumentar el voltaje de salida del LM35. Les dejo el programa y la conexión para quien le sea de utilidad, mucha suerte a todos y me preguntan ante cualquier duda. Si, el de las dudas era yo pero quizás ahora pueda ayudar a otro, saludos.
 

Adjuntos

  • Diseño.rar
    19.4 KB · Visitas: 428
hola ana21 ojala y veas este comentario. mi duda es como sacaste el valor "3.413333333" el cual esta incluido en la linea de codigo "conv=conv/3.413333333;" .Espero tu respuesta y desde ya gracias.
 
Última edición por un moderador:
Hola, estoy programando un pic 16f877a en mikroc, lo que quiero es reflejar la temperatura en 2 displays de 7 segmentos. y pues la verdad es que no tengo idea. He leído sus comentarios y pues intentaré con ello, pero ojalá puedan ayudarme
 
Hola Steron

El circuito que estás por elaborar lo tienes en el archivo comprimido que subió psyke en su mensaje #24.

saludos
a sus ordenes
 
Última edición:
Hola, otra duda. ¿Como puedo hacer que al presionar un push, todo mi sistema se apague, y que con otro push se encienda?. Esta pensando que con una condicionante, en este caso IF para lo que es mikroC. ¿Alguna sugerencia?
 
Mm, a mi se me ocurre que uses la interrupcion externa, entonces mediante el push haces entrar y salir del modo Sleep al microcontrolador
 
Hola, me sirvio de mucho la información de Psyke y los demas muchas gracias
Quisiera ver si me pueden ayudar puesto que quisiera ahorrar pines del microcontrolador y eh visto que se pueden miltiplexear los display...........alguien me puede ayudar, como se pogramaria? estoy utilizando Pic c Compiler, espero me puedan ayudar.
Les dejo una imagen de lo que eh visto en internet, igual seguiré investigando gracias.
 

Adjuntos

  • multi.JPG
    multi.JPG
    19.5 KB · Visitas: 68
claro que se puede multiplexar el display solo tienes que enviar el numero que quieres mostrar y después activas la posición donde quieras que aparezca el numero solo unos milisegundos. eso lo tengo pero en archivo asm
 
que onda fen2006!
muchas gracias por responder
y bueno si pudieras facilitarme el archivo para ver como programarlo en PCC.
cualquier tipo de ayuda es bien recibida.
gracias!
 
hola Erik te entrego algo de información espero que no este equivocado para que te guíes si no entiendes algo me avisas espero no se aburran ya que es un poquito extenso

sensor de temperatura lm35
Rango de temperatura de -55 ° a +150 ° C
Factor de escala lineal +10.0 mV/°C
Funciona a partir de 4 Hasta 30 volts

MODULO CONVERTIDOR ANALÓGICO/DIGITAL (A/D)

El módulo de conversión Analógico/Digital dispone de cinco entradas para los dispositivos de 28 pines y ocho para dispositivos de 40 pines.
A través de la entrada analógica se aplica la señal analógica a un condensador de captura y retención (sample and hold) que después se introduce en el convertidor. El convertidor de aproximaciones sucesivas da como resultado una palabra de 10 bits.
El convertidor A/D puede seleccionar como tensión de referencia la alimentación interna VDD y masa o bien una externa que se introduzca entre VREF+ y VREF. Cuando se selecciona la tensión de referencia externa, hay que tener en cuenta que existen algunas limitaciones; el máximo voltaje aplicado a la patilla VREF+ será VDD+0,3V y el mínimo VDD-2,5V. En cuanto a la tensión VREF- la mínima tensión será VSS-0,3V y la máxima VREF+ –2V, así por ejemplo, si la tensión de alimentación es de 5V, la tensión VREF+ no podrá exceder de 5V. Por lo que el máximo voltaje en VREF- será de 3V. Siempre se ha de cumplir que VREF+ – VREF– <= 2V.
En el caso de los micros de la serie 16 y 18 de microchip el modulo ADC de el Pic es de 10 bits de resolución el microcontrolado me aumentaría 1 bit cada (VRF+ - VRF-)/2^10 en el caso que tengamos un voltaje VREF– = Vss; y VREF+ =3V el voltaje por bit seria de 3V/1024 = 0,002929688V/bit = 2. 929688 mV/bit
Lo que quiere decir que el registro del ADC me aumentara en 1 por cada 2. 929688 mV/bit.
Acomodando las escalas si el sensor lm35 me entrega 10.0 mV/°C y el ADC me aumenta en 2. 932551mV por bit y necesito que me quede uno a uno la escala puedo buscar un factor que me haga esto y seria 10.0 mV/C° / 2. 929688 mV/bit = 3,41333 o sea que si divido el valor de la conversión A/D por este valor 3,41333 me dará el valor de la temperatura en grados centígrados

Para realizar una conversión A/D deben seguirse los siguientes pasos:
1. Configurar el módulo conversor A/D
• Configurar los pines que actúan como entradas analógicas, las señales que harán de tensión de referencia la que trabajarán como E/S digitales (ADDCON1).
• Seleccionar el canal de entrada. A/D (ADCON0).
• Seleccionar la fuente de la señal de reloj para la conversión A/D (ADON0).
• Hacer la selección del formato de justificación
• Activar el módulo de conversión A/D (ADCON0)

2. Activar si, se desea, la interrupción del módulo conversor A/D
3. Esperar el tiempo requerido para la adquisición
4. Inicio de la conversión
5. Tiempo de espera para terminar la conversión A/D que puede detectarse
6. Leer el par de registros ARDESH:ADRESL donde se encuentran los 10 bits que resultan de la conversión y poner a cero el flag ADIF.
7. Para una nueva conversión volver a los pasos 1 y 2, El tiempo de conversión por bit está definido por TAD, se exige un mínimo de 2*TAD para realizar una nueva conversión.

te anexo un ejemplo realizado en Pic c de CCS y la simulación en Proteus.

saludos



disculpa, pero si quisera usar dos displays de 7 segmentos multiplexado con un 74LS48, la salida la pongo directamente en el portb o tendria que reeescribir las salidas de cada pin? es que lo quisera utilizar con un pic16f819, pero con este ejemplo le entenderia bien y gracias por la info ;)
 
Última edición:
Hola, estoy realizando un trabajo final para la facultad, el cual consiste en un sensado de temperaturas con lm35 y un lcd 16x4
Lo habia realizado para el pic 18f4550 y me anduvo de diez, pero al querer realizarlo en el pic 16f877a me surgen algunos problemas en cuanto al código.
Este es el codigo del pic 18f4550, con las modificaciones que realice, pero cuando lo simulo en proteus no anda.

Código:
 LIST P=16F877a
 INCLUDE <P16f877a.INC> 
;***Comienzo a definir variables***

; Oscilador utilizado 4MHz.-
; ************************************************
ByteAlto    equ 0x20    ; Registro para guardar Byte alto de la conversion.-
ByteBajo    equ 0x21    ; Regsitro para guardar Byte bajo de la conversion.-
Contador    equ 0x22    ; registro utilizado en demora.-
ASCII_H EQU 0x2B
ASCII_M EQU 0x2C
ASCII_L EQU 0x2D
HEXADECIMAL EQU 0x23    ;GUARDA EL DATOS DEL SENSOR
NUMASCCII   EQU 0x24    ;RESULTADO DE CONVERSION HEX A ASCCII

CONTA1       EQU    0124H
CONTA2       EQU    0125H
CONTA3       EQU    0126H
; ************************************************
			org     0x00
		    GOTO CONFIPIC
INICIO
        	CALL MENSAJE
PROCESO
			bsf     STATUS,5  ; Banco 1
			movlw   0x8E        ; Justificado a la derecha, Fosc/8, RA0 analógico, VDD, VSS.-
			movwf   ADCON1
			bcf     STATUS,5  ; Banco 0
			movlw   0x41        ; Fosc/8, Canal 0, módulo habilitado.-
			movwf   ADCON0
			call    Demora_20us ; Demora de adquision.-
			bsf     ADCON0,GO
Espera
			btfsc   ADCON0,GO   ; Espera a que termine conversion.-
			goto    Espera
			movf    ADRESH,0   ; Movemos resultado de la conversion.-
			addwf ADRESH,0
		    CALL Hex_Ascii    
		    CALL MOSTRAR_TEMPERATURA
		    ;BSF PORTB,2
			bsf     STATUS,5  ; Banco 1
			movf    ADRESL,0
			;movwf   ByteBajo
			bcf     STATUS,5  ; Banco 0.-
			bsf     ADCON0,ADON ; Apago modulo de conversion.-
	
		 	GOTO PROCESO
	;**** Demora ****
Demora_20us
			movlw   0x05 ;
			movwf   Contador ; Iniciamos contador1.-
Repeticion
			decfsz  Contador,1 ; Decrementa Contador1.-
			goto    Repeticion ; Si no es cero repetimos ciclo.-
			return              ; Regresa de la subrutina.-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;; RUTINA PARA CONVERTIR HEX ASCCII ;;;;;;;;;;;;;;;;;;;;;;;

Hex_Ascii      ;cargar en W el dato hex

			movwf HEXADECIMAL 
			clrf ASCII_H ;Para BCD D'0'
			clrf ASCII_M ;Para BCD D'0'
			clrf ASCII_L ;Para BCD D'0'

Centenas	movlw D'100' ;D'100' --> W
			subwf HEXADECIMAL,0 ;HEXADECIMAL - D'100' --> W
			btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ?
			goto Decenas ;Si
			movwf HEXADECIMAL ;Salva el resto
			incf ASCII_H,F ;Incrementa el contador de centenas BCD
			goto Centenas ;Vuelve por otros D'100'

Decenas		movlw D'10' ;D'10' --> W
			subwf HEXADECIMAL,0 ;HEXADECIMAL - D'10' --> W
			btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ?
			goto Unidades ;Si
			movwf HEXADECIMAL ;Salva el resto
			incf ASCII_M,F ;Incrementa el contador de decenas BCD
			goto Decenas ;Vuelve por otros D'10'

Unidades	movf HEXADECIMAL,0 ;El resto pertenece
			movwf ASCII_L ;a las unidades BCD
			clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL
            
Bcd_A_Ascii	movlw H'30' ;H'30' --> W
			iorwf ASCII_L,F ;Convierte de BCD a ASCII	
			iorwf ASCII_M,F ;Convierte de BCD a ASCII

			movf ASCII_H,F ;ASCII_H --> F
			btfsc STATUS,Z ;? ASCII_H es D'00' ?
			goto Espacio ;Si
			movlw H'30' ;H'30' --> W
			iorwf ASCII_H,F ;Convierte de BCD a ASCII
			return ;Retorna
 
Espacio
			movlw '0' ;A' ' --> W
			movwf ASCII_H ;A' ' --> ASCII_H
			return ;Retorna

;**********************************************************************
;     MOSTRAR MENSAJE DE BIENVENIDA
;**********************************************************************
MENSAJE
				NOP
   				MOVLW	    038H         ; Inicio LCD a 8 bits, 2 linea            
	      	    CALL      CONTROL
				MOVLW     0CH          ; sentido giro 0000 0101 
				CALL      CONTROL 
	            MOVLW     01H                         
                CALL      CONTROL      ; Limpia todo el display  y retorna el cursor a la posicion de inicio de LCD ... 
                CALL      RETARDO     ; Tiempo prudencial para que la lcd ermnie la instruccion anterior der borrado ...


                MOVLW     " "          
                CALL      DATO
                MOVLW     " "          
                CALL      DATO
                MOVLW     " "         
                CALL      DATO
                MOVLW     "S"          
                CALL      DATO    
                MOVLW     "E"          
                CALL      DATO 
                MOVLW     "N"         
                CALL      DATO    
                MOVLW     "S"          
                CALL      DATO          
                MOVLW     "A"          
                CALL      DATO    
                MOVLW     "D"         
                CALL      DATO           
                MOVLW     "O"         
                CALL      DATO    
                MOVLW     " "         
                CALL      DATO                
                MOVLW     "D"          
                CALL      DATO    
                MOVLW     "E"          
                CALL      DATO    
                MOVLW     " "          
                CALL      DATO                
                MOVLW     ""          
                CALL      DATO    
                MOVLW     ""         
                CALL      DATO
;************ SEGUNDA LINEA **************************
				MOVLW     " "          
                CALL      DATO
                MOVLW     " "          
                CALL      DATO
                MOVLW     " "         
                CALL      DATO
                MOVLW     " "          
                CALL      DATO    
                MOVLW     "T"          
                CALL      DATO 
                MOVLW     "E"         
                CALL      DATO    
                MOVLW     "M"          
                CALL      DATO          
                MOVLW     "P"          
                CALL      DATO    
                MOVLW     "E"         
                CALL      DATO           
                MOVLW     "R"         
                CALL      DATO    
                MOVLW     "A"         
                CALL      DATO                
                MOVLW     "T"          
                CALL      DATO    
                MOVLW     "U"          
                CALL      DATO    
                MOVLW     "R"          
                CALL      DATO                
                MOVLW     "A"          
                CALL      DATO    
                MOVLW     " "         
                CALL      DATO
		MOVLW     " "          
                CALL      DATO
                MOVLW     " "          
                
      	        CALL RETARDO
       	        CALL RETARDO
      	        CALL RETARDO
                CALL RETARDO
                CALL RETARDO
                CALL RETARDO
                CALL RETARDO
                   
	            MOVLW     01H                         
                CALL      CONTROL      ; Limpia todo el display  y retorna el cursor a la posicion de inicio de LCD ... 
                  
                CALL      RETARDO     ; Tiempo prudencial para que la lcd ermnie la instruccion anterior der borrado ...

                MOVLW     "T"          
                CALL      DATO    
                MOVLW     "E"          
                CALL      DATO 
                MOVLW     "M"          
                CALL      DATO    
                MOVLW     "P"          
                CALL      DATO  
		MOVLW     " "          
                CALL      DATO  
		MOVLW     "="          
                CALL      DATO  
		MOVLW     " "          
                CALL      DATO 
                MOVLW     B'10001100'                         
                CALL      CONTROL      ; POSICIONA EL CURSOR EN UNA CIERTA POSICION
  
				MOVLW     0xDF			;envia el simbolo de grados celsius
				CALL      DATO    
				MOVLW     'C'
				CALL      DATO
              RETURN

;**********************************************************************
;**********************************************************************
; MOSTRAR TEMPERATURA
;**********************************************************************
MOSTRAR_TEMPERATURA
 				NOP
                MOVLW     B'10001000'                         
                CALL      CONTROL        
                
                movf 	ASCII_H,0 ;envia las centenas de temperatura
				CALL      DATO    
				movf ASCII_M,0   ;envia las decenas de temperatura
				CALL      DATO    
				movf ASCII_L,0  ;envia las unidades de temperatura
				CALL      DATO    
				MOVLW     " "    
                CALL      DATO 
                CALL RETARDO

              RETURN

;**********************************************************************
;**********************************************************************
; CONTROL LCD 
;**********************************************************************
CONTROL 	     BCF	     PORTA,1        ; RS =  0 Control
              	 BSF	     PORTA,2        ; E    =  1 Habilito LCD ...
              	 NOP
              	 NOP
             	 NOP
        	     MOVWF    PORTD	        ; Saca dato puerto B
                 CALL     RETARDO1
                 CALL     RETARDO1
        	     BCF      PORTA,2        ; E   =  0    Desabilito LCD ...
        	     RETURN
;**********************************************************************
; DATO  LCD 
;**********************************************************************
DATO        	 BSF	     PORTA,1        ; RS =  1   Dato    
             	 BSF	     PORTA,2        ; E    =  1 Habilito LCD ...
             
             	 MOVWF    PORTD	        ; Saca dato puerto B
        	     CALL     RETARDO1
                 BCF      PORTA,2        ; E   =  0    Desabilito LCD ...
        	     RETURN     
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;**********************************************************************
; RETARDO1        TIEMPO DE WRITE Y READ DE DATO PARA LCD MODIFAMOS 019-025-30
;**********************************************************************
RETARDO1          MOVLW      0C8H
                  MOVWF      CONTA2         ;cargo el registro CONTA1 con AAh
CICLO22           MOVLW      01H    
                  MOVWF      CONTA3         ;cargo el registro CONTA1 con 01h

CICLO11           DECFSZ     CONTA3,1          ;decrementa el contenido CONTA3
                  GOTO       CICLO11            
            
                  DECFSZ     CONTA2,1          ;decrementa el contenido CONTA2
                  GOTO       CICLO22  
                  RETURN  
;**********************************************************************
; RETARDO
;**********************************************************************

RETARDO	 		MOVLW  0FFH				;CARGAMOS EN EL REGISTRO DE TRABAJO EN FF  UN DECREMENTO
				MOVWF  CONTA1			;LO MEVEMOS AL REGISTRO DE PROPOCITO GENERAL CONTA 1
CICLO3  		MOVLW  0FFH				;CARGA EN EL REGISTRO DE TRABAJO FF PARA UN DECREMENTO
				MOVWF  CONTA2			;LO MEVEMOS A LA ETIQUETA 
CICLO2  		MOVLW  01H				;CARGA EN EL REGISTRO DE TRABAJO PARA UN DECREMENTO
				MOVWF  CONTA3			;LO MUEVE AL REGISTRO
CICLO1  		DECFSZ CONTA3,1				;DECREMENTA EL REGISTRO Y DEJA EL RESULTADO EN ESE REGISTRO
				GOTO   CICLO1		        ;SI EL DECREMENTO ES CERO SALTA A LA ETIQUETA
				DECFSZ CONTA2,1			;DECREMENTA
				GOTO   CICLO2			;SIEL DECREMENTO ES CERO SALTA
				DECFSZ CONTA1,1			;DECREMENTA
				GOTO   CICLO3			;SI ES CERO SALTA
				RETURN					;RETORNA



;**********************************************************************
;******************** CONFIGURACION PIC *******************************
;**********************************************************************

CONFIPIC	
			NOP
			BANKSEL 0F00H
			MOVLW b'00000000'   ;pone el puerto b como salida
			MOVWF TRISB			;MOSTRAMOS POR EL PUERTO B
                        CLRF PORTB
				
			MOVLW b'00000000'   ;pone el puerto b como salida
			MOVWF TRISD		;MOSTRAMOS POR EL PUERTO D
                        CLRF PORTD



;*********************************************************************           
			
			MOVLW    0Fh
			MOVWF    ADCON1 
			MOVLW    07h
			MOVWF    CMCON 
			MOVLW    00h 
			MOVWF    TRISA
			CLRF        PORTA

            BSF      PORTA,2
            CALL     RETARDO
            BCF      PORTA,2
            CALL     RETARDO
            BSF      PORTA,2
            CALL     RETARDO
			GOTO INICIO
            
	END
 
Atrás
Arriba