







































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Microcontrolador
Tipologia: Notas de estudo
1 / 79
Esta página não é visível na pré-visualização
Não perca as partes importantes!








































































A figura abaixo mostra a diferença entre um microprocessador e um microcontrolador. O microprocessador (ou CPU) é o gerenciador de um sistema microcontrolado, possui internamente a unidade lógica aritmética (ULA), registradores e a unidade de controle (UC). O microprocessador necessita de unidades de memórias (ROM e/ou RAM) e de dispositivos de entrada e saída (I/O) para se comunicar com o ambiente externo. O microcontrolador é um dispositivo que possui internamente um microprocessador, unidades de memórias e interface com o mundo externo (porta serial, porta paralela, temporizadores). Na figura abaixo o retângulo marrom corresponde ao microprocessador e retângulo azul corresponde ao microcontrolador. O microcontrolador é utilizado para sistemas dedicados, tais como: injeção eletrônica, ignição eletrônica, computador de bordo, relógios microcontrolados, sistemas de automação. Num chão de fábrica é muito utilizado o CLP, sendo que este equipamento possui internamente um microcontrolador.
Existem vários microcontroladores disponíveis no mercado. Um dos mais utilizados se refere à família MCS-51. Estes microcontroladores possuem a vantagem de serem produzidos por vários fabricantes (Atmel, Philips, Texas...) que mantém núcleo base (core) e diferem em outras características: uns apresentam conversores analógicos digitais (A/D), outros variam na quantidade de memória, no tipo de memória (flash, eeprom ), uns possuem PWM, comunicação SPI, I^2 C, Ethernet, clocks que variam de 2 a 100 MHz.
O contador de endereço do 80C51 (PC) é de 16 bits, portanto pode ser adicionado até:
64 Kbytes de memória de dados (Pinos RD e WR) 64 Kbytes de memória de programa (Pino PSEN)
A habilitação da memória externa de programa é feita através do pino EA:
EA = 0 utiliza a memória externa de programa (até 64 Kbytes) EA =1 utiliza a princípio a memória interna (4 Kbytes) e depois a memória externa.
Para o uso de memórias externas, os seguintes pinos devem ser utilizados:
Pino 17 (RD) – utilizado para leitura na memória de dados (RAM) externa. Pino 16 (WR) – utilizado para escrita na memória de dados (RAM) externa. Pino 29 (PSEN) – utilizado para leitura na memória de programa (ROM) externa. Pino 30 (ALE) – sinal para demultiplexar a porta P0 (enable latch). Pino 31 (EA) – habilita o acesso externo da memória de programa (external Access) Pinos de 1 a 8 (porta 0) – bus multiplexado endereços (A0-A7) e dados (D0-D7). Pinos de 21 a 28 (porta 2) – contém os endereços de A8 a A15.
MOV A, R0 ; isto movimenta o valor que está em R0 do banco 0 (2Eh, no exemplo acima) para o acumulador (que é o principal registrador).
Neste comando teríamos:
(A) 2Eh os parênteses indicam que o valor no registrador A recebe o valor constante 2Eh.
Outra forma de acessar os valores nos registradores sem selecionar o banco seria através da sua posição de memória. Por exemplo, acessando o registrador R através de seu endereço:
MOV A, 00h ; isto movimenta o valor que está na posição de memória 00h (2Eh, no ;exemplo acima) para o acumulador (que é o principal registrador).
Neste comando teríamos:
(A) (00h)os parênteses indicam que o valor no registrador A recebe o valor que está na posição de memória 00h (que é 2Eh).
Exercício 1) Qual os valores que serão movidos para o acumulador quando for dada a instrução: MOV A, R
e como esses valores poderiam ser acessados pela posição de memória:
Se for selecionado o banco 0:_________ ou _______________ O banco 1:_________ ou _______________ O banco 2:_________ ou _______________ O banco 3:_________ ou _______________
Exercício 2) Qual os valores que serão movidos para o acumulador:
MOV A, 15h (A) MOV A, 0CH (A) MOV A, 06h (A) MOV A, 0Eh (A) MOV A, 2Eh (A)
O mapa abaixo mostra os registradores de funções especiais bem como os valores que eles assumem após o sinal de reset:
XXXXXXXX
00000000
00000000
00000000
00000000
00000000
00000000
0XXX
Pelo mapa, temos os endereços:
P0 - Porta 0, endereço 80h P1 - Porta 1, endereço 90h P2 – Porta 2, endereço A0h P3 – Porta 3, endereço B0h
SP (stack point) – pilha, endereço 81h DPTR – ponteiro para endereçar dados externos, é dividido em DPL (82h) e DPH (83h), como cada registro possui 8 bits, o DPTR possui 16 bits, sendo possível com isso acessar 64 Kbytes de memória externa. PCON – controle de potência, endereço 87h TCON – controle do timer/contador, endereço 88h TMOD – modo de controle do timer/contador, endereço 89h
Na família MCS51, cada ciclo de máquina possui 6 estados (de S1 a S6), cada estado possui 2 períodos do oscilador, portanto:
1 ciclo de máquina no 8051 possui 12 períodos de clock.
Se for utilizado um cristal de 12 MHz, o ciclo de máquina será:
Tciclo de máquina 1 μ
O 80C51 possui instruções de 1 ciclo de máquina – 1 byte (Ex.: inc A ); 2 ciclos de máquina – 2 bytes (Ex.: add a,#dado ) e 2 ciclos de máquina – 1 byte (Ex.: inc dptr ).
Abaixo é mostrado o diagrama de tempo da leitura da memória externa de programa:
Para leitura de memória externa de dados, o diagrama é mostrado abaixo:
Para iniciar o processamento, o microcontrolador necessita de um sinal de reset. Este sinal faz a CPU procurar o endereço 00h da memória de programa para iniciar o programa armazenado nela. Na família MCS51 este sinal corresponde a uma borda de descida no pino 9 (RST), que pode ser feita automaticamente através do seguinte esquema:
O valor do capacitor e do resistor pode ser calculado utilizando o tempo de carga no capacitor e considerando que seja necessário:
10 ms para estabilizar a tensão de alimentação 10 ms para partida do oscilador 24 períodos de clock para inicialização do sistema.
No diagrama de tempo, vr corresponde a tensão de referência (3,5 V – acima deste valor é considerado nível alto). Considerando que seja utilizado um cristal de 1 MHz, o período do clock será:
Portanto seria necessário um tempo de 20,024 ms (10 m + 10 m + 24 * 1 μs).
A tensão no capacitor é dada por:
t
−
Como o tempo t é conhecido (20,024 ms), será necessário assumir um valor para o
capacitor (C = 10 μF) e calcular o valor do Resistor:
3 6
− −
Valor comercial R = 6k8.
Neste caso o conteúdo de R0 (06h) é transformado em posição de memória, e o valor desta posição (B2h) é transferido para o acumulador, portanto A = B2h
(A) ((R0)) substituindo o conteúdo de R (A)(06h) substituindo o conteúdo da posição de memória 06h (A) B2h Note que para indicar esta operação deve existir o caractere @ antes dos registradores (ou R0 ou R1).
Endereçamento indexado : utilizado para leitura de dados em tabela ou memória externa de programa. A posição da memória é obtida por um endereço base + um índice. É utilizada a instrução MOVC. Ex:
Nos dois exemplos o acumulador é o índice e o endereço base é dado por DPTR ou PC.
No primeiro caso o conteúdo do acumulador é somado ao conteúdo do DPTR (endereço base), isto fornece a nova posição da memória, e o conteúdo desta nova posição é transferido para o acumulador.
Endereçamento específico : utilizado para transferir dados entre cpu e memória de dados externa. É utilizada a instrução MOVX. Ex:
MOVX A, @DPTR MOVX A, @Ri
O valor de DPTR é transformado em endereço e o conteúdo deste endereço é transferido ao acumulador
(A) ((DPTR)) (A) ((Ri))
Abreviaturas utilizadas:
A ou Acc acumulador, sendo A o registro e Acc o endereço direto, ou dir endereço da RAM interna Rn um dos registradores: R0, R1, R2, R3, R4, R5, R6 e R7. @Ri R0 ou R1, usado para endereçamento indireto.
A família MCS51 possui 111 instruções, sendo:
24 instruções aritméticas 25 instruções lógicas 28 instruções de transferência de dados 17 instruções booleanas 17 instruções de desvios
São instruções de soma, subtração, multiplicação, divisão, incremento e decremento:
As somas são todas realizadas entre acumulador e outro operando, e o resultado são sempre transferidos para o acumulador
comando byte s
CM C CA 0V descrição
ADD A, Rn 1 1
(A) (A) + (Rn) ADD A, direto
(^2 1) (A) (A) + (posição de memória) ADD A, @Ri (^1 1) (A) (A) + (conteúdo da posição indicado por Ri) ADD A, #dado 2 1 (A) (A) + valor do dado
Na tabela acima:
Bytes se referem ao número de posição que a instrução ocupa na memória de programa. Quantos menos bytes forem utilizados, menos memória de programa será utilizada. CM – ciclo de máquina – indica quantos ciclos de máquina à instrução utiliza. Lembre-se no 80C51 cada ciclo de máquina corresponde a 12 períodos de clock. Quanto menos ciclo de máquina utilizar, mais rápida será a execução do programa. C – flag de carry se estiver marcado com X, o flag será afetado. CA – flag de carry auxiliar. OV – flag de overflow.
Aqui o acumulador é somado com outro operando e com o flag de carry (que pode ser 1 ou 0):
comando byte s
CM C CA 0V descrição
ADDC A, Rn 1 1
(A) (A) + (Rn) + (C) ADDC A, direto 2 1 (A) (A) + (pos. de memória) + (C) ADDC A, @Ri 1 1 (A) (A) + (conteúdo da posição indicado por Ri) + (C) ADDC A, #dado 2 1 (A) (A) + (C) + valor do dado
É sempre incrementado de uma unidade o operando
comando byte s
CM C CA 0V descrição
INC Rn (^1 1) (Rn) (Rn) + 1 INC direto 2 1 (pos. memória) (pos.memória)+ INC @Ri 1 1 ((Ri)) ((Ri)) + 1
É sempre decrementado de uma unidade o operando
comando byte s
CM C CA 0V descrição
DEC Rn (^1 1) (Rn) (Rn) - 1 DEC direto 2 1 (pos. memória) (pos.memória)- DEC @Ri 1 1 ((Ri)) ((Ri)) - 1
Existe apenas incremento de 16 bits, não existe decremento de 16 bits
comando byte s
CM C CA 0V descrição
Instrução para operação em BCD. Válido apenas após as instruções ADD ou ADDC.
comando byte s
CM C CA 0V descrição
Converte o conteúdo do acumulador em BCD
Exemplo:
Supondo: A = 56h (0101 0110) representando o valor 56 BCD R1 = 6 (0110 0111) representando o valor 67 BCD C = 1 Se for feita a adição:
ADDC A, R1 ; soma o valor do acumulador com o valor de R1 + o carry, ; resultando em A = BEh, com AC = C = 0. DA A ; ajuste para BCD, A = 24h e C = 1.
São instruções que realizam as operações lógicas AND (E), OR (OU) e XOR (OU-EXCLUSIVO) entre o acumulador (ou uma posição de memória) e outro operando.
O resultado de uma operação AND só será verdadeiro (1) se os dois operandos forem verdadeiros (1). Ex:
resultado AND = 0101 0100
comando byte s
CM C CA 0V descrição
ANL A, Rn 1 1
(A) (A) AND (Rn) ANL A, direto (^2 1) (A) (A) AND (direto) ANL A, @Ri (^1 1) (A) (A) AND ((Ri)) ANL A, # dado (^2 1) (A) (A) AND dado ANL direto, A 2 1
(direto) (direto) AND (A) ANL direto, #dado
(^3 2) (direto) (direto) AND (dado)
O resultado de uma operação OR será verdadeiro (1) se um dos dois operandos for verdadeiro (1). Ex:
resultado OR = 0111 1101
comando byte s
CM C CA 0V descrição
ORL A, Rn 1 1
(A) (A) OR (Rn) ORL A, direto 2 1 (A) (A) OR (direto) ORL A, @Ri (^1 1) (A) (A) OR ((Ri)) ORL A, # dado 2 1 (A) (A) OR dado ORL direto, A 2 1
(direto) (direto) OR (A) ORL direto, #dado
3 2 (direto) (direto) OR (dado)
O resultado de uma operação XOR será verdadeiro (1) se um dos operandos for verdadeiro (1) e o outro operando for falso (0). Ex:
0101 1100 0111 0101 resultado OR = 0010 1001
É a troca de conteúdo entre os operandos:
comando byte s
CM C CA 0V descrição
XCH A, Rn 1 1
(A) (Rn) e (Rn) (A) XCH A, direto 2 1 (A)(direto)e (direto) (A) XCH A, @Ri (^1 1) (A)((Ri) e ((Ri)) (A)
As transferências de dados permitidas são mostradas na tabela abaixo:
comando byte s
CM C CA 0V descrição
MOV A, Rn 1 1
(A) (Rn) MOV A, direto (^2 1) (A) (direto) MOV A, @Ri 1 1 (A) ((Ri)) MOV A, #dado (^2 1) (A) dado
MOV Rn, A (^1 1) (Rn) (A) MOV Rn, direto (^2 2) (Rn) (direto) MOV Rn, #dado (^2 1) (Rn) dado
MOV direto, A 2 1 (direto) (A) MOV direto, Rn (^2 2) (direto) (Rn) MOV direto, direto
3 2 (direto) (direto)
MOV direto, @Ri (^2 2) (direto) ((Ri)) MOV direto, #dado (^3 2) (direto) dado
MOV @Ri, A 1 2 ((Ri)) (A) MOV @Ri, direto (^2 2) ((Ri)) (direto) MOV @Ri, #dado 2 1 ((Ri)) dado
MOV DPTR, #da16 3 2 Move p/ DPTR o dado de 16 bits
Nota-se pela tabela acima que com o acumulador e com o endereço de memória são possíveis todas as transferências de dados. O mesmo não ocorre com os registradores, por exemplo, não é permitida a instrução: MOV R1, R4, isto é, não é permitido mover o conteúdo entre registradores.
Esta troca ocorre entre os nibbles baixo do acumulador e a memória interna
comando byte s
CM C CA 0V descrição
XCHD A, @Ri 1 1 - - -
comando byte s
CM C CA 0V descrição
PUSH direto 2 2 - - - Armazena o conteúdo na pilha POP direto 2 2 - - - Tira o conteúdo da pilha
Para guardar ou retirar o conteúdo do acumulador na pilha, deve-se colocar o endereço do acumulador (Acc). Ex: PUSH ACC POP ACC
É possível fazer a transferência de dados usando endereçamento de 16 bits (DPTR), ou com endereçamento de 8 bits (@Ri). A instrução utilizada neste caso é MOVX:
comando byte s
CM C CA 0V descrição
MOVX A, @Ri 1 2 - - - Leitura da memória externa MOVX A, @DPTR 1 2 - - - Leitura da memória externa MOVX @Ri, A 1 2 - - - Escrita em memória MOVX @DPTR, A 1 2 - - - Escrita em memória
Também, é possível fazer a transferência de dados usando endereçamento de 16 bits (DPTR), ou com endereçamento de 8 bits (@Ri). A instrução utilizada neste caso é MOVC:
comando byte s
CM C CA 0V descrição
MOVC A, @A+DPTR 1 2 - - - Leitura da memória externa MOVC A, @A + PC 1 2 - - - Leitura da memória externa