Você está na página 1de 14

Microprocessadores e Controladores I

Projeto
Grupo 08

Bruno Bezerra Silva Elias Sampaio da Silva Flvio da Cruz Silva Mrio Massanori Kuroki Wellington Rodrigues dos Santos

76357-8 76998-3 76573-2 76740-9 78245-9

Introduo
Microcontroladores so geralmente utilizados em automao e controle de produtos e perifricos, como sistemas de controle de motores automotivos, controles remotos, mquinas de escritrio e residenciais, brinquedos, sistemas de superviso, etc. Por reduzir o tamanho, custo e consumo de energia, e se comparados forma de utilizao de microprocessadores convencionais, aliados a facilidade de desenho de aplicaes, juntamente com o seu baixo custo, os microcontroladores so uma alternativa eficiente para controlar muitos processos e aplicaes. Um microcontrolador (tambm denominado MCU) um computador-num-chip, contendo um processador, memria e perifricos de entrada/sada. um microprocessador que pode ser programado para funes especficas, em contraste com outros microprocessadores de propsito geral (como os utilizados nos PCs). Eles so embarcados no interior de algum outro dispositivo (geralmente um produto comercializado) para que possam controlar as funes ou aes do produto.

Objetivo
O objetivo do projeto controlar dispositivos por meio da porta de E/S do microcontrolador 8051, sendo basicamente uma sequncia de LEDs ativada atravs de botes. O funcionamento bsico da aplicao de controle ser a exibio de uma sequncia numrica na barra de 8 LEDs. O acionamento de cada operao deve ser ativado por um boto pressionado.

Roteiro
Quando o microcontrolador (placa) resetado (ou ligado) dever piscar 5 (cinco) vezes a barra de LEDs (valor #0FFH), com um intervalo visual de aproximadamente 1 segundo. Aps terminar de piscar, deve acender (energizar) o LED mais significativo (MSB) da porta 2 (P2.7) para indicar que est ativo no modo Menu. No modo Menu, 3 (trs) botes podem ser pressionados, cada qual acionando uma sub-rotina especifica (vide tabela). Boto pressionado significa valor 0 no BIT respectivo da porta 2. LED rotaciona crescente significa energizar, um de cada vez, o bit menos significativo at o mais significativo, aproximadamente 0,5s para cada LED, ligado na porta 1, rotacionando o valor binrio. LED rotaciona decrescente significa sentido inverso da rotao. Conta binrio significa que a barra de LEDs deve apresentar a contagem em binrio equivalente de 0 a 16, sequencialmente, com intervalo de aproximadamente 0,5s entre cada nmero, na porta 1. Vale lembrar de que o LED acende (fica energizado) com lgica 0 e o visual para indicar a contagem deve ser o seguinte: LED aceso = BIT habilitado. A conta ocorre enquanto o boto P2.2 mantido pressionado (mantido fechado). Ao ser solto o programa deve guardar o ltimo valor binrio da contagem e, ao ser novamente pressionado deve iniciar a conta a partir do ltimo valor binrio armazenado. Quando a placa resetada, ou foi ligada na energia pela primeira vez, o valor armazenado da conta deve ser zero.

Desenvolvimento do Programa
Em primeiro lugar, ao ligarmos ou resetarmos a placa a barra de LEDs dever piscar 5 vezes, com intervalo visual de aproximadamente 1s. Para tal utilizamos as seguintes instrues: A instruo piscada, mostrada abaixo, acende os LEDs da P1, que permanecem acesos por aproximadamente 1s graas a quantidade de repeties obtidas atravs de decrementos repetitivos nos registradores R2, R0 e no acumulador. piscada:mov p1, #00 mov r2, #00Ah tx0: mov A, #0FFh t_2: mov R0, #0FFh t_1: dec R0 cjne R0, #00h, t_1 dec A cjne A, #00, t_2 dec r2 cjne r2, #00, tx0 jz piscada2 Para que as repeties dos decrementos totalizassem 1s, consideramos a sequncia das instrues de forma que s ocorria decremento no acumulador aps os 256 decrementos no registrador R0, e s ocorria decremento no registrador R2 aps os 256 decrementos do acumulador, fazendo com que tivssemos 655630 repeties antes de partirmos para piscada2, que apaga os LEDs. A tabela a seguir mostra como dimensionamos o tempo de 1s atravs das instrues e repeties consideradas no programa: Piscada (aceso) Pulsos das funes Pulsos totais 12 12 12 12 12 120 12 30720 12 7864320 12 7864320 12 7864320 12 30720 24 61440 12 30720 24 61440 12 12 Total 23808156

Funes piscada: mov p1, #00 mov r2, #00Ah tx0: mov A, #0FFh t_2: mov R0, #0FFh t_1: dec R0 nop cjne R0, #00h, t_1 dec A cjne A, #00, t_2 dec r2 cjne r2, #00, tx0 jz piscada2

Tempo (s) 542,5347E-9 542,5347E-9 5,4253E-6 1,3889E-3 355,5556E-3 355,5556E-3 355,5556E-3 1,3889E-3 2,7778E-3 1,3889E-3 2,7778E-3 542,5347E-9 1,0764 s

Na instruo piscada2, mostrada abaixo, utilizamos instrues semelhantes de decremento, tendo tambm 655360 repeties antes de retornar para piscada para acender os LEDs, com o acrscimo da instruo NOP para atingirmos o tempo necessrio de aproximadamente 1s. Ainda antes de retornar piscada, incrementamos o registrador R1 e o comparamos atravs da instruo CJNE para que s retornemos 4 vezes, fazendo com que os LEDs acendam e apaguem 5 vezes ao ligarmos ou resetarmos a placa e, aps isso, o programa vai para o menu. piscada2:mov p1, #0FFh mov r2, #00Ah tx1: mov A, #0FFh t_4: mov R0, #0FFh t_3: dec R0 nop cjne R0, #00h, t_3 dec A cjne A, #00, t_4 dec r2 cjne r2, #00, tx1 inc R1 cjne R1, #05, piscada Segue abaixo a tabela com o dimensionamento do tempo de 1s com as instrues acima citadas: Piscada2 (apagado) Funes Pulsos das funes Pulsos totais Tempo piscada2: mov p1, #0FFh 12 12 542,5347E-9 mov r2, #00Ah 12 12 542,5347E-9 tx1: mov A, #0FFh 12 120 5,4253E-6 t_4: mov R0, #0FFh 12 30720 1,3889E-3 t_3: dec R0 12 7864320 355,5556E-3 nop 12 7864320 355,5556E-3 cjne R0, #00h, t_3 12 7864320 355,5556E-3 dec A 12 30720 1,3889E-3 cjne A, #00, t_4 12 30720 1,3889E-3 dec r2 12 120 5,4253E-6 cjne r2, #00, tx1 24 240 10,8507E-6 inc R1 12 12 542,5347E-9 cjne R1, #05, piscada 24 24 1,0851E-6

Total

23685660

1,0709 s

Em nosso menu, inicialmente utilizamos a instruo CLR em P2.7, para indicar que o menu est ativo. Para o funcionamento dos botes, utilizamos a instruo JNB direcionada s suas respectivas sequncias de instrues para que, ao acionarmos um dos botes, iniciemos a rotina correspondente. Caso nenhum boto seja acionado, o loop feito com a instruo SJMP direcionada menu far com que o programa aguarde o acionamento de um dos botes com o menu ativo. menu: mov P1, #0FFh clr P2.7 jnb P2.0, botao jnb P2.1, botao2 jnb P2.2, botao3 sjmp menu Para o boto em P2.0 utilizamos o mesmo conceito de repeties de instrues de decremento j citado, ajustando a quantidade de repeties para atingirmos o tempo de 0,5s. Para que tenhamos a rotao crescente, utilizamos CLR em P1.0 e a instruo RL para transportar os bits, fazendo com que o LED aceso rotacione. botao: mov P1, #0FFh clr P1.0 ;acende o LED func1: mov R2, #02 tx2: mov R1, #0FFh ;esse MOV vai por #FFh no registrador R1 t_6: mov R0, #0FFh ;esse MOV vai por #FFh no registrador R0 t_5: dec R0 jb P2.0, jump nop cjne R0, #00h, t_5 dec R1 cjne R1, #00, t_6 dec R2 cjne R2, #00, tx2 mov A, P1 rl A mov P1, A jb P2.0, jump mov A, R1 jz func1 jump: ljmp menu

Segue a tabela com o dimensionamento dos tempos para que o LED permanea aceso por 0,5s antes de rotacionar: Funes botao: mov P1, #0FFh clr P1.0 func1: mov R2, #02 tx2: mov R1, #0FFh t_6: mov R0, #0FFh t_5: dec R0 jb P2.0, jump nop cjne R0, #00h, t_5 dec R1 cjne R1, #00, t_6 dec R2 cjne R2, #00, tx2 mov A, P1 rl A mov P1, A mov A, R1 jb P2.0, jump jz func1 Boto P2.0 Pulsos das funes Pulsos totais Tempo 12 12 542,5347E-9 12 12 542,5347E-9 12 12 542,5347E-9 12 6144 277,7778E-6 12 1572864 71,1111E-3 12 1572864 71,1111E-3 24 3145728 142,2222E-3 12 1572864 71,1111E-3 24 3145728 142,2222E-3 12 6144 277,7778E-6 24 12288 555,5556E-6 12 24 1,0851E-6 24 48 2,1701E-6 12 12 542,5347E-9 12 12 542,5347E-9 12 12 542,5347E-9 12 12 542,5347E-9 24 24 1,0851E-6 24 24 1,0851E-6 Total 11034828 0,4989 s

A diferena das instrues correspondestes ao boto em P2.0 para o boto em P2.1 que utilizamos a instruo CLR em P1.7, e o comando RR para rotacionar de forma decrescente. botao2: mov P1, #0FFh clr P1.7 ;acende o LED func2: mov R2, #02 tx3: mov R1, #0FFh t_8: mov R0, #0FFh t_7: dec R0 jb P2.1, jump2 nop cjne R0, #00h, t_7 dec R1 cjne R1, #00, t_8 dec R2 cjne R2, #00, tx3 mov A, P1 rr A mov P1, A mov A, R1

jb P2.1, jump2 jz func2 jump2: ljmp menu Nas instrues correspondentes ao boto em P2.2 tambm consideramos o conceito de repeties de decrementos e NOPs para obtermos o tempo de 0,5s. Para que o programa continue a contar do ponto em que parou quando soltamos o boto, o armazenamento dos valores obtidos a cada incremento armazenado no registrador R3, que zerado atravs da instruo resetmemo3, presente antes de menu para que, ao ligarmos ou resetarmos a placa o programa inicie a conta no 0 novamente (esse conceito utilizado melhor observado no final deste documento, onde apresentamos o cdigo utilizado no programa por completo). botao3: mov p1, R3 repeat: mov R2, #02 tx4: mov A, #0FFh t_10: mov R0, #0FFh t_9: dec R0 jb P2.2, jump3 nop nop cjne R0, #00h, t_9 dec A nop nop cjne A, #00, t_10 dec R2 cjne R2, #00, tx4 dec r3 mov p1, r3 cjne r3, #0EFh, repeat cjne r3, #0EEh, jjj jjj: ljmp resetmemo3 jz botao3 jb P2.2, jump3 jump3: ljmp menu

Segue tabela com o dimensionamento do tempo de 0,5s para cada loop de nossa rotina de soma: Funes botao3: mov p1, R3 repeat: mov R2, #02 tx4: mov A, #0FFh t_10: mov R0, #0FFh t_9: dec R0 jb P2.2, jump3 nop nop cjne R0, #00h, t_9 dec A nop nop cjne A, #00, t_10 dec R2 cjne R2, #00, tx4 dec r3 mov p1, r3 cjne r3, #0EFh, repeat Boto P2.2 Pulsos das funes 12 12 12 12 12 24 12 12 24 12 12 12 24 12 24 12 12 24 Total Pulsos totais Tempo 12 542,5347E-9 12 542,5347E-9 24 1,0851E-6 24 1,0851E-6 1572864 71,1111E-3 3145728 142,2222E-3 1572864 71,1111E-3 1572864 71,1111E-3 3145728 142,2222E-3 6144 277,7778E-6 6144 277,7778E-6 6144 277,7778E-6 12288 555,5556E-6 24 1,0851E-6 48 2,1701E-6 12 542,5347E-9 12 542,5347E-9 24 1,0851E-6 11040960 0,4992 s

Cdigo do Programa
#include <C:\Arquivos de Programas\Rigel\Reads51\Include\sfr51.inc> org 0 ljmp inicio org 0100h inicio: mov R1, #00 piscada:mov p1, #00 mov r2, #00Ah tx0: mov A, #0FFh t_2: mov R0, #0FFh t_1: dec R0 cjne R0, #00h, t_1 dec A cjne A, #00, t_2 dec r2 cjne r2, #00, tx0 jz piscada2 piscada2:mov p1, #0FFh mov r2, #00Ah tx1: mov A, #0FFh t_4: mov R0, #0FFh t_3: dec R0 nop cjne R0, #00h, t_3 dec A cjne A, #00, t_4 dec r2 cjne r2, #00, tx1 inc R1 cjne R1, #05, piscada jz resetmemo3

resetmemo3: mov r3, #0FFh; move FF para o Registrador 3 menu: mov P1, #0FFh; apaga os LEDs da P1 clr P2.7 jnb P2.0, botao jnb P2.1, botao2 jnb P2.2, botao3 sjmp menu

botao: mov P1, #0FFh clr P1.0 ;acende o LED func1: mov R2, #02 tx2: mov R1, #0FFh ;esse MOV vai por #FFh no registrador R1 t_6: mov R0, #0FFh ;esse MOV vai por #FFh no registrador R0 t_5: dec R0 jb P2.0, jump nop cjne R0, #00h, t_5 dec R1 cjne R1, #00, t_6 dec R2 cjne R2, #00, tx2 mov A, P1 rl A mov P1, A jb P2.0, jump mov A, R1 jz func1 jump: ljmp menu botao2: mov P1, #0FFh clr P1.7 ;acende o LED func2: mov R2, #02 tx3: mov R1, #0FFh t_8: mov R0, #0FFh t_7: dec R0 jb P2.1, jump2 nop cjne R0, #00h, t_7 dec R1 cjne R1, #00, t_8 dec R2 cjne R2, #00, tx3 mov A, P1 rr A mov P1, A mov A, R1 jb P2.1, jump2 jz func2 jump2: ljmp menu botao3: mov p1, R3 repeat: mov R2, #02

tx4: t_10: t_9:

mov A, #0FFh mov R0, #0FFh dec R0 jb P2.2, jump3 nop nop cjne R0, #00h, t_9 dec A nop nop cjne A, #00, t_10 dec R2 cjne R2, #00, tx4 dec r3 mov p1, r3 cjne r3, #0EFh, repeat cjne r3, #0EEh, jjj jjj: ljmp resetmemo3 jz botao3 jb P2.2, jump3 jump3: ljmp menu end

Bibliografia e Referncias
http://pt.wikipedia.org/wiki/Microcontrolador legacy.afonsomiguel.com/Graduacao/MPI/8051/tut8051_lima.doc Notas de aula de Microprocessadores e Controladores I

Você também pode gostar