Documente Academic
Documente Profesional
Documente Cultură
CALLAO
FACULTAD DE INGENIERÍA ELÉCTRICA Y ELECTRÓNICA
ALUMNOS:
1 9 6 6
BELLAVISTA – CALLAO
2009
CONTROL DE TEMPERATURA CON PIC 16F877A
o DIAGRAMA DE BLOQUES:
TECLADO
(set point)
VISUALIZACION
o SENSOR LM35
Resolución
Voltaje de Temperatura
entrada CONVERSOR en bits
A/D
0.01T
0.01T 0.01T
=T → =T → Vref = 2.55 Volts
LUEGO: RESO LU CIO N Vref
255
Para capturar la tecla pulsada se usa una rutina la cual explora el teclado y
devuelve el valor de esta en un registro.
o DIAGRAMA DE FLUJOS
CONFIGURACION
DE REGISTROS
PULSO HELP?
NO
SI
ACTIVAR
CONVERSOR
TERMINO
CONVERSION?
NO
SI
ENVIAR A LCD
NO
Text < T1?
NO
T1 < Text < T2? SI
D1 = ON
SI
D2 = OFF
Text > T2
D1 = OFF
D1 = OFF
D2 = OFF
D2 = ON
o LENGUAJE EN ASSEMBLER
LIST 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 ;Hay alguna pulsada ??
goto menu ;no
movlw 0x0F ;si-->verificar si es Menu
subwf Tecla,0
btfss STATUS,Z
goto menu ;NO ES MENU
;pedir_temperatura_1
CALL inicio_LCD ;inicio de 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 ;inicio de 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 ;w=T_1 - W(T_2)-
btfsc STATUS,C ;T_2>T_1
GOTO MAL ;no
decf T_1,1 ;para efectos de comparacion
GOTO INICIO
;;;;
MAL
CLRF INDICADOR
CALL inicio_LCD ;inicio de 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
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
goto menu
;;;;
INICIO
BSF ADCON0,GO ;INICIAR CONVERSION
BTFSC ADCON0,GO
GOTO $-1
;;;;MOSTRAR EN LCD;;;;;;;;;;;;;;;;
MOVF ADRESH,0 ;W=Temperatura
CALL inicio_LCD ;inicio de LCD
MOVF ADRESH,0
CALL Hex_Ascii ;para convertir de HEXADECIMAL a 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 ;envia las centenas de temperatura
call EnviaCarLCD
movf ASCII_M,0 ;envia las decenas de temperatura
call EnviaCarLCD
movf ASCII_L,0 ;envia las unidades de temperatura
call EnviaCarLCD
MOVLW 0xDF ;envia el simbolo de grados celsius
call EnviaCarLCD
MOVLW 'C'
call EnviaCarLCD
MOVLW DISP_ON_NOCURSOR;es para apagar el cursor del LCD
CALL EnviaCmdLCD
CALL COMPARAR ;chequea en que rango de temperatura se esta
CALL RETARDO ;retardo de 20ms necesario para el ADC
call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada ??
goto INICIO ;no
movlw 0x0F ;si-->verificar si es Menu
subwf Tecla,0
btfss STATUS,Z
goto INICIO ;NO ES MENU
goto menu
;********************
RETARDO ;20ms
MOVLW .10
MOVWF 20H
LAZO
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 código 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 código 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 código 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 STATUS,Z
GOTO MALO
MOVF REG2,0
SUBLW .4
BTFSC STATUS,C
GOTO CONTINUA
GOTO MALO
;*****
MALO
BSF INDICADOR,0
RETURN
;*****
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