Anda di halaman 1dari 21

1.

Introduo
Este projeto nos proporcionou um aprendizado de grande importncia para nossa
formao. Com o desenvolvimento do mesmo, podemos colocar em prtica nossos
conhecimentos adquiridos ao longo do curso de engenharia e a teoria de
microprocessadores visto ao longo deste semestre.
O projeto elaborado foi o controle de entrada e sada de um ambiente. A principio ele
deveria apresentar o nmero mximo de pessoas dentro de um veculo, o nmero total de
pessoas que entraram no veculo durante um determinado perodo e o numero total de
pessoas dentro do ambiente (veculo) em um instante, ou em um momento atual. Estes
dados so gerados em um display de 16x2. Mas apenas conseguimos implementar o
nmero de pessoas atual no ambiente. Um exemplo de utilizao a contagem de pessoas
que entram e saem em uma Lotao.
Apresenta-se neste relatrio, todo o trabalho de pesquisa, software, hardware e dificuldades
emergentes durante o processo de construo do mesmo.

2. Hardware
O sistema baseado no micro-controlador da famlia do 8051, AT89S52, da
ATMEL, que em conjunto com perifricos capaz de realizar a funo a que se prope.
Primeiramente vejamos uma breve listagem dos principais componentes do
hardware, para mais adiante explanarmos detalhadamente seus aspectos.

Micro-controlador
Sensoriamento
Display
Teclado (6 teclas)
Sinalizao Sonora

2.1. Micro-controlador

O micro-controlador utilizado, como j foi dito anteriormente, o AT89S52.


Foi escolhido pois capaz de atender as exigncias do projeto, e poder ser reaproveitado

em projetos futuros.

Figura 2.1 Microcontrolador AT89S52

As propriedades que nos foram teis:


Memria de Programa Flash: Nos permitiu gravar e des-gravar o programa
tantas vezes quantas foram necessrias. A capacidade de 8kBytes no foi bem aproveitada,
uma vez que nosso programa possui apenas 633 Bytes.
Memria de Dados: 256 Bytes de RAM interna, que tambm foi pouco
utilizada.
Clock: Trabalhamos com um clock interno de 12MHz. Para garantir essa
freqncia utilizamos um cristal de quartzo ligado entre os pinos 18 e 19 do controlador.

Figura 2.2 Gerador para Clock Interno

Reset: O reset feito por um push-button.


Interrupes: Foram utilizadas as 2 interrupes externas para
implementao das funes Lotao e Total, que so ativadas por push-buttons. As
interrupes dos timers e da serial, no foram utilizadas.
Temporizadores: Apenas um dos timers foi utilizado, para rotinas internas de
atraso e debouncing.
Canal Serial: O canal serial no foi utilizado.
Portas de Entrada/Sada: A porta 0 s foi utilizada para ativar a sinalizao
sonora, ativando o buzzer quando necessrio; a porta 1 foi utilizada para entradas (sensores
e botes de interface); a porta 2 a sada de dados para o display; e a porta 3 possui as
entradas de solicitao de interrupo e duas sadas para comunicao com o display.

2.2. Sensoriamento
Para implementao do hardware de deteco, utilizamos basicamente
componentes simples, de fcil aquisio no mercado, o que de certa forma prejudicou a
utilidade real do nosso projeto. A idia inicial era utilizar dois fotosensores excitados por
dois fotoemissores de infravermelho, e ligar diretamente a sada dos fotosensores ao
controlador. Compramos o fototransistor TIL78 para sensor, e o fotodiodo TIL32 para
emissor. Verificamos, no entanto, que a capacidade de excitao desses fotodiodos
medocre, e seria necessria uma amplificao do sinal. Mas conseguimos tambm,
emprestado por um colega, um fotoemissor muito mais poderoso, o TSAL6200. Utilizando
este emissor e os dois TIL32 que tnhamos, sob correntes prximas das mximas,
conseguimos uma resposta razovel dos receptores na distncia de demonstrao que

pretendamos usar (cerca de 20 cm). Ao tentar ligar a sada do receptor ao controlador,


descobrimos que realmente, ele no capaz de ser aplicado diretamente ao mesmo. Para
resolver este problema, recorremos ao que foi aprendido na disciplina de Eletrnica II, no
que diz respeito a comparadores. Bolamos um circuito que compara a sada dos
fotosensores com a tenso sobre um led (aproximadamente 1,95V). O operacional utilizado
foi o LM741, alimentado por +5 volts e 0, e, portanto a sada deveria variar entre esses
extremos. Quase certo, pois a baixa qualidade do operacional, colocou tenso de sada entre
1,5 e 5 volts. No datasheet do AT89S52, temos que ele detecta o nvel lgico 1 para tenses
maiores que 1,9V e nvel lgico 0 para tenses menores que 1,1V. Mais uma vez, driblamos
o problema com o que tnhamos disposio: colocamos dois diodos 1N4007 em srie na
sada, ligados um resistor de 8k2 (caminho para o terra). O circuito final que vem a seguir,
funcionou perfeitamente nos dando uma variao entre 0,5V e 3,5V na sada, que
perfeitamente discernida pelo controlador!

Figura 2.3 Dispositivo de Sensoriamento

2.3. Display
A interface com o usurio tem como seu mais importante componente o
display. Ele indispensvel para a correta utilizao do equipamento.
O display adquirido um display LCD, de 16 colunas por 1 linha apenas. A
ligao dos seus 8 bits de dados feita na porta 2 do controlador, porta essa que possui
pull-up interno, e portanto no requer resistores de pull-up externo. Como queremos

apenas escrever o display, aterramos seu pino RD/WR\. Os bits E (enable do display) e RS
(que define se instruo ou dado que vamos enviar) esto ligados na porta 3, tambm sem
necessidade de pull-up externo, nos bits P3.7 e P3.6 respectivamente. Alm dos pinos de
alimentao com +5V e 0V, precisamos tambm ligar a um pino de contraste um
potencimetro; no caso ligamos um resistor de 1k para o terra e 10k para +5V e obtivemos
um contraste satisfatrio.

Figura 2.4 Display LCD 16x1

2.4. Teclado
O teclado no matricial, no precisamos fazer varredura. Ele consiste
simplesmente nos seis botes, do tipo push-button, sendo que 1 deles para o reset (
detectado independentemente dos demais), outros dois so para chamada de interrupo
externa, que tambm so detectados sempre. Apenas 3 botes podem em algum momento
serem acionados qualquer um, e essa varredura simples feita facilmente no software.

Figura 2.5 Ligao dos Botes


O boto RESET no necessita de debouncing. Ele simplesmente liga por
alguns instantes o +5V no pino de RST do controlador, e mantm o pino em 0 no resto do
tempo por um resistor de pull-down.
Os botes de interrupo so LOTAO e TOTAL. Eles possuem um sistema
de debouncing por filtro passa-baixas simples: um capacitor de 10uF em paralelo com eles,
de modo que temos uma constante de tempo de 100ms (para o resistor de 10k utilizado no
pull-up), que muito maior do que os tericos 10ms (mximo) de efeito-mola,
garantindo uma perfeita rejeio ao bouncing.
Os botes de entrada no programa, esto ligados na P1, so (menos), +
(mais), e OK. O seu debouncing feito pelo software.

2.5. Sinalizao Sonora


Sinalizao sonora simplesmente um Buzzer conectado a P0.4 com um
resistor de 10k indo para +5V (porta 0 necessita de resistor de pull-up externo). O Buzzer
no precisa de driver de corrente pois a corrente que a P0 capaz de fornecer ou drenar
de at 23mA, que muito mais do que o Buzzer precisa quando est sozinho sob 5 volts.

Figura 2.6 Alerta Sonoro (Buzzer)

3. Software
O software para o sistema foi desenvolvido no programa Keil uVision2 Evaluation Version.
No programa fonte fornecido mais adiante neste relatrio, descrevemos passo
a passo por meio de comentrios o que o programa est fazendo a cada momento. Ento,
aqui vamos apenas dar uma viso geral do que se passa em cada etapa.

3.1. Reset
O programa reinicializa. A Lotao inicial (default) definida em 6 (pessoas).
O Fluxo e o Total so zerados. Habilita as duas interrupes externas e desabilita as demais.

Define que a interrupo TOTAL tem prioridade. Inicializa tambm o display. Durante o
reset, o beep est acionado. Quando termina inicializao, o beep pra, indicando ao
usurio que a medio de fluxo foi iniciada.

3.2. Medio de Fluxo


Essa rotina cuida os sensores, e verifica quando eles mudaram de valor. Cada
mudana define o estado em que o programa est de acordo com o diagrama de estados a
seguir. Foi considerado que humanamente impossvel que dois sensores troquem de valor
simultaneamente (antes da nova medida), por isso, se isso acontecer, o programa emitir
um beep curto (indicando erro), e retornar ao estado 00.
_
AB

_
AB
AB

09H

_
AB

___
AB

___
AB
_
AB

06H
___
AB

AB

AB
03H
_
AB

12H

AB
00H
_
AB

___
AB
_
AB

AB
_
AB

0CH
_
AB

_
AB

0FH

___
AB

___
AB

Figura 3.1 Diagrama de Estados dos Sensores

Quando completamos uma transio, isto , chegamos de novo ao estado 00, o


programa decidir baseado na ordem em que os sensores foram sombreados, se conta
mais uma pessoa (incrementa) ou se conta menos uma (decrementa).
Incrementa: ao incrementar, o programa verifica se no chegamos ao valor
estipulado para lotao; se chegamos a esse liga o beep, que s ir parar se uma pessoa (ou

quantas a mais que o permitido tiverem entrado) sair, deslotando o ambiente. No


incremento, alm de incrementar o fluxo, tambm incrementa-se uma varivel hexadecimal
chamada Contador, que vai contar quantas pessoas entraram, mas no vai descontar
quando elas sarem. Isso ser usado na interrupo TOTAL.
Decrementa: ao decrementar no decrementamos o Contador, apenas o fluxo.
O programa verifica se estava lotado para ento considerar se deslotou. E ainda, no caso
de termos 00 pessoas contabilizadas no local, se decrementarmos, o programa apita um
beep curto de erro, e mantm em 00 a contagem de fluxo!
Depois de incrementar ou decrementar, escreve no display o novo valor, e
retorna ao inicio da rotina.

3.3. Interrupo Lotao


LOTAO uma interrupo detectada quando o nvel lgico no pino P3.2
cai de 1 para 0. Ela tem baixa prioridade. Serve para que o usurio defina qual a lotao,
isto o nmero mximo de pessoas que podem estar dentro, que ele quer que o
controlador permita.
Esse interfaceamento realizado pelos botes +, -- e OK. O + aumenta o
valor, -- diminui, e o OK encerra a interrupo, voltando ao programa principal.
Durante o atendimento da interrupo, o fluxo no est sendo contado!
Se estava lotado, e aumentarmos o valor da lotao para um numero maior
que o de pessoas que esto no local, o programa no identificar que deslotou to
facilmente, pois nada foi planejado a esse respeito.
Lotao mxima 99, e mnima 00.

3.4. Interrupo Total


TOTAL a interrupo de maior prioridade, isto , se estivermos atendendo
outra interrupo e ela for chamada, ela ser atendida! detectada pela queda de nvel no
pino P3.3. Sua utilidade fornecer uma aproximao de quantas pessoas diferentes
passaram pelos sensores. Ela utiliza o registrador Contador, para nos indicar quantos
entraram, sem descontar os que saram! Podemos assim, se considerarmos que todas as
pessoas que entraram, entraram apenas uma vez, informar ao usurio o nmero de
freqentadores do local!

O valor de sada aqui, assim como em todos os outros instantes do programa,


limitado em 99 (pois isto apenas um programa de teste de conhecimentos). Assim, se
ultrapassarmos aqui esse valor, o display indicar caracteres que no fazem sentido para o
usurio.

3.5. Sub-rotina Escrita


Cada vez que vamos escrever algo no display, precisamos setar o E (enable do
display), e em seguida zer-lo. Alm disso, para escrevermos um dado precisamos de no
mnimo 40us de espera antes de enviar um novo dado. Por isso, criamos uma sub-rotina
que far tudo isso, chamada Escrita.
Se estivermos enviando uma instruo, precisamos de 15ms, por isso, sempre
que enviamos uma, alm de chamar a sub-rotina de escrita, chamamos tambm uma subrotina de atraso maior.
3.6. Sub-rotina Fluxo
Escreve a mensagem Fluxo: no display. Alm disso, chama outra sub-rotina,
Numero, para escrever o valor desse fluxo no display.
3.7. Sub-rotina Numero
Escreve o valor do fluxo no display
3.8. Sub-rotinas de Atrasos
Temos quatro sub-rotinas de atrasos, todas utilizando o timer 1 apenas. So
elas:

Delay50us: atraso de 50us para escrita de dados no display.


Delay800us: atraso de 800us na leitura dos sensores
Delay20ms: atraso de 20ms para escrita de instrues no display
DelayMax: atraso de 66ms para debouncing de teclas

O atraso de debouncing foi definido pelo teste do equipamento; com um


delay menor ficou muito difcil para o controle das teclas pelo usurio.

3.9. Programa Fonte


Uma vez explicados os principais aspectos do programa, colamos a seguir o
Programa Fonte final de nosso programa , e encerramos nossa descrio do software.
Note-se que a edio do Word posicionou os comentrios em nova linha, mas
no programa a ser compilado eles devem todos estar depois de ponto e virgula.

;Programa Fonte para Projeto de Sistema Microcontrolado:


;

"CONTROLADOR DE FLUXO"

;---------------------------------------------------------------------------------------;---------------------------------------------------------------------------------------;TABELA DE EQUATES
;Banco de registradores 00
SENSOR
EQU R0 ;guarda o valor atual dos sensores
ULTIMO_ESTADO EQU R1 ;guarda o valor do ltimo estado
PROX_ESTADO EQU R2 ;guarda o valor do novo estado
FLAG0
EQU R3 ;guarda a unidade de contagem em ascii
FLAG1
EQU R4 ;guarda a dezena de contagem em ascii
LOT0
EQU R5 ;guarda a unidade de lotao e de total em ascii
LOT1
EQU R6 ;guarda a dezena de lotao e de total em ascii
CONTADOR EQU R7 ;guarda o total de passantes
;Endereos de portas
ENTRADA
EQU P1 ;guarda o endereo da porta das entradas
LCD
EQU P2 ;guarda o endereo do codigo para o display
;Endereos de bits de portas
BEEP
EQU P0.4 ;guarda o endereo do beep sinalizador
SENSORA
EQU P1.0 ;guarda o endereo do sensor A (ver manual)
SENSORB
EQU P1.1 ;guarda o endereo do sensor B (ver manual)
MAIS
EQU P1.2 ;guarda o endereo do boto '+'
MENOS
EQU P1.3 ;guarda o endereo do boto '-'
OK
EQU P1.4 ;guarda o endereo do boto 'OK'
SINAL0

EQU P3.0 ;bit que sinaliza que a interrupo 'Lotao' ainda no foi encerrada

SINAL1
EQU P3.1 ;bit que sinaliza que a interrupo 'Total' ainda no foi encerrada
E
EQU P3.6 ;guarda o endereo da habilitao do display
RS
EQU P3.7 ;guarda o o endereo de controle do display (0=instruo,1=dado)
;---------------------------------------------------------------------------------------;Inicio do Programa
ORG 0000H
JMP RESET
ORG 0003H
JMP LOTACAO
ORG 0013H
JMP TOTAL
RESET: SETB BEEP
;o beep aqui sinaliza a inicializao
SETB SINAL0
SETB SINAL1
MOV SENSOR,#00H
MOV ULTIMO_ESTADO,#00H
MOV PROX_ESTADO,#00H
MOV FLAG0,#48
;48 cdigo ASCII para 0
MOV FLAG1,#48
MOV LOT0,#54
;54 cdigo ASCII para 6
MOV LOT1,#48
;Lotao default de 6 pessoas
MOV CONTADOR,#00H
MOV DPTR,#TABELA
;O Data Pointer recebe o endereo da tabela na memoria de programa
MOV IE,#00H
;Desabilita todas interrupes pra iniciar 'sossegado'
MOV TMOD,#10H
;Timer 1 funcionando como contador de 16 bits (modo 1)
MOV TCON,#45H
;Interrupes detectadas na mudana de nvel. Alm disso,
;pe timer 1 correndo. Ele no pra nunca no programa,
;mas sempre reiniciado nas rotinas de atraso.
CLR RS

;Para escrever instrues no display zeramos o bit RS

MOV LCD,#38H
;1 linha / matriz 7x5
CALL ESCRITA
CALL DELAY20MS
;delay de 20ms (para instrues o atraso recomendado maior que para dados)
MOV LCD,#06H
;cursor com autoincremento para direita
CALL ESCRITA
CALL DELAY20MS
MOV LCD,#0CH
;liga display / cursor apagado
CALL ESCRITA
CALL DELAY20MS
MOV IE,#85H
MOV IP,#04H

;Habilita agora as interrupes externas, e desabilita as outras


;Indica que a interrupo 'Total' tem prioridade sobre 'Lotao'.

CALL FLUXO
;Escreve no display o Fluxo
;O display ser limpo nessa subrotina
CLR BEEP

;A inicializao foi encerrada... o beep pra.

MEDIR_FLUXO: MOV ENTRADA,#0FFH


;Necessrio para o pull-up externo
CALL DELAY800US
;Atraso para que o programa no leve em considerao alteraes rpidas demais.
MOV A,ENTRADA
;O acumulador recebe as entradas (porta 1)
ANL A,#03H
;Descartamos os seis ultimos bits. Os dois primeiros tem o valor atual dos sensores.
MOV SENSOR,A
;O resultado do 'and' nos dar portanto os sensores iluminados (ativos), que sero
guardados no registrador
MOV A,ULTIMO_ESTADO
;Ento o acumulador recebe o valor do ltimo estado...
MOVC A,@A+DPTR
;e esse valor indicar na tabela o valor dos sensores nesse ultimo estado.
XRL A,SENSOR
;De posse do valor dos sensores antes, verificamos aqui qual mudou!
JZ MEDIR_FLUXO
;Se nenhum mudou, reiniciamos a medida.
;Se os dois sensores mudaram ento ocorre um erro! (ver a seguir)
CJNE A,#03H,CORRETO
;Nesse trecho o programa verifica se no ocorreu
SETB BEEP
;algum erro de 'pular' estado. Se sim ele toca um
CALL DELAYMAX
;sinal de alerta, e retorna para verificar os sensores
CALL DELAYMAX
;de novo, sem atualizar o estado corretamente.
CALL DELAYMAX
;Se no, ele continua.
MOV ULTIMO_ESTADO,#00H
;O ltimo estado volta ento para o estado inicial.
CLR BEEP
JMP MEDIR_FLUXO
CORRETO: ADD A,ULTIMO_ESTADO
;Se um, e apenas um sensor mudou, o resultado do 'ou exclusivo' nos dir
qual foi.
MOVC A,@A+DPTR
;Se for 01, mudou o sensor A, se for 02, mudou o B. Somando com o valor do estado
MOV PROX_ESTADO,A
;em que estavamos e olhando na tabela, teremos o valor do prximo estado!!! Esse
;valor ser ento amazenado no registrador.
CJNE PROX_ESTADO,#00H,ATUALIZAR_ESTADO ;Se no chegamos no estado, ainda no atualizamos o
display
TESTE1: CJNE ULTIMO_ESTADO,#09H,TESTE2
;Se chegamos no estado 00H, verificamos de onde viemos. Se foi
de 09H,
JMP DECREMENTA
;decrementamos a sada.
TESTE2: CJNE ULTIMO_ESTADO,#12H,ATUALIZAR_ESTADO ;Se chegamos de 12H, incrementamos a sada
JMP INCREMENTA
;Em qualquer outro caso, simplesmente atualizamos o estado.
ATUALIZAR_ESTADO: MOV A,PROX_ESTADO
;Atualizar o estado significa aqui que:
MOV ULTIMO_ESTADO,A
;o 'prximo estado' passa a ser o 'ultimo estado'.
JMP MEDIR_FLUXO
;Reiniciamos daqui a medida
;Atualizao das Sadas
;Atualizar as sadas significa mudar o valor indicado no display.
DECREMENTA: DEC FLAG0
;Ao decrementar, decrementamos uma unidade.
CJNE FLAG0,#47,DISPLAY
;Se j estavamos em unidade '0', precisamos ento
DEC FLAG1
;decrementar a dezena, e colocar a unidade em '9'.
MOV FLAG0,#57
CJNE FLAG1,#47,DISPLAY
;Se a dezena tambm estava em zero, ento significa que uma pessoa saiu de
onde
SETB BEEP
;no havia ningum!!! O programa no aceita isso, ento apita rapidamente, e reinicia
JMP ERRO
;a medio de fluxo a partir de '0', desconsiderando o passante.

INCREMENTA: INC CONTADOR


;Ao incrementar, incrementamos uma unidade e tambm um contador que
ser usado depois.
INC FLAG0
CJNE FLAG0,#58,DISPLAY
;Se j estavamos em unidade '9', precisamos ento
INC FLAG1
;incrementar a dezena, e colocar a unidade em '0'.
MOV FLAG0,#48
DISPLAY: JB BEEP,DESLOTOU
;Se o beep est setado, porque estava 'lotado'. Precisamos verificar se a lotao foi
;'terminada', ou se continua lotado no trecho 'Deslotou'.
;ESSA INSTRUO NO FUNCIONOU COMO QUERAMOS (explicaes no relatrio)
MOV A,FLAG0
;Aqui ele faz uma comparao entre os flags que
XRL A,LOT0
;contam o nmero de pessoas que entraram (flag0
JNZ NAO_LOTOU
;e flag1) com os que definem a lotao (lot0 e
MOV A,FLAG1
;lot1). Se iguais porque lotou e seno porque
XRL A,LOT1
;ainda no lotou.
JNZ NAO_LOTOU
LOTOU: SETB BEEP
;Se lotou, aciona beep que s para se deslotar!
JMP NAO_LOTOU
DESLOTOU: MOV A,FLAG0
;Aqui ele faz uma comparacao entre os flags que
INC A
;contam o nmero de pessoas que entraram (flag0
XRL A,LOT0
;e flag1) (com (flag0)+1), com os que definem a
JNZ NAO_LOTOU
;lotao (lot0 e lot1). Se iguais porque ainda
MOV A,FLAG1
;est lotado, seno 'porque deslotou'.
XRL A,LOT1
JNZ NAO_LOTOU
CLR BEEP
;Se deslotou, pra o beep.
JMP NAO_LOTOU
ERRO: CALL DELAYMAX
;A sinalizao de erro um beep curto.
CALL DELAYMAX
CALL DELAYMAX
CALL DELAYMAX
CALL DELAYMAX
MOV FLAG1,#48
;Quando acontece o erro, o contador de fluxo reiniciado.
MOV FLAG0,#48
CLR BEEP
NAO_LOTOU: CALL NUMERO
;Finalmente, atualiza o valor do display!
JMP ATUALIZAR_ESTADO

;E ento retorna para atualizar o estado.

TABELA: DB 03H,03H,0CH ;Aqui est nossa tabela. Ela contm em cada linha os dados relativos a cada um dos
DB 02H,00H,06H ;estados possveis (00H,03H,06H,09H,0CH,0FH,12H).
DB 00H,09H,03H
DB 01H,06H,00H ;As colunas significam respectivamente: 'Valor dos sensores na medio anterior',
DB 01H,0FH,00H ;'Valor do prximo estado se mudou o sensor A',
DB 00H,0CH,12H ;e 'Valor do prximo estado se mudou o sensor B.
DB 02H,00H,0FH
;..................Interrupes.............................................
;Rotina de Interrupo 0
LOTACAO: CLR SINAL0

;Indica que a interrupo 'Lotao' est ativa.

CLR RS
MOV LCD,#01H
;codigo ASCII para acesso coluna 1 do display
CALL ESCRITA
CALL DELAY20MS
SETB RS
;Setamos RS para escrever dados no display!
MOV LCD,#76
;codigo ASCII para letra L
CALL ESCRITA
MOV LCD,#79
;codigo ASCII para letra O
CALL ESCRITA
MOV LCD,#84
;codigo ASCII para letra T
CALL ESCRITA
MOV LCD,#65
;codigo ASCII para letra A
CALL ESCRITA
MOV LCD,#67
;codigo ASCII para letra C
CALL ESCRITA
MOV LCD,#65
;codigo ASCII para letra A
CALL ESCRITA
MOV LCD,#79
;codigo ASCII para letra O
CALL ESCRITA
MOV LCD,#63
;codigo ASCII para '?'
CALL ESCRITA
JB SINAL1,DEZENA
JMP ENCERRA_INT1
DEZENA: CLR RS
MOV LCD,#198
CALL ESCRITA
SETB RS
MOV LCD,LOT1
CALL ESCRITA
UNIDADE: CLR RS
MOV LCD,#199
CALL ESCRITA
SETB RS
MOV LCD,LOT0
CALL ESCRITA

;Se a interrupo 'Total' ainda no foi encerrada,


;ela ser encerrada agora.

;codigo ASCII para acesso coluna 15 do display

;coloca o valor lotacao da casa de dezena no display

;codigo ASCII para acesso coluna 16 do display

;coloca o valor lotacao da casa de unidade no display

SOMA:
SETB MAIS
;pull-up externo
CALL DELAYMAX
JB MAIS,DIMINUI
;Se o boto 'mais' for pressionado, incrementa o valor de Lotao
INC LOT0
CJNE LOT0,#58,DEFINIDO
MOV LOT0,#48
INC LOT1
CJNE LOT1,#58,DEFINIDO
MOV LOT1,#48
DIMINUI: SETB MENOS
;pull-up externo
CALL DELAYMAX

JB MENOS,DEFINIDO ;Se o boto 'menos' for pressionado, decrementa o valor de Lotao


DEC LOT0
CJNE LOT0,#47,DEFINIDO
MOV LOT0,#57
DEC LOT1
CJNE LOT1,#47,DEFINIDO
MOV LOT1,#57
DEFINIDO: SETB OK
;pull-up externo
CALL DELAYMAX
JB OK,DEZENA
;Se o boto 'OK' for pressionado, encerra a interrupo Lotao.
SETB SINAL0
CALL FLUXO

;Setamos esse bit indicando que a lotao foi definida.


;Retornamos com valor do fluxo ao programa principal.

RETI
; Rotina de Interrupo 1
TOTAL: CLR SINAL1
;Indica que a interrupo 'Lotao' est ativa.
PUSH ACC
PUSH PSW
PUSH 05
PUSH 06
;Salva na pilha os registradores que vai modificar
MOV LOT0,#00H
MOV LOT1,#00H
CLR RS
MOV LCD,#01H
;cdigo ASCII para acesso coluna 1 do display e limpeza do mesmo
CALL ESCRITA
CALL DELAY20MS
SETB RS
MOV LCD,#84
CALL ESCRITA
MOV LCD,#79
CALL ESCRITA
MOV LCD,#84
CALL ESCRITA
MOV LCD,#65
CALL ESCRITA
MOV LCD,#76
CALL ESCRITA
MOV LCD,#58
CALL ESCRITA

;cdigo ASCII para letra T


;cdigo ASCII para letra O
;cdigo ASCII para letra T
;cdigo ASCII para letra A
;cdigo ASCII para letra L
;cdigo ASCII para ':'

CLR C
;Necessrio para que jnc d certo
CLR AC
;Necessrio para que subb d certo
DEFINIR_TOTAL: MOV A,CONTADOR ;O contador guarda o numero total de pessoas que passaram!!!
JZ MOSTRA_TOTAL ;Nesse trecho vamos separar o valor do contador em 2 bytes,
MAIS_DEZ: SUBB A,#0AH
;dezena e unidade, ASCII, para podermos envi-lo ao display.

INC LOT1
JZ MOSTRA_TOTAL
JNC MAIS_DEZ
DEC LOT1
ADD A,#0AH
JZ MOSTRA_TOTAL
MAIS_UM: DEC A
INC LOT0
JNZ MAIS_UM
MOSTRA_TOTAL: MOV A,#48
ADD A,LOT0
CLR RS
MOV LCD,#199 ;cdigo ASCII para acesso coluna 16 do display
CALL ESCRITA
SETB RS
MOV LCD,A
;coloca o valor total da casa de unidade no display
CALL ESCRITA
MOV A,#48
ADD A,LOT1
CLR RS
MOV LCD,#198 ;cdigo ASCII para acesso coluna 15 do display
CALL ESCRITA
SETB RS
MOV LCD,A
;coloca o valor total da casa de dezena no display
CALL ESCRITA
SETB OK
JB OK,$

;Aguarda que o usurio aperte 'OK' para sair da interrupo.

CALL DELAYMAX
CALL FLUXO
POP 06
POP 05
POP PSW
POP ACC

;Desempilha os registradores, retornando os valores de antes da interrupo.

JB SINAL0,ENCERRA_INT1 ;Se a interrupo 'Lotao' ainda estava sendo executada quando foi chamada
JMP LOTACAO
;a 'Total', retornamos a ela para que o display escreva a mensagem "Lotao".
;para depois encerrar esta.
ENCERRA_INT1: SETB SINAL1 ;Indica que foi encerrada a interrupo total.
RETI
;....................Subrotinas.................................................
FLUXO: CLR RS
MOV LCD,#01H

;cdigo ASCII para acesso coluna 1 do display e limpeza do mesmo

CALL ESCRITA
CALL DELAY20MS
SETB RS
MOV LCD,#70
CALL ESCRITA
MOV LCD,#76
CALL ESCRITA
MOV LCD,#85
CALL ESCRITA
MOV LCD,#88
CALL ESCRITA
MOV LCD,#79
CALL ESCRITA
MOV LCD,#58
CALL ESCRITA

;cdigo ASCII para letra F


;cdigo ASCII para letra L
;cdigo ASCII para letra U
;cdigo ASCII para letra X
;cdigo ASCII para letra O
;cdigo ASCII para ':'

CALL NUMERO
RET
NUMERO: CLR RS
MOV LCD,#199
CALL ESCRITA
SETB RS
MOV LCD,FLAG0
CALL ESCRITA
CLR RS
MOV LCD,#198
CALL ESCRITA
SETB RS
MOV LCD,FLAG1
CALL ESCRITA

;cdigo ASCII para acesso coluna 16 do display

;coloca o valor da casa de unidade no display

;cdigo ASCII para acesso coluna 15 do display

;coloca o valor da casa de dezena no display

RET
ESCRITA: SETB E
;Setamos e depois zeramos o E (Enable), indicando ao display
CLR E
;que estamos lhe enviando um byte de dados ou instruo
CALL DELAY50US
;O tempo mnimo para que ele receba esse byte 40us (para dados).
RET
;ATRASOS
DELAYMAX: CLR TF1
MOV TH1,#00H
MOV TL1,#00H
JNB TF1,$
CLR TF1
RET
DELAY20MS: CLR TF1

MOV TH1,#HIGH(65535-20000)
MOV TL1,#LOW(65535-20000)
JNB TF1,$
CLR TF1
RET
DELAY800US: CLR TF1
MOV TH1,#HIGH(65535-800)
MOV TL1,#LOW(65535-800)
JNB TF1,$
CLR TF1
RET
DELAY50US: CLR TF1
MOV TH1,#HIGH(65535-50)
MOV TL1,#LOW(65535-50)
JNB TF1,$
CLR TF1
RET
END

4. Concluso
A cada nova etapa da criao e montagem do sistema microcontrolado, no deparamos com
os mais variados problemas.
No caso do software, obtivemos grande auxlio nas ferramentas de debug do compilador
Keil, que se verificaram indispensveis para a elaborao do mesmo. At chegarmos
verso final, devemos ter encontrado mais de 100 erros, desde simples comandos escritos
errado, que impediam a compilao, at graves problemas de lgica, que impediam o
funcionamento desejado.
Quanto ao hardware, os problemas foram ainda maiores, dada a nossa quase total
inexperincia em eletrnica digital. interessante citar os dois que nos tomaram mais
tempo:

o pull-up externo na porta 0: perdemos algumas horas por no termos dado ateno
ao fato de que a porta 0 requer resistores de pull-up externo para funcionar.
os sensores de baixa potncia (luminosa): no item 2.2 deste relatrio, est a descrio
deste problema. S chegamos a ele quando nosso prazo de entrega j estava se
esgotando, e , por isso, embora nossa soluo aparentemente funcionou, isto
precisaria ser longamente revisto para que o sistema fosse implementado em escala
industrial.

Concluda a verso final do software, e do hardware, no h muito mais o que dizer.


Realmente, o mais importante para o grande aproveitamento deste projeto, foram
exatamente os erros com os quais nos confrontamos, pois foram eles que nos permitiram
uma maior compreenso de quase todos os aspectos desta disciplina, e de outras, alm de
nos propiciarem uma vivncia real em engenharia eltrica, no que diz respeito contornar
os obstculos fsicos usando o que se tem a disposio, e procurando minimizar os custos
de fabricao.
O projeto Controlador de Fluxo relativamente simples, se comparado maioria dos
projetos propostos por outros colegas na data da especificao dos projetos, mas para ns
uma grande satisfao t-lo concludo, pois partimos praticamente do limbo no que diz
respeito a conhecimento de microcontroladores e sua programao, e chegamos ao fim
capacitados a criar novos projetos mais complexos.

Anda mungkin juga menyukai