Mudanças entre as edições de "Teste-Reflexo MIC29004-2014-1"
(29 revisões intermediárias por 2 usuários não estão sendo mostradas) | |||
Linha 10: | Linha 10: | ||
− | Este teste baseia-se em um equipamento que será inicializado com um botão ( | + | 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 <span style="color:red;">vermelho</span> proibindo ele de aperta o botão. |
− | Ao passar | + | |
+ | Ao passar esse intervalo de tempo que será sorteado, para evitar que a pessoa já saiba o tempo certo, que o led <span style="color:red;">vermelho</span> será apagado, e outro led de cor <span style="color:green;">verde</span> 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 <span style="color:green;">verde</span> 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. | 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 | + | |
+ | 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''' == | == '''Componentes''' == | ||
Linha 21: | Linha 26: | ||
** E outro que que ficará na parte superior do equipamento, que servirá para '''parar o cronômetro''' do teste | ** E outro que que ficará na parte superior do equipamento, que servirá para '''parar o cronômetro''' do teste | ||
− | * Dois leds: | + | * Dois '''leds''': |
** Um <span style="color:green;">VERDE</span> | ** Um <span style="color:green;">VERDE</span> | ||
** Um <span style="color:red;">VERMELHO</span> | ** Um <span style="color:red;">VERMELHO</span> | ||
* Um '''display''' para exibir as mensagens necessárias e o tempo do teste. | * Um '''display''' para exibir as mensagens necessárias e o tempo do teste. | ||
+ | |||
+ | == Fluxograma == | ||
+ | |||
+ | === Fluxograma Principal === | ||
+ | |||
+ | [[Arquivo:principal2.jpg]] | ||
+ | |||
+ | === Fluxograma das sub-rotinas === | ||
+ | |||
+ | [[Arquivo:timer2.jpg]] [[Arquivo:INT02.jpg]] | ||
== Execução == | == Execução == | ||
Linha 31: | Linha 46: | ||
Este será desenvolvido para o microcontrolador '''8051'''. | 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'''. | Utilizando o '''MCU'''(com linguagem Assembly) para escrever e depurar o código do equipamento, para futuramente ser desenvolvido no software '''Proteus'''. | ||
+ | |||
+ | |||
+ | == Código == | ||
+ | |||
+ | <code> | ||
+ | |||
+ | 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************************************* | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | '''arquivos:''' https://db.tt/1iWzwVyG | ||
+ | |||
+ | == Foto do programa em funcionamento == | ||
+ | |||
+ | <center>[[Arquivo:foto_display.png| 900px]]</center> |
Edição atual tal como às 15h12min de 14 de julho de 2014
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
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*************************************
</syntaxhighlight>
arquivos: https://db.tt/1iWzwVyG
Foto do programa em funcionamento