Está en la página 1de 11

UNIVERSIDAD NACIONAL DEL

CALLAO
FACULTAD DE INGENIERA ELCTRICA Y ELECTRNICA
ESCUELA PROFESIONAL DE INGENIERA ELECTRNICA

CONTROL DE TEMPERATURA CON PIC


16F877A
CURSO

PROFESOR

ELECTRNICA DE POTENCIA 1

Ing. RUSEL CORDOVA

ALUMNOS:

1 9 6 6

BELLAVISTA CALLAO
2009

CONTROL DE TEMPERATURA CON PIC 16F877A


o

DIAGRAMA DE BLOQUES:

SENSOR LM35

Descripcin: El LM35 es un sensor de temperatura con una precisin calibrada de


1C y un rango que abarca desde -55 a +150C.
El sensor se presenta en diferentes encapsulados pero el mas comn es el to-92 de
igual forma que un tpico transistor con 3 patas, dos de ellas para alimentarlo y la
tercera nos entrega un valor de tensin proporcional a la temperatura medida por el
dispositivo. Con el LM35 sobre la mesa las patillas hacia nosotros y las letras del
encapsulado hacia arriba tenemos que de izquierda a derecha los pines son: VCC Vout - GND.
La salida es lineal y equivale a 10mV/C por lo tanto:
+1500mV = 150C
+250mV = 25C
-550mV = -55C

CONVERSIN A/D Y PROCESADO DE SEAL

Resolucin

RES

Vref Volts
Vref

255 bits
28 1
Temperatura
en bits

Voltaje de
entrada

CONVERSOR
A/D

0.01T

0.01T
LUEGO: RESOLUCION

0.01T
T
Vref
255

Vref 2.55 Volts

Conversin AD: El uC 16F877A tiene el siguiente mdulo conversor:

El voltaje de referencia de 2.55 V se introducir por RA3 y el canal elegido para la


conversin es RA0, el valor de la conversin se almacena en los registros ADRESH y
ADRESL siendo por defecto los de ADRESH los de mayor peso.

Para activar la conversin se pone el bit ADON en 1 y para comenzar la


conversin se activa el bit GO, ambos bits estan en el registro ADCON0.
En el bloque S/H se hace el muestreo de la seal para ser digitalizada en la
siguiente etapa.
Una vez que se tiene el valor de la temperatura en ADRESH se compara con el valor
introducido por el teclado.
Si el valor sensado es menor que el rango establecido anteriormente, entonces
D1=ON y D2=OFF.
Si el valor censado esta dentro del rango establecido anteriormente, entonces
D1=OFF y D2=OFF.
Si el valor censado es mayor que el rango establecido anteriormente, entonces
D1=OFF y D2=ON.
Para la visualizacin de la temperatura en LCD se transforma el valor que esta en
ADRESH a cdigo ascii a travs de una rutina de conversin. Luego este valor es
enviado al LCD por medio del comando EnviaCarLCD que forma parte de una rutina
de manejo de LCD la cual ser adjuntada en la ltima parte del trabajo.
Para capturar la tecla pulsada se usa una rutina la cual explora el teclado y
devuelve el valor de esta en un registro.

DIAGRAMA DE FLUJOS

o
LIST

LENGUAJE EN ASSEMBLER

P=16F877A
INCLUDE
<P16F877A.INC>
INCLUDE
<MACROPIC.INC>
__CONFIG _XT_OSC &_LVP_OFF &_WDT_OFF
CBLOCK 0x20
ENDC
T_1
EQU
0x22
T_2
EQU
0x23
INDICADOR
EQU
0x24
AUX
EQU 0x25
AUX2
EQU 0x26
REG1
EQU 0x27
REG2
EQU 0x28
REG3
EQU 0x29
TEMPER
EQU 0x2A
ASCII_H
EQU
0x2B
ASCII_M
EQU
0x2C
ASCII_L
EQU
0x2D
HEXADECIMAL
EQU
0x2E
Key_var
equ
0x2F
ORG
00H
goto
EMPEZAR
org
0x05
include <TECLADO2.INC>
EMPEZAR
BSF
STATUS,RP0
;banco 1
BSF
TRISA,0
;entrada de sensor
BSF
TRISA,3
;voltaje Ref=5.1
CLRF
TRISB
MOVLW B'11111100'
MOVWF TRISC
;salidas para LEDs
CLRF
TRISD
BSF
ADCON1,0
;para permitir ingreso de Vref=5.1V
bcf
OPTION_REG,7 ;resistencias Pull Up activada
BCF
STATUS,RP0
;banco_0
;;;configuracion de conversor AD
MOVLW B'11000001'
;RA0=entrada de sensor
MOVWF ADCON0
CLRF
PORTC
;iniciar el trabajo
CALL
inicio_LCD
;inicio de LCD
MOVLW 'P'
call
EnviaCarLCD
MOVLW 'U'
call
EnviaCarLCD
MOVLW 'L'
call
EnviaCarLCD
MOVLW 'S'
call
EnviaCarLCD
MOVLW 'E'
call
EnviaCarLCD
MOVLW ' '
call
EnviaCarLCD
MOVLW 'M'
call
EnviaCarLCD
MOVLW 'E'
call
EnviaCarLCD
MOVLW 'N'
call
EnviaCarLCD
MOVLW 'U'
call
EnviaCarLCD
MOVLW DISP_ON_NOCURSOR
call
EnviaCmdLCD
menu
CLRF
INDICADOR
call
Key_Scan
;Explora el teclado
movlw 0x80

subwf Tecla,W
btfsc
STATUS,Z
goto
menu
movlw 0x0F
subwf Tecla,0
btfss
STATUS,Z
goto
menu
;pedir_temperatura_1
CALL
inicio_LCD
MOVLW 'T'
call
EnviaCarLCD
MOVLW 'E'
call
EnviaCarLCD
MOVLW 'M'
call
EnviaCarLCD
MOVLW 'P'
call
EnviaCarLCD
MOVLW '1'
call
EnviaCarLCD
MOVLW '='
call
EnviaCarLCD
call
cap_tecla
movf
TEMPER,0
movwf T_1
MOVLW DISP_ON_NOCURSOR
call
EnviaCmdLCD
btfss
INDICADOR,0
GOTO
$+2
GOTO
MAL
pedir_temperatura_2
CALL
inicio_LCD
MOVLW 'T'
call
EnviaCarLCD
MOVLW 'E'
call
EnviaCarLCD
MOVLW 'M'
call
EnviaCarLCD
MOVLW 'P'
call
EnviaCarLCD
MOVLW '2'
call
EnviaCarLCD
MOVLW '='
call
EnviaCarLCD
call
cap_tecla
movf
TEMPER,0
movwf T_2
btfss
INDICADOR,0
GOTO
$+2
GOTO
MAL
movf
T_2,0
subwf T_1,0
btfsc
STATUS,C
GOTO
MAL
decf
T_1,1
GOTO
INICIO
;;;;
MAL
CLRF
INDICADOR
CALL
inicio_LCD
MOVLW 'E'
call
EnviaCarLCD
MOVLW 'R'
call
EnviaCarLCD
MOVLW 'R'
call
EnviaCarLCD
MOVLW 'O'
call
EnviaCarLCD
MOVLW 'R'
call
EnviaCarLCD
MOVLW DISP_LINEA2
CALL
EnviaCmdLCD

;Hay alguna pulsada ??


;no
;si-->verificar si es Menu
;NO ES MENU
;inicio de LCD

;inicio de LCD

;w=T_1 - W(T_2);T_2>T_1
;no
;para efectos de comparacion

;inicio de LCD

MOVLW
call
MOVLW
call
MOVLW
call
MOVLW
call
MOVLW
call
MOVLW
call
MOVLW
call
MOVLW
call
MOVLW
call
MOVLW
call
MOVLW
call
goto

'P'
EnviaCarLCD
'U'
EnviaCarLCD
'L'
EnviaCarLCD
'S'
EnviaCarLCD
'E'
EnviaCarLCD
''
EnviaCarLCD
'M'
EnviaCarLCD
'E'
EnviaCarLCD
'N'
EnviaCarLCD
'U'
EnviaCarLCD
DISP_ON_NOCURSOR
EnviaCmdLCD
menu

;;;;
INICIO
BSF
ADCON0,GO
BTFSC ADCON0,GO
GOTO
$-1
;;;;MOSTRAR EN LCD;;;;;;;;;;;;;;;;
MOVF
ADRESH,0
CALL
inicio_LCD
MOVF
ADRESH,0
CALL
Hex_Ascii
MOVLW 'T'
call
EnviaCarLCD
MOVLW 'E'
call
EnviaCarLCD
MOVLW 'M'
call
EnviaCarLCD
MOVLW 'P'
call
EnviaCarLCD
MOVLW '='
call
EnviaCarLCD
MOVLW ' '
call
EnviaCarLCD
movf
ASCII_H,0
call
EnviaCarLCD
movf
ASCII_M,0
call
EnviaCarLCD
movf
ASCII_L,0
call
EnviaCarLCD
MOVLW 0xDF
call
EnviaCarLCD
MOVLW 'C'
call
EnviaCarLCD
MOVLW DISP_ON_NOCURSOR;es
CALL
EnviaCmdLCD
CALL
COMPARAR
CALL
RETARDO
call
Key_Scan
movlw 0x80
subwf Tecla,W
btfsc
STATUS,Z
goto
INICIO
movlw 0x0F
subwf Tecla,0
btfss
STATUS,Z
goto
INICIO
goto
menu
;********************
RETARDO ;20ms

;INICIAR CONVERSION

;W=Temperatura
;inicio de LCD
;para convertir de HEXADECIMAL a ASCII

;envia las centenas de temperatura


;envia las decenas de temperatura
;envia las unidades de temperatura
;envia el simbolo de grados celsius

para apagar el cursor del LCD


;chequea en que rango de temperatura se esta
;retardo de 20ms necesario para el ADC
;Explora el teclado
;Hay alguna pulsada ??
;no
;si-->verificar si es Menu
;NO ES MENU

LAZO

MOVLW .10
MOVWF 20H

DECFSZ 20H,1
GOTO
LAZO
RETURN
;*********************
COMPARAR
MOVF
ADRESH,0
;W=TEMPERATURA ACTUAL
SUBWF T_1,0
;W=T_1-TEMPERATURA
BTFSC STATUS,C
;C=0? (TEMP>T_1)
GOTO
LED_1
;NO
GOTO
SIGUIENTE
;SI
LED_1
MOVLW B'00000001'
MOVWF PORTC
RETURN
SIGUIENTE
MOVF
ADRESH,0
;W=TEMPERATURA ACTUAL
SUBWF T_2,0
;W=T_2-TEMPERATURA
BTFSC STATUS,C
;C=0? (TEMP>T_2)
GOTO
LED_2
;NO
GOTO
LED_3
;SI
LED_2
MOVLW B'00000000'
MOVWF PORTC
RETURN
LED_3
MOVLW B'00000010'
MOVWF PORTC
RETURN
;***********************************************
;RUTINA PARA CONVERTIR DE HEXADECIMAL A ASCII
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,W ;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,W ;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,W ;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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cap_tecla
call
Key_Scan
;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc
STATUS,Z
;Hay alguna pulsada ??
goto
cap_tecla
;No
movf
Tecla,W
;Lee el cdigo de la tecla pulsada
movwf REG1
;Tecla-->REG1
call
Hex_Ascii
movf
ASCII_L,0
call
EnviaCarLCD
pulso1
call
Key_Scan
;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc
STATUS,Z
;Hay alguna pulsada ??
goto
pulso1
;no
on1
movlw 0x0D
;si-->verificar si es ON
subwf Tecla,0
btfss
STATUS,Z
;fue ON??
goto
$+2
;no
goto
salir1
;si
movf
Tecla,W
;Lee el cdigo de la tecla pulsada
movwf REG2
;Tecla-->REG2
call
Hex_Ascii
movf
ASCII_L,0
call
EnviaCarLCD
pulso2
call
Key_Scan
;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc
STATUS,Z
;Hay alguna pulsada ??
goto
pulso2
;no
on2
movlw 0x0D
;si-->verificar si es ON
subwf Tecla,0
btfss
STATUS,Z
;fue ON??
goto
$+2
;no
goto
salir2
;si
movf
Tecla,W
;Lee el cdigo de la tecla pulsada
movwf REG3
;Tecla-->REG3
call
Hex_Ascii
movf
ASCII_L,0
call
EnviaCarLCD
pulso_3
call
Key_Scan
;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc
STATUS,Z
;Hay alguna pulsada ??
goto
pulso_3
;no
movlw 0x0D
;si-->verificar si es ON
subwf Tecla,0
btfss
STATUS,Z
goto
pulso_3
goto
salir3
;;;;;;
salir3
;*****
MOVF
REG1,0
SUBLW .1
BTFSC STATUS,C
GOTO
CONTINUA
MOVF
REG1,0
SUBLW .2

BTFSS
GOTO
MOVF
SUBLW
BTFSC
GOTO
GOTO

STATUS,Z
MALO
REG2,0
.4
STATUS,C
CONTINUA
MALO

;*****
MALO
BSF
RETURN

INDICADOR,0

;*****
CONTINUA
BCF
INDICADOR,0
movlw .9
movwf AUX
movf
REG2,0
movwf AUX2
;AUX2=REG2 inicial
follow3
movf
AUX2,0
addwf REG2,1
;REG2=REG2+REG2
decfsz AUX
goto
follow3
movf
REG2,0
addwf REG3,1
;REG3=10*REG2+REG3
falta
movlw .99
movwf AUX
movf
REG1,0
movwf AUX2
;AUX2=REG1 inicial
otro
movf
AUX2,0
ADDWF REG1,1
DECFSZ AUX
GOTO
otro
movf
REG1,0
ADDWF REG3,0
MOVWF TEMPER
RETURN
;;;;;;;;;;,
salir1
movf
REG1,0
movwf TEMPER
;TEMP<--REG1
RETURN
;;;;;;;;;;
salir2
movlw .9
movwf AUX
movf
REG1,0
movwf AUX2
;AUX2=REG1 inicial
follow2
movf
AUX2,0
;w=aux2
addwf REG1,1
;REG1=REG1+aux2
decfsz AUX
goto
follow2
movf
REG1,0
addwf REG2,0
;w=REG1+REG2
movwf TEMPER
RETURN
INCLUDE
<LCD.ASM>
INCLUDE
<RETARDO.ASM>
END

También podría gustarte