You are on page 1of 8

$mod51

;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;DECLARACAO DE VARIAVEIS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;P0 RESPONSAVEL PELOS (LEDS DE TESTE) ALARME E VALVULAS
;1 = ATIVADO
;0 = DESATIDADO
;SAIDAS:
VALVA EQU P0.0
VALVB EQU P0.1
VALVC EQU P0.2
MOTOR EQU P0.5
LED EQU P0.6
ALARME EQU P0.7
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;P3 RESPONSAVEL PELO BOTAO DE EMERGENCIA E SENSORES
;0 = ATIVADO
;1 = DESATIDADO
;ENTRADAS:
SENSORALTO EQU P3.5
SENSORMEDIO EQU P3.6
SENSORBAIXO EQU P3.7
;CRITICO = botao de parada de emergencia
CRITICO EQU P3.2
;VETOR UM REGISTRADOR COM:
;1o BIT MENOS SIGNIFICATIVO= sensor cheio
;2o BIT MENOS SIGNIFICATIVO= sensor medio
;3o BIT MENOS SIGNIFICATIVO= sensor alto
;4o BIT MENOS SIGNIFICATIVO= boto critico
;outos BITs = DEFAULT em "0"
VETOR EQU R4
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;ENDERECAMENTO PARA DISPLAY:
;SET DE JUMPERS: E6 E RS5
EN EQU P2.6
RS EQU P2.5
VAZIO EQU 0800H
MEIO EQU 0810H
CHEIO EQU 0820H
ESVAZIANDO EQU 0830H
EMERGENCIA EQU 0840H
REINICIO1 EQU 0850H
ENCHENDO EQU 0860H
ACIONADA EQU 0870H
TEMPO EQU 15535 ;5MIL MICRO SEGUNDOS.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;INICIALIZACAO DO PROGRAMA
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 0000
;PULA ENDERECOS RESERVADOS PARA O TIMER
SJMP INICIO
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;INTERRUPTS:
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;INTERRUPT 0 - BOTAO DE EMERGENCIA
ORG 0003H
JMP INTERROMPE
;TIMER 0 - DISPLAY
ORG 000BH
JMP DISPLAY
;INTERRUPT 1 - RESET
ORG 0013H
JMP INICIO
;TIMER 1 - VERIFICACAO DE BOTOES
ORG 001BH
JMP INICIO
;COMUNICACAO SERIAL - DESATIVADA
ORG 0023H
JMP INICIO
;DEFINE O ENDERECO DO INICIO DO PROGRAMA
ORG 0040H
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;INICIALIZACAO DE VARIAVEIS:
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;(A)FECHA TODAS VALVULAS e inicializa o display
INICIO: LCALL DISPLAY ;inicializa display
CLR RS ; POSICIONA O CURSOR
MOV A,#80H
LCALL WRCAR
SETB RS
MOV P0, #00H
MOV P1, #00H
MOV P2, #0FFH
MOV P3, #0FFH
;SETA O INTERRUPT E TIMER
MOV TMOD,#11H
MOV TCON,#02H
MOV DPTR,#8000h
MOV TL1,#0FCH
MOV TH1,#0FCH
MOV IP,#01H
MOV IE,#81H
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;ROTINA PRINCIPAL:
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;(A)PRIMEIRO ESVAZIA O TANQUE (ABRIR VALVULA C)
PRINCIPAL: LCALL ESVAZIA
LCALL LIMPA
MOV DPTR, #VAZIO
LCALL WRITESTRING
LCALL ATRASO
;(B) ABRE VALVULA A
SETB VALVA
LCALL LIMPA
MOV DPTR, #ENCHENDO
LCALL WRITESTRING
LCALL ATRASO
ABRE1: LCALL VERIFICA
;SE ESTIVER NA METADE
CJNE VETOR, #04H, ABRE1
LCALL LIMPA
MOV DPTR, #MEIO
LCALL WRITESTRING
LCALL ATRASO
CALL COMPARA
;FECHA VALVA
CLR VALVA
;(C)ABRE VALVULA B
ABRE2: SETB VALVB
;PISCA LED DO MOTOR:
SETB MOTOR
LCALL DELAY5
CALL COMPARA
CLR MOTOR
LCALL DELAY5
CALL COMPARA
;VOLTA A VERIFICAR OS SENSORES ATE O TANQUE FICAR CHEIO
LCALL VERIFICA
CJNE VETOR, #00H, ABRE2
LCALL LIMPA
MOV DPTR, #CHEIO
LCALL WRITESTRING
LCALL ATRASO
CALL COMPARA
;TANQUE CHEIO = DESLIGA MOTOR E FECHA VALVULA B
CLR MOTOR
CLR VALVB
LCALL DELAY5
LCALL DELAY5
;(D)ESVAZIA O TANQUE
LCALL ESVAZIA
;GARANTE QUE TODAS AS VALVULAS ESTO FECHADAS:
CLR VALVA
CLR VALVB
CLR VALVC
;(E)LED DEVE PISCAR POR UNS 3 SEGUNDOS ANTES DE REINICIAR
LCALL LIMPA
MOV DPTR, #REINICIO1
LCALL WRITESTRING
LCALL ATRASO
SETB LED
LCALL DELAY5
CALL COMPARA
CLR LED
LCALL DELAY5
CALL COMPARA
SETB LED
LCALL DELAY5
CALL COMPARA
CLR LED
LCALL DELAY5
CALL COMPARA
SETB LED
LCALL DELAY5
CALL COMPARA
CLR LED
LCALL DELAY5
CALL COMPARA
SETB LED
LCALL DELAY5
CALL COMPARA
CLR LED
LCALL DELAY5
CALL COMPARA
;REINICIA A ROTINA PRINCIPAL
LJMP PRINCIPAL
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;REDIRECIONA PARA INTERRUPO
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
PARA: LJMP INTERROMPE
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;COMPARADOR PARA ENCONTRAR ERRO DE SENSORES
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
COMPARA: MOV A, #08H
SUBB A, VETOR
JZ PARA
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;ROTINA DE ESVAZIAR O TANQUE:
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
ESVAZIA: SETB VALVC ;ABRE VALVULA C
LCALL VERIFICA
;LCALL COMPARA
LCALL LIMPA
MOV DPTR, #ESVAZIANDO
LCALL WRITESTRING
LCALL ATRASO
ESVAZIA1: LCALL VERIFICA
;LCALL COMPARA
CJNE VETOR, #07H, ESVAZIA1
CLR VALVC ;FECHA VALVULA C
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;ROTINA DE VERIFICACAO DOS SENSORES:
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
VERIFICA: JNB CRITICO, STOP
MOV VETOR,00H
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;TESTA PRIMEIRO SE O TANQUE EST CHEIO:
JB SENSORALTO, VERIFICAMEDIO1
JB SENSORMEDIO, STOP
JB SENSORBAIXO, STOP
;AQUI OS TRES SENSORES ESTAO LIGADOS (Nv 0):
;(TANQUE CHEIO) = 00H
MOV VETOR, #00H
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;SENSOR ALTO ESTA DESLIGADO
;(TANQUE NO ESTA CHEIO)
VERIFICAMEDIO1: JB SENSORMEDIO, VERIFICABAIXO1
JB SENSORBAIXO, STOP
;AQUI OS SENSORES MEIO E BAIXO ESTAO LIGADOS
;(METADE CHEIO) = 04H
MOV VETOR, #04H
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;SENSORES ALTO E MEDIO ESTO DESLIGADOS
;(TANQUE COM MENOS DA METADE DE VOLUME)
VERIFICABAIXO1: JB SENSORBAIXO, VAZIO1
;APENAS SENSOR BAIXO ATIVADO
;(TANQUE COM MENOS DA METADE DE VOLUME)= 06H
MOV VETOR, #06H
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;TODOS SENSORES DESLIGADOS
;(TANQUE VAZIO) = 07H
VAZIO1: MOV VETOR, #07H
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;PARADA DE EMERGNCIA ACIONADA
;ACIONAR INTERRUPO = 08H
STOP: MOV VETOR, #08H
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;**************************************************
;Delay de 0.5 seg
;**************************************************
delay5: mov r6, #0FFh
mov r7, #077h
volta5: LCALL VERIFICA
djnz r6, volta5
LCALL VERIFICA
djnz r7, volta5
LCALL VERIFICA
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;ROTINA DE INTERRUPCAO DE EMERGENCIA
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
INTERROMPE: CLR VALVC
CLR VALVB
CLR VALVA
CLR MOTOR
CLR LED
SETB ALARME
VOLTAINTERROMPE:LCALL LIMPA
MOV DPTR, #EMERGENCIA
LCALL WRITESTRING
LCALL ATRASO
LCALL DELAY5
LCALL LIMPA
MOV DPTR, #ACIONADA
LCALL WRITESTRING
LCALL ATRASO
LCALL DELAY5
JMP VOLTAINTERROMPE
RETI
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;ROTINAS DE DISPLAY
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
DISPLAY:
CLR RS
MOV A,#38H ;00111000b | 0001 1100
LCALL WRCAR ; 1 c
MOV A,#38H
LCALL WRCAR
MOV A,#06H ; 00000110 | 0110 0000
LCALL WRCAR ; 6 0
MOV A,#0EH ; 00001110 | 0111 0000
LCALL WRCAR ; 7 0
MOV A,#01H ; 00000001 | 1000 0000
LCALL WRCAR ; 8 0
MOV A,#0CH
LCALL WRCAR
SETB RS
LCALL T5MS
RET
WRCAR:
CLR EN ;HABILITA ESCRITA DISPLAY
MOV P1,A ;escreve dado
LCALL T5MS ;chama tempode espera
SETB EN ;desabilita escrita no LCD
RET

WRITESTRING: MOV A, #0
MOVC A, @A + DPTR
CJNE A, #'$', WRITE_NEXT
SJMP FINIS_STRING
WRITE_NEXT: LCALL WRCAR
INC DPTR
SJMP WRITESTRING
FINIS_STRING: RET
T5MS: MOV TL0,#LOW(TEMPO)
MOV TH0,#HIGH(TEMPO)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
LIMPA: CLR RS ; POSICIONA O CURSOR
MOV A,#01H
LCALL WRCAR
SETB RS
RET
ATRASO:
MOV R2,#10D
DENOVO:
MOV TL1,#LOW(TEMPO)
MOV TH1,#HIGH(TEMPO)
SETB TR1
JNB TF1,$
CLR TR1
CLR TF1
DJNZ R2,DENOVO
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;TABELAS DISPLAY
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
org VAZIO
DB 'TanqueVazio$'
org MEIO
DB 'MetadeCheio$'
org CHEIO
DB 'TanqueCheio$'
org ESVAZIANDO
DB 'Esvaziando$'
org EMERGENCIA
DB 'Emergencia$'
org REINICIO1
DB 'Reiniciando$'
org ENCHENDO
DB 'Enchendo$'
org ACIONADA
DB 'Acionada$'
END

You might also like