# Intel 8051

O Intel MCS-51 (comumente chamado de Intel 8051) faz parte de uma família de microcontroladores de 8 bits lançada pela Intel em meados de 1980. É conhecido pela sua facilidade de programação, utilizando a linguagem Assembly ou até mesmo a linguagem C. É tido como o microcontrolador mais popular do mundo, pois existem milhares de aplicações para o mesmo, usado majoritariamente em sistemas embarcados. Existem pelo menos dois mil fabricantes produzindo variantes e clones do modelo. Atualmente possui diversos modelos clones sendo produzidos por empresas diversas à Intel. Por ser um microcontrolador CISC, oferece um conjunto de instruções muito vasto que permite executar desde um simples programa até um mais complexo com rede, sendo baseado na arquitetura de Harvard.
A família foi continuada em 1996, com o avançado MCS-151 de 8 bits, e o microcontrolador compatível com binário, de 8/16/32 bits, MCS-251. Apesar da Intel terminar a fabricação dos MCS-51, MCS-151 e MCS-251, até hoje microcontroladores derivados dos anteriores continuam populares. Alguns derivados oferecem um processador de sinal digital. Além dos componentes físicos, diversas empresas disponibilizam núcleos de propriedade intelectual derivadas do MCS-51 para uso em FPGAs (field-programmable gate array) ou ASICs (application-specific integrated circuit).

## Estrutura

A família MCS-51 da Intel, foi desenvolvida utilizando a tecnologia NMOS, suas versões posteriores são identificadas por uma letra C em seu nome (por exemplo, 80C51), desenvolvidas com a tecnologia CMOS, garantindo a estes dispositivos um menor consumo de energia quando alimentados por bateria.
Em sua composição interna, também possui uma memória ROM, que é tida exclusivamente para armazenar o programa que a CPU executará. Sua utilização tornou-se inviável para alguns projetistas da época, pois como as aplicações precisavam ler e gravar dados em tempo de execução, era preciso que uma memória RAM externa fosse utilizada. Em alguns casos, o Intel 8052 foi usado como alternativa, é o mesmo que o Intel 8051, exceto com outro temporizador, RAM e ROM adicionais.
O Intel 8031 é um membro da família que não possui memória interna de programa, embora toda a arquitetura interna seja a mesma. As características de hardware e software da família 8051 permitem a manipulação de bits com extrema facilidade e possibilitam o desenvolvimento de sistema microprocessado de um único chip.

## Aplicações

A família MCS-51 da Intel, foi desenvolvida utilizando a tecnologia NMOS, suas versões posteriores são identificadas por uma letra C em seu nome (por exemplo, 80C51), desenvolvidas com a tecnologia CMOS, garantindo a estes dispositivos um menor consumo de energia quando alimentados por bateria.
Em sua composição interna, também possui uma memória ROM, que é tida exclusivamente para armazenar o programa que a CPU executará. Sua utilização tornou-se inviável para alguns projetistas da época, pois como as aplicações precisavam ler e gravar dados em tempo de execução, era preciso que uma memória RAM externa fosse utilizada. Em alguns casos, o Intel 8052 foi usado como alternativa, é o mesmo que o Intel 8051, exceto com outro temporizador, RAM e ROM adicionais.
O Intel 8031 é um membro da família que não possui memória interna de programa, embora toda a arquitetura interna seja a mesma. As características de hardware e software da família 8051 permitem a manipulação de bits com extrema facilidade e possibilitam o desenvolvimento de sistema microprocessado de um único chip.

## Versões

Com ROM:
* 8051, 80C51, 80CL51, 8052, 83C053, 83CL410, 83C451, 83C528, 83C550, 83C552, 83C562, 83C575, 83C592, 83C652, 83C654, 83C751, 83C752, 83C851, 83C852.
Sem ROM:
* 8031, 80C31, 8032, 80C32, 80CL410, 80C451, 80C528,
80C550, 80C552, 80C562, 80C575, 80C592, 80C652, 80C851.
EPROM:
* 87C51, 87C52, 87C054, 87C451, 87C528, 87C550, 87C552, 87C575, 87C592, 87C652, 87C654, 87C751, 87C752.

## Principais características funcionais do microcontrolador 8051

* ULA de 8 bits;
* Acumulador de 8 bits;
* Barramento de 8 bits; 2 barramentos de endereço de 16 bits;
* Contador de programas (PC);
* Ponteiro de dados;
* Processador booleano com 17 instruções;
* Instruções de multiplicação, divisão e comparação;
* 4 bancos de registradores alternáveis com 8 registradores cada (mapeados em memória);
* Interrupção rápida com alternância de banco de registrador opcional;
* Modo de economia de energia (em alguns derivados);
* CPU de 8 bits otimizada para aplicações de controle, chamada de ''Timing and Control''
* Memória Interna de Programa (4Kbytes);
* Memória Interna de Dados (128 bytes);
* 2 Contadores/Temporizadores programáveis de 16 bits;
* 1 Porta Serial Full – Duplex;
* 32 linhas de E/S;
* Estrutura de Interrupção com dois níveis de prioridade 5 fontes (2 externas, 3 internas);
* RAM interna endereçável bit-a-bit;
* 64Kbytes para Memória Externa de Programas;
* 64Kbytes para Memória Externa de Dados;
Uma adição ao núcleo 8051 foi um mecanismo de processamento booleano, que permite operações lógicas booleanas a nível de bit, a serem executadas diretamente e eficientemente em registradores internos, portas e certos locais da RAM. Essa adição ajudou a concretizar a popularidade do 8051 em controle de aplicações industriais, porque reduziu o tamanho do código em até 30%.
Outra característica é a inclusão de quatro registradores selecionáveis por banco, que reduzem bastante a quantidade de tempo necessária para completar uma rotina de interrupção de serviço. Com apenas uma instrução, o 8051 pode trocar de banco de registradores, ao invés de executar a tarefa de mover os registradores críticos para a pilha, ou endereços de RAM designados, que pode demorar um bom tempo a mais. Esse banco de registradores também permitiu ao 8051 rapidamente executar uma troca de contexto.

## Organização da Memória

O MCS-51 tem quatro tipos distintos de memória: RAM interna (IRAM), registradores de função especial, memória de programa e memória de dados.
* Memória de Programa
O espaço de endereçamento para a memória é de 64Kbytes. No 8051, os 4KB mais baixos estão na própria memória interna de programa. Após o reset, a CPU inicia a execução no endereço 0x00, onde deve residir uma instrução de salto para o endereço de início do programa.
Os 4KB mais baixos da memória de programa podem residir tanto internamente no chip como na memória externa. A seleção é feita pelo pino EA (External Access). Quando EA=1, a CPU busca as instruções de endereços 0x0000 a 0x0FFF na ROM interna e as instruções de endereços 0x1000 a 0xFFFF na memória externa.
* Memória de Dados
O 8051 pode acessar dados tanto na Memória Interna como na Memória Externa de dados. A Memória Externa de Dados pode ter até 64 Kbytes e é acessada através da instrução MOVX. A Memória interna de Dados do 8051 é composta por 2 blocos de 128 bytes. O bloco inferior 0x00 até 0x7F é usado como RAM e pode ser endereçado direto ou indiretamente. O bloco superior 0x80 a 0xFF é um espaço reservado para mapear os registradores de funções especiais da CPU (SFR). Este bloco só pode ser acessado diretamente.
O bloco inferior da Memória Interna de Dados 0x00 a 0x7F é dividido em 3 partes:
* Banco de Registradores (0x00 a 0x1F): 32 bytes
* Área endereçável bit-a-bit (0x20 a 0x2F): 16
bytes
* Área de Rascunho (0x30 a 0x7F): 80 bytes
* RAM Interna (IRAM)
A RAM interna tem um espaço de endereços de 8 bits, e permite endereços do 0 até o 0xFF. Os endereços de 0x00 até 0x7F podem ser acessados diretamente. A maioria dos clones do 8051 também tem 256 bytes de IRAM. Os 32 bytes de 0x00 até 0x1F mapeiam na memória os 8 registradores R0-R7. 8 bytes são usados por vez, 2 bits de palavras de status selecionam entre quatro bancos de registradores possíveis.
* Os 16 bytes (128 bits) nas locações de IRAM 0x20-0x2F são endereçáveis por bit.
* Registradores de Funções Especiais
Os registradores de funções especiais estão localizados no mesmo espaço de memória da IRAM, nos endereços 0x80 até 0xFF, e são acessados diretamente usando as mesmas instruções que a metade inferior da IRAM. Eles não podem ser acessados indiretamente via @R0 ou @R1, utilizando esses comandos será acessado indiretamente a metade superior da IRAM.
* 16 dos SFRs (aqueles cujos endereços são múltiplos de 8) também são endereçáveis por bit.

## Registradores de funções especiais

Os registradores de funções especiais da CPU, os SRF (Special Function Register), com exceção do PC (Program Counter), estão alocados na parte superior da Memória Interna de Dados. São eles:
ACC – Acumulador
B – Utilizado como fonte e destino para operações de multiplicação e divisão.
Stack Pointer (SP) – É o ponteiro da pilha da CPU.
DPTR (Data Pointer) – É um registrador de 16 bits usado para o endereçamento da memória externa de dados. Eles ocupa dois espaços de 8 bits que podem ser acessados com DPL e DPH.
P0, P1, P2, P3 – Usados para latch nas portas 0 a 3 de E/S.
SBUF (Serial Data Buffer) – Utilizado para transmissão e recepção de dados para a porta serial.
PSW (Program Status Word) – Contém as flags da CPU. (8-bit)
Registradores de Temporização – Sob os pares (TH0, TL0), (TH1, TL1), (TH2, TL2). Cada par corresponde a um registrador de 16 bits.
Registradores de Captura (apenas no 8052) – O par de registradores (RCAP2H, RCAP2L) são registradores de captura para o Timer 2 “Modo de Captura”.
Registradores de Controle – IP, IE, TMOD, TCON, SCON e PCON são registradores de controle e estado do sistema de interrupção, da seção de temporização e da porta serial.

## Set de Instruções

Todas as instruções contém de 1 a 3 bytes cada, consistindo de um byte de opcode inicial, seguido de até 2 bytes de operandos. 3/4 dos bytes de opcode estão associados a 16 instruções básicas de ULA. Um operando é flexível, enquanto o segundo (se houver) é especificado pela operação: o acumulador, uma constante imediata ou um endereço de RAM.
Os últimos 4 bits do opcode especificam um dos seguintes modos de endereçamento, o bit mais significante especifica a operação:
* 8-F: Registrador direto, R0-R7;
* 6-7: Registrador indireto, @R0 ou @R1;
* 5: Memória direta, um byte seguinte especifica um endereço IRAM ou SFR;
* 4: De modo imediato, um byte seguinte especifica uma constante de 8 bits. Enquanto a operação sempre, ou por padrão, usa um valor imediato, isso em alguns casos especifica que o acumulador é usado.
Os valores restantes, 0-3, são usados para opcodes irregulares.
As operações especificadas pelos 4 bits mais significativos são as seguintes. Nem todas suportam todos os modos de endereçamento; o modo imediato, em particular, não está disponível onde o operando flexível é gravado.
| OPCODE | OPERAÇÃO | FUNÇÃO | EXEMPLO |
| 0 | INC | Incrementa o operando especificado. Em modo imediato (opcode 0x04) especifica o acumulador. | INC operando |
| 1 | DEC | Decrementa o operando especificado. Em modo imediato (opcode 0x14) especifica o acumulador. | DEC operando |
| 2 | ADD | Soma o operando ao acumulador | ADD A, operand |
| 3 | ADDC | Soma o operando, mais o bit C, ao acumulador | ADDC A, operando |
| 4 | ORL | 'Ou' lógico entre o operando e o acumulador. Um modo de endereçamento extra para essa operação é especificado pelo opcode 0x43. | ORL A, operando |
| 5 | ANL | 'E' lógico entre o operando e o acumulador. Um modo de endereçamento extra para essa função é especificado pelo opcode 0x53. | ANL A, operando |
| 6 | XRL | 'Ou exclusivo' lógico entre o operando e o acumulador. Um modo de endereçamento extra para essa função é especifica pelo opcode 0x63. | XRL A, operando |
| 7 | MOV | Move imediatamente do endereço ao operando. Em modo imediato (0x74) especifica o acumulador. | MOV operando, #data |
| 8 | MOV | Move um valor para um registrador IRAM ou SFR. Modo imediato (0x75) não é usado nessa operação, pois duplica o opcode 0x75. | MOV operando, endereço |
| 9 | SUBB | Subtrai o operando do acumulador. Essa operação usa empréstimo, e sem empréstimo não há subtração. | SUBB A, operando |
| A | MOV | Move um valor de um registrador IRAM ou SFR. Modo imediato (opcode 0xB4) não é usado, pois serve somente de origem. Modo direto de memória (0xB5) não é usado, pois duplica o opcode 0xB5. | MOV operando, endereço |
| B | CJNE | Compara o operando ao #data imediato, e incrementa o PC se não são iguais. Modo imediato e imediato de memória (opcodes 0xB4 e 0xB5) comparam o operando com o acumulador. (Não há uma operação que compare e pule se iguais). | CJNE operando, #data, offset |
| C | XCH | Troca o acumulador com o operando. O modo imediato (0xC4) não é usado para essa operação. | XCH A, operando |
| D | DJNZ | Decrementa o operando, e pula para PC + offset se o resultado não é zero. Modo imediato (opcode 0xD4) e modo registrador indireto (0xD6, 0xD7) não são usados. | DJNZ operando, offset |
| E | MOV | Move o operando ao acumulador. Modo imediato (0xE4) não é usado, pois duplica o opcode 0x74. | MOV A, operando |
| F | MOV | Move o acumulador ao operando. Modo imediato (opcode 0xF4) não é usado pois não tem efeito. | MOV operando, A |
Apenas as instruções ADD, ADDC, e SUBB ligam flags de PSW. As funções INC, DEC, e instruções lógicas não ligam. A instrução CJNE modifica apenas o bit C, ao resultado da subtração do operando 1 menos o operando 2.

## Acesso à Memória Externa

Os acessos poder feitos tanto para a Memória de Programa quando para à Memória de Dados. O Sinal utilizado para “strobe” de leitura é o PSEN (Program Strobe Enable).
Em um acesso externo com endereço de 16 bits, o byte de mais alta ordem do endereço é armazenado em P2 e o menos significativo em P0.

## Porta Serial

A transmissão/recepção serial é feita através dos pinos TXD e RXD. O pino RXD é amostrado periodicamente e quando a porta serial detecta um “start-bit” válido, o dado correspondente é carregado no registrador SBUF.
Na transmissão a CPU escreve o dado ser enviado em SBUF e a porta serial encarrega-se de transmiti-lo através do pino TXD. Na recepção, a porta serial encarrega-se de trazer o byte pelo pino RXD e colocar no SBUF.

## Consumo

Para aplicações onde o consumo de potencia é critico, as versões NMOS e CMOS possuem um modo de operação para redução de consumo.
Nas versões NMOS, é feita através de uma fonte de alimentação externa conectada ao pino RST. Nas versões CMOS, há dois modos de operação para redução de consumo, o “Idle” e o “Power-Down”, os mesmos são ativados através do registrador PCON.

## Processadores relacionados

O predecessor do 8051, o 8048, foi utilizado no teclado do primeiro IBM PC, onde convertia o sinal das teclas em um sinal serial que era enviado a unidade principal do computador. O 8048 e derivados ainda são utilizados hoje em dia (2007) para modelos básicos de teclados.
O 8031 foi uma versão de custo reduzido do original Intel 8051 que não possui nenhuma memória interna para programação (ROM). Este fato o torna o microcontrolador mais barato para implementação de projetos. A grande maioria dos kits didáticos são baseados no 8031. A facilidade de encontrar memórias EPROM e RAM de baixo custo o tornaram o microcontrolador mais utilizado nas universidades e cursos técnicos.
O 8052 foi uma versão melhorada da versão original Intel 8051 que dispõe de 256 bytes de memória RAM interna ao invés dos 128 bytes, 8 kB de ROM ao invés dos 4 kB, e um terceiro timer de 16-bit. O 8032 possui as mesmas características exceto pela memória interna de programa .

## Referências bibliográficas

SICA, Carlos (2006). Sistemas Automáticos com Microcontroladores 8031/8051. 1 1 ed. São Paulo - SP: Novatec. 192 páginas. ISBN 85-7522-083-7 A referência emprega parâmetros obsoletos |Título= (ajuda) PREDKO, Myke. Programming and Customizing the 8051 Microcontroller. 1. ed. New York - NY: McGraw-Hill, 1999. ISBN 0-07-134192-7.