Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Control de Temperatura Con Pic 16f877a
Control de Temperatura Con Pic 16f877a
CALLAO
FACULTAD DE INGENIERA ELCTRICA Y ELECTRNICA
ESCUELA PROFESIONAL DE INGENIERA ELECTRNICA
PROFESOR
ELECTRNICA DE POTENCIA 1
ALUMNOS:
1 9 6 6
BELLAVISTA CALLAO
2009
DIAGRAMA DE BLOQUES:
SENSOR LM35
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
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
;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
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