Teste-Reflexo MIC29004-2014-1
Motivação
Com objetivo de maior aprendizagem, foi proposto um Projeto Final de Microprocessador, o qual a nossa equipe decidiu elaborar o Teste de Reflexo.
Funcionamento
Afim de auxiliar a policia,elaboramos um microcontrolador para testar o reflexo do motorista. Assim ela pode detectar com outro mecanismo se o motorista está embriagado, evitando que este ponha sua vida em risco e dos outros também.
Este teste baseia-se em um equipamento que será inicializado com um botão (start), ao ser acionado ele irá ligar o equipamento e mostrará no display uma mensagem inicial “PREPARE-SE”, esta que ficará exibida durante um tempo randômico, o tempo em que o possível infrator terá para posicionar uma das mãos na altura da orelha, com o equipamento a uma distância de 1 metro do chão, sobre uma superfície plana. Lembrando que durante este intervalo de tempo terá um led da cor vermelho proibindo ele de aperta o botão.
Ao passar esse intervalo de tempo que será sorteado, para evitar que a pessoa já saiba o tempo certo, que o led vermelho será apagado, e outro led de cor verde acenderá indicando que a partir daquele momento será acionado um cronômetro (0 à 10s), contabilizando o seu tempo de reação para apertar o botão. Após o acionamento do botão o cronometro parará, o led verde desligará e o tempo decorrido do teste será apresentado no display do equipamento.
Ao final dos testes com os resultados: do reflexo e do bafômetro, o policial tomará a decisão mais plausível sobre o possível infrator.
No final do teste o equipamento exibirá a mensagem se deseja refazer o teste (“Reiniciar”), em casos de erro ou de mais um motorista a ser averiguado. Se desejar refazer deve-se precionar o botão start novamente, e o processo descrito acima se repetirá.
OBS.:Caso esse botão não seja pressionado até os 10 segundos aparecerá no display (“TIME OUT”), e em seguida aparecerá no display (“Reiniciar”), se desejar refazer os testes deve-se pressionar o botão start.
Componentes
- Dois botões:
- Um que ficará do lado do equipamento, que possui função de ligar ou reiniciar o sistema
- E outro que que ficará na parte superior do equipamento, que servirá para parar o cronômetro do teste
- Dois leds:
- Um VERDE
- Um VERMELHO
- Um display para exibir as mensagens necessárias e o tempo do teste.
Fluxograma
Fluxograma Principal
Fluxograma das sub-rotinas
Execução
Este será desenvolvido para o microcontrolador 8051. Utilizando o MCU(com linguagem Assembly) para escrever e depurar o código do equipamento, para futuramente ser desenvolvido no software Proteus.
Código
\tasm
max_estouro equ 6; valor real deveria ser 200.
start equ p3.3
D equ P1
RS bit P3.0
RW bit P3.1
E bit P3.4
org 0000h
ljmp main
org 0003h
jmp int
org 001Bh
jmp timer
- Converte_hexa_string_em_ASCII**************************
escrever_String:
cjne r4,#0h,tempo1
mov DPTR,#string_tempo0
lcall main_Display
lcall sair
tempo1: cjne r4,#1h,tempo2
mov DPTR,#string_tempo1
lcall main_Display
lcall sair
tempo2: cjne r4,#2h,tempo3
mov DPTR,#string_tempo2
lcall main_Display
lcall sair
tempo3: cjne r4,#3h,tempo4
mov DPTR,#string_tempo3
lcall main_Display
lcall sair
tempo4: cjne r4,#4h,tempo5
mov DPTR,#string_tempo4
lcall main_Display
lcall sair
tempo5: cjne r4,#5h,sair
mov DPTR,#string_tempo5
lcall main_Display
lcall sair
sair: ret
- Subrotina_de_Interrupção_da_pota
- p3.2************************
- lógica para interrupção quando a pessoa aperta o botão
int:
clr EA ; para as interrupções
clr TR1;para o timer1
setb p2.1;apaga led verde
push acc
lcall escrever_String
mov r1,#1h
pop acc
reti
- Rotina_de_interrupção_do_timer***************************
timer:
;recarrega o timer
inc r4;conta estouros
mov TH1,#3Ch
mov TL1,#0B0h;configura timer1 com 3CB0H
cjne R4,#max_estouro,sai ; aqui achamos que tem um problema na lógica do loop
clr TR1
clr EA
mov r1,#1h
setb p2.1 ; apaga led verde
mov dptr,#string_3 ;time out
lcall main_display
sai: reti
- O_tempo_que_demora_com_o_led_vermelho_aceso********************
; O tempo que demora com o led vermelho aceso
delay_Ns:
teste: djnz acc, loop1
ret
loop1: call delay_1s
JMP teste
delay_1s:
push acc
mov a,#0h
delay_loop:
call delay
inc a
cjne a,#20h,delay_loop ;increcrementa 20 vezes
pop acc
ret
delay:
Clr ET0
clr TR0;garante que timer esteja parado
clr TF0;garante que flag de estouro esteja zerado
mov TMOD,#0000001b ;configura timer0 para modo 1, sem controle externo
mov TH0,#3Ch
mov TL0,#0B0h;configura timer0 com
setb TR0;liga timer0
loop:
jnb TF0,loop;espera que timer0 estoure
clr TR0;para o timer0
clr TF0;zera TF0 - note que nao eh zerado de forma automatica
ret
- Subrotina_para_gerar_o_Randomico****************************
ramdomico:
cjne r0,#0h, loopr1
mov r0, #4h
volta_rdm:
lcall volta_main
loopr1:
cjne r0,#2h, loopr2
mov r0, #3h
lcall volta_rdm
loopr2:
mov r0, #2h
lcall volta_rdm
- Surotina_para_aparecer_o_Reiniciar_no_LCD********************
reiniar:
mov dptr,#string_2
lcall main_display
mov r1,#0h
lcall main
- Main_Principal**************************************
main:
;confuguração:
;configura o timer
cjne r1,#0h,reiniar
setb p2.1; apaga led verde
clr Rs
cmd #00000001b; apaga display
cmd #00000010b; curso retorna ao inicio
Clr ET1
clr TR1;garante que timer esteja parado
clr TF1;garante que flag de estouro esteja zerado
mov TMOD,#0000001b ;configura timer0 para modo 1, sem controle externo
mov TH1,#3Ch
mov TL1,#0B0h;configura timer0 com
mov r3,#0h ;registrdor utilizado para guarda o valor da multiplicação na int0
mov r4,#0h ; registrador para contar o número de estouros
mov r1,#0h; registrador utilizado para ver se recomeça (1) ou nao (0)
mov a,#0h
setb EA
clr ea
setb start;colocando 1 na porta (OBS: na porta 3 o bit 3 está habilitado)
;fim das configurações iniciais
;VERIFICA SE O START(BOTAO) FOI PRECIONADO
loop_Start:
jb start,loop_Start;espera que o botão start seja acionado (quando for 0)
;inicio do Programa:
mov D, #0
clr RW
mov DPTR,#string_1
lcall main_Display
clr p2.0 ;ascender o led vermelho
lcall ramdomico
volta_main:
mov a,r0 ; tempo aleatório
call delay_Ns
clr Rs
cmd #00000001b; apaga display
cmd #00000010b; curso retorna ao inicio
setb p2.0 ; apaga led vermelho
mov ie,#10001001b ; habilita int0 e o timer
mov tcon,#00000001b ; borda
clr p2.1 ; acende led verde
setb TR1;liga timer1;dipara timer
- teste_para_reiniciar_o_sistema*********************************
teste_retorne:
jnb start,main
cjne r1,#0h, main
clr Rs
cmd #00000001b; apaga display
cmd #00000010b; curso retorna ao inicio
jmp teste_retorne
- Main_do_Display_LCD**********************************
main_Display:
cmd macro cmd_code
setb E
mov D, cmd_code
clr E
endm
clr RS
cmd #00000001b ; Clear display
cmd #00000010b ; Cursor home
cmd #00000110b ; Entry mode set
cmd #00001111b ; Display ON/OFF control
cmd #00011110b ; Cursor/display shift
cmd #00111100b ; Function set
cmd #10000001b ; Set DDRAM address
; Print the string ...
setb RS
mov R6, #0
print: mov A, R6
inc R6
movc A, @A+DPTR
cmd A
cjne A, #0, print
ret
- Strings*****************************************
string_1: db 'Prepare-se!\0'
string_2: db 'Reiniciar!\0'
string_3: db 'Time out!\0'
string_tempo0: db 30h,'ms!\0'
string_tempo1: db 35h,30h,'ms!\0'
string_tempo2: db 31h,30h,30h,'ms!\0'
string_tempo3: db 31h,35h,30h,'ms!\0'
string_tempo4: db 32h,30h,30h,'ms!\0'
string_tempo5: db 32h,35h,30h,'ms!\0'
end
- Fim_do_Progama*************************************
<\code>