Buscar

Apos8051 CPMA.COMUNIDADES.NET

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 52 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 52 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 52 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

�PAGE �
�PAGE �40�
CURSO
MICROCONTROLADORES
8051
KIT STATION51
Apostila Teórica
Prof. Elmo Dutra da Silveira Filho
Centro Tecnológico de Mecatrônica - SENAI
E-mail: elmo@malbanet.com.br
Internet: www.malbanet.com.br/professorelmo
Colaboração - colegas Senai - RS -RJ
3. Arquitetura de um microcontrolador
3.1 Componentes do microcontrolador genérico
Um microcontrolador é composto pelos seguintes blocos:
Unidade Central de Processamento (CPU);
Memória de Programa (ROM ou EPROM);
Memória de dados (RAM);
Linhas de I/O (PORT’s);
Controle de interrupções;
Gerador de clock;
Timer’s e counter’s.
A figura abaixo ilustra a composição típica de um microcontrolador com os elementos acima citados e suas respectivas interligações.
As diferenças entre os diversos tipos de microcontroladores residem basicamente na capacidade e tipos de memórias, na quantidade de port’s disponíveis ao usuário, na velocidade de operação, e em outros recursos disponíveis como por exemplo, portas seriais, maior número de contadores, opção de baixo consumo, entre outros.
Existem também, os componentes chamados derivativos que, como o próprio nome diz, são microcontroladores derivados dos tipos mais comuns (8048 e 8051), ou seja, a célula básica é o microcontrolador e este é acrescido de outros componentes de acordo com as necessidades. A PHILIPS desenvolve a maior linha de derivativos homologados, tendo componentes específicos para uma vasta gama de funções.
�
3.2 Família 8051
Quando temos vários microcontroladores utilizando uma mesma célula, chamamos esse conjunto de componentes de família. Desta forma temos várias famílias como por exemplo a família do 8048, do 8051, do 8096, entre outras.
Vamos tratar aqui da família do 8051, por este ser o assunto central do nosso curso. A tabela abaixo descreve suscintamente os principais componentes dessa família.
Nome do
Chip
Versão sem
ROM
Versão
EPROM
Bytes de
ROM
Bytes de
RAM
Timers
16 Bits
Tipo de
Circuito
8051
8031
8751
4K
128
2
NMOS
80C51
80C31
87C51
4K
128
2
HMOS
80CL51
4K
128
2
SACMOS
8052
8032
8K
256
3
NMOS
80C52
80C32
87C52
8K
256
3
CMOS
83C528
80C528
87C528
32K
512
3+1
CMOS
83C652
80C652
87C652
8K
256
2
CMOS
83C751
87C751
2K
64
1
CMOS
83C452
80C452
87C452
8K
256
2
CMOS
O elemento básico desta família é o 8051, cujo diagrama interno serviu como ilustração quando falamos sobre um microcontrolador genérico. Os outros componentes desta família estão descritos nos manuais dos fabricantes. Atualmente, a tendência mundial no uso de componentes de baixo consumo, torna imperativo o desenvolvimento de projetos baseados na tecnologia CMOS, facilitando assim a interligação de seus blocos. Todos os componentes que apresentarem um “C” em seu código (80C31, 87C452, etc) pertencem a esta família e devem ser preferencialmente utilizados. Esta família representa o que existe de mais avançado em microcontroladores de 8 bits, o que garante a continuidade de sua linha de produção por um longo período.
As características desta família são:
CPU de 8 bits com conjunto de instruções otimizado para aplicações de controle de processos;
Capacidade de processamento Booleano (manipulação de bit individualmente);
32 linhas de I/O bidirecionais e individualmente endereçáveis;
128 bytes de RAM “on-chip” (mínimo);
Dois contadores/temporizadores programáveis de 16 bits;
Interface serial full-duplex;
Estrutura de interrupções com até 5 entradas permitindo 2 níveis de prioridade;
Gerador de clock;
Mínimo de 4Kbytes de memória de programa (ROM ou EPROM);
Capacidade de endereçamento externo de até 64Kbytes.
3.3 Organização de Memória
O 8051 possui espaços de endereços separados para a memória de programa e para a memória de dados. Esta separação lógica permite que os dados acessados pelos endereços de 8 bits sejam armazenados e manipulados mais rapidamente. Apesar disto, podemos manipular endereços de 16 bits através do registrador DPTR.
A figura abaixo ilustra a estrutura de memória utilizada num microcontrolador 8051:
A memória de programa é do tipo “read only” e não podemos escrever dados nela. Podemos ter até 64Kbytes de memória, e normalmente encontramos pelo menos 4K de memória internos no chip em forma de ROM, EPROM ou OTP (One Time Program). Os tipos OTP representam uma opção economicamente atraente, pois são mais baratos que os tipo EPROM e podem ser programados pelo usuário. Nas versões ROMless, esta memória encontra-se externa ao microcontrolador. O pulso de leitura para a memória externa é o sinal PSEN (Program Store Enable).
A memória de dados ocupa um espaço de endereçamento separado da memória de programa. Até 64Kbytes de memória externa podem ser endereçados, e a CPU gera sinais de read e write, necessários durante o acesso à memória externa.
3.3.1 Memória de Programa
A figura abaixo mostra o mapa da parte inferior da memória de programa. Após o reset, a CPU começa a executar as instruções a partir do endereço 0000H.
Como pode ser visto na figura, cada interrupção é alocada num endereço fixo da memória de programa. A interrupção direciona o contador de programa da CPU para o seu respectivo endereço, onde encontra-se a rotina de interrupção.
Os primeiros 4Kbytes de memória podem estar localizados no chip, ou num chip (ROM ou EPROM) externo. O controle de acesso interno/externo é feito através do sinal EA (External Access). O sinal de “strobe” para acesso à memória externa é o sinal PSEN, ativo apenas quando da ocorrência de acessos externos (EA ligado à terra), não sendo portanto utilizado quando utiliza-se apenas a área de memória interna.
A configuração de hardware necessária para acesso à memória externa é ilustrada a seguir. Note que 16 linhas de I/O (port 0 e port 2) são dedicadas à transição de sinais durante buscas à memória externa. O port 0 opera como um barramento de dados endereço multiplexado, emitindo o byte low do program counter como endereço e aguarda o recebimento do byte de código da memória de programa. Durante o tempo em que o byte low está válido no port 0, o sinal ALE coloca este byte no latch de endereços, enquanto o port 2 emite o byte alto de endereços. O sinal PSEN pulsa, e o código de byte é lido pelo microcontrolador.
O endereço de memória de programa sempre é de 16 bits, mesmo quando a quantidade de memória externa é inferior à 64Kbytes. Desta forma, sempre que utilizarmos memória externa, dois port’s (port 0 e port 2) serão sacrificados em função do endereçamento das mesmas.
3.3.2 Memória de dados
A figura abaixo mostra o hardware necessário para o acesso à memória RAM externa.
A CPU, neste caso está executando um programa a partir da ROM interna. O port 0 serve como um barramento multiplexado de dados/endereço para a RAM, e 3 linhas do port 2 são utilizadas para as páginas da RAM. Os sinais de RD e WR são gerados pela CPU para comandar as operações.
Podemos endereçar até 64Kbytes de memória RAM, em endereços de 1 ou 2 bytes. Os endereços de 1 byte são geralmente utilizados em conjunto com 1 ou mais linhas de I/O, para definir a página que está sendo utilizada na RAM. Endereços de 2 bytes, quando utilizados demandam que o port 2 gere o byte alto de endereços.
A memória de dados interna está mapeada como indica a figura a seguir. O espaço de memória está dividido em 3 blocos, normalmente denominados, Lower 128, Upper 128 and SFR (Special Function Register). A memória de dados interna tem sempre 1 byte de endereçamento apenas, o que significa que temos um máximo de 256 bytes de memória interna.
Entretanto, os modos de endereçamento permitem o uso de até 384 bytes utilizando umtruque simples. Através de endereçamento direto, acessamos um espaço de memória e através de endereçamento indireto, acessamos um espaço de memória diferente. Desta forma, os registradores de função especial (SFR) e os últimos 128 bytes (Upper Space) são acessados nos mesmos endereços (de 80H até FFH) apesar de serem fisicamente separados. Nas células básicas 8051, a área de memória alta não existe no chip, desta forma, consideramos apenas a área de memória baixa (Lower Space) para as nossas experiências (melhores referencias a estas áreas altas podem ser encontradas nos manuais dos fabricantes).
Os primeiros 128 bytes de memória interna estão mapeados como indica a figura abaixo:
Os primeiros 32 bytes estão agrupados em 4 bancos de 8 registradores, chamados pelas instruções de programa de R0 até R7. Dois bits no registrador da palavra de controle (PSW) selecionam qual o banco de registradores está em uso. Este recurso permite um uso mais eficiente do espaço de código, desde que as instruções de registrador são mais curtas do que utilizando-se endereçamento direto.
Os próximos 16 bytes acima do banco de registradores formam o bloco conhecido como memória endereçável por bit (bit addressable space). O conjunto de instruções do 8051 inclui vários tipos de instruções de um só bit, e os 128 bits presentes nessa área podem ser diretamente endereçados por estas instruções.
Todos os bytes nos primeiros 128 bytes de memória podem ser endereçados direta ou indiretamente. Os próximos 128 bytes só podem ser acessados indiretamente nos dispositivos que os possuem.
A área de memória acima de 128 bytes constitui o registrador de funções especiais (SFR) cuja descrição detalhada faremos posteriormente.
3.4 Conjunto de Instruções da família 8051
Todos os membros da família 8051 executam o mesmo conjunto de instruções. Este conjunto é composto por instruções otimizadas para aplicações de controle, facilitando as operações de dados através de vários modos de endereçamento. Capacita ainda a operação de variáveis de um bit, permitindo operação em sistemas que demandam processamento booleano. Vamos descrever rapidamente o modo de operação de várias das instruções contidas neste conjunto. Maiores informações podem ser encontradas nos manuais dos fabricantes, os quais descrevem detalhadamente o conjunto de instruções.
3.4.1 Registrador da palavra de controle
O registrador da palavra de controle (PSW) contém vários bits de status que indicam o estado atual da CPU. A tabela a seguir indica a posição dos bits dentro do registrador.
CY
AC
F0
RS1
RS0
OV
-
P
CY – (PSW7): Carry flag, indica “vai um” nas operações aritméticas.
AC – (PSW6): Auxiliary carry flag, auxilia nas operações de adição.
F0 – (PSW5): Flag de uso geral.
RS1 – (PSW4): Seleção do banco de registradores.
RS0 – (PSW3): Seleção do banco de registradores.
OV – (PSW2): Overflow em operações aritméticas.
- – (PSW1): Flag definível pelo usuário.
P – (PSW0): Flag de paridade
O bit de carry, entre outras funções serve como “vai um” em operações aritméticas, e também como acumulador para um número de operação booleana. Os bits RS0 e RS1 são utilizados para selecionar um entre quatro bancos de registradores, disponíveis nos primeiros 128 bytes de RAM. O bit de paridade indica a quantidade de bits em um no acumulador: se P=1, o acumulador contém um número ímpar de uns; se P=0, o número de uns no acumulador é par. Dois bits do PSW estão disponíveis e podem ser utilizados como flags de uso geral. O PSW encontra-se localizado na área denominada SFR, no endereço D0H.
3.4.2 Modos de endereçamento
Podemos ter seis modos distintos de endereçamento no 8051, que diferem basicamente pelo número de bits utilizados na conformação do endereço, bem como nos registradores utilizados no acesso. Estes modos são adequados às operações de controle.
Endereçamento direto: Neste modo, o operando é especificado por 8 bits de endereço na instrução. Somente a RAM interna e os SFR’s podem ser acessados diretamente.
Endereçamento indireto: No modo indireto, a instrução especifica um registrador que contém o endereço do operando. Ambas as memórias, interna e externa podem ser acessadas desta forma. O registrador de endereço, para operações de 8 bits, pode ser R0 ou R1, ou ainda o Stack Pointer. Endereços de 16 bits podem ser acessados somente pelo Data Pointer.
Instruções de registrador: Os bancos de registradores contêm os registradores de R0 até R7, que podem ser acessados por certas instruções que levam a especificação do registrador junto com o opcode da instrução. As instruções que acessam os registradores dessa forma são eficientes pois eliminam o byte de endereço. Quando a instrução é executada, um dos oito registradores do banco selecionado é acessado e a seleção do banco é feita por dois bits (RS0 e RS1) no PSW.
Instruções de registrador específico: Algumas instruções são especificadas para certos registradores, por exemplo, as instruções que operam com acumulador ou Data Pointer não necessitam um byte de endereço para apontá-las, pois o próprio opcode faz isso.
Constantes imediatas: Podemos carregar um registrador com uma constante diretamente, através de um simples comando como por exemplo, mov A,#100, que coloca no acumulador o valor 100 (decimal).
Endereçamento indexado: Somente a memória de programa (ROM) pode ser acessada desta forma e somente pode ser lida. Este modo de endereçamento é destinado à leitura de tabelas. Um registrador de 16 bits (DPTR ou PC) indica o endereço de base da tabela e o acumulador é carregado com o valor da tabela.
3.4.3 Instruções aritméticas
O conjunto de instruções aritméticas é listado na tabela a seguir. A tabela indica o modo de endereçamento que pode ser utilizado com cada instrução, para acessar o byte operando. Por exemplo, a instrução Add A,<byte>; pode ser escrita como:
Add A, 7FH
(endereçamento direto)
Add A, @R0
(endereçamento indireto)
Add A, R7
(endereçamento por registrador)
Add A, #127
(constante imediata)
Mnemônico
Operação
Modo de
Endereçamento
Tempo de
Execução
ADD A, <byte>
A = A + <byte>
Dir / Ind / Reg / Imm
1
ADDC A, <byte>
A = A + <byte> + C
Dir / Ind / Reg / Imm
1
SUBB A, <byte>
A = A - <byte> - C
Dir / Ind / Reg / Imm
1
INC A
A = A + 1
Acumulador
1
INC <byte>
<byte> = <byte> + 1
Dir / Ind / Reg
1
INC DPTR
DPTR = DPTR + 1
Data Pointer
2
DEC A
A = A - 1
Acumulador
1
DEC <byte>
<byte> = <byte> - 1
Dir / Ind / Reg
1
MUL AB
B e A = B x A
Acumulador e B
4
DIV AB
A = INT [A/B]
B = MOD [A/B]
Acumulador e B
4
DA A
Ajuste decimal
Acumulador
1
Os tempos de execução indicados consideram um clock de 12MHz. Todas as instruções aritméticas são executadas num tempo de 1(s com exceção da instrução INC DPTR que consome 2(s, e as instruções de multiplicação e divisão que são efetuadas em 4(s.
Perceba que qualquer byte no espaço de memória interno pode ser incrementado ou decrementado sem o uso do acumulador. Inclusive o registrador de 16 bits DPTR pode ser incrementado desta forma. A instrução MUL AB opera com os registradores A e B e põe o resultado (16 bits) nos registradores B (byte high) e A (byte low) concatenados. A instrução DIV AB divide A por B e coloca o quociente (resultado da divisão inteiro em 8 bits) no acumulador e o resto (8 bits) no registrador B.
Devido às suas características, a operação de divisão é mais utilizada em conversões de radicais e operações de deslocamento programáveis, do que na divisão aritmética propriamente dita.
A instrução de ajuste decimal DA A é utilizada na aritmética BCD, quando utilizamos esta aritmética, as operações ADD e ADDC devem, obrigatoriamente, ser seguidas por uma operação de ajuste decimal, para que os resultados continuem em BCD. Note que o ajuste decimal não converte o númerobinário em BCD, mas corrige os erros de aproximação ocorridos nos registradores.
3.4.4 Instruções lógicas
A tabela a seguir mostra uma lista de instruções lógicas do 8051.
Mnemônico
Operação
Modos de
Operação
Tempo de
Execução
ANL A, <byte>
A = A and <byte>
Dir / Ind / Reg / Imm
1
ANL <byte>, A
<byte> = <byte> and A
Direto
1
ANL <byte>, #DATA
<byte> = <byte> and #DATA
Direto
2
ORL A, <byte>
A = A or <byte>
Dir / Ind / Reg / Imm
1
ORL <byte>, A
<byte> = <byte> or A
Direto
1
ORL <byte>, #DATA
<byte> = <byte> or #DATA
Direto
2
XRL A, <byte>
A = A xor <byte>
Dir / Ind / Reg / Imm
1
XRL <byte>, A
<byte> = <byte> xor A
Direto
1
XRL <byte>, #DATA
<byte> = <byte> xor #DATA
Direto
2
CLR A
A = 00H
Acumulador
1
CPL A
A = not A
Acumulador
1
RL A
Roda Acum. à esquerda 1 bit 
Acumulador
1
RLC A
Roda Acum. à esquerda c/ carry
Acumulador
1
RR A
Roda Acum. à direita 1 bit 
Acumulador
1
RRC A
Roda Acum. à direita c/ carry
Acumulador
1
SWAP A
Swap nibbles in A
Acumulador
1
Todos os modos de endereçamento podem ser utilizados e as instruções são executadas em tempo de 1 a 2 (s. Estas instruções podem ser executadas em qualquer byte de memória interna ou na área de SFR. O conjunto de instruções permite que sejam realizadas todas as operações lógicas e ainda a instrução SWAP A, que inverte os nibbles alto e baixo do acumulador, operação útil quando operamos com o código BCD.
3.4.5 Transferência de dados interna e externa
A tabela a seguir mostra as instruções disponíveis para movimentação de dados entre os espaços de memória interna.
Mnemônico
Operação
Modo de
Endereçamento
Tempo de
Execução
MOV A, <fonte>
A = <fonte>
Dir / Ind / Reg / Imm
1
MOV <dest>, A
<dest> = A
Dir / Ind / Reg
1
MOV <dest>, <fonte>
<dest> = <fonte>
Dir / Ind / Reg / Imm
2
MOV DPTR, #DATA
DPTR = 16 bit Const
Constante imediata
2
PUSH <fonte>
INC SP: MOV @SP, <fonte>
Direto
2
POP <dest>
MOV <dest>, @SP: DEC SP
Direto
2
XCH A, <byte>
Acc e <byte> trocam os dados
Dir / Ind / Reg
1
XCHD A, @RI
Acc e <byte> trocam os nibbles
 baixos
Indireto
1
A instrução MOV <dest>, <fonte> permite que os dados sejam transferidos entre qualquer dois registradores da RAM interna ou dos SFR, sem o uso do acumulador. Lembre que os 128 bytes superiores podem ser acessados apenas por endereçamento indireto e os SFR apenas por endereçamento direto.
A área de stack reside na própria RAM interna e as instruções de PUSH primeiro incrementam o stack pointer, então copia o byte no stack. As instruções de PUSH e POP usam apenas o endereçamento direto para identificar o byte que está sendo manipulado, enquanto que o stack é acessado por endereçamento indireto através do registrador SP. Isto significa que o stack vai para os 128 bytes altos (se existirem) mas não para a área de SFR. Nos dispositivos onde não está implementado a área alta, os bytes “PUSHed” são perdidos e os bytes “POPed” são indeterminados.
As transferências de dados incluem movimentações em 16 bits, que podem ser utilizadas para inicializar o Data Pointer (DPTR), para o uso de tabelas na memória de programa, ou para acesso à memória de dados externa.
A instrução XCH A, <byte> resulta na troca dos dados entre o acumulador e o byte endereçado. A instrução XCHD A, @RI é similar, com a diferença que apenas os nibbles baixos estão envolvidos na operação. Esta instrução facilita a manipulação de dados, de forma a economizar instruções nos programas.
A memória externa pode ser acessada através de endereçamento indireto, utilizando 8 ou 16 bits de endereço. A escolha recai no uso de endereçamento de um byte, através de @Ri, onde Ri pode ser R0 ou R1 do banco de registradores selecionado, ou um endereço de 2 bytes (16 bits) colocado no Data Pointer (DPTR). A desvantagem do uso do endereçamento de 16 bits está no fato de que, se utilizarmos um pequeno espaço de memória, ainda assim o port 2 será inteiramente indisponibilizado para uso. No endereçamento através de 8 bits, sacrificamos apenas algumas linhas do port 2.
A tabela abaixo indica as instruções de movimentação de dados em memória externa. Todas as instruções são executadas em 2(s, com um clock de 12MHz.
Largura do Endereço
Mnemônico
Operação
8 Bits
MOVX A, @Ri
Lê RAM Externa (Ri)
8 Bits
MOVX @Ri, A
Escreve RAM Externa (Ri)
16 Bits
MOVX A, @DPTR
Lê RAM Externa (DPTR)
16 Bits
MOVX @DPTR, A
Escreve RAM Externa (DPTR)
Em todos os acessos à RAM externa, utilizamos sempre o acumulador como registrador intermediário. Os pulsos de READ ou WRITE são ativos somente durante à execução da instrução MOVX. Normalmente estes sinais estão inativos e se não forem utilizados, podem ser configurados como linhas de I/O extra.
Existem ainda duas instruções que estão disponíveis para leitura de tabelas na memória de programa. Estas instruções permitem apenas a leitura de dados na memória de programa (ROM), não permitindo a atualização dos mesmos. O mnemônico para esta é MOVC (mov constant), e pode se apresentar de duas formas:
MOVC A, @A + DPTR
MOVC A, @A + PC
A diferença reside no registrador auxiliar utilizado durante a leitura, que pode ser o DPTR ou o PC. A primeira instrução permite o acesso à tabelas de até 256 itens, sendo que o DPTR indica o início da tabela, e o acumulador indica o offset do endereço desejado. Com a variação (incremento) do acumulador, podemos ler a tabela inteira mantendo o DPTR fixo. A outra instrução, utiliza o acumulador como base de endereçamento e o PC como offset, de forma que a leitura de tabelas deve ser feita através de subrotinas como a que se segue:
MOV A, valor inicial
CALL tabela
A rotina “tabela” seria:
tabela:
MOVC A, @A + PC
RET
Este tipo de tabela pode conter até 255 itens, lembrando que neste caso, não podemos utilizar o valor “0” da tabela, que variará entre 1 e 255. Um valor colocado no offset 0 não será lido.
Devido a estes variados recursos de manipulação de dados através de registradores, este microcontrolador apresenta-se como a solução mais adequada em sistemas de controle, onde a manipulação de informações é primordial.
3.4.6 Instruções Booleanas
A família 8051 contém um processador booleano completo. Um processador booleano consiste num elemento que permite a manipulação direta de um único bit dentro da palavra que pode ser de 8 ou mais bits (byte). A RAM interna contém 128 bits endereçáveis e o espaço SFR contém mais 128. Todos os port’s são bits endereçáveis, e cada um pode ser tratado como um port separado. As instruções que acessam esses bits não são apenas sequências de desvios condicionais, mas um completo conjunto de instruções como indicado na tabela abaixo:
Mnemônico
Operação
Tempo de
Execução
ANL C, bit
C = C and bit
2
ANL C, /bit
C = C and not bit
2
ORL C, bit
C = C or bit
2
ORL C, /bit
C = C or not bit
2
MOV C, bit
C = bit
1
MOV bit, C
bit = C
2
CLR C
C = 0
1
CLR bit
bit = 0
1
SETB C
C = 1
1
SETB bit
bit =1
1
CPL C
C = not C
1
CPL bit
bit = not bit
1
JC REL
Jump If C = 1
2
JNC REL
Jump If C = 0
2
JB bit, REL
Jump If bit = 1
2
JNB bit, REL
Jump If bit = 0
2
JBC bit, REL
Jump If bit = 1 : CLR bit
2
Este tipo de operação de bit não é facilmente obtido em arquiteturas de microprocessador. Todos os bits são acessados diretamente nos endereços 00H até 7FH na área dos 128 bytes inferiores e de 80H até FFH no espaço SFR. Desta forma podemos através de instruções de programa, implementar circuitos lógicos dentro do microcontrolador, evitando o uso de circuitos discretos ou PAL’s.
3.4.6 Instruções de Salto
Podemos utilizar 3 tipos de instruções de salto, quando endereçamos um programa no microcontrolador. Estas instruções diferem entre si no formato do endereço de destino. A instrução SJMP(Short Jump) é composta por dois bytes, constituindo um byte de opcode e um byte de offset. Este fato limita o espaço de endereçamento em valores de -127 até +127 bytes em torno da instrução seguinte do SJMP.
Quando utilizamos a instrução LJMP (Long Jump) temos um comprimento de 3 bytes, que consiste de dois bytes de endereço e um byte de opcode, permitindo o endereçamento de 64Kbytes de memória de programa.
A instrução AJMP (Absolute Jump) é codificada em 2 bytes sendo que o endereço é formado por 11 bits e os 5 bits restantes utilizados no opcode.
A tabela abaixo indica as instruções de salto disponíveis.
Mnemônico
Operação
Tempo de
Execução
JMP end
Salto para end
2
JMP @A + DPTR
Salto para A + DPTR
2
CALL end
Chama subrotina no endereço end
2
RET
Retorno de subrotina
2
RETI
Retorno de interrupção
2
NOP
Sem operação
1
Em todos os casos, o programador especifica o endereço de destino para o assembler da mesma forma, um “label” ou uma constante de 16 bits. O assembler colocará o endereço de destino no formato correto para cada dada instrução, e se o formato não comportar o valor, aparecerá a mensagem “Destination out of range”.
Temos ainda as instruções LCALL, que permite a chamada de subrotinas em qualquer posição dos 64Kbytes de memória, e ACALL, que se utiliza do mesmo formato de endereçamento de 11 bits utilizado no AJMP. As subrotinas devem ser finalizadas com o comando RET, e deve-se lembrar que cada chamada demanda um RET, sem o qual o programa se perde.
A instrução RETI é utilizada como retorno da rotina de interrupção. A única diferença entre a instrução RET e a RETI, é que a RETI informa ao sistema de controle de interrupção que a interrupção em progresso foi atendida.
Os saltos acima listados são chamados de saltos incondicionais, pois não dependem de nenhuma verificação de condições anteriores. Os chamados saltos condicionais, dependentes da verificação de certos bits de controle, estão listados abaixo:
Mnemônico
Operação
Modo de
Endereçamento
Tempo de
Execução
JZ rel
Salto se A=0
Acumulador
2
JNZ rel
Salto se A não 0
Acumulador
2
DJNZ <byte>, rel
Decrementa e salta se não 0
Direto Registrador
2
CJNE A, <byte>, rel
Salta se A diferente de <byte>
Direto Imediato
2
CJNE <byte>, #DATA, rel
Salta se <byte> diferente de #DATA
Indireto Registrador
2
Não existe bit de zero no registrador PSW, portanto as instruções JZ e JNZ devem testar o dado do acumulador para estas condições. A instrução DJNZ é adequada para controle de loops, pois sua configuração de dupla função (decrementa e testa) torna fácil a execução de loops.
A instrução CJNE pode ser utilizada para controle de loops ou para teste condicional de bytes, na forma de “maior que” ou “menor que”, pois existe a indicação de maior ou menor através do bit de CARRY, localizado no PSW.
3.4.7 Oscilador Interno
Todos os membros da família 8051 possuem um oscilador interno que pode ser utilizado como fonte de clock para a CPU, bastando para isso que se conecte um cristal ressonador cerâmico entre os pinos XTAL1 e XTAL2, e dois capacitores para o terra, como mostrado na figura abaixo:
Se ao invés de utilizarmos o oscilador interno, utilizamos outro gerador qualquer (para sincronizar com outros circuitos, por exemplo) devemos ter o cuidado de interligar a entrada no pino certo. Este fato é importante, pois este pino muda conforme o tipo de chip utilizado, por exemplo, com chips HMOS (8051) devemos ligar a entrada de clock ao pino XTAL2, enquanto que em circuitos CMOS (80C51), o clock deve ser colocado no pino XTAL1. A figura abaixo indica a correta montagem destas entradas nos diversos componentes.
3.4.8 Estrutura de Interrupções
A família 8051 atende a cinco entradas de interrupções distintas, duas externas, duas relativas aos dois timers, e uma relativa ao port serial interno. Cada interrupção pode ser habilitada ou desabilitada individualmente, setando ou resetando um bit no registrador denominado IE (Interrupt Enable) dentro do SFR. Este registrador contém ainda um bit que desabilita todas as interrupções, e sua estrutura completa é mostrada abaixo. O bit em 0 desabilita a interrupção e o bit em 1 habilita a interrupção.
EA
-
-
ES
ET1
EX1
ET0
EX0
EA – (IE.7) Desabilita todas as interrupções. Quando em 1, permite que sejam desabilitadas individualmente.
ES – (IE.4) Interrupção do port serial.
ET1 – (IE.3) Interrupção do timer 1.
EX1 – (IE.2) Interrupção externa 1.
ET0 – (IE.1) Interrupção do timer 0.
EX0 – (IE.0) Interrupção externa 0.
Cada fonte de interrupção pode ser programada quanto à sua prioridade de atendimento, através de um outro registrador localizado na área de SFR e denominado IP (interrupt priority).
A rotina de prioridade de interrupção determina que se uma interrupção de baixo nível estiver sendo executada, esta pode ser interrompida por uma interrupção de alto nível, sendo continuada após o término da mesma. O contrário não é verdadeiro, ou seja, uma interrupção de alto nível não é interrompida por uma interrupção de nível inferior, nem igual ao dela. Se duas interrupções de mesmo nível são recebidas simultaneamente, uma sequência de pool interna determina qual será atendida em primeiro lugar. A figura abaixo ilustra o conteúdo do registrador IP. O Bit em 0 desabilita a interrupção e o bit em 1 habilita a interrupção. 
-
-
-
PS
PT1
PX1
PT0
PX0
PS – (IP.4) Prioridade de interrupção do port serial.
PT1 – (IP.3) Prioridade de interrupção timer 1.
PX1 – (IP.2) Prioridade de interrupção externa 1.
PT0 – (IP.1) Prioridade de interrupção do timer 0.
PX0 – (IP.0) Prioridade de interrupção externa 0.
Quando em operação, todos os flags de interrupção estão retidos no sistema de controle de interrupção durante o estado 5 de cada ciclo de máquina. As amostras são “pooladas” durante o ciclo seguinte, e se uma delas se encontrar setada, o sistema de interrupção gera um LCALL para o endereço apropriado na memória de programa, a menos que outra condição bloqueie a interrupção.
Esta LCALL gerado por hardware resulta na transferência do conteúdo do registrador PC para o Stacker e recarrega o PC com o primeiro endereço da rotina de serviço da interrupção. Cada rotina de serviço para uma dada interrupção começa num endereço fixo. Somente o PC é transferido automaticamente para o stack, então devemos nos lembrar de salvar os registradores importantes em cada rotina de interrupção. Salvando apenas o PC, torna-se mais simples a aplicação destas rotinas nas funções mais comuns de controle, onde não necessitamos grandes recursos de software, pois precisamos apenas setar um pino, ou recarregar um timer, ou ler um port serial, por exemplo.
A figura a seguir indica como atuam os registradores no controle do hardware de interrupção:
4 Descrição do Hardware
A descrição a seguir mostra as características construtivas do microcontrolador 8051. Faremos uma abordagem deste controlador em alusão aos demais componentes e derivativos da mesma família.
4.1 Registradores de função especial (SFR)
A figura abaixo indica a disposição do registrador de funções especiais (SFR).
Na área de SFR, nem todos os endereços estão ocupados, de forma que estes endereços não estão implantados no chip. Estes espaços destinam-se à acessórios que encontramos em outros componentes da família.
Vamos descrever os nomes e funções de cada registrador.
Endereço
F8H
F9H
FAH
FBH
FCH
FDH
FEH
FFH
Função
Endereço
F0H
F1H
F2H
F3H
F4H
F5H
F6H
F7H
Função
B
Endereço
E8H
E9H
EAH
EBH
ECH
EDH
EEH
EFH
Função
Endereço
E0H
E1H
E2H
E3H
E4H
E5H
E6H
E7H
Função
ACC
Endereço
D8H
D9H
DAHDBH
DCH
DDH
DEH
DFH
Função
Endereço
D0H
D1H
D2H
D3H
D4H
D5H
D6H
D7H
Função
PSW
Endereço
C8H
C9H
CAH
CBH
CCH
CDH
CEH
CFH
Função
T2CON
RCP2L
RCP2H
TL2
TH2
Endereço
C0H
C1H
C2H
C3H
C4H
C5H
C6H
C7H
Função
Endereço
B8H
B9H
BAH
BBH
BCH
BDH
BEH
BFH
Função
IP
Endereço
B0H
B1H
B2H
B3H
B4H
B5H
B6H
B7H
Função
P3
Endereço
A8H
A9H
AAH
ABH
ACH
ADH
AEH
AFH
Função
IE
Endereço
A0H
A1H
A2H
A3H
A4H
A5H
A6H
A7H
Função
P2
Endereço
98H
99H
9AH
9BH
9CH
9DH
9EH
9FH
Função
SCON
SBUF
Endereço
90H
91H
92H
93H
94H
95H
96H
97H
Função
P1
Endereço
88H
89H
8AH
8BH
8CH
8DH
8EH
8FH
Função
TCON
TMOD
TL0
TL1
TH0
TH1
Endereço
80H
81H
82H
83H
84H
85H
86H
87H
Função
P0
SP
DPL
DPH
PCON
4.1.1 Acumulador (ACC)
O acumulador é o registrador onde se processam a maioria das operações de um processador, comumente encontradas num microprocessador de 8 bits.
4.1.2 Registrador B (B)
É um registrador utilizado durante as operações de multiplicação e divisão, podendo ser utilizado como registrador de uso geral em outras operações.
4.1.3 Registrador da palavra de controle (PSW)
É chamado de Program Status Word e contém basicamente, os flags de controle de encaminhamento do programa. Por isso é utilizado em desvios e saltos condicionais, sendo também alterado na maioria das instruções. Seu conteúdo é indicado na figura abaixo.
CY
AC
F0
RS1
RS0
OV
-
P
CY – (PSW7): Carry flag, indica “vai um” nas operações aritméticas.
AC – (PSW6): Auxiliary carry flag, auxilia nas operações de adição.
F0 – (PSW5): Flag de uso geral.
RS1 – (PSW4): Seleção do banco de registradores em uso.
RS0 – (PSW3): Seleção do banco de registradores em uso.
OV – (PSW2): Overflow em operações aritméticas.
- – (PSW1): Flag definível pelo usuário.
P – (PSW0): Flag de paridade, indica o número de bits em “1” no acumulador.
RS0
RS1
Banco Selecionado
Endereço
0
0
Banco 0
00H até 07H
0
1
Banco 1
08H até 0FH
1
0
Banco 2
10H até 17H
1
1
Banco 3
18H até 1FH
4.1.4 Stack Pointer (SP) e Data Pointer (DPTR)
O Stack Pointer (ponteiro de pilha) é incrementado antes do armazenamento dos dados em uma instrução PUSH ou CALL. Observe que o Stack pode ser alocado em qualquer região da memória RAM, o ponteiro é sempre inicializado no endereço 07H, e o Stack começa no endereço 08H.
O Data Pointer consiste em dois registradores de 8 bits (DPH byte alto, e DPL byte baixo), que podem ser manipulados tanto como dois registradores separados de 8 bits como um único de 16 bits.
4.1.5 Buffer Serial (SBUF)
O Buffer de dados serial (Serial data BUFfer) consiste de dois registradores separados, o buffer de transmissão e o buffer de recepção. Quando um dado é colocado no buffer serial, ele vai diretamente para o buffer de transmissão serial, e quando ele chega ao buffer de recepção, ele é colocado diretamente no SBUF.
Existe um registrador que controla todas as operações da interface serial chamado SCON (Serial CONtrol). Seu conteúdo é descrito a seguir.
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0 – (SCON.7): Modo de operação da interface serial.
SM1 – (SCON.6): Modo de operação da interface serial.
SM2 – (SCON.5): Modo de operação da interface serial.
REN – (SCON.4): Habilitação de recepção.
TB8 – (SCON.3): É o nono bit transmitido (stop bit).
RB8 – (SCON.2): É o nono bit recebido.
TI – (SCON.1): Flag indicando fim de transmissão.
RI – (SCON.0): Flag indicando buffer de recepção cheio.
SM0
SM1
Modo
Descrição
Frequência
0
0
0
Shift Register
Freq. Oscilador /12
0
1
1
8 bit UART
Variável
1
0
2
9 bit UART
Freq. Oscilador /64 ou 32
1
1
3
9 bit UART
Variável
�
4.1.6 Port’s de I/O (P0, P1, P2, P3)
Os port’s P0, P1, P2 e P3 são latches dos seus respectivos port’s físicos. Escrevendo um bit “1” no SFR, o pino de saída para o port respectivo irá para “1” imediatamente. Quando este port for acessado para leitura, o estado do pino externo é armazenado no registrador correspondente. A estrutura dos port’s é ilustrada abaixo.
Todos os 4 port’s são bidirecionais e consistem num latch (que é o próprio SFR), num driver de saída e num driver de entrada. Os drivers de saída dos port’s P0 e P2 e o driver de entrada do port P0, são utilizados durante o acesso à memória externa.
4.1.7 Registradores de Timer e de Controle
Os pares de registradores (TH0, TL0, e TH1, TL1) são registradores de contagem de 16 bits, nos quais programamos os valores de contagem/temporização dos respectivos contadores.
Existem outros registradores de funções específicas de controle de alguns módulos do microcontrolador. Vamos descrever cada um desses registradores.
O registrador IP (Interrupt Priority), define um dos dois níveis possíveis para cada interrupção, de acordo com a descrição abaixo.
-
-
PT2
PS
PT1
PX1
PT0
PX0
PT2 – (IP5): Define nível de prioridade do timer 2 (somente no 8052).
PS – (IP4): Define o nível de prioridade do port serial.
PT1 – (IP3): Define o nível de prioridade do timer 1.
PX1 – (IP2): Define o nível de prioridade da interrupção externa 1.
PT0 – (IP1): Define o nível de prioridade do timer 0.
PX0 – (IP0): Define o nível de prioridade da interrupção externa 0.
Já o registrador IE (Interrupt Enable), permite a habilitação ou desabilitação individual de cada uma das fontes de interrupção. Através de um bit neste mesmo registrador podemos atuar sobre todas as interrupções juntas.
EA
-
ET2
ES
ET1
EX1
ET0
EX0
EA – (IE7): Desabilita todas as interrupções quando em 0.
ET2 – (IE5): Habilita ou desabilita a interrupção do timer 2 (somente 8052).
ES – (IE4): Habilita ou desabilita a interrupção do port serial.
ET1 – (IE3): Habilita ou desabilita a interrupção do timer 1.
EX1 – (IE2): Habilita ou desabilita a interrupção externa 1.
ET0 – (IE1): Habilita ou desabilita a interrupção do timer 0.
EX0 – (IE0): Habilita ou desabilita a interrupção externa 0.
O registrador TMOD (Timer MODe), permite o controle do modo de operação dos timers existentes no microcontrolador, bem como a definição quanto à operação como timer ou como contador.
Gate (1)
C/T (1)
M1 (1)
M0 (1)
Gate (0)
C/T (0)
M1 (0)
M0 (0)
Gate: Permite o disparo do timer através do hardware (gate=1), ou de software (gate=0), através do registrador TCON.
C/T: Em 0 opera como timer, em 1 opera como contador.
M1: Modo de operação.
M0: Modo de operação.
M1
M0
Modo de Operação
0
0
0 – Timer de 13 bits compatível com o 8048.
0
1
1 – Timer/counter de 16 bits.
1
0
2 – Timer/counter de 8 bits auto reload.
1
1
3 – No timer 0, TL0 define um contador de 8 bits e TH0 é controlado pelos bits de controle do timer 1. O timer 1 está parado.
A operação dos timers/counters depende também de um registrador denominado TCON (Timer CONtrol), de onde podemos inicializá-lo e monitorar suas condições de funcionamento. Neste mesmo registrador encontramos os flags de interrupções externas, os quais estão ativos quando da ocorrência da interrupção.
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
TF1 – (TCON.7): Flag de overflow do timer 1. Seta quando overflow.
TR1 – (TCON.6): Bit de disparo do timer 1.
TF0 – (TCON.5): Flag de overflow do timer 0. Seta quando overflow.
TR0 – (TCON.4): Bit de disparo do timer 0.
IE1 – (TCON.3): Flag da interrupção externa 1.
IT1 – (TCON.2): Seleciona o tipo de interrupção 1 (borda ou nível).
IE0 – (TCON.1): Flag da interrupção externa 0.
IT0– (TCON.0): Seleciona o tipo de interrupção 0 (borda ou nível).
O registrador de controle da interface serial SCON (Serial CONtrol), permite a programação das características funcionais da interface serial do microcontrolador. Normalmente devemos utilizar este registrador para definir que tipo de UART vamos utilizar, e verificar o status da transmissão através dos bits de controle, presentes neste mesmo registrador.
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0 – (SCON.7): Modo de operação do port serial.
SM1 – (SCON.6): Modo de operação do port serial.
SM2 – (SCON.5): Usado nos modos 2 e 3 para multiprocessamento.
REN – (SCON.4): Habilita ou desabilita a recepção definido por soft.
TB8 – (SCON.3): É o nono bit transmitido (stop bit) definido por soft.
RB8 – (SCON.2): É o stop bit recebido do hardware para sinalização.
TI – (SCON.1): Setado pelo hardware no fim da transmissão.
RI – (SCON.0): Setado pelo hardware no fim da recepção.
SM0
SM1
Modo
Descrição
Frequência
0
0
0
Shift Register
Freq. Oscilador /12
0
1
1
8 bit UART
Variável
1
0
2
9 bit UART
Freq. Oscilador /64 ou 32
1
1
3
9 bit UART
Variável
Existe ainda um registrador para controle genérico das funções de alimentação do microcontrolador. O registrador PCON (Power CONtrol) é bastante utilizado quando optamos pela utilização da tecnologia CHMOS (80C51 por exemplo), para garantir baixo consumo em circuitos alimentados por bateria, ou ainda que permaneçam um grande período em “stand-by”.
SMOD
-
-
-
GF1
GF0
PD
IDL
SMOD: Dobra o baud rate quando utilizamos o timer 1.
GF1: Flag de uso geral.
GF0: Flag de uso geral.
PD: Ativa o modo de operação Power Down (só nos CHMOS).
IDL: Ativa o modo de operação IDLE (só nos CHMOS).
4.2 Estrutura e operação dos ports de I/O
Os quatro ports presentes no 8051 são bidirecionais, consistindo cada um num latch (que é o próprio registrador Px no SFR), num driver de saída e num buffer de entrada. Para acessar a memória externa, utilizamos os ports P0 e P2, sendo que o port P0 leva os dados e endereços multiplexados, enquanto que o port P2 leva à memória o restante dos endereços. Fica claro que quando utilizamos os microcontroladores sem memória interna (80C31 por exemplo) o port P2 tem seu uso restrito para endereçamento. O port P3 é um port multifuncional, ou seja, seus pinos não são apenas pinos de entrada e saída, mas tem diversas funções específicas, que estão listadas abaixo:
P3.0 – RXD – entrada do port serial
P3.1 – TXD – saída do port serial
P3.2 – INT0 – entrada da interrupção externa 0
P3.3 – INT1 – entrada da interrupção externa 1
P3.4 – T0 – entrada do Timer/counter 0
P3.5 – T1 – entrada do Timer/counter 1
P3.6 – WR – sinal de escrita para memória externa
P3.7 – RD – sinal de leitura para memória externa
Os ports 1, 2 e 3 são providos de resistores pull-up internos, enquanto que o port 0 apresenta saídas em open drain. Qualquer uma das linhas pode ser usada independentemente como entrada ou saída, uma vez que os ports são endereçáveis por bit (bit addressable). Para utilizarmos os ports como entradas, devemos colocar nível lógico “1” no latch de entrada, para que o pino fique num nível alto através do pull-up, mas possa ser colocado em nível baixo pela ação de um sinal externo.
No port 0, não existe o resistor de pull-up interno, de forma que torna-se imperativo o uso de pull-up’s externos. Quando ocorre o endereçamento, a estrutura do port permite que sejam colocados “1’s” ou “0’s” conforme o necessário. A estrutura dos ports está representada a seguir, ilustrando o funcionamento dos mesmos.
Para escrever um dado em um dispositivo através de um dos ports, devemos simplesmente mover o dado para o registrador respectivo no SFR. Devemos lembrar sempre que os valores de corrente fornecidos pelos port’s são da ordem de miliampères, de forma que precisamos de drivers de corrente na maioria dos casos. Os resistores pull-up internos fornecem baixos valores de corrente e na maioria dos projetos determinamos a ativação dos dispositivos de saída através de níveis baixos, pois neste caso a corrente pode ser significativamente maior.
Os buffers de saída dos ports 1, 2 e 3 fornecem corrente suficiente para 4 cargas TTL cada um, enquanto que o port 0 pode fornecer corrente para até 8 cargas TTL.
Algumas instruções de leitura no port, realizam uma leitura no latch (registrador), enquanto outras realizam a leitura diretamente no pino do CI. As instruções que realizam a leitura no latch, lêem este valor, processam, e depois se for necessário rescrevem-no no latch. São chamadas de “read-modify-write”, e estão listadas a seguir:
ANL – “E” lógico
ORL – “Ou” lógico
XRL – “Ou Exclusivo” lógico
JBC – Jump se bit =1 e limpa o bit
CPL – Complementa o bit
INC – Incremento
DEC – Decremento
DJNZ – Decrementa e salta se não zero
MOV, Px,y, C – Move carry bit para o bit y do port x
CLR Px,y – Limpa bit y do port x
SETB Px,y – Seta bit y do port x
A razão pela qual as instruções acima são direcionadas preferencialmente ao latch, em detrimento ao pino, é evitar uma má interpretação do nível lógico no pino. Um exemplo disso é quando utilizamos transistores na saída dos microcontroladores, e escrevemos nível “1” na base do mesmo. A tensão neste pino pode ser confundida com nível “0” facilmente, enquanto que se a mesma for lida no latch, representará o valor real do sinal no pino.
4.3 Acesso à memória externa
Podemos ter dois tipos de acesso à memória externa, acesso à memória de programa externa (ROM, EPROM) e acesso à memória de dados externa (RAM). Acessos à ROM externa utilizam o sinal PSEN como strobe de leitura, enquanto que utilizamos o sinal RD ou WR como strobe quando acessamos a memória RAM.
Buscas à memória externa de programa utilizam sempre endereços de 16 bits, e os acessos à memória de dados podem utilizar 8 ou 16 bits de endereço.
Quando utilizamos acessos de 16 bits, o byte alto de endereço é exibido através do port 2, que fica indisponível como port de I/O genérico. Quando utilizamos acessos em 8 bits, o valor do port 2 existente no latch do seu respectivo SFR é mantido de forma que podemos implementar um sistema de paginamento com facilidade.
Em qualquer dos casos, o port 0 contém o byte baixo de endereços multiplexado com os dados, e nesta função utilizamos um dos FETs internos com pull-up de forma que não se orna necessária a adição de pull-up externo (se forem realizadas apenas operações de busca na memória, o que não é muito comum). O sinal de ALE deve ser utilizado para capturar o endereço válido no latch externo.
Durante qualquer acesso à memória externa, é escrito o byte 0FFH no latch do port 0 (SFR), destruindo a informação presente neste port, portanto, devemos salvar qualquer informação útil existente no port 0 antes de acessar a memória externa.
A memória de programa externa é acessada sempre em duas condições: quando o sinal EA estiver ativo (nível baixo), ou o contador de programa PC apresentar um número maior do que 0FFFH.
4.4 Temporizadores e Contadores
O microcontrolador 8051 tem 2 temporizadores/contadores de 16 bits, timer 0 e timer 1. Os dois podem ser programados para operar como temporizadores ou contadores independentemente.
Na função de timer, o registrador é incrementado a cada ciclo de máquina, de forma que podemos imaginar o timer como um “contador de ciclos de máquina”. Como um ciclo de máquina consiste de 12 períodos do oscilador, podemos calcular facilmente a frequência do nosso timer.
Na função de contador, o registrador é incrementado a cada transição de 1 para 0 no correspondente pino de entrada. Desta forma, cada leitura toma o tempo de dois ciclos de máquina, limitando a frequência máxima de amostragem a 1/24 da frequência de clock.
4.4.1Modos de operação
Podemos ter três modos distintos de operação dos timer’s selecionáveis através do registrador TMOD.
Modo 0:
No modo 0, o timer é um contador de 8 bits com um divisor por 32, perfazendo, na realidade, um timer de 13 bits, compatível com o timer do 8048, como indicado na figura abaixo:
Neste modo, quando o contador passa de todos os bits em 0, o flag respectivo TFx é setado no registrador TCON. O disparo do timer é feito através de outro bit no registrador TCON, o bit TRx (Timer Run). O bit Gate, presente no registrador TMOD permite o uso de uma interrupção conjuntamente com o timer. Devemos lembrar sempre de programar TMOD antes de programar TCON para disparo do timer.
O registrador de 13 bits consiste nos 8 bits de THx e nos 5 bits mais baixos de TLx, sendo os 3 bits restantes do registrador TLx ignorados.
Modo 1:
No modo 1, os timer se comportam da mesma forma que no modo 0, exceto pelo fato de que os registradores agora utilizam a totalidade dos 16 bits disponíveis para cada um dos contadores.
Modo 2:
O modo 2 configura o registrador do timer como um contador de 8 bits (TLx) com recarga automática, como mostrado na figura abaixo:
Quando ocorre o overflow de TLx, o flag TLx é setado e o conteúdo de TLx é recarregado com o valor de THx, que deve ser anteriormente carregado por software. O valor de THx permanece inalterado.
Modo 3:
O modo 3 deve ser utilizado quando necessitamos de um outro contador no 8051. Quando ativamos o modo 3, estabelecemos dois contadores separados, um para o THx e outro para o TLx. O timer procedente de TLx utiliza para seu controle, os bits C/T, Gate, TR0, INTx e TFx, relativos ao timer 0, enquanto que o timer relativo ao registrador THx, utiliza os bits de controle relativos ao timer 1. A figura abaixo ilustra a lógica de atuação deste modo.
4.5 Interface Serial
A interface serial presente no microcontrolador é do tipo full-duplex, pode transmitir e receber dados simultaneamente, com buffer de recepção, ou seja, pode começar a receber um segundo byte antes de ler o primeiro byte do buffer. Os buffers de transmissão e recepção são comandados através do registrador SBUF no SFR. Escrita no SBUF carrega o buffer de transmissão, enquanto que leituras no SBUF acessam um registrador de recepção separado fisicamente.
A interface serial pode operar em 4 modos distintos, e em qualquer dos modos a transmissão é iniciada por qualquer instrução que utilize o SBUF como registrador de destino. A recepção se dá quando chega um dado no SBUF.
4.5.1 Modos de Operação
Podemos operar com a interface serial interna ao microcontrolador de 4 modos diferentes:
Modo 0:
Neste modo, os dados serializados entram e saem através do pino RXD, enquanto que o pino TXD é utilizado para exteriorizar o sinal de clock. Temos então a transmissão de 8 bits, sendo que o primeiro bit é o LSB, e a frequência de baud rate é fixa em 1/12 da frequência do oscilador.
A transmissão é iniciada por qualquer instrução que utilize o SBUF como registrador de destino. Imediatamente após esta instrução, é colocado um bit “1” na nona posição do shift register e o bloco de controle de transmissão começa a transmissão. Os bits de dados são deslocados para a direita e são colocados zeros nas posições desocupadas, até que se chegue no MSB. Esta condição avisa para o bloco de controle que deve ser efetuado um deslocamento, e em seguida setado o flag TI. Todo este processo ocorre no tempo de 10 ciclos de máquina.
A recepção começa quando a condição REN é igual a “1” e o flag RI é igual a “0”. Os dados recebidos são deslocados e após a chegada do último bit, o flag de recepção RI é setado, indicando que existem dados no buffer de recepção. A figura abaixo ilustra o processo.
�
Modo 1:
Dez bits são recebidos através de RXD, ou transmitidos através de TXD; um start bit (0), 8 bits de dados (LSB primeiro), e um stop bit. Na recepção, o stop bit vai para a posição RB8 no registrador SCON, e o baud rate é determinado pelo timer 1, na maioria dos casos (podem ser utilizados também o timer 2 ou ambos no 8052).
 A transmissão ocorre da mesma forma que no modo anterior, diferindo apenas no fato de que não existe uma linha de clock sincronizando os dois circuitos. Este sincronismo é função de bits de start e stop, presentes em cada transmissão. Após a transmissão do último bit (stop bit) o flag TI é setado no registrador SCON.
A recepção é iniciada com a detecção da transição de 1 para 0 na linha RXD, indicando a presença do start bit na linha. Para esta função, a linha RXD é amostrada a uma taxa de 16 vezes a frequência determinada para o baud rate. Após esta detecção, o sinal começa a ser deslocado a partir da frequência gerada pelo timer 1. Quando for recebido o último bit (stop bit), este é colocado em RB8, e o flag TI é setado. A figura a seguir ilustra o diagrama de sinais da recepção do modo 1.
Modos 2 e 3:
Nestes dois modos transmitimos 11 bits através do pino TXD, ou recebemos 11 bits através do pino RXD: um start bit “0”, 8 bits de dados (LSB primeiro), um nono bit programável e um stop bit “1”. A diferença entre os modos 2 e 3 é que no modo 3 a frequência de baud rate é variável, enquanto que no modo 2 a frequência é fixa em 1/32 ou 1/64 da frequência do oscilador. Os processos de transmissão e recepção dos dados são semelhantes aos outros modos anteriormente mostrados. A figura abaixo ilustra o processo.
4. 5.2 Registrador de Controle
O controle da interface serial é feito pelo já descrito registrador SCON, com a atuação do registrador PCON, (utilizando o bit SMOD). Através deste registrador podemos monitorar o funcionamento da interface serial através dos bits TI, RI, TB8 e RB8, que indicam o estado da interface serial nas operações de transmissão ou recepção.
4.5.3 Baud Rates
A taxa de transmissão (baud rate), tem seus valores definidos de acordo com o modo de operação estabelecido para o interface serial. No modo 0, o baud rate é fixo e tem seu valor estabelecido como sendo 1/12 da frequência do oscilador.
No modo 2, a frequência pode ter dois valores distintos, dependendo do valor do bit SMOD no registrador PCON. Se SMOD for igual a 0, o baud rate é igual a 1/64 da frequência do oscilador, se o SMOD for igual a 1, o baud rate passa a ser 1/32 da frequência do oscilador.
Quando utilizamos o timer 1 como gerador de baud rate, o baud rate nos modos 1 e 3 tem seu valor determinado pela taxa de overflow do próprio timer 1, obedecendo a fórmula:
Baud rate = [(2Smod)/32] x (timer 1 overflow rate)
A interrupção do timer 1 deve ser desabilitada neste caso para evitar sinalização indevida. O timer pode ser configurado para operação como timer ou como contador e em qualquer dos 3 modos. O modo mais comumente utilizado é o modo de operação como timer de auto recarga. A fórmula para se obter diretamente a frequência do baud rate é a seguinte:
Baud Rate = {[(2Smod)/32] x [Fosc./[12 x (256 - TH1)]]}
A tabela abaixo indica os valores mais utilizados a partir de uma dada frequência de cristal, e os valores de recarga dos timers para facilitar a programação.
Baud Rate
Freq. Osc.
SMOD
Modo
Valor de Recarga
19,2K
11,059 MHz
1
2
FDH
9,6K
11,059 MHz
0
2
FDH
4,8K
11,059 MHz
0
2
FAH
2,4K
11,059 MHz
0
2
F4H
1,2K
11,059 MHz
0
2
E8H
137,5
11,968 MHz
0
2
1DH
110
6 MHz
0
2
72H
110
12 MHz
0
1
FEEBH
Devemos observar os valores de máxima frequência para cada um dos modos, e respeitá-los poiso uso de frequências acima destes valores acarretariam perdas de informação na comunicação serial. A tabela abaixo indica estas frequências:
Modo
Frequência Máxima
0
1 MHz
1 e 3
62,5 KHz
2
375 KHz
4.6 Interrupções
Os microcontroladores da família 8051 são providos de 5 fontes de interrupção, como mostradas na figura a seguir. As interrupções externa INT0 e INT1 podem ser ativadas por nível lógico ou por transição (borda), dependendo para isto, dos bits IT0 e IT1 no registrador TCON. Os flags que indicam a presença da interrupção nos pinos externos são IE0 e IE1 no mesmo registrador TCON. Quando uma interrupção externa é recebida, o respectivo flag é limpo quando a rotina de serviço é vetorizada para o endereço da interrupção, somente se a interrupção for do tipo ativa por transição. Se a interrupção for ativa por nível , o dispositivo externo que solicitou a interrupção se encarrega do seu controle.
As interrupções dos timers são geradas quando do overflow dos mesmos, e são reestabelecidas ao seu estado inativo por hardware quando a interrupção já se encontrar devidamente vetorizada.
A interrupção da interface serial é gerada através de um OU lógico entre os flags de RI e TI, e estes flags não são limpos após o vetoramento da interrupção, devendo ser feito este procedimento por software, após o recebimento ou transmissão do dado.
Todos os bits que geram interrupção podem ser habilitados ou não através do registrador de habilitação de interrupção IE.
Os vetores de endereço das interrupções, ou seja, os endereços para qual o PC é direcionado quando ocorre uma interrupção são fixos e seus valores são indicados abaixo:
Fonte
Endereço
IE0
0003H
TF0
000BH
IE1
0013H
TF1
001BH
Serial
0023H
4.6.1 Estrutura de prioridades
Cada uma das fontes de interrupção pode ser individualmente programada para atender a um dos dois possíveis níveis de interrupção, através de um bit específico no registrador IP. Colocando um valor 0 no bit correspondente, definimos esta interrupção como de menor prioridade, e vice-versa.
Quando temos duas interrupções de mesma prioridade, no mesmo instante, elas serão atendidas através do pool select que é realizado na seguinte ordem:
IE0 – TF0 – IE1 – TF1 – Serial
4.6.2 Interrupções externas
As fontes externas de interrupção podem ser programadas para serem ativadas por nível ou por borda. Desde que os pinos de interrupção externa são amostradas uma vez a cada ciclo de máquina, a entrada de interrupção deve manter-se estável por pelo menos 12 períodos do oscilador para que a interrupção seja reconhecida. No caso da interrupção ser ativa por transição, deve-se manter em um nível por um ciclo de máquina e mudar para outro nível, mantendo-se nele por outro ciclo de máquina.
Após o reconhecimento, o flag IEx é setado no registrador TCON sendo automaticamente resetado pela CPU quando a rotina de serviço da interrupção é chamada.
Se a interrupção é ativa por nível, este nível deve ser mantido pelo tempo necessário para que seja reconhecida a interrupção, e depois deve ser desativada antes que a rotina de tratamento da interrupção se complete, para evitar que outro pedido de interrupção seja gerado.
4.7 Circuitos de Controle
Existem outros circuitos que devem ser considerados quando da elaboração do hardware de um microcontrolador. Além dos já citados circuitos de decodificação de dados/endereços, utilizado para acesso a memória externa, pull-ups e buffers nas linhas de dados e endereços, alguns circuitos aparentemente simples, merecem especial cuidado e atenção na construção.
4.7.1 Reset
A entrada do reset se dá pelo pino RST, quando este é mantido em nível alto por pelo menos dois ciclos de máquina, após o circuito do oscilador começar a funcionar. Logo após o reset, os valores colocados nos registradores são os indicados abaixo:
Fonte
Endereço
PC
0000H
Acc
00H
B
00H
PSW
00H
SP
07H
DPTR
0000H
P0-P3
FFH
IP
XXX00000b
IE
0XX00000b
TMOD
00H
TCON
00H
TH0
00H
TL0
00H
TH1
00H
TL1
00H
SCON
00H
SBUF
Indeterminado
PCON (HMOS)
0XXXXXXXb
PCON (CHMOS)
0XXX0000b
Normalmente utilizamos um circuito conhecido como Power On Reset, para que o microcontrolador seja inicializado ao ligarmos o equipamento. O circuito abaixo ilustra um exemplo típico de circuito para uma tensão de 5Vcc, e frequência de 10MHz. Devemos notar que para os circuitos CHMOS, devido à características construtivas do dispositivo, não se faz necessário o uso do resistor externo, simplificando ainda mais o circuito.
4.7.2 Clock
Podemos utilizar o oscilador interno ao microcontrolador como indicado anteriormente neste mesmo manual. Devemos utilizar um cristal com as seguintes características:
Co (Shunt Capacitance) – máx. 7pF
Cl (Load Capacitance) – 30 pF (10%)
Potência – 1mW
A resistência equivalente em série, depende da frequência do cristal, tendo seus valores práticos demarcados no gráfico a seguir:
�
4.7.3 Operação passo a passo
Este modo de operação é muito útil durante a construção de programas, e desenvolvimento do hardware, para solucionar eventuais problemas surgidos no decorrer destes processos.
Podemos entender esta operação, lembrando o funcionamento da já conhecida estrutura das interrupções do microcontrolador. Quando uma interrupção está em progresso, outra interrupção de mesmo nível não pode ser ativada simultaneamente. O fato é que a próxima interrupção só ocorre após a execução de pelo menos uma instrução do programa interrompido, de forma que, colocando a interrupção INT0 (por exemplo) em nível baixo e acrescentando algumas linhas de programa nas rotinas de tratamento da interrupção. As linhas são as seguintes:
JNB P3.2,$ ; aguarda até que a interrupção vá para alto
JB P3.2,$ ; aguarda até que a interrupção vá para baixo
RETI ; volta e executa uma instrução
Desta forma, quando a INT0 é colocada em nível baixo, ativando-a, a CPU vai para a rotina de tratamento da interrupção e fica até que o sinal INT0 pulse (de baixo para alto e novamente para baixo). Desta forma ela executa o comando de retorno da interrupção, executa uma instrução e imediatamente reentra na rotina de interrupção, permanecendo nesta até que o sinal INT0 pulse novamente.
Esta é uma forma simples de acompanhar a execução das rotinas de um programa passo a passo, mas normalmente vamos executar estas rotinas através de um software de simulação apropriado, onde serão detectadas as principais falhas na programação.
4.8 Descrição da pinagem
A figura abaixo ilustra a pinagem do controlador 8051 nas duas formas de encapsulamento mais comuns:
A descrição da pinagem deste componente, no invólucro DIP é dada abaixo:
Pino
Descrição
1
Port 1, Dado 0
2
Port 1, Dado 1
3
Port 1, Dado 2
4
Port 1, Dado 3
5
Port 1, Dado 4
6
Port 1, Dado 5
7
Port 1, Dado 6
8
Port 1, Dado 7
9
Entrada de Reset
10
Port 3, Dado 0 (RXD da interface serial interna)
11
Port 3, Dado 1 (TXD da interface serial interna)
12
Port 3, Dado 2 (Interrupção externa INT0)
13
Port 3, Dado 3 (Interrupção externa INT1)
14
Port 3, Dado 4 (Entrada do Timer 0)
15
Port 3, Dado 5 (Entrada do Timer 1)
16
Port 3, Dado 6 (Sinal de escrita para memória exemploterna)
17
Port 3, Dado 7 (Sinal de leitura para memória externa)
18
Entrada do cristal do oscilador
19
Entrada do cristal do oscilador
20
Alimentação Terra
21
Port 2, Bit0 (Endereço A8)
22
Port 2, Bit1 (Endereço A9)
23
Port 2, Bit2 (Endereço A10)
24
Port 2, Bit3 (Endereço A11)
25
Port 2, Bit4 (Endereço A12)
26
Port 2, Bit5 (Endereço A13)
27
Port 2, Bit6 (Endereço A14)
28
Port 2, Bit7 (Endereço A15)
29
SinalPSEN (Program Search Enable)
30
Sinal ALE (Address Latch Enable) *Prog no 8751
31
Sinal EA (External Access) *Tensão de Prog no 8751
32
Port 0, Bit 7 (Dado 7)
33
Port 0, Bit 6 (Dado 6)
34
Port 0, Bit 5 (Dado 5)
35
Port 0, Bit 4 (Dado 4)
36
Port 0, Bit 3 (Dado 3)
37
Port 0, Bit 2 (Dado 2)
38
Port 0, Bit 1 (Dado 1)
39
Port 0, Bit 0 (Dado 0)
40
Alimentação de +5V
�
5 Software para Simulação
5.1 Criação de Programas para o 8051
Para utilização do microcontrolador 8051, devemos criar programas de forma a instruir o que o controlador deve fazer. A linguagem de programação utilizada é o assembler baseado no conjunto de instruções do 8051. Precisaremos de alguns softwares para tal tarefa:
Editor de texto (Norton Editor ou qualquer outro);
Assemblador (ASM51 - AVMAC51 - FENIX-SIGA51 - NIED - SENAI);
Conversor para hexadecimal (0H , AVLINK);
Simulador (AVSIM51 - DSCOPE).
Deve-se criar o programa e escrevê-lo com o editor de texto, utilizando a extensão .ASM. Pode-se escrever diretamente os mnemônicos presentes no conjunto de instruções do 8051, pois o assemblador irá entender. Alguns cuidados devem ser tomados quanto à sintaxe, como por exemplo, a posição de escrita dos códigos, que devem estar sempre alinhados. Devemos colocar na seguinte ordem; os labels de programa, seguidos de dois pontos (( e numa outra coluna (que pode ser definida por “TAB”) escreve-se o mnemônico diretamente.
Para a inserção de comentários, utiliza-se o sinal (;) no início da linha. Uma maneira prática de criar os jumps de programa consiste na utilização dos labels anteriormente definidos, e escrevendo o jump para o label. Desta forma não precisamos ficar calculando os endereços relativos, o que economiza muito tempo. No final do programa, devemos colocar a instrução END obrigatoriamente, e mais nada após a mesma, para evitar a indicação de erros no assemblador.
Uma vez criado o arquivo com extensão .ASM, deve-se utilizar o assemblador da seguinte forma:
A:\> ASM51 Arq.asm (ENTER)
O assemblador cria dois arquivos com extensões .OBJ e .LST. Através do arquivo .LST, localizamos os erros de codificação do programa, pois é nele que estes ficam indicados. Após a correção dos erros, podemos ter uma listagem completa do programa, incluindo os endereços dos labels e etc.. A indicação de erro se dá após o uso do ASM51, quando é indicado o número de erros encontrados. Deve-se corrigir o programa até encontrar a mensagem “NO ERRORS FOUND” após a codificação.
Quando o programa estiver corrigido, deve-se utilizar o arquivo .OBJ criado e convertê-lo para HEX utilizando o software 0H.EXE através de um software apropriado.
Uso do software AVSIM51
Este software permite a simulação de programas nos controladores da linha 8051. Sua utilização é simples e direta, tornando-o uma poderosa ferramenta de desenvolvimento. Após carregar o programa e selecionar o tipo de controlador utilizado, aparecerá uma tela como a indicada a seguir:
5.2 Tabela de Instruções completa
Temos na tabela a seguir o set de instruções do 8051, indicando o seu opcode, conforme já explicado, o número de bytes da instrução, os períodos de clock necessários e os flags afetados.
Temos a seguinte codificação na tabela:
@ – significa “endereçado pelo valor de ...”; 
#Dado – indica valor constante de 8 bits;
#Dado 16 – indica valor constante de 16 bits;
Direto – indica um endereçamento de memória de 8 bits (primeiras 256 posições interna ou externas)
rel – indica que o endereçamento é relativo;
? – indica “depende do resultado ou da operação”;
“-“ – indica “não afetado”;
1 – indica setado;
0 – indica zerado.
Opcode
Mnemônico
Função
Bytes
Pulsos
Flags afetados
CY
AC
0V
00
NOP
Nenhuma operação
1
12
-
-
-
01
AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
02
LJMP End16
Desvia para qualquer posição da memória de programa.
3
24
-
-
-
03
RR A
Desloca acumulador à direita
1
12
-
-
-
04
INC A
Soma 1 ao acumulador
1
12
-
-
-
05
INC Direto
Soma 1 à posição de memória
2
12
-
-
-
06
INC @R0
Soma 1 à RAM endereçada por R0
1
12
-
-
-
07
INC @R1
Soma 1 à RAM endereçada por R1
1
12
-
-
-
08
INC R0
Soma 1 ao conteúdo de R0
1
12
-
-
-
09
INC R1
Soma 1 ao conteúdo de R1
1
12
-
-
-
0A
INC R2
Soma 1 ao conteúdo de R2
1
12
-
-
-
0B
INC R3
Soma 1 ao conteúdo de R3
1
12
-
-
-
0C
INC R4
Soma 1 ao conteúdo de R4
1
12
-
-
-
0D
INC R5
Soma 1 ao conteúdo de R5
1
12
-
-
-
0E
INC R6
Soma 1 ao conteúdo de R6
1
12
-
-
-
0F
INC R7
Soma 1 ao conteúdo de R7
1
12
-
-
-
10
JBC bit, rel
Desvia se o bit endereçado estiver setado e depois zera o bit
3
24
-
-
-
11
ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
12
LCALL End16
Chama sub-rotina em qualquer posição da memória de programa
3
24
-
-
-
13
RRC A
Desloca o acumulador à direita através do carry
1
12
?
-
-
14
DEC A
Subtrai 1 do acumulador
1
12
-
-
-
15
DEC Direto
Subtrai 1 da posição de memória
2
12
-
-
-
16
DEC @R0
Subtrai 1 da RAM endereçada por R0
1
12
-
-
-
17
DEC @R1
Subtrai 1 da RAM endereçada por R1
1
12
-
-
-
18
DEC R0
Subtrai 1 do conteúdo de R0
1
12
-
-
-
19
DEC R1
Subtrai 1 do conteúdo de R1
1
12
-
-
-
1A
DEC R2
Subtrai 1 do conteúdo de R2
1
12
-
-
-
1B
DEC R3
Subtrai 1 do conteúdo de R3
1
12
-
-
-
1C
DEC R4
Subtrai 1 do conteúdo de R4
1
12
-
-
-
1D
DEC R5
Subtrai 1 do conteúdo de R5
1
12
-
-
-
1E
DEC R6
Subtrai 1 do conteúdo de R6
1
12
-
-
-
1F
DEC R7
Subtrai 1 do conteúdo de R7
1
12
-
-
-
20
JB bit, rel
Desvio se o bit endereçado estiver setado
3
24
-
-
-
21
AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
22
RET
Retorne da sub-rotina
1
24
-
-
-
23
RL A
Desloca o acumulador à esquerda
1
12
-
-
-
24
ADD A, #Dado
Soma o dado ao acumulador
2
12
?
?
?
25
ADD A, Direto
Soma o conteúdo da posição de memória ao acumulador
2
12
?
?
?
26
ADD A, @R0
Soma o conteúdo da RAM endereçada por R0 ao acumulador
1
12
?
?
?
27
ADD A, @R1
Soma o conteúdo da RAM endereçada por R1 ao acumulador
1
12
?
?
?
28
ADD A, R0
Soma o conteúdo de R0 ao acumulador
1
12
?
?
?
29
ADD A, R1
Soma o conteúdo de R1 ao acumulador
1
12
?
?
?
2A
ADD A, R2
Soma o conteúdo de R2 ao acumulador
1
12
?
?
?
2B
ADD A, R3
Soma o conteúdo de R3 ao acumulador
1
12
?
?
?
2C
ADD A, R4
Soma o conteúdo de R4 ao acumulador
1
12
?
?
?
2D
ADD A, R5
Soma o conteúdo de R5 ao acumulador
1
12
?
?
?
2E
ADD A, R6
Soma o conteúdo de R6 ao acumulador
1
12
?
?
?
2F
ADD A, R7
Soma o conteúdo de R7 ao acumulador
1
12
?
?
?
30
JNB bit, rel
Desvia se o bit endereçado estiver zerado
3
24
-
-
-
31
ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
32
RETI
Retorne da interrupção
1
24
-
-
-
33
RLC A
Desloca o acumulador à esquerda através do carry
1
12
?
-
-
34
ADDC A, #Dado
Soma o dado e o carry ao acumulador
2
12
?
?
?
35
ADDC A, Direto
Soma o conteúdo da posição de memória e o carry ao acumulador
2
12
?
?
?
36
ADDC A, @R0
Soma o conteúdo da RAM endereçada por R0 e o carry ao acumulador
1
12
?
?
?
37
ADDC A, @R1
Soma o conteúdo da RAM endereçada por R1 e o carry ao acumulador1
12
?
?
?
38
ADDC A, R0
Soma o conteúdo de R0 e o carry ao acumulador
1
12
?
?
?
39
ADDC A, R1
Soma o conteúdo de R1 e o carry ao acumulador
1
12
?
?
?
3A
ADDC A, R2
Soma o conteúdo de R2 e o carry ao acumulador
1
12
?
?
?
3B
ADDC A, R3
Soma o conteúdo de R3 e o carry ao acumulador
1
12
?
?
?
3C
ADDC A, R4
Soma o conteúdo de R4 e o carry ao acumulador
1
12
?
?
?
3D
ADDC A, R5
Soma o conteúdo de R5 e o carry ao acumulador
1
12
?
?
?
3E
ADDC A, R6
Soma o conteúdo de R6 e o carry ao acumulador
1
12
?
?
?
3F
ADDC A, R7
Soma o conteúdo de R7 e o carry ao acumulador
1
12
?
?
?
40
JC rel
Desvia se o carry estiver setado
2
24
-
-
-
41
AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
42
ORL Direto, A
“Ou” entre acumulador e memória; resultado na memória
2
12
-
-
-
43
ORL Direto, #Dado
“Ou” entre dado e memória
3
24
-
-
-
44
ORL A, #Dado
“Ou” entre dado e acumulador
2
12
-
-
-
45
ORL A, Direto
“Ou” entre memória e acumulador
2
12
-
-
-
46
ORL A, @R0
“Ou” entre a RAM endereçada por R0 e o acumulador
1
12
-
-
-
47
ORL A, @R1
“Ou” entre a RAM endereçada por R1 e o acumulador
1
12
-
-
-
48
ORL A, R0
“Ou” entre o conteúdo de R0 e o acumulador
1
12
-
-
-
49
ORL A, R1
“Ou” entre o conteúdo de R1 e o acumulador
1
12
-
-
-
4A
ORL A, R2
“Ou” entre o conteúdo de R2 e o acumulador
1
12
-
-
-
4B
ORL A, R3
“Ou” entre o conteúdo de R3 e o acumulador
1
12
-
-
-
4C
ORL A, R4
“Ou” entre o conteúdo de R4 e o acumulador
1
12
-
-
-
4D
ORL A, R5
“Ou” entre o conteúdo de R5 e o acumulador
1
12
-
-
-
4E
ORL A, R6
“Ou” entre o conteúdo de R6 e o acumulador
1
12
-
-
-
4F
ORL A, R7
“Ou” entre o conteúdo de R7 e o acumulador
1
12
-
-
-
50
JNC rel
Desvia se o carry estiver zerado
2
24
-
-
-
51
ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
52
ANL Direto, A
“E” entre acumulador e memória; resultado na memória
2
12
-
-
-
53
ANL Direto, #dado
“E” entre dado e memória
3
24
-
-
-
54
ANL A, #Dado
“E” entre dado e acumulador
2
12
-
-
-
55
ANL A, Direto
“E” entre memória e acumulador
2
12
-
-
-
56
ANL A, @R0
“E” entre RAM endereçada por R0 e acumulador
1
12
-
-
-
57
ANL A, @R1
“E” entre RAM endereçada por R1 e acumulador
1
12
-
-
-
58
ANL A, R0
“E” entre o conteúdo de R0 e o acumulador
1
12
-
-
-
59
ANL A, R1
“E” entre o conteúdo de R1 e o acumulador
1
12
-
-
-
5A
ANL A, R2
“E” entre o conteúdo de R2 e o acumulador
1
12
-
-
-
5B
ANL A, R3
“E” entre o conteúdo de R3 e o acumulador
1
12
-
-
-
5C
ANL A, R4
“E” entre o conteúdo de R4 e o acumulador
1
12
-
-
-
5D
ANL A, R5
“E” entre o conteúdo de R5 e o acumulador
1
12
-
-
-
5E
ANL A, R6
“E” entre o conteúdo de R6 e o acumulador
1
12
-
-
-
5F
ANL A, R7
“E” entre o conteúdo de R7 e o acumulador
1
12
-
-
-
60
JZ rel
Desvia se o acumulador for zero
2
24
-
-
-
61
AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
62
XRL Direto, A
“Ou exclusivo” entre acumulador e memória; resultado na memória
2
12
-
-
-
63
XRL Direto, #Dado
“Ou exclusivo” entre dado e memória
3
24
-
-
-
64
XRL A, #Dado
“Ou exclusivo” entre dado e acumulador
2
12
-
-
-
65
XRL A, Direto
“Ou exclusivo” entre memória e acumulador
2
12
-
-
-
66
XRL A, @R0
“Ou exclusivo” entre RAM endereçada por R0 e acumulador
1
12
-
-
-
67
XRL A, @R1
“Ou exclusivo” entre RAM endereçada por R1 e acumulador
1
12
-
-
-
68
XRL A, R0
“Ou exclusivo” entre conteúdo de R0 e acumulador
1
12
-
-
-
69
XRL A, R1
“Ou exclusivo” entre conteúdo de R1 e acumulador
1
12
-
-
-
6A
XRL A, R2
“Ou exclusivo” entre conteúdo de R2 e acumulador
1
12
-
-
-
6B
XRL A, R3
“Ou exclusivo” entre conteúdo de R3 e acumulador
1
12
-
-
-
6C
XRL A, R4
“Ou exclusivo” entre conteúdo de R4 e acumulador
1
12
-
-
-
6D
XRL A, R5
“Ou exclusivo” entre conteúdo de R5 e acumulador
1
12
-
-
-
6E
XRL A, R6
“Ou exclusivo” entre conteúdo de R6 e acumulador
1
12
-
-
-
6F
XRL A, R7
“Ou exclusivo” entre conteúdo de R7 e acumulador
1
12
-
-
-
70
JNZ rel
Desvia se o acumulador não for zero
2
24
-
-
-
71
ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
72
ORL C, bit
“Ou” entre o bit endereçado e o carry
2
24
?
-
-
73
JMP @A+DPTR
Desvia para o endereço obtido da soma do acumulador e do DPTR
1
24
-
-
-
74
MOV A, #Dado
Mova o dado para o acumulador
2
12
-
-
-
75
MOV Direto, #Dado
Mova o dado para a memória
3
24
-
-
-
76
MOV @R0, #Dado
Mova dado para RAM endereçada indiretamente por R0
2
12
-
-
-
77
MOV @R1, #Dado
Mova dado para RAM endereçada indiretamente por R1
2
12
-
-
-
78
MOV R0, #Dado
Mova o dado para o registro R0
2
24
-
-
-
79
MOV R1, #Dado
Mova o dado para o registro R1
2
24
-
-
-
7A
MOV R2, #Dado
Mova o dado para o registro R2
2
24
-
-
-
7B
MOV R3, #Dado
Mova o dado para o registro R3
2
24
-
-
-
7C
MOV R4, #Dado
Mova o dado para o registro R4
2
24
-
-
-
7D
MOV R5, #Dado
Mova o dado para o registro R5
2
24
-
-
-
7E
MOV R6, #Dado
Mova o dado para o registro R6
2
24
-
-
-
7F
MOV R7, #Dado
Mova o dado para o registro R7
2
24
-
-
-
80
SJMP rel
Desvio curto relativo
2
24
-
-
-
81
AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
82
ANL C, bit
“E” entre o bit endereçado e o carry
2
24
?
-
-
83
MOVC A, @A+PC
Soma A + PC obtendo um endereço de 16 bits na memória de programa; carrega o acumulador com esta memória
1
24
-
-
-
84
DIV AB
Divide A e B; resultado: A inteiro e B resto
1
48
0
?
0
85
MOV Direto1, Direto2
Mova o conteúdo da memória direta2 para a memória direta1
3
24
-
-
-
86
MOV Direto, @R0
Mova RAM endereçada por R0 para memória
2
24
-
-
-
87
MOV Direto, @R1
Mova RAM endereçada por R1 para memória
2
24
-
-
-
88
MOV Direto, R0
Mova registro R0 para memória
2
24
-
-
-
89
MOV Direto, R1
Mova registro R1 para memória
2
24
-
-
-
8A
MOV Direto, R2
Mova registro R2 para memória
2
24
-
-
-
8B
MOV Direto, R3
Mova registro R3 para memória
2
24
-
-
-
8C
MOV Direto, R4
Mova registro R4 para memória
2
24
-
-
-
8D
MOV Direto, R5
Mova registro R5 para memória
2
24
-
-
-
8E
MOV Direto, R6
Mova registro R6 para memória
2
24
-
-
-
8F
MOV Direto, R7
Mova registro R7 para memória
2
24
-
-
-
90
MOV DPTR, #Dado 16
Mova dado de 16 bits para o DPTR
3
24
-
-
-
91
ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2
24
-
-
-
92
MOV bit, C
Mova o carry para o bit endereçado
2
24
-
-
-
93
MOVC A, @A + DPTR
Soma A + DPTR obtendo um endereço de 16 bits na memória de programa; carrega o acumulador com esta memória
1
24
-
-
-
94
SUBB A, #Dado
Subtrai o dado e o borrow do acumulador
2
12
?
?
?
95
SUBB A, Direto
Subtrai o conteúdo da posição de memória e o borrow do acumulador
2
12
?
?
?
96
SUBB A, @R0
Subtrai o conteúdo da RAM endereçada por R0 e o borrow do acumulador
1
12
?
?
?
97
SUBB A, @R1
Subtrai o conteúdo da RAM endereçada por R1 e o

Outros materiais

Outros materiais