Teste-Reflexo MIC29004-2014-1

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

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.

Beber.jpg


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

Principal2.jpg

Fluxograma das sub-rotinas

Timer2.jpg INT02.jpg

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

Foto display.png