Arquitetura e Instruções do Microcontrolador 8051: Guia de Pinagem e Conjunto de Instruções
Do ponto de vista funcional, as instruções da família de processadores 8051 são agrupadas em cinco grandes grupos: "Operações Aritméticas", "Operações Lógicas", "Transferências de Dados", "Processamento Booleano Bit a Bit" e "Transferência e Salto de Controlo".
Operações Aritméticas
Instrução ADD
Quando é executada uma instrução deste tipo, o conteúdo do acumulador é somado com um segundo operando, e o resultado da operação é guardado no registo acumulador. O segundo operando, byte, é um endereço que pode ser especificado de qualquer uma das seguintes formas:
- Direto: exemplo,
ADD A, 20H; - Por registo: exemplo,
ADD A, R7; - Indireto por registo: exemplo,
ADD A, @R0; - Imediato: exemplo,
ADD A, #20H.
Instruções INC e DEC
Quando a instrução INC (Increment) é executada, o conteúdo do registo especificado na instrução, que é o operando, é incrementado de uma unidade. O operando pode ser endereçado das seguintes formas:
- Direto: exemplo,
INC 20H; - Por registo: exemplo,
INC A; - Indireto: exemplo,
INC @R0.
De forma análoga, quando executamos a instrução DEC (Decrement), o registo alvo da operação é decrementado.
Operações Lógicas
Instrução ANL
Quando é executada uma instrução deste tipo, são realizadas operações de produto lógico (função AND, bit a bit em particular) entre o conteúdo do acumulador e um segundo operando. O segundo operando, byte, é um endereço que pode ser especificado de qualquer uma das seguintes formas:
- Direto: exemplo,
ANL A, 20H; - Por registo: exemplo,
ANL A, R7; - Indireto por registo: exemplo,
ANL A, @R0; - Imediato: exemplo,
ANL A, #20H.
Também é possível utilizar esta instrução para memorizar o resultado na RAM do processador, fazendo, por exemplo, ANL 20H, A ou ANL 20H, #20H. O resultado destas instruções não afeta as flags.
Instruções ORL e XRL
Realizam, respetivamente, as funções OR (soma lógica) e OR exclusivo (XOR), entre dois operandos, de forma semelhante à função ANL.
Transferências de Dados
Neste grupo de instruções de transferência de dados, é possível distinguir três subgrupos:
- Transferência interna: a sua execução desencadeia a troca de informação (cópia de dados) entre registos da RAM interna do processador e/ou SFRs (Special Function Registers);
- Transferência com acesso à memória externa de dados: copia palavras de dados ou o acumulador entre o processador e dispositivos externos, em ambos os sentidos;
- Transferência com acesso à memória de programa: copia palavras de dados da memória de programa (interna ou externa) para o acumulador do processador.
Processamento Booleano Bit a Bit
Na descrição das instruções deste grupo, o operando pode ser qualquer um dos bits localizados no mapa de memória RAM ou nos SFRs manipuláveis bit a bit.
CLR CeSETB C: pela sua execução, atribuem-se, respetivamente, os valores lógicos "0" e "1" ao flag de transporte (carry).CLR biteSETB bit: semelhantes aCLR CeSETB C, respetivamente. Exemplos:CLR 20H(atribui o valor "0" ao bit da RAM interna) eSETB P1.0(atribui o valor "1" ao bit menos significativo do porto 1).
Transferência e Salto de Controlo
Ao executar as instruções que integram este grupo, o processador deixa de aceder à memória de programa de forma sequencial e passa a aceder a um endereço determinado. Algumas das instruções do repertório não incluídas, ao serem executadas, provocam um salto (desvio de endereçamento) incondicional. Noutras, o processamento do desvio é condicionado pelo resultado de uma operação de teste.
- LJMP end16 (Long JUMP): instrução de salto incondicional cuja execução provoca a escrita do valor end16 (endereço de 16 bits) no PC e, assim, o acesso à posição de memória de programa desse endereço. O uso desta instrução permite desviar ou controlar a execução do programa para qualquer endereço, de 0000h até FFFFh.
- JZ rel e JNZ rel (Jump if Zero e Jump if Not Zero): instruções de salto condicional que provocam o desvio da execução do programa para um endereço dado - (PC) + rel -, se o conteúdo do acumulador for zero (JZ) ou diferente de zero (JNZ). No caso contrário, o processador executa a instrução seguinte.
Pinagem
- VSS: ligação à massa.
- VCC: alimentação.
- XTAL1 e XTAL2: entrada e saída do amplificador do oscilador interno.
- RST: entrada de reset, com estado ativo a nível alto.
- ALE (Address Latch Enable): saída que gera o sinal de validação dos dois bits menos significativos do endereço, em operações de acesso à memória externa. Também pode ser utilizada para excitar entradas de relógio de periféricos.
- PSEN (Program Store Enable): saída utilizada para aceder à memória de programa externa. Esta memória é acedida quando surgem impulsos de acesso (nível baixo) nesta linha.
- EA (External Access Enable): entrada para selecionar o bloco de memória de programa (interna ou externa) com endereços baixos (0000H a 1111H). Nas versões do processador que possuem memória de programa interna, esta entrada deve ser ligada a VCC quando se deseja utilizar essa memória, e à massa quando se pretende utilizar memória externa.
- P0.7 a P0.0: Porto 0, entrada e saída de dados bidirecional. Este porto não está disponível quando se utiliza memória de programa externa, pois os seus pinos são utilizados para transferir dados (D7 a D0 do barramento de dados) e endereços (A7 a A0 do barramento de endereços). As operações de acesso à memória externa, de programa ou de dados, multiplexam os endereços e os dados no domínio do tempo, sendo a desmultiplexagem feita externamente, controlada pela saída ALE.
- P1.7 a P1.0: Porto 1, bidirecional. É o único porto cujos pinos têm entrada e saída de dados dedicadas.
- P2.7 a P2.0: Porto 2, bidirecional. Nas operações de acesso à memória externa, suporta os oito bits mais significativos do endereço (A15 a A8).
- P3.7 a P3.0: Porto 3, bidirecional. Alternativamente, todos os pinos deste porto podem ser utilizados para funções especiais reservadas: RxD (P3.0): entrada de dados no modo de transmissão série; TxD (P3.1): saída de dados no modo de transmissão série; INT0 (P3.2): entrada de interrupção externa 0, ativa a nível baixo; INT1 (P3.3): entrada de interrupção externa 1, ativa a nível baixo; T0 (P3.4): entrada de excitação do Timer 0; T1 (P3.5): entrada de excitação do Timer 1; WR (P3.6): saída de controlo de operações de escrita em memória externa; RD (P3.7): saída de controlo de operações de leitura em memória externa.
Todos os portos são bidirecionais e podem ser utilizados como entradas ou saídas; as operações podem ser feitas bit a bit ou byte a byte. Contudo, convém notar que a utilização de qualquer linha de um porto como entrada implica que o último valor escrito no respetivo latch interno seja "1". Todos os portos, exceto o P0 (que apresenta uma configuração do tipo open-drain), apresentam pull-ups internos ligados a VCC e podem excitar até quatro entradas do tipo LS-TTL (oito, no caso do Porto 0).