Beruflich Dokumente
Kultur Dokumente
Discentes:
Fernando Henrique Gomes Zucatelli
Rafael Pires Franco Silva
Turma: A1/Diurno
Prof Dr. Carlos Eduardo Capovilla.
1. INTRODUO
Cofres so compartimentos prprios para armazenar dinheiro, bens ou
documentos de valor. Podem ser construdos com uma camada espessa de
concreto, ao ou madeira.
Para garantir sua inviolabilidade, possui um segredo e/ou chave, o que permite
que apenas o possuidor do segredo abra-o. Tal segredo pode ser mecnico (girando
um disco com marcaes de 00 a 99 direita e esquerda), eletrnico (digitando
uma senha em um teclado numrico) ou com uma chave.
Hoje o modelo eletrnico muito encontrado em quarto de hotis, pois de
fcil utilizao e a senha pode ser gravada no momento pelo hospede, diferente de
cofres mecnicos onde isso uma tarefa mais complicada.
2. LISTA DE MATERIAIS
2.1.
Fonte Alimentao
4x Diodos 1N4004
1x LM7805
2x LM7812
2.2.
Microcontrolador
1x microcontrolador 8051
1x MAX232
1x LM358
1x 74HC04
4x LEDs
4x resistores 470
1x resistor 3k3
1x resistor 1k
5x capacitor 1F
1x capacitor 10nF
1x alto falante
3. FLUXOGRAMAS PROGRAMA
Para
desenvolvimento
do
programa
foram
confeccionados
alguns
4. PROGRAMA ASSEMBLY
A verso final do Programa desenvolvido encontra-se
encontra se abaixo.
A evoluo do programa est descrita na seo Histrico.
As principais definies de uso de variveis (posies de memria) so
descritas quando elas
las so
so inicialmente preparadas, por exemplo na seo ;
; Programa Projeto_3_Main_6_1
; Rotina principal do projeto 3.
; Autores:
;
Fernando Henrique Gomes Zucatelli
;
Rafael Pires Franco Silva
;
;
;
;
;
;
;
;
;
;
Cofre de Hotel
Deve conter:
Uso: LCD, Motor de Passo, Serial
Chave e indicao de porta aberta
Digitar a senha com n letra e/ou nmeros no teclado do PC.
Usar ENTER para sair ou o limite de 16 caracteres
Guardar senha mestra de 10h a 1Fh
Guardar senha inserida de 20h a 2Fh
Guardar senha para abrir de 30h a 3Fh
mov SP, 3Fh; i.e., evita que a pilha suje a memria onde guardemos as senhas
; Verso 6: Adicionado Opo de Backspace para retirar o ltimo valor digitado da pilha e
tambm remover o asterisco
;
do LCD
; Verso 6_1: Testado no kit, a senha est ok com o Backspace. S que o Visor do LCD
continus apagando
;
alm do ponto final para digitar a senha. Este problema da Verso 6 foi corrigido
na 6_1.
;
Usando 2 Subrotinas para definir se o LCD ser incrementado ou decrementado
;
Alterados LCd para informar sobre a velocidade de digitao e sobre o Teclado ser
Case Sensitive.
;
Removidas tabelas desnecessrias
;================================== Comandos ==========================
; ENTER
<=> ASCII = #0Dh--> Confirma a gravao e a entrada da senha
; /
<=> ASCII = #2Fh--> Reinicia a gravao e a entrada da senha
; BackSpace
<=> ASCII = #08h--> Apaga o ltimo valor digitado na gravao e na
entrada da senha
;==============================
; Inicio do programa
org 0000h
Ljmp inicio
;org 0003h
;Ljmp Int_0 ; ativa atrves de P3.2
org 000Bh
Ljmp T_0 ;
; TO
;org 0013h
; ; INT1barrado ativa atravs de P3.3
;org 001Bh
;Ljmp T_1 ; ; T1
org 0023h
Ljmp S_0; ; S0
;org 002Bh
; ; T2, apenas no 805
;==============================
org 0033h
inicio:
mov SP, #3Fh; Prepara o ponteiro da Pilha fora da regio de memria que pode dar erro
; Configurando as Interrupes
mov IE,
#10010010b ; EA _ _ ES0 ET1 EX1 ET0 EX0
mov IP,
#00000000b ; __ _ _ PS P1 PX1 P0 P0 ;1 prioridade forada
mov TMOD, #00100001b ; G1 C/T1' M11 M10 | G0 C/T0' M01 M00
;Modo 0 : 00 => 13 bits, no usado
;Modo 1 : 01 => 16 bits sem autoreload
;Modo 2 : 10 => 8 bits com autoreload
;Modo 3 : 11 => 2 contadores 8 bits sem autoreload
; Valor dos temporizadores 1
mov TH1, #0FDh ; Tprog = Ttotal - Tdesejado;
; #FDh para obter o clock de 11,059 MHz
mov TL1, #0FDh ; Quebrar o resultado em hexadecimal (16bits=65535 microseg, 8bits=255
microseg)
; TH guarda o autoreload no Modo 2
; TH1 = TL1 = #0FDh <=> Uso de serial para 11.059MHz
; Valor dos temporizadores 0
;mov TH0, #0FBh ; Tprog = Ttotal - Tdesejado
;mov TL0, #0FBh ; Quebrar o resultado em hexadecimal (16bits=65535 microseg, 8bits=255
microseg)
; TH guarda o autoreload no Modo 2
mov TCON, #01000000b ; TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
;acionamento nivel baixo = 0; acionamento borda = 1
mov SCON, #01010000b; SM0 SM1 SM2 REN TB8 RB8 Ti Ri
;Modo x: SM0 SM1
;Modo 0 : 00 => Sinc. 8 Bits com LSB primeiro, transmitido e recebido atravs de RxD. O
TxD envia o clock
;Modo 1 : 01 => AsSinc. 10 Bits, transmitidos (via TxD) ou recebidos (viaRxD) : 1
StartBit, 8 Bits de dados com LSB primeiro e um StopBit
10
11
12
mov R1, #2Fh; prepara para limpar a pilha senha 30h -> 3Fh
Lcall Resetar_Parte_Pilha
mov R5, #00; habilita escrita no loop que tem o LCD_ABERTO
Lcall LCD_clear
Ljmp loop_main
;==============================
;subrotinas principais
LCD_ABERTO:
cjne R5, #00, saida_LCD_ABERTO; se R5=#00 ento escreve
mov 0Bh, #00 ; Zera o ponteiro de tabelas
mov 0Dh, #01 ; Seleciona a tab_LCD_ABERTO
Lcall LCD_generico
saida_LCD_ABERTO:
mov R5, #01; j escreveu no LCD, s escreve quando R5=#00
RET
;=============
LCD_SENHA:
mov 0Bh, #00 ; Zera o ponteiro de tabelas
mov 0Dh, #02 ; Seleciona a tab_LCD_SENHA
Lcall LCD_generico
RET
;=============
LCD_TRANCADO:
mov 0Bh, #00 ; Zera o ponteiro de tabelas
mov 0Dh, #03 ; Seleciona a tab_LCD_TRANCADO
Lcall LCD_generico
RET
;=============
LCD_SENHA_CORRETA:
;teste no kit
mov P1, #12
;teste no kit
mov 0Bh, #00 ; Zera o ponteiro de tabelas
mov 0Dh, #04 ; Seleciona a tab_LCD_SENHA_CORRETA
Lcall LCD_generico
mov 08h, #15
Lcall delay
mov P1, #0F0h
RET
;=============
LCD_SENHA_CORRETA_MESTRE:
;teste no kit
mov P1, #0Fh
;teste no kit
mov 0Bh, #00 ; Zera o ponteiro de tabelas
mov 0Dh, #05 ; Seleciona a tab_LCD_SENHA_CORRETA_MESTRE
Lcall LCD_generico
mov 08h, #15
Lcall delay
mov P1, #0F0h
RET
;=============
LCD_SENHA_INCORRETA:
;teste no kit
mov P1, #10
;teste no kit
mov 0Bh, #00 ; Zera o ponteiro de tabelas
mov 0Dh, #06 ; Seleciona a tab_LCD_SENHA_INCORRETA
Lcall LCD_generico
13
14
15
nao_inicio_pilha_ESPERAR_SENHA:
Lcall LCD_limpa_um_asterisco_senha
nao_limpe_um_asterisco_ESPERAR_SENHA:
dec R0
mov @R0, #00; garante que no ter nada errado na posio de
memria
;rotina para o LCD ir para trs
mov R4, #00
sjmp ESPERAR_SENHA
Continua_ESPERAR_SENHA_nao_backspace:
mov @R0, 04h
inc R0
mov R4, #00
mov DPTR, #0FFD2h
mov A, #'*'
movx @DPTR, A;
clr TR0
mov TH0, #00h
mov TL0, #00h
mov R7, #00h
setb TR0
cjne R0, #40h, ESPERAR_SENHA
sjmp saida_ESPERAR_SENHA; Encheu a pilha da senha => sair
estourou_tempo_ESPERAR_SENHA:
clr TR0
mov 09h, #00
cjne R0, #30h, limpa_LCD_ESPERAR_SENHA
sjmp nao_limpa_LCD_ESPERAR_SENHA
limpa_LCD_ESPERAR_SENHA:
Lcall LCD_clear
Lcall LCD_TRANCADO
mov R4, #00
Lcall LCD_posiciona_asterisco_senha
nao_limpa_LCD_ESPERAR_SENHA:
mov R1, #2Fh; prepara para limpar a pilha senha 30h -> 3Fh
Lcall Resetar_Parte_Pilha
mov R0, #30h
setb TR0
Ljmp ESPERAR_SENHA
saida_ESPERAR_SENHA:
mov R4, #00h
clr P1.1
RET
;=============
CONFERIR_SENHA:
;mov R0, #1Fh; prepara para a pilha senha 20h -> 2Fh
;mov R1, #2Fh; prepara para a pilha senha 30h -> 3Fh
;mov R2, #00; valor antes de entrar em CONFERIR_SENHA
setb P1.2
inc R0
inc R1
mov A, @R0
mov 0Ch, @R1
;cjne @R0, @R1, Errou_senha ; esta instruo no existe
cjne A, 0Ch, Errou_senha
cjne R1, #3fh, CONFERIR_SENHA
; Acertou_senha
mov R2, #02; senha correta
sjmp saida_CONFERIR_SENHA
16
Errou_senha:
mov R0, #0Fh; prepara para a pilha senha 10h -> 1Fh
mov R1, #2Fh; prepara para a pilha senha 30h -> 3Fh
loop_verificar_senha_mestre:
inc R0
inc R1
mov A, @R0
mov 0Ch, @R1
;cjne @R0, @R1, Errou_senha_mestre ; esta instruo no existe
cjne A, 0Ch, Errou_senha_mestre
cjne R1, #3fh, loop_verificar_senha_mestre
; Acertou_senha_mestre
mov R2, #03; senha correta mestre
sjmp saida_CONFERIR_SENHA
Errou_senha_mestre:
mov R2, #01; senha incorreta
saida_CONFERIR_SENHA:
clr P1.2
RET
;==============================
;subrotinas auxiliares
Resetar_Parte_Pilha:
mov R3, #00h
loop_Resetar_Parte_Pilha:
inc R1; inicia a limpeza com (X+1)h onde antes de entrar mov R1, Xh
mov @R1, #00h
inc R3
cjne R3, #16, loop_Resetar_Parte_Pilha
mov R3, #00h
RET
;=============
monitora_BF:
mov DPTR, #0FFE2h
movx A, @DPTR;
jb Acc.7, monitora_BF ; a busy flag esta na MSB do acumulador
RET
;=============
LCD_generico:
lcall monitora_BF
mov R7, 0Dh
;cjne 0Dh, #01, nao_tab_LCD_ABERTO ; instruo no existe
cjne R7, #01, nao_tab_LCD_ABERTO
mov dptr, #tab_LCD_ABERTO; aponta para a tabela
nao_tab_LCD_ABERTO:
cjne R7, #02, nao_tab_LCD_SENHA
mov dptr, #tab_LCD_SENHA; aponta para a tabela
nao_tab_LCD_SENHA:
cjne R7, #03, nao_tab_LCD_TRANCADO
mov dptr, #tab_LCD_TRANCADO; aponta para a tabela
nao_tab_LCD_TRANCADO:
cjne R7, #04, nao_tab_LCD_SENHA_CORRETA
mov dptr, #tab_LCD_SENHA_CORRETA; aponta para a tabela
nao_tab_LCD_SENHA_CORRETA:
cjne R7, #05, nao_tab_LCD_SENHA_CORRETA_MESTRE
mov dptr, #tab_LCD_SENHA_CORRETA_MESTRE; aponta para a tabela
nao_tab_LCD_SENHA_CORRETA_MESTRE:
cjne R7, #06, nao_tab_LCD_SENHA_INCORRETA
mov dptr, #tab_LCD_SENHA_INCORRETA; aponta para a tabela
nao_tab_LCD_SENHA_INCORRETA:
17
18
LCD_limpa_um_asterisco_senha:
;rotina para o LCD ir para trs
Lcall LCD_decrementar_04
lcall monitora_BF
mov DPTR, #0FFD2h
mov A, #' '; insere espao onde havia um asterisco
movx @DPTR, A;
;rotina para o LCD ir para frente
Lcall LCD_incrementar_06
lcall monitora_BF
mov DPTR, #0FFD2h
mov A, #' '; insere espao onde havia um asterisco
movx @DPTR, A;
;rotina para o LCD ir para trs
Lcall LCD_decrementar_04
lcall monitora_BF
mov DPTR, #0FFD2h
mov A, #' '; insere espao onde havia um asterisco
movx @DPTR, A;
;rotina para o LCD ir para frente
Lcall LCD_incrementar_06
RET
;====================================================
;subrotinas de tempo
delay:
;mov 08h, #valor ; antes de entrar no delay
loop2_delay:
mov R6, #200; 100 ms
loop1_delay:
mov R7, #250; 250 ciclo mquina
djnz R7, $; equivale 500 microsegundos
djnz R6, loop1_delay; djnz leva 2 ciclo mquina
djnz 08h, loop2_delay; djnz leva 2 ciclo mquina
RET
;=============
delay_rapido:
;mov R6, #200; 100 ms
loop1_rapido:
mov R7, #250; 250 ciclo mquina
djnz R7, $; equivale 500 microsegundos
djnz R6, loop1_rapido; djnz leva 2 ciclo mquina
RET
;==============================
T_0:
inc R7
cjne R7, #76, diferente_T_0; contar 76 ciclos => total de ~5 segundos
mov 09h, #01; Indica que o tempo de espera estourou
mov R7, #00
diferente_T_0:
RETi
;==============================
;serial
S_0:
mov 0Ah, A
mov A, SBUF
mov R4, A
mov A, 0Ah
clr Ri; ltima coisa a ser feita para no receber uma em cima da outra
RETi
;====================================================
;tabelas
tab_passo:
db 01, 02, 04, 08
tab_meio_passo:
19
tab_LCD_TRANCADO:
db "COFRE TRANCADO", 01, "DIGITE A SENHA", 00
;COFRE TRANCADO
;DIGITE A SENHA
tab_LCD_SENHA_CORRETA:
db "Senha correta", 00
;db 'Senha correta'
tab_LCD_SENHA_CORRETA_MESTRE:
db "Senha correta", 01, "mestre", 00
;db 'Senha correta mestre'
tab_LCD_SENHA_INCORRETA:
db "Senha incorreta", 02, "
; 'Senha incorreta'
end