Você está na página 1de 22

Esse e o link:

http://www.sabereletronica.com.br/files/file/Codigo_Fonte_Alarme_SMS.a
sm


Cdigo Fonte Comentado do Projeto:
; "Desenvolvimento de um Sistema para Controle de Alarme Automotivo
usando Mensagens atravs do Celular"

; Autores:
; - Rafael Carvalho Figueiredo
; - Rangel Arthur
; - Luiz Henrique Bonani do Nascimento
; Universidade Estadual de Campinas - UNICAMP
;_____________________________________________________________________
______________

; --- Descrio dos Ports utilizados:
;
; P0 - Conversor AD
; P1 - Motor de Passo
; P2:
; P2.0 - Buzzer
; P2.4 a P2.7 - Leds
; P3:
; P3.0 e P3.1 - Comunicao Serial
; P3.3 - Push Button (INT1)
; P3.5 - Push Button
; P3.6 e P3.7 - RD e WR do conversor AD
;
; Inicialmente feita a inicializao do programa, so rotulados os
endereos
;desejados (EQU - Equate), chamadas as rotinas de interrupo nos
endereos
;correspondente,configuradas as palavras necessrias
; e atribudos valores iniciais aos registradores desejados.
;***************************************************************

Time_Motor EQU 15535 ; Tempo de 50 ms para motor de passo
Step_Motor EQU 0C00H ; Define sentido horrio para motor de
passo
Step_Motor2 EQU 0C20H ; Define sentido anti-horrio para motor
de passo
Time_Conv EQU 0E6H ; Tempo de 250us para o Timer
End_AD EQU 8000H ; Define endereco de I/O mapeado para AD
Canal EQU 01H ; Define canal de converso
Temp_Max EQU 0C40H ; Endereo para SMS quando atinge 27 no
aquecedor
Alarme_ON EQU 0CA0H ; SMS de confirmao para habilitao do
alarme
Alarme_OFF EQU 0CC0H ; SMS de confirmao para desabilitao
do alarme
Porta_Lock EQU 0CE0H ; SMS de confirmao para portas travadas
Porta_Unlock EQU 0D00H ; SMS de confirmao para portas
destravadas
Vidro_UP EQU 0D20H ; SMS de confirmao para vidros fechados
Vidro_DOWN EQU 0D40H ; SMS de confirmao para vidros abertos
Aquecedor_ON EQU 0D60H ; SMS de confirmao quando o aquecedor
ligado
Aquecedor_OFF EQU 0D80H ; SMS de confirmao quando o aquecedor
desligado
Alarme_Disparou EQU 0DA0H ; Aviso de alarme disparou
Aviso_Porta EQU 0DC0H ; Aviso de que uma das portas est aberta
Alarm_Is_On EQU 0DE0H ; SMS de comando no aceito com alarme
habilitado
Send_Menu EQU 0F20H ; Mensagem com opes das funes
Help_1 EQU 0F40H ; 1 mensagem de ajuda
Help_2 EQU 0F60H ; 2 mensagem de ajuda
Direct_Send EQU 0FD0H ; LInha de comando para escrita de
mensagem

; As 'Equates' seguintes definem os endereos das palavras a serem
escritas
;na mensagem, quando solicitado o status do sistema.
Alarme EQU 1000H
Habilitado EQU 1020H
Desabilitado EQU 1040H
Portas EQU 1060H
Travadas EQU 1080H
Destravadas EQU 10A0H
Vidros EQU 10C0H
Abertos EQU 10E0H
Fechados EQU 1100H
Aquecedor EQU 1120H
Ligado EQU 1140H
Desligado EQU 1160H
SMS_ON EQU 1180H
SMS_OFF EQU 11A0H
Rec_SMS EQU 11C0H


ORG 00H ; Incio - endereo 00h
LJMP 40H ; Pula para o endereo 40h

ORG 0BH ; Inicio da rotina de interrupcao para
o timer0 (AD)
LJMP LeConversao ; Pula para rotina de leitura dos
dados convertidos

ORG 13H ; Incio da rotina de interrupo
int1 (alarme)
LJMP DISPAROU_ALARME

ORG 23H ; Endereo reservado para
interrupo serial
LJMP COMUNICACAO_SERIAL ; Pula para rotina de comunicao
serial

ORG 40H ; Comea programa em 40h

MOV SP, #30H ; Move endereo da pilha para 30h

CLR 00h ; Zera bit no endereo (00H)
; [usado para indicar TRANSMISSO
serial]
CLR 01H ; status alarme (1-ativado)(0-
desativado)
CLR 02H ; status porta (1-travada)(0-
destravada)
SETB 03H ; status vidro (1-fechado)(0-aberto)
CLR 04H ; status aquecedor (1-ligado)(0-
desligado)
CLR 05H ; status msgs de confirmao (0-
envia)(1-NO ENVIA)
CLR 07H ; Indica que alarme disparou

MOV P2, #01H ; Mantm buzzer desligado.

MOV A, #00H ; Limpa acumulador

SETB RS0 ; Seleciona Banco 3
SETB RS1
MOV R7, #00H ; Limpa registradores do banco 3,
MOV R6, #00H ; responsveis por armazenar os
MOV R5, #00H ; dados recebidos serialmente.
MOV R4, #00H
MOV R3, #00H
MOV R2, #00H

MOV IE,#10010000b ; Habilita interrupo do canal serial
SETB 0BCH ; Prioridade mxima de int. para serial
MOV SCON, #50h ; Move para SCON (01010000)b. Isto deixar
o port serial
; no modo 1, habilitar a recepo. [SM1
e REN = 1]

MOV A, PCON ; Move a palavra existente em PCON para
acc
SETB ACC.7 ; Setar o bit 7 do ACC, que o SMOD em
MOV PCON, A ; PCON retornar dado para PCON.
; Bit 7 do PCON o bit de SMOD.
MOV TH1, #0E6H
MOV TMOD, #20H ; Move para TMOD 20h = (00100000)b.
; Isto habilitar o timer 1 no modo 2.
Como
; SMOD =1 e TH1 = E6h, o mesmo que
; transmitir a serial em 2400 bps
SETB TR1 ; Liga Timer 1 [Baud rate Serial]



; Neste primeiro ponto feita a aleitura da mensagem recebida,
; analisando se foi enviada pela internet ou pelo celular.
;----- ROTINA DE LEITURA PARA SMS RECEBIDO -----
Leitura:

MOV A,1DH ; Move acumulador para R5 do banco
3
CJNE A,#00H, OrigemSMS ; Verifica se alguma mensagem foi
recebida

OrigemSMS: ; Verifica origem da SMS (Web ou
Cel.)

SETB RS1 ; Seleciona banco 3
SETB RS0
CJNE R5, #')', Celular ; Se antepenultimo caractere
recebido no for )
; Mensagem veio do celular
MOV A, 1CH ; Se sim veio da Web, por isso o
valor do
; comando est em R4
JMP Leia_1 ; Pula para eitura das funes

Celular:
MOV A, 1DH ; Se for, carrego o valor de R
para entrar
; na rotina de leitura
; Se no, reconfigura o modem

;---------------------------------------------------------------------
------------------------
; A partir deste ponto feita a leitura para identificar qual comando
foi enviado
; por SMS executando a funo correspondente.

Leia_1:

CJNE A, #'1', Leia_2 ; Verifica se foi envado o comado
1 seno vai
; para Leia_2
JB 01H, OFF_Alarm ; Se alarme setiver ligado pula
para desligado
SETB 06H ; Seta flag para indicar que o
alarme est
; sendo habilitado
LJMP Porta_Alarme ; Pula para rotina de travar
portas via alarme

Ativa_Alarme:
SETB 01H ; Seta flag de alarme habilitado
SETB 0AAH ; HAbilita Interrupo por |INT1
SETB 0BAH ; Prioridade p/ INT1
SETB P2.7 ; Acende led ligado ao pino p2.7
CLR 06H ; Limpa flag de que alarme est
sendo habilitado

JB 05H, Out_Alarm ; Se SMS de confirmao
desabilitado no
; envia msg
MOV DPTR,#Alarme_ON ; Carrega msg de alarme habilitado
LCALL WriteString ; Escreve msg

LCALL Wait_OK ; Aguarda retorno do modem

JNB 04H, Out_Alarm ; Se aquecedor desligado volta
para rotina
; de leitura
LCALL EXECUTA_AD ; Chama rotina para leitura e
converso dos
; valores do AD
SJMP Out_Alarm ; Volta para rotina de leitura

OFF_Alarm:

CLR 01H ; limpa flag de alarme habilitado
CLR 02H ; limpa flag de porta travada
CLR 06H ; limpa flag de alarme sendo
habilitado
CLR 07H ; limpa flag de alarme disparou
CLR 0AAH ; desabilita interrupo por
/Int1
CLR 0BAH ; tira prioridade da interrupo
SETB P2.0 ; desliga buzzer
CLR P2.7 ; apaga led alarme
CLR P2.6 ; apaga led portas

JB 05H, Out_Alarm ; Se SMS de confirmao
desabilitado
; no envia msg
MOV DPTR,#Alarme_OFF ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita

JNB 04H, Out_Alarm ; Se aquecedor desligado volta
para rotina
; de leitura
LCALL EXECUTA_AD ; Chama rotina para leitura e
; converso dos valores do AD
Out_Alarm:
LCALL LimpaReg ; limpa registradores de
recebimento serial


Leia_2:
JNB 07H, Executa_2 ; se flag de alarme desativado
continua comando
LJMP Continua_Disparando ; se estiver ativo mantm
disparando alarme

Executa_2:

CJNE A,#'2', Leia_3 ; Verifica se foi enviado o
comando 2
; seno vai para Leia_3

Porta_Alarme:

JB 02H, Unlock_Doors ; Se portas travadas, vai para
destrava
JNB P3.5, Porta_Aberta ; verifica se existe porta aberta
SETB 02H ; ativa flag de porta travada
SETB P2.6 ; acende led referente a porta

JB 06H, Continua_Alarme ; se flag de ativando for 1
continua

JB 05H, Out_Doors ; Se SMS de confirmao
desabilitado
; no envia msg
MOV DPTR,#Porta_Lock ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

JNB 04H, Out_Doors ; Se aquecedor desligado, volta
para rotina
; de leitura
LCALL EXECUTA_AD ; Chama rotina para leitura e
converso
; dos valores do AD
SJMP Out_Doors ; volta para rotina de leitura

Porta_Aberta:
CLR 06H ; limpa flag de alarme sendo
habilitado
MOV DPTR,#Aviso_Porta ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

JNB 04H, Out_Doors ; Se aquecedor desligado, volta
para rotina
; de leitura
LCALL EXECUTA_AD ; Chama rotina para leitura e
converso dos
; valores do AD
SJMP Out_Doors ; Volta para rotina de leitura

Unlock_Doors:
JB 06H, Continua_Alarme ; se flag de ativando for 1
continua
JB 01H, NOT_Unlock ; se alarme estiver habilitado no
destrava

CLR 02H ; limpa flag de porta travada
CLR P2.6 ; apaga led
JB 05H, Out_Doors ; Se SMS desabilitado no envia
msg
MOV DPTR,#Porta_Unlock ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

JNB 04H, Out_Doors ; Se aquecedor desligado, volta
para leitura
LCALL EXECUTA_AD ; Chama rotina para converso dos
valores do AD
SJMP Out_Doors ; Volta para rotina de leitura

NOT_Unlock: ; envia mensagem comunicando o no
fechamento
MOV DPTR,#Alarm_Is_On ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

JNB 04H, Out_Doors ; Se aquecedor desligado, volta
para leitura
LCALL EXECUTA_AD ; Chama rotina para converso dos
valores do AD

Out_Doors:
LCALL LimpaReg ; Limpa registradores de
recebimento serial
SJMP Leia_3 ; volta para leitura

Continua_Alarme:
LJMP Vidro_Alarme ; pula para rotina de vidro pelo
alarme

Leia_3:
JNB 07H, Executa_3 ; se flag de alarme desativado
continua comando
LJMP Continua_Disparando ; se estiver ativo mantm
disparando alarme

Executa_3:
CJNE A, #'3', Leia_4 ; Verifica se foi enviado o
comando 3
; seno vai para Leia_4

Vidro_Alarme:
JB 03H, Open_Glasses ; se vidro fechado, pula para open
LJMP Motor_de_Passo ; chama rotina para rotacionar
motor de passo

Vidro_Fechado:

SETB 03H ; seta flag de vidro fechado

JB 06H, Retorna_Alarme ; verifica flag de ativando alarme

JB 05H, Out_Glasses ; Se SMS desabilitado no envia
msg
MOV DPTR,#Vidro_UP ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

JNB 04H, Out_Glasses ; Se aquecedor desligado, volta
para leitura
LCALL EXECUTA_AD ; Chama rotina para converso dos
valores do AD
SJMP Out_Glasses

Open_Glasses:

JB 06H, Retorna_Alarme ; verifica flag de ativando alarme
JB 01H, NOT_Open ; verifica se alarme est
habilitado
LJMP Motor_de_Passo2 ; chama rotina para rotacionar
motor de passo

Vidro_Aberto:

CLR 03H ; limpa flag de vidro
JB 05H, Out_Glasses ; Se confirmao desabilitado
no envia msg
MOV DPTR,#Vidro_DOWN ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
JNB 04H, Out_Glasses ; Se aquecedor desligado, volta
para leitura
LCALL EXECUTA_AD ; Chama rotina para converso dos
valores do AD
SJMP Out_Glasses ; Volta para rotina de leitura

NOT_Open:
MOV DPTR,#Alarm_Is_On ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

JNB 04H, Out_Glasses ; Se aquecedor desligado, volta
para leitura
LCALL EXECUTA_AD ; Chama rotina para converso dos
valores do AD

Out_Glasses:
LCALL LimpaReg ; Limpa registradores de
recebimento serial
SJMP Leia_4 ; Volta para rotina de leitura

Retorna_Alarme:
LJMP Ativa_Alarme ; retorna para habilitao de
alarme

Leia_4:
JNB 07H, Executa_4 ; se alarme desativado continua
comando
LJMP Continua_Disparando ; se estiver ativo mantm
disparando alarme

Executa_4:
CJNE A, #'4', Leia_5 ; Verifica se foi enviado o
comando 4
; seno vai para Leia_5
JB 04H, OFF_Heater ; Se aquecedor ligado, pula
desliga

SETB 04H ; ativa flag de aquecedor
SETB P2.4 ; acende led indicando aquecedor
ligado

LCALL EXECUTA_AD ; Chama rotina para converso dos
valores do AD

JB 05H, Out_Heater ; Se SMS desabilitado no envia
msg

MOV DPTR,#Aquecedor_ON ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem
LCALL EXECUTA_AD ; Chama rotina para converso dos
valores do AD
SJMP Out_Heater ; Volta para rotina de leitura

OFF_Heater:

CLR 04H ; limpa flag do aquecedor
CLR P2.4 ; apaga led

MOV 16H, #00H ; zera registrador que guarda
valor AD

JB 05H, Out_Heater ; Se SMS desabilitado no envia
msg

MOV DPTR,#Aquecedor_OFF ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

Out_Heater:
LCALL LimpaReg ; Limpa registradores de
recebimento serial

Leia_5:
JNB 07H, Executa_5 ; se flag de alarme desativado
continua comando
LJMP Continua_Disparando ; se estiver ativo mantm
disparando alarme

Executa_5:
CJNE A, #'5', Leia_6 ; Verifica se foi enviado o
comando 5
; seno vai para Leia_6
LCALL STATUS ; Chama rotina para escrita de
Status

Leia_6:
JNB 07H, Executa_6 ; se flag de alarme desativado
continua comando
LJMP Continua_Disparando ; se estiver ativo mantm
disparando alarme

Executa_6:
CJNE A,#'6', Leia_7 ; Verifica se foi enviado o
comando 6
; seno vai para Leia_7
JB 05H, ON_Messages ; Se SMS desativado, vai ativar
SETB 05H ; desativa SMS de confirmao
SJMP Leia_7 ; retorna para rotina de leitura

ON_Messages:
CLR 05H ; ativa envio de SMS de
confirmao

Leia_7:
JNB 07H, Executa_7 ; se flag de alarme desativado
continua comando
LJMP Continua_Disparando ; se estiver ativo mantm
disparando alarme

Executa_7:
CJNE A, #'7', Leia_8 ; Verifica se foi enviado o
comando 7
; seno vai para Leia_8
MOV DPTR,#Send_Menu ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

Leia_8:
JNB 07H, Executa_8 ; se flag de alarme desativado
continua comando
LJMP Continua_Disparando ; se estiver ativo mantm
disparando alarme

Executa_8:
CJNE A,#'8', Return ; Verifica se foi enviado o
comando 8
; seno vai para Retorno
MOV DPTR,#Help_1 ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

MOV DPTR,#Help_2 ; Carrega endereo da msg em DPTR
LCALL WriteString ; CHama rotina de escrita
LCALL Wait_OK ; Aguarda retorno do modem

JNB 07H, Return ; Se flag desativado, volta para
leitura

;----------------------------------------------
; o trecho abaixo executa o disparo do alarme
Continua_Disparando:
CLR 0AAH ; Desabilita interrupo por int1
CLR 0BAH ; tira prioridade de int1
MOV P2, #0F1H ; acende leds e aciona buzzer
MOV TMOD,#21H ;Timer 1 no modo 2 e Timer 0 Modo 1(16
bits)
LCALL Atraso_Alarme ; chama rotina de atraso
mov P2, #00H ; apaga leds e desliga buzzer
LCALL Atraso_Alarme ; chama rotina de atraso

SETB RS1 ; seleciona banco 3
SETB RS0
CJNE R5, #')', Cel_2 ; verifica se recebeu sms
LJMP Leitura ; volta para leitura

Cel_2:
CJNE R4, #'X', Continua_Disparando
; se comando no for vlido continua disparando
LJMP Leitura ; volta para leitura

Return: ; retorna para leitura
SETB 15h ; ativa flag para reconfigurar modem
LJMP Leitura ; volta a rotina de leitura

Atraso_Alarme:
CLR TR0 ; desliga timer
CLR TF0 ; limpa flag timer 0
mov TH0, #00H ; carrega tempo para timer
mov TL0, #00H ; de 0 at[e 65535 contangens
SETB TR0 ; liga timer
JNB TF0,$ ; espera flag estourar
CLR TR0 ; desliga timer
CLR TF0 ; limpa flag timer 0
RET ; retorna

;---------------------------------------------
; Execuo do conversor AD para obteno e leitura dos dados do
aquecedor
EXECUTA_AD:

PUSH ACC
MOV DPTR,#End_AD ; Carrega endereco de I/O
mapeado
MOV A, #Canal ; Define canal em A
MOVX @DPTR, A ; Escreve no ad o canal de
conversao
POP ACC ; tira acc da pilha
SETB TR0 ; liga timer

MOV DPTR, #Temp_Max ; carrega endereo da msg em
DPTR
LCALL WriteString ; chama rotina de SEM
habilitar escrita

RET ; retorno da interrupo

;-----------------------------------------

; O prximo trecho usado para limpar o banco de registradores
; que armazenam os caracteres recebidos serialmente.
;----- Rotina p/zerar memria -----

LimpaReg:
SETB RS1
SETB RS0
MOV R7, #00H ; Limpa registradores do banco 0,
MOV R6, #00H ; responsveis por armazenar os
MOV R5, #00H ; dados recebidos serialmente.
MOV R4, #00H
MOV R3, #00H
MOV R2, #00H

RET
;--- FIM - Rotina p/zerar memria ---

;----- Rotina para enviar dados serialmente -----
; A prxima rotina do programa responsvel pelo envio
; dos caracteres via comunicao serial.

WriteString:
PUSH ACC ; Coloca acumulador na
pilha

LoopWriteString:
MOV A,#0 ; Zera acumulador
MOVC A,@A + DPTR ; Modo de endereamento
indexado
CJNE A,#'$', Write_Next ; Enquanto caracter no
for $
; continua escrevendo
JB 13H, Final_String

MOV A, #0DH ; Carrega ACC com "enter"
em ASCII
LCALL SendChar ; Chama rotina para envio
do caracter
SJMP Final_String ; Pula para final da
rotina

Write_Next:
LCALL SendChar ; Chama rotina para envio
do caracter
INC DPTR ; Incrementa DPTR
; (para endereamento do
prximo char)
SJMP LoopWriteString ; Volta para loop de
escrita

SendChar:
MOV SBUF, A ; Carrega SBUF para
transmisso
SETB 00h ; Seta o bit 00H para
indicar que
; uma transmisso
JNB TI,$ ; Espera finalizar
transmisso
CLR TI ; Limpa TI para uma nova
transmisso
CLR 00h ; Zera flag de transmisso

Final_String:
POP ACC ; Retira acumulador da
pilha
RET ; Retorna

;--- FIM - Rotina para enviar dados serialmente ---

Wait_OK:

CJNE R5, #'K', $ ; Aguarda retorno (OK) do
modem
LCALL LimpaReg ; limpa registradores

RET ; retorna de onde foi
chamada

;-------------------------------------------------------------------
; Rotinas para movimentao do motor de passo
Motor_de_Passo:
MOV TMOD,#21H ; Timer 1 no modo 2 e Timer 0 Modo
1(16 bits)
SETB RS1 ; seleciona banco 2
CLR RS0
MOV R4,#00H ; zera contador

Loop_Motor:
MOV DPTR,#Step_Motor ; carrega endereco do apontador
SETB RS1 ; seleciona banco 2
CLR RS0
MOV R5,#00H ; zera contador
PUSH ACC ; coloca acc na pilha
MOV A, R5 ; carrega contador de rotao

Loop_Rotacao:
MOVC A,@A+DPTR ; le palavra a ser enviada ao
motor
MOV P1,A ; escreve
LCALL Atraso_Motor ; chama rotina de atraso
SETB RS1 ; seleciona banco 2
CLR RS0
INC R5 ; incrementa contador
MOV A,R5 ; restaura contador
CJNE R5,#04H,Loop_Rotacao ; se contador menor que 4 continua
sequencia
INC R4 ; incrementa contador
CJNE R4,#0AH,Loop_Motor ; repete rotao 10 vezes
POP ACC ; retira acc da pilha
LJMP Vidro_Fechado ; pula para vidro fechado


Motor_de_Passo2:
MOV TMOD,#21H ; Timer 1 no modo 2 e Timer 0 Modo
1(16 bits)
SETB RS1 ; seleciona banco 2
CLR RS0
MOV R4,#00H ; zera contador

Loop_Motor2:
MOV DPTR,#Step_Motor2 ; carrega endereco do apontador2
SETB RS1 ; seleciona banco 2
CLR RS0
MOV R5,#00H ; zera contador
PUSH ACC ; coloca acc na pilha
MOV A,R5 ; carrega contador de rotao

Loop_Rotacao2:
MOVC A,@A+DPTR ; le palavra a ser enviada ao
motor
MOV P1,A ; escreve
LCALL Atraso_Motor ; chama rotina de atraso
SETB RS1 ; seleciona banco 2
CLR RS0
INC R5 ; incrementa contador
MOV A,R5 ; restaura contador
CJNE R5,#04H,Loop_Rotacao2 ; se contador menor que 4 continua
sequencia
SETB RS1 ; seleciona banco 2
CLR RS0
INC R4 ; incrementa contador
CJNE R4,#0AH,Loop_Motor2 ; repete rotao 10 vezes
POP ACC ; retira acc da pilha
LJMP Vidro_Aberto ; pula para vidro aberto

Atraso_Motor:
CLR TR0 ; desliga timer
CLR TF0 ; limpa flag de estouro de timer
MOV TH0,#HIGH(Time_Motor) ; carrega tempo de contagem
MOV TL0,#LOW(Time_Motor)
SETB TR0 ; liga timer
JNB TF0,$ ; aguarda flag setar
CLR TR0
CLR TF0

RET ; retorna

;----- Interrupo Serial -----
; Aqui ser tratada a rotina de interrupo serial, primeiramente
verificado
; o "flag" 00H para ver se uma transmisso, se for pula para o
final.
; Caso contrrio recebe o caracter e armazena no registrador, que
passado para
; o prximo registrador at o recebimento dos 6 ltimos caracteres
; recebidos serialmente.

COMUNICACAO_SERIAL: ; Rotina chamada na interrupo
serial

JB 00H, EXIT ; se estiver transmitindo sai da interrupo

SETB RS0 ; seleciona banco 3
SETB RS1
MOV R2, 1BH ; move contedo de R2 para R3
MOV R3, 1CH ; move contedo de R3 para R4
MOV R4, 1DH ; move contedo de R4 para R5
MOV R5, 1EH ; move contedo de R5 para R6
MOV R6, 1FH ; move contedo de R7 para R6
MOV R7, SBUF ; l o que foi recebido
CLR RI ; desabilita RI: desliga recepcao de novo byte

EXIT:

RETI ; Retorna da interrupo

;--- FIM - Interrupo Serial ---

DISPAROU_ALARME:

JNB P3.3,$ ; aguarda boto ser solto (debouncing)

JNB 01H, EXIT_INT ; se alarme desabilitado sai da interrupo
MOV DPTR,#Alarme_Disparou ; carrega end da msg em DPTR
LCALL WriteString ; chama rotina de escrita

CLR 04H ; desliga flag aquecedor
MOV 16H, #00H ; limpa dados do AD

EXIT_INT:

RETI ; retorna da interrupo

;=========================
LeConversao: ; interrupo INT Timer 0

CLR TR0 ; liga timer
CLR TF0 ; limpa flag
PUSH ACC ; coloca acc na pilha
MOVX A,@DPTR ; Le o dado
MOV 16H,A ; Grava o dado
POP ACC ; retira acc da pilha

RETI ; retorna da interrupo

;=========================
; Esta rotina pega o dado digital e converte ele no formato
; a ser escrito na mensagem para o usurio.

CONV_DADO:
MOV A,16H ; recupera dado do AD
SETB RS1 ; seleciona banco 2
CLR RS0
MOV R7,#02H ; inicializa contador de n de casas
decimais
MOV 19H,#11001101b ; variavel que guarda -51

RETORNA:
MOV B, #51D
DIV AB
MOV 50H,A ; guarda valor inteiro
XCH A,B ; A passa a guardar o resto
CJNE A,#00H,CONTINUA
MOV 51h,#00H
MOV 52h,#00H
SJMP WRITE_CONV ; fim de conversao (VAI PARA
ESCRITA)

CONTINUA:
CJNE R7,#00H,CONTINUA_1
SJMP WRITE_CONV

CONTINUA_1:
MOV B,#05H
MUL AB ; multiplica resto da divisao por 5
MOV B,#51D
DIV AB ; divide resultado por 51
MOV 1AH,A ; guarda resultado parcial da divisao
MOV A,#02H
MUL AB ; multiplica resto por 2
SJMP VER_B ; chama rotina de verificacao do resto
(< ou > 51?)
VER_B:
MOV 1BH,A ; guarda o resultado da multiplicacao do
resto por 2
ADD A,19H ; subtrai 51 de resto X 2
JNB ACC.7,CASO_POS ; desvia caso o resultado da subtracao
seja zero (pos)

CASO_NEG:
MOV A,1AH ; retoma resultado da divisao por 51
MOV B,#02H
MUL AB ; multiplica este resultado por 2
MOV 51H,A ; guarda nova casa decimal
DEC R7
MOV A,1BH
SJMP LOOP_CONV

CASO_POS:
MOV 1BH,A ; guarda valor final do resto em
temporariamente
MOV A,1AH ; retoma resultado da divisao
MOV B,#02H
MUL AB ; multiplica resultado por 2
INC A ; soma 1 ao resultado
MOV 52H,A ; guarda nova casa decimal
DEC R7
MOV A,1BH ; retoma valor do resto para novo
calculo

LOOP_CONV:
SJMP CONTINUA

WRITE_CONV:
MOV A,50H ; carrega valor no acc
ANL A,#00001111b ; converte para ASCII
ORL A,#00110000b

CJNE A,#00110000b,Um ; verifica se o valor zero
MOV A,#00110010b ; 'soma' vinte e dois ao valor de
escrita
LCALL SendChar ; escreve 22
MOV A,#00110010b
LCALL SendChar
SJMP Virgula ; pula para virgula
Um:
CJNE A,#00110001b,Dois ; verifica se valor um
MOV A,#00110010b
LCALL SendChar ; escreve 23
MOV A,#00110011b
LCALL SendChar
SJMP Virgula
Dois:
CJNE A,#00110010b,Tres ; verifica se valor dois
MOV A,#00110010b
LCALL SendChar ; escreve 24
MOV A,#00110100b
LCALL SendChar
SJMP Virgula
Tres:
CJNE A,#00110011b,Quatro ; verifica se valor tres
MOV A,#00110010b
LCALL SendChar ; escreve 25
MOV A,#00110101b
LCALL SendChar
SJMP Virgula
Quatro:
CJNE A,#00110100b,Cinco ; verifica se valor quatro
MOV A,#00110010b
LCALL SendChar ; escreve 26
MOV a,#00110110b
LCALL SendChar
SJMP virgula
Cinco:
CJNE A,#00110101b,Virgula ; verifica se valor cinco
MOV A,#00110010b
LCALL SendChar ; escreve 27
MOV A,#00110111b
LCALL SendChar

Virgula:
MOV A,#00101100b
LCALL SendChar ; escreve virgula

MOV A,51H
ANL A,#00001111b
ORL A,#00110000b
LCALL SendChar ; escreve primeira casa decimal

MOV A,52H
ANL A,#00001111b
ORL A,#00110000b
LCALL SendChar ; escreve segunda casa decimal

MOV A,#11111000b
LCALL SendChar ; escreve grau
MOV A,#01000011b
LCALL SendChar ; escreve C
RET ; Retorno da Rotina


;----- STATUS----
STATUS:
PUSH ACC
MOV DPTR,#Direct_Send ; carrega endereo da msg em DPTR
LCALL WriteString ; envia comando para escrita de
SMS

; ALARME LIGADO
SETB 13H ; ativa flag de escrevendo status
MOV DPTR,#Alarme ; carrega endereo
LCALL WriteString ; chama rotina de escrita
CLR 13H

JNB 01H, STATUS_2 ; verifica se alarme esta
habilitado ou no
MOV DPTR,#Habilitado ; escreve status
LCALL WriteString

SJMP STATUS_3 ; pula prximo status

STATUS_2: ; ALARME DESLIGADO
MOV DPTR,#Desabilitado ; escreve status
LCALL WriteString

STATUS_3: ; PORTAS

SETB 13H
MOV DPTR,#Portas ; escreve portas
LCALL WriteString
CLR 13H

JNB 02H, STATUS_4 ; verifica status da porta
MOV DPTR,#Travadas
LCALL WriteString

SJMP STATUS_5 ; pula para prximo status


STATUS_4: ; PORTAS DESTRAVADAS
MOV DPTR,#Destravadas
LCALL WriteString


STATUS_5: ; vidros
SETB 13H
MOV DPTR,#Vidros
LCALL WriteString
CLR 13H

JNB 03H, STATUS_6 ; verifica status do vidro
MOV DPTR,#Fechados
LCALL WriteString

SJMP STATUS_SMS ; pula para prximo status


STATUS_6: ; Vidros Abertos
MOV DPTR,#Abertos
LCALL WriteString

STATUS_SMS:

SETB 13H
MOV DPTR,#Rec_SMS
LCALL WriteString
CLR 13H

JB 05H, STATUS_7 ; verifica satus sms
MOV DPTR,#SMS_ON
LCALL WriteString

SJMP STATUS_8


STATUS_7: ; Vidros Abertos
MOV DPTR,#SMS_OFF
LCALL WriteString


STATUS_8: ; aquecedor

SETB 13H
MOV DPTR,#Aquecedor
LCALL WriteString
CLR 13H

JNB 04H, STATUS_9 ; verifica status do vidro

SETB 13H
MOV DPTR,#Ligado
LCALL WriteString
CLR 13H

MOV A, #'(' ; Carrega ( em ASCII
LCALL SendChar ; Chama rotina para envio do
caracter

LCALL CONV_DADO ; Chama rotina para converso dos
valores AD
SETB 14H ; seta flag

MOV A, #')' ; Carrega ) em ASCII
LCALL SendChar ; Chama rotina para envio do
caractere
MOV A, #'.' ; Carrega . em ASCII

SJMP STATUS_FINAIS ; Pula para finalizao do Status

STATUS_9: ; Aquecedor Desligado

MOV DPTR,#Desligado ; Carrega endereo da msg no DPTR
LCALL WriteString ; Chama rotina de escrita

STATUS_FINAIS: ; Sai do modo texto e envia mensagem

MOV a,#0DH ; Comea cursor em nova linha
LCALL SendChar ; Chama rotina para envio do
caractere
MOV A,#01AH ; CTRL+Z (Sai do modo texto)
LCALL SendChar ; Chama rotina para envio do
caractere

POP ACC ; Retina ACC da pilha
LCALL Wait_OK ; Aguarda retorno do modem

RET ; Retorno da rotina

;----- Dados armazenados por DB -----
; Neste ponto so armazenados os dados de acordo
; com os endereos definidos no incio do programa
; criada ; DB - Direct Byte

ORG Step_Motor
DB 03H,09H,0CH,06H
; Comandos fornecidos pelo fabricante para rotacionar
; o motor de passo no sentido horrio.
; Abre o vidro.

ORG Step_Motor2
DB 06H,0CH,09H,03H
; Comandos fornecidos pelo fabricante para rotacionar
; o motor de passo no sentido anti-horrio.
; Fecha o vidro.

;---------------------------------------------------------------------
-
; Os comandos abaixo (AT+CMSS) enviam uma SMS previamente armazenada
; na memria do mdulo GSM. O nmero da mensagem gerado pelo
prprio
; mdulo, quando se armazena a mensagem atravs do comando AT+CMGW.
; Esta gravao prvia pode ser feita, por exemplo, pelo
HyperTerminal do Windows.

ORG Alarme_ON
DB 'AT+CMSS=294$'
;O alarme do veiculo foi habilitado com sucesso.
;Caso ele dispare voce sera avisado por uma mensagem.
;Para desabilitar envie uma mensagem com o codigo X1.

ORG Alarme_OFF
DB 'AT+CMSS=295$'
; O alarme do veiculo foi desabilitado com sucesso.
; Para habilitar novamente envie uma mensagem com o codigo X1.

ORG Porta_Lock
DB 'AT+CMSS=296$'
; As portas do veiculo foram travadas com sucesso.
; Para destravar envie uma mensagem com o codigo X2.

ORG Porta_Unlock
DB 'AT+CMSS=297$'
; As portas do veiculo foram destravadas com sucesso.
; Para travar novamente envie uma mensagem com o codigo X2.

ORG Vidro_UP
DB 'AT+CMSS=298$'
; Os vidros do veiculo foram fechados com sucesso.
; Para abrir novamente envie uma mensagem com o codigo X3.

ORG Vidro_DOWN
DB 'AT+CMSS=299$'
; Os vidros do veiculo foram abertos com sucesso.
; Para fechar envie uma mensagem com o codigo X3.

ORG Aquecedor_ON
DB 'AT+CMSS=300$'
; O aquecedor veicular foi ligado.
; Voce sera avisado quando chegar na temperatura maxima.
; Para consultar a temperatura, envie X5.
; Para desligar envie X4.

ORG Aquecedor_OFF
DB 'AT+CMSS=301$'
; O aquecedor foi desligado com sucesso.
; Para ligar novamente envie uma mensagem com o codigo X4.

ORG Alarme_Disparou
DB 'AT+CMSS=302$ $ $'
; ATENCAO! O alarme de seu veiculo disparou!
; Para desligar envie X1.
; Nenhum outro comando sera aceito pelo sistema enquanto o alarme
estiver disparado.

ORG Aviso_Porta
DB 'AT+CMSS=303$'
; Nao foi possivel concluir o comando solicitado.
; Feche todas as portas do veiculo e envie sua
; solitacao novamente.

ORG Alarm_Is_On
DB 'AT+CMSS=304$'
; Comando nao permitido com o alarme habilitado.
; Se desejar, envie X1 para desabilitar o alarme e depois envie sua
;solicitacao novamente.

ORG Temp_Max
DB 'AT+CMSS=305$'
; O aquecedor veicular atingiu sua temperatura maxima de 27 graus.
; Se desejar desliga-lo envie uma mensagem com o codigo X4.


ORG Send_Menu
DB 'AT+CMSS=306$'
; Menu:
; X1.Alarme
; X2.Portas
; X3.Vidros
; X4.Aquecedor
; X5.Consulta status
; X6.On/Off SMS
; X7.Menu
; X8.Ajuda
; (Envie apenas o codigo. Exemplo: X8)

ORG Help_1
DB 'AT+CMSS=307$'
;Envie somente o codigo da opcao.
;Exemplo: X2 trava as portas se elas estiverem destravadas e vice-
versa.
;Para o menu completo envie X7.(1/2)

ORG Help_2
DB 'AT+CMSS=308$'
;X5 retorna o status completo do sistema.
;X6 liga/desliga mensagens de confirmacao, os avisos continuam ativos.
;Maiores detalhes no manual do usuario. (2/2)


;-------------------------------
; As palavras armazendas abaixo so usadas para compor a mensagem
enviada
; quando o usurio solicita o STATUS do sistema, atravs de uma
mensagem
; com o nmero 5. Por possuir valores variveis, esta mensagem no
pode ser
; previamente armazenada no mdulo GSM.

ORG Direct_Send
DB 'AT+CMGS="num. do cel.destino",129$$'

ORG Alarme
DB 'Alarme: $'

ORG Habilitado
DB 'Habilitado. $'

ORG Desabilitado
DB 'Desabilitado. $'

ORG Portas
DB 'Portas: $'

ORG Travadas
DB 'Travadas. $'

ORG Destravadas
DB 'Destravadas. $'

ORG Vidros
DB 'Vidros: $'

ORG Abertos
DB 'Abertos. $'

ORG Fechados
DB 'Fechados. $'

ORG Aquecedor
DB 'Aquecedor: $'

ORG Ligado
DB 'Ligado $'

ORG Desligado
DB 'Desligado. $'

ORG Rec_SMS
DB 'SMS de confirmacao: $'

ORG SMS_ON
DB 'ON. $'

ORG SMS_OFF
DB 'OFF. $'

End ; Fim do programa

; [Autores: Rafael Figueiredo, Rangel Arthur e