You are on page 1of 31

DEPARTAMENTO DE ELECTROTECNIA

SISTEMAS DIGITAIS

µControladores da Família 51

João Paulo Baptista


1 Família de Micro Controladores 8051
O 8051 é um µControlador de 8 bits desenvolvido originalmente pela INTEL em 1980. Trata-se sem
dúvida do núcleo de µControlador mais popular em todo o mundo, sendo desenvolvido por um grande
número de fabricantes que lhe vão introduzindo ao longo do tempo novos melhoramentos essencialmente
no que diz respeito aos periféricos que lhe estão associados.

Um 8051 típico contém:


• CPU com processador booleano
• 6 fontes de interrupção com possibilidade de diferentes níveis de prioridade
• 2 temporizadores / contadores de 16 bits
• Porto de comunicação série, com taxas de comunicação programáveis
• RAM de dados interna
• ROM / EPROM / EEPROM / FLASH interna para armazenamento de programa (não existente
em alguns modelos)

O conjunto de instruções do 8051 encontra-se optimizado para as operações ao bit permitindo uma mais
fácil implementação de software de controlo em tempo real. O processador booleano fornece suporte
directo para a manipulação de bits, conduzindo a programas mais eficientes no que toca às operações de
entrada e saída de dados tão importantes na resolução de problemas de controlo digital.

2 Arquitectura Base
A fig. 1 apresenta a arquitectura base dos µControladores da família 51.

Figura 1: Diagrama de blocos dos µCs da família 51

• CPU – unidde de processamento central.


• Memória de Programa – memória interna destinada a armazenar o código correspondente ao
programa a executar pelo µC. Esta memória pode não existir em alguns modelos de µC.
• Memória de Dados – memória interna destinada ao armazenamento de dados.

1
• Controlo de Interrupções – permite a detecção e consequente processamento de um conjunto
de sinais de interrupção externos e internos.
• Timer 0 e Timer 1 – temporizadores / contadores de 16 bits que podem ser activados a partir do
exterior.
• Porto Série – dispositivo implementado por uma UART (Universal Assynchronous Receiver
Transmiter) permitindo efectuar comunicações série com o exterior.
• Portos de I/O – conjunto de 4 portos paralelos para o interface com o exterior. Dois destes
portos podem ser usados para implementar barramentos de acesso a dispositivos de memória
exteriores.
• Controlo do Barramento – quando é utilizada memória externa ao mC, este bloco contém o
hardware necessário para o controlo das transferências de informação.
• Oscilador – permite gerar os sinais de relógio necessários ao funcionamento do µC.

3 ‘PinOut’ do µControlador
Na fig. 2 mostram-se duas caixas possíveis para este µC.

Figura 2 – Duas caixas possíveis para o µControlador

4 Sistema de Memória
Como já foi referido no parágrafo 2, os diferentes elementos da família 51 dispõe de memória interna de
dados e, na maior parte das vezes, de memória interna de programa. Alguns exemplos de µCs desta
família:

2
µControlador Mem. Programa Mem. Programa Mem. de Dados Mem. de Dados
Interna (bytes) Externa (bytes) Interna (bytes) Externa (bytes)
80C31 0 Até 64K 256 Até 64k
87C51 4K (EPROM) Até 64K 256 Até 64k
8051 4K (ROM) Até 64K 256 Até 64k
89C51 4K (Flash) Até 64K 384 Até 64k
89C51RD2 64K (Flash) Até 64K 384 Até 64k
89C2051 2K (Flash) 0 256 0

Tabela 1

De notar que nestes µCs, o espaço de endereçamento da memória de programa é totalmente distinto do
espaço de endereçamento da memória de dados, o que permite, com um barramento de endereços de 16
bits, obter 64K bytes de programa mais 64K bytes de dados. Comparando com o Z80, em que estes dois
espaços de endereçamento se sobrepõe (64K programa + dados), este µC consegue endereçar o dobro de
memória.

A razão de ser deste aumento do espaço de endereçamento tem a ver com o barramento de controlo do
8051. No processador Z80, conforme foi estudado anteriormente, o barramento de controlo para o acesso
às memórias dispõe unicamente de um sinal de escrita (WR) e de um de leitura (RD). Estes sinais são
utilizados quer se esteja a fazer um acesso à memória de programa quer se esteja a aceder à memória de
dados. No caso dos µCs 51, existe uma distinção entre o barramento de controlo para a memória de
programa (PSEN) e o barramento de controlo para a memória de dados (WR e RD). Este duplo
barramento aliado à existência de instruções específicas para acesso a cada uma daquelas zonas de
memória, permite a duplicação da capacidade de endereçamento nestes µControladores.

4.1 Memória de Programa


Os µCs da família 51 têm capacidade para endereçar um total de 64K bytes de memória de programa.
Esta memória pode estar fisicamente situada
• no interior do µC
• no interior e no exterior do µC
• no exterior do µC

Como foi referido na Tabela 1, a quantidade de memória de programa existente no interior do µC


depende do modelo que se está a utilizar. Normalmente este valor pode variar entre 0 (p. ex. 8031) e 64K
bytes (p. ex. T89C51RD2).

Quando é utilizada memória externa de programa ou de dados, a comunicação com os dispositivos de


memória é feita à custa de 3 barramentos:
• Barramento de Endereços, com 16 bits, implementado fisicamente a partir dos Portos 0 e 2 do
µC.
• Barramento de Dados, com 8 bits, implementado fisicamente a partir do Porto 0 do µC.
• Barramento de Controlo que é constituído pelos sinais PSEN (pino 29) e ALE (pino 30). O
PSEN é o sinal de leitura da memória de programa. A função do ALE será analisada num
parágrafo posterior.

3
Como se pode ver, os barramentos de endereços e de dados partilham um porto do 51 – Porto 0. Este
processo de partilha será analisado mais à frente no parágrafo que diz respeito à Multiplexagem de
Barramentos.

Ainda em relação ao acesso à memória de programa, o sinal EA (pino 31) permite-nos indicar ao µC se a
memória de programa está no seu interior ou no seu exterior. Assim, se EA estiver ligado a VCC (nível
lógico 1) o µC faz a pesquisa das instruções de programa a partir da sua memória interna de programa. Se
EA estiver ligado ao nível lógico 0 (VSS), a pesquisa é feita da memória externa de programa, através dos
barramentos descritos anteriormente.

De notar que, mesmo que exista uma certa quantidade de memória interna de programa, é sempre
possível fazer a sua expansão até 64K utilizando memória externa. Neste caso EA deverá ser colocado a 1
para permitir aceder à memória interna. O µC é capaz de detectar quando é feito um acesso a um
endereço da memória externa, colocando automaticamente em funcionamento os barramento para que a
instrução possa ser pesquisada do exterior.

Como se pode ver na Tabela 1, há alguns µCs desta família que não permitem a expansão de memória. É
o caso do 89C2051 que dispõe internamente de 2K bytes de memória de programa mas que, devido à sua
construção, não apresenta os Portos 0 e 2, impossibilitando por isso a implementação dos barramentos de
acesso ao exterior.

4.2 Memória de Dados


Relativamente à memória de dados, os µCs da família 51 dispõe de 256 (384) bytes de RAM interna,
permitindo ainda a implementação de 64K bytes no seu exterior. Em alguns elementos da família é
possível encontrar ainda 64 a 2K bytes de memória com tecnologia E2Prom para o armazenamento de
dados que necessitam de retenção em caso de falha de alimentação.

4.2.1 Memória de Dados Interna


Como se mostra na fig. 3, a memória interna de dados é FFh FFh
constituída por 2 ou 3 espaços de endereçamento. A
Endereçamento Endereçamento
existência do 3º espaço de endereçamento, que aparece indirecto directo
a tracejado na figura, depende do modelo do µC. (uso geral) (SFRs)

80h 80h
O primeiro espaço é constituído por 128 bytes
(endereços 0 a 127) e destina-se ao armazenamento de 7Fh
operandos necessários ao processo computacional. Cada Endereçamento
directo e
uma das posições de memória pode ser endereçada indirecto
directa ou indirectamente, isto é, a operação de leitura (uso geral)
ou escrita pode ser feita especificando o endereço ao 00h
qual se vai aceder ou especificando um registo no qual
existe o endereço que vai ser acedido.

Os 128 bytes mais altos do espaço de endereçamento Figura 3 – Memória Interna de Dados
são, em alguns modelos de µCs, partilhados por 2
blocos de memória. A única diferença existente entre estes 2 blocos tem a ver com o processo de
endereçamento. Num deles, que existe em todos os µCs e que contém os registos de função especial

4
(SFRs), o acesso é feito utilizando endereçamento directo. O outro bloco, cujas posições se destinam a
uso genérico, só pode ser acedido utilizando
endereçamento indirecto.
Figura 4 - Memória Interna de Dados
Os 128 bytes mais baixos da memória interna de
dados do 8051 estão representados na fig. 4.

Bancos de registos: as primeiras 32


posições de memória estão organizadas em 4
bancos de registos, cada um deles com 8
registos (R0, R1, ..., R7). A selecção de cada
um destes bancos é feita a partir dos bits RS0
e RS1 do registo PSW.

Zona endereçável ao bit: as 16 posições de


memória seguintes, endereços 20h a 2Fh
podem ser endereçadas ao bit. Os endereços Figura 4 – Memória interna de dados (0 – 7F)
de bit utilizados no endereçamento podem
variar entre 0 e 127 (0 é o bit menos significativo da posição de memória 20h e 127 o bit mais
significativo da posição de memória 2Fh).

Início da stack: quando é feito o reset do µC, o ponteiro da stack é inicializado com o valor 07h.
Isto quer dizer que a estrutura de stack irá crescer a partir desta posição de memória o que obriga,
se não quisermos alterar o seu início, a ter certos cuidados na declaração das variáveis a utilizar no
programa.

Na zona superior da memória interna de dados encontram-se os registos de função especial – SFRs. Estas
posições de memória, que podem ser acedidas unicamente por endereçamento directo, estão ligadas ao
hardware do µC. Na figura seguinte pode ser visto o conjunto base de SFRs.

Figura 5 – Mapa de memória dos SFRs

5
De notar que nesta zona de memória só os endereços correspondentes aos SFRs se encontram
descodificados pelo que não deve ser tentado qualquer acesso às restantes posições de memória.

Ainda nesta zona de memória, todos os SFRs cujo endereço termine em 0 ou 8 podem ser acedidos ao bit.

Os diferentes registos de função especial podem ser agrupados de acordo com as suas funcionalidades:

Registos Aritméticos
o Registo B B
o Acumulador ACC
o Registo de Estados PSW

Ponteiros
o Ponteiro da Stack SP
o Ponteiro de Dados DPH
DPL

Portos Paralelos de E/S de Dados


o Porto 0 P0
o Porto 1 P1
o Porto 2 P2
o Porto 3 P3

Sistema de Interrupções
o Controlo de Prioridade IPC
o Enable de Interrupções IEC

Temporizadores / Contadores
o Modo de funcionamento TMOD
o Controlo TCON
o Timer 0 TH0
TL0
o Timer 1 TH1
TL1

Porto Série
o Controlo da Com. Série SCON
o Buffer da Com. Série SBUF

Outras Funções
o Controlo de Potência PCON

Acumulador - Registo ligado à ALU do µC. Embora o nome deste registo seja ACC, as mnemónicas das
instruções que o usam especificamente referem-se ao acumulador como A.

Registo B - Este registo é usado especialmente nas operações de multiplicação e divisão. Fora destas
operações pode ser utilizado como um registo de uso normal.

6
Registo de Estados – o registo PSW contém informações sobre o estado do programa. A sua
constituição encontra-se na figura seguinte.

Bit Símbolo Função


PSW.7 CY Flag de Carry
PSW.6 AC Flag de Carry auxiliar (para operações em BCD)
PSW.5 F0 Flag de uso geral
PSW.4 RS1 Bits de selecção do banco de registos da memória
PSW.3 RS0 interna de dados
PSW.2 OV Flag de overflow
PSW.1 -- Flag definida pelo utilizador
PSW.0 P Flag de paridade par do Acumulador
Figura 6 – Registo de Estados (PSW)

Ponteiro da Stack – trata-se de um registo de 8 bits cujo em cada instante contém o endereço do topo da
estrutura de stack. Este ponteiro é incrementado antes de os dados serem guardados durante a execução
de instruções de PUSH e CALL, e decrementado depois da recuperação dos dados durante a execução de
instruções de POP e RETURN.

Ponteiro de Dados – o ponteiro DPTR é constituído por um byte mais significativo DPH e um byte
menos significativo DPL. Este registo destina-se a conter um endereço de 16 bits para acesso indirecto às
memórias de programa e de dados.

Portos 0 a 3 – portos de entrada / saída de dados, num total de 32 bits programáveis individualmente
como entrada ou saída de dados.

Buffer de Comunicação Série – registo SBUF, composto por 2 registos separados que constituem o
buffer de transmissão e o buffer de recepção, permitindo uma comunicação em full-duplex.

Temporizadores / Contadores – pares de registos (TH0, TL0) e (TH1, TL1) que constituem os dois
temporizadores / contadores de 16 bits disponíveis no µC.

Registos de Controlo – os registos de função especial IP, IE, TMOD, TCON, SCON e PCON contém
bits de controlo e de estados para o sistema de interrupções, temporizadores / contadores e porto série.

4.2.2 Memória de dados externa


Em aplicações onde seja necessário utilizar uma quantidade de memória de dados superior à existente no
interior do µC, é sempre possível adicionar memória externa de dados até um máximo de 64 Kbytes. No
parágrafo seguinte será explicada a interligação entre diferentes tipos de memória externa e o 8051.

7
4.3 Multiplexagem de Barramentos
Como foi visto no parágrafo anterior, nos µCs da família 51 que dispõe de barramentos para acesso a
memória externa, o barramento de dados é partilhado com os 8 bits menos significativos do barramento
de endereços através de um processo que se designa por multiplexagem de barramentos. Esta multiplexagem
no tempo permite que, durante uma primeira fase do acesso ao exterior, o Porto 0 contenha os 8 bits
menos significativos do endereço e, numa segunda fase, o barramento é comutado para conter os dados
que vão ser transferidos (lidos ou escritos). Este processo pode ser analisado na fig. 7 na qual se mostra a
evolução dos barramentos e sinais de controlo numa operação de escrita na memória externa de dados.

ALE

WR

P0 Endereço A0..7 Dados D0..7

P2 Endereço A8..15

Figura 7 – Escrita na memória externa de dados

No início do processo de escrita, os Portos P0 e P2 contem o endereço da posição de memória a aceder.


O sinal de controlo ALE (Address Latch Enable) é activado para sinalizar que no porto 0 se encontram os 8
bits menos significativos do endereço. De seguida o conteúdo de P0 é comutado passando a conter os
dados a serem escritos. Nesta altura é activado o sinal WR que vai efectuar a escrita daqueles dados no
dispositivo de memória.

Nas figuras 8 e 9 pode ser vista a evolução dos barramentos e sinais de controlo em operações de leitura
da memória externa de dados e de leitura de código da memória externa de programa
.
ALE

RD

P0 Endereço A0..7 Dados D0..7

P2 Endereço A8..15

Figura 8 – Leitura da memória externa de dados

ALE

PSEN

P0 PC0 .. 7 Código D0..7

P2 PC8 ..15

Figura 9 – Leitura de código da memória externa de programa

8
Como já é sabido, para que possa ser feita uma operação de leitura ou escrita num dispositivo de memória,
é necessário que o barramento de endereços permaneça estável durante todo o processo. Analisando os
casos anteriores, podemos verificar que os 8 bits menos significativos daquele barramento são retirados do
porto 0 para dar lugar aos dados. É então necessário adicionar algum hardware externo para que possa ser
feira a memorização de A0..7. Isto é feito com o circuito que se apresenta na figura 10 onde pode ser vista
a utilização de uma latch (p. ex. 74HCT573) que permite a memorização dos 8 bits menos significativos do
endereço sempre que é activado o sinal ALE.

AD0..7 8

8051 Mem Prog


8 A0..7

Latch
P0 A0..7

D0..7
ALE
A8..15 8
P2 A8..15
PSEN OE

RD Mem Dados
WR A0..7
D0..7
A8..15

OE
WE

Figura 10– Interligação do 8051 com memória externa

Embora estes µCs disponham de um barramento externo de endereços de 16 bits, a existência de


diferentes barramentos de controlo para memória de programa (PSEN) e memória de dados (RD, WR)
permite o endereçamento de um total 128K bytes (64K de programa + 64K de dados). A activação de
cada um destes barramentos tem a ver com a execução de instruções próprias para cada um dos acessos.
Assim, por exemplo, a instrução MOVC acede à memória de programa enquanto que a instrução MOVX
permite aceder à memória externa de dados.

5 Portos de Entrada / Saída de Dados


O µC8051 disponibiliza 4 portos de E/S de 8 bits cada, num total de 32 bits programáveis
individualmente como entrada ou saída. Cada um destes bits é constituído por um FF D, um driver de
saída e um buffer de entrada. O acesso a estes portos é feito através dos SFRs P0 a P3.

Os drivers de saída dos portos 0 e 2 e o buffer de entrada do porto 0 podem ser utilizados no acesso à
memória externa utilizando o processo de multiplexagem de barramentos analisado no parágrafo anterior.

Os 8 bits que fazem parte do porto 3 disponibilizam, para além da normal E/S de dados, uma segunda
função:

P3.0 RxD (linha de recepção de dados do porto série)


P3.1 TxD (linha de transmissão de dados do porto série)
P3.2 INT0 (entrada de interrupção externa)
P3.3 INT1 (entrada de interrupção externa)
P3.4 T0 (entrada de relógio para o temporizador / contador 0)
P3.5 T1 (entrada de relógio para o temporizador / contador 1)

9
P3.6 WR (sinal de escrita na memória externa de dados)
P3.7 RD (sinal de leitura na memória externa de dados)

5.1 Porto 0
Na fig. 11 está representado o hardware
correspondente a um bit do Porto 0.
Podemos identificar a latch onde podem
ser escritos os dados a enviar para a saída,
o driver de saída e o buffer de entrada.
De notar ainda a existência de um
multiplexador que é comutado sempre
que é necessário activar o barramento
externo para operações de acesso a
memória.

Em operações de barramento este porto


apresenta um driver de saída que pode ter 3 Figura 11 – Hardware de um bit do Porto 0
estados possíveis: 0, 1 e HiZ (alta
impedância)

Em operações de E/S de dados existem duas hipóteses possíveis:


Operação de Entrada de Dados: neste caso deve ser escrito um 1 na latch do porto. Desta
maneira os fets do andar de saída são colocados no estado OFF e o porto fica em alta impedância
permitindo assim a operação de entrada de dados.
Operação de Saída de Dados: dado que o fet superior do andar de saída só entra em estado ON
nas operações de barramento, o Porto 0, como saída de dados, possui um driver em dreno aberto.
Isto obriga à utilização de resistências de pull-up no exterior para poder ser garantido o nível
lógico 1.

5.2 Porto 1
A figura ao lado representa o hardware associado a um
bit do Porto 1. A sua estrutura é bastante mais simples
do que a dos restantes portos dado que este porto não
possui segundas funções. Trata-se única e
exclusivamente de um porto de E/S de dados.

Relativamente ao Porto 0, umas das diferenças tem a


ver com a constituição do driver de saída. Neste caso o
fet superior é substituído por um pull-up que apresenta
uma resistência de 20K a 40K.
Figura 12 – Hardware de um bit do Porto 1

Operação de Entrada de Dados: para programar o bit do porto com entrada de dados é
necessário escrever um 1 na latch de dados de maneira a que o fet inferior seja colocado no
estado OFF. De notar que os diferentes bits deste porto, quando programados como entrada, não
apresentam alta impedância devido à existência do pull-up interno.

10
Operação de Saída de Dados: a escrita de um 0 na latch de dados coloca em condução o fet do
driver de saída ligando à massa o pino exterior. A escrita de um 1 na mesma latch coloca o fet em
estado OFF colocando o pino do porto ligado a VDD através do pull-up interno. De notar ainda
que, quando se processa uma transição de 0 para 1 no bit de saída, o pull-up é curto circuitado
durante 2 períodos de relógio de maneira a reduzir a 0 a constante de tempo de carga dos
circuitos externos e consequentemente reduzir praticamente a 0 o tempo de subida do sinal no
pino do µC.

5.3 Porto 2
O hardware de um bit do Porto 2 está
representado na fig. 13.

Este porto apresenta um drive de saída


semelhante ao existente no Porto 1 e, dado
que uma das suas funções é colocar no
exterior os 8 bits mais significativos do
endereço nas operações de acesso à
memória externa, possui também um
multiplexador como acontecia com o
porto 0.
Figura 13 - Hardware de um bit do Porto 2
Os processos ligados às operações de E/S de dados são iguais aos descritos para o Porto 1.

5.4 Porto 3
O hardware que implementa os diferentes bits do
Porto 3 do µC8051 é idêntico ao apresentado para
os Portos 1 e 2. A diferença existente tem a ver
com a possibilidade de os bits deste Porto poderem
apresentar funções alternativas como se referiu no
início do parágrafo 5. Estes sinais, que podem estar
ligados à UART (TxD, RxD), ao sistema de
interrupções (INT0, INT1), aos temporizadores /
contadores (T0, T1) e à unidade de controlo (WR,
RD), são lidos ou escritos através das linhas que se
apresentam na fig. 14.
Figura 14 - Hardware de um bit do Porto 3
De notar que neste porto podem coexistir, em
funcionamento normal, bits de E/S e bits com funções especiais. Em termos de operações de E/S, o
funcionamento é o mesmo que foi visto para os Portos 1 e 2.

11
6 Temporizadores / Contadores
Os µCs da família 51 possuem pelo menos 2 temporizadores / contadores de 16 bits, Timer 0 e Timer 1.
podendo ser cada um deles configurado para funcionar como temporizador ou como contador de
eventos. Os registos físicos que implementam o T/C 0 (TH0 e TL0) e o T/C 1 (TH1 e Tl1) estão
mapeados na zona de memória dos SFRs.

No modo de temporizador os registos são incrementados em cada ciclo máquina através de um sinal
obtido do oscilador interno do µC e cuja frequência é fosc/12.
No modo de funcionamento de contador, os registos são incrementados no flanco descendente do sinal
que é introduzido nos pinos T0 (para o T/C 0)e T1 (para o T/C 1). Neste caso, o método de amostragem
do sinal de entrada, que necessita de 2 ciclos máquina para reconhecer uma transição de 1 para 0, limita a
frequência do sinal de entrada a fosc/24.

6.1 Registo TMOD

GATE Quando este bit está igual a 1, o Timer/Counter x só funciona se o pino exterior
INTx e o bit de controlo TRx estiverem a nível lógico 1.
Quando este bit for igual a 0, o Timer/Counter x funciona se TRx=1.
C/T =1 permite o funcionamento do Timer/Counter x como contador utilizando para
isso o sinal introduzido a partir do pino exterior Tx
=0 permite o funcionamento do Timer/Counter x como temporizador utilizando
para isso o sinal resultante do oscilador interno (fosc÷12)

M1 M0 Modo de Funcionamento
0 0 T/C de 8 bits crescente com um prescaler de 5 bits (÷32)
0 1 T/C crescente de 16 bits (THx + TLx)
1 0 T/C crescente de 8 bits (TLx) com recarga (THx)
1 1 O T/C 0 funciona como 2 T/Cs independentes de 8 bits (TH0 e TL0)
Este modo de funcionamento para o T/C 1 serve unicamente para parar o seu
funcionamento
Figura 15 – Registo para definição do modo de funcionamento dos T/Cs

12
6.2 Registo TCON

Bit Símbolo Função


TCON.7 TF1 Flag que sinaliza o overflow do T/C 1. Esta flag é automaticamente colocada a
0 quando o processador entra na rotina de atendimento da interrupção. Pode
também ser colocada a 0 por software.
TCON.6 TR1 0 - T/C 1 parado 1 - T/C 1 em funcionamento
TCON.5 TF0 Flag que sinaliza o overflow do T/C 0. Esta flag é automaticamente colocada a
0 quando o processador entra na rotina de atendimento da interrupção. Pode
também ser colocada a 0 por software.
TCON.4 TR0 0 - T/C 0 parado 1 - T/C 0 em funcionamento
TCON.3 IE1 Flag de enable da interrupção externa INT1
TCON.2 IT1 0 – Interrupção externa INT1 activada pelo nível 0
1 – Interrupção externa INT1 activada por flanco descendente
TCON.1 IE0 Flag de enable da interrupção externa INT0
TCON.0 IT0 0 – Interrupção externa INT0 activada pelo nível 0
1 – Interrupção externa INT0 activada por flanco descendente
Figura 16 – Registo de controlo dos T/Cs

6.3 Funcionamento dos Temporizadores / Contadores


Os 2 temporizadores / contadores, T/C 0 eT/C 1, podem funcionar quer como temporizadores quer
como contadores de eventos. Estas duas funções podem ser escolhidas, para cada um deles, através dos
bits C/T do registo de função especial TMOD.
Cada um destes T/Cs dispõe de 4 modos de funcionamento. A selecção de um modo de funcionamento é
feita através dos bits M1 e M0 do registo TMOD. Os modos de funcionamento 0, 1 e 2 são iguais para os
dois T/Cs. No modo 3 os dois T/Cs apresentam diferenças de funcionamento. Nos parágrafos seguintes
são analisados os diferentes modos.

6.3.1 Modo 0
Programando qualquer um dos T/Cs em Modo 0 permite a implementação de um contador de 8 bits com
um divisor de frequência por 32. Este modo de funcionamento é mostrado, para o T/C 1, na fig. 17.

Em Modo 0 o T/C é configurado como um registo de 13 bits em que os 8 bits mais significativos são
implementados pelo registo TH1 e os 5 bits menos significativos pelo TL1. Neste último registo os 3 bits
mais significativos não são utilizados.

Como podemos ver na figura, os impulsos de contagem podem ter origem no oscilador interno ou no
pino exterior T1 dependendo do valor do bit T/C do registo TMOD. A entrada desses impulsos no
contador depende dos valores existentes em TR1, Gate e pino exterior INT1. Assim, se Gate=0 então o
ON/OFF do contador é controlado exclusivamente por TR1 (0=OFF, 1=ON). Se Gate=1 então a
chegada dos impulsos de contagem ao contador depende do valor de TR1 e do valor lógico aplicado ao

13
pino exterior INT1. Só existe contagem de impulsos se TR1=1 e se INT1=1. Isto permite o controlo
ON/OFF do contador a partir de um sinal exterior ao µC.

Figura 17 – T/C 1 programado em modo 0 (contador de 13 bits)

Quando se verifica o overflow do contador, é activada a flag TF1 que, como veremos mais à frente, está
ligada ao sistema de interrupções do µC.

Embora na fig. 17 esteja representado o T/C 1, tudo o que foi dito também se aplica ao T/C 0,
substituindo TL1 e TH1 por TL0 e TH0, TF1 por TF0, T1 por T0 e TR1 por TR0 e INT1 por INT0. Os
bits Gate e T/C terão que ser os correspondentes ao T/C 0 no registo TMOD.

6.3.2 Modo 1
O Modo 1 de funcionamento é igual ao Modo 0 com a única diferença de que o contador de 13 bits é
substituído por um contador de 16 bits. Neste caso todos os bits de TL1(0) estarão activos podendo então
ser efectuadas contagens entre 0000h e FFFFh. Os sinais de controlo são os mesmos apresentados no
parágrafo anterior.

6.3.3 Modo 2
O Modo 2 de funcionamento configura o T/C como um contador crescente de 8 bits (TL1) com recarga
automática, como se mostra na fig. 18.

Figura 18 – T/C 1 programado em Modo 2: contador de 8 bits com auto recarga

14
O overflow do contador TL1 não só activa a flag TF1 como também provoca a recarga de TL1 com o
valor contido em TH1. Este valor, carregado em TH1 por software, não é alterado após a operação de
recarga.

Este modo de funcionamento aplica-se igualmente ao T/C 0.

6.3.4 Modo 3
A programação do T/C 1 em Modo 3 provoca simplesmente a paragem do processo de contagem.

A programação em Modo 3 do T/C 0 configura-o como 2 contadores independentes de 8 bits (TL0 e


TH0) como se mostra na fig. 19.

Figura 19 – T/C 0 programado em Modo 3

Neste modo de programação, o contador TL0 utiliza os sinais de controlo do T/C 0: C/T, Gate, INT0,
TR0 e TF0. No que diz respeito ao contador implementado por TH0, os seus sinais de controlo são os
normalmente atribuídos ao T/C 1: TR1 e TF1. Estes sinais de controlo ficam assim indisponíveis para
serem utilizados pelo T/C 1. De notar que, neste modo de programação do T/C 0, a interrupção do T/C
1 é activada pelo overflow do contador TH0.

Este modo de funcionamento permite dotar uma aplicação com 3 temporizadores / contadores
independentes, embora fiquem diminuídas algumas funcionalidades do T/C 1. Contudo este T/C pode
ser parado não através de TR1 mas através da sua reprogramação em Modo 3, podendo ainda ser utilizado
em todas as aplicações que não necessitem de interrupções, incluindo como gerador de taxa de
transmissão para a UART como poderemos ver nos parágrafos seguintes.

7 Porto Série
O porto série que se encontra em todos os µCs da família 51 permite comunicações série síncronas e
assíncronas, utilizando para isso uma UART. No caso das comunicações assíncronas, estas podem ser
feitas em modo full-duplex. Na figura seguinte é apresentado um diagrama de blocos que descreve a
UART do µC.

15
Barramento Interno

8 8

SBUF SBUF
Registo de Transmissão Registo de Recepção
Gerador de
taxa de
8 8
transmissão

TI Shift-Register Shift-Register RI
de Transmissão de Recepção

TxD RxD
Figura 20 – Diagrama de blocos da UART

Neste diagrama de blocos podemos ver que a UART é constituída por duas zonas distintas que
correspondem à recepção de dados (à direita na figura) e à transmissão de dados (à esquerda na figura).
Estas duas zonas independentes partilham unicamente o sistema de relógio que permite gerar a taxa de
transmissão. Os dois registos SBUF, embora partilhem um endereço único na zona dos SFRs, são na
realidade implementados em hardware por registos independentes (um só de escrita e o outro só de
leitura).

7.1 Funcionamento em transmissão de dados


A escrita no registo SBUF de transmissão provoca a entrada em funcionamento da metade da UART
correspondente à transmissão de dados. Logo que é detectada a escrita neste registo, o seu valor é
transferido para o shift-register de transmissão começando imediatamente o processo de transmissão série
dos dados de acordo com a programação da UART. Os diferentes bits que fazem parte da trama a
transmitir são colocados sucessivamente no pino exterior TxD a uma taxa que é definida pelo gerador de
taxa de transmissão. Como veremos a seguir esta taxa é programável.
Logo que termina a transmissão da trama em questão, é activada a flag TI que está ligada ao sistema de
interrupções do µC podendo, se autorizada, gerar uma interrupção com o consequente processo inerente
a este tipo de evento.

7.2 Funcionamento em recepção de dados


Desde que activado, o sistema de recepção de dados faz uma amostragem do pino exterior RxD a uma
taxa 16 vezes superior à taxa de comunicação que foi definida. Logo que seja detectado um start bit
(transição de RxD de 1 para 0) é desencadeado todo o processo de leitura da informação que irá chegar
por RxD.

Após a detecção do flanco descendente do start bit, a UART retira 16 amostras consecutivas da
linha de recepção e, a partir das amostras 7, 8 e 9, correspondentes ao meio do bit, decide por
maioria se se trata ou não de um start bit. Este processo implementa uma detecção de falsos start
bits permitindo anular ruídos que surjam na linha, desde que estes não ultrapassem o tempo de
meio bit.
Para os restantes bits que compõe a trama, o processo é idêntico. São feitas 16 amostras do bit e a
decisão sobre a leitura de um 0 ou de um 1 é feita por maioria a partir das amostras 7, 8 e 9.

Após a determinação do valor de um novo bit, este é deslocado para dentro do shift-register de recepção.

16
Logo que tenha sido recebida a trama completa, se a flag RI=0, então a nova palavra é transferida para o
registo de recepção SBUF e é activada a flag RI. Esta flag, que está ligada ao sistema de interrupções do
µC, indica a recepção de uma nova palavra. O software implementado deve ler o registo SBUF e colocar a
0 a flag RI.
No caso de ter sido recebida uma nova palavra e a flag RI se encontrar em 1, o conteúdo do shift-register
de recepção não é passado para o SBUF ficando a palavra recebida provisoriamente armazenada no
próprio shift-register. Logo que seja detectada a passagem de RI a 0 é feita a sua transferência para o
SBUF de recepção. Isto quer dizer que o sistema de recepção da UART tem capacidade para armazenar
até 2 palavras sem que haja leitura por parte do CPU, constituindo aquilo que normalmente se designa por
um duplo buffer de recepção.

7.3 Registo de Controlo do Porto Série

SM0 e SM1 especificam o modo de funcionamento do porto série de acordo com a seguinte tabela:

SM0 SM1 Modo Funcionamento Taxa de comunicação


0 0 0 8 bits síncrono fosc/12
0 1 1 8 bits UART variável
1 0 2 9 bits UART fosc/64 ou fosc/32
1 1 3 9 bits UART variável

SM2 Bit de recepção condicional. Nos modos 2 e 3, se SM2=1, RI só será activada se o 9º bit
recebido for igual a 1. No modo 1, se SM2=1, a flag RI só é activada se for recebido um stop bit
válido.

REN Coloca em funcionamento o hardware de recepção da UART. Deve ser escrito por software um
1 para activar a unidade de recepção da UART, deve ser escrito um 0 para a sua desactivação.

TB8 9º bit a ser transmitido nos modos 2 e 3. Colocado em 0 ou 1 por software.

RB8 9º bit recebido nos modos 2 e 3. No modo 1, se SM2=0, RB8 contém o stop bit recebido.

TI Flag de transmissão concluída. É colocada em 1 pelo hardware quando termina a transmissão


do 8º bit no modo 0 ou quando começa a transmissão do stop bit nos restantes modos de
funcionamento. Deve ser colocada em 0 por software.

RI Flag de recepção completa. Colocada em 1 por hardware no final da recepção do 8 bit em modo
0 ou durante a recepção do stop bit nos restantes modos de funcionamento. Deve ser colocada
em 0 por software.

Figura 21 – Registo de Controlo do Porto Série (SCON)

17
7.4 Funcionamento em MODO 0
Trata-se de um modo de comunicação síncrona em que o sinal de sincronismo é emitido pelo µC quer na
transmissão quer na recepção. Neste modo de funcionamento os dados são transmitidos ou recebidos
através de RxD e o sinal de sincronismo é emitido através de TxD.

No processo de transmissão, logo que é detectada a escrita no registo SBUF a UART começa a efectuar a
transmissão dos 8 bits (primeiro o bit –sig) de acordo com o diagrama seguinte:

Figura 22 – Transmissão de dados em MODO 0

A recepção de uma palavra é iniciada, neste modo de funcionamento, pela condição REN=1 e RI=0.
Logo que esta condição se verifique, o µC começa a emitir o sinal de sincronismo para que o hardware
exterior comece a disponibilizar os diferentes bits que compõe a palavra. Este processo encontra-se
esquematizado no diagrama seguinte:

Figura 23 – Recepção de dados em MODO 0

Trata-se de uma comunicação feita a uma taxa fixa igual a fosc/12. Isto significa que, para um µC a
funcionar com uma frequência de relógio de 12 MHz, a comunicação será efectuada a 1 Mbit/s.

Este modo de funcionamento pode ser utilizado para uma expansão dos portos do µC utilizando um
processo de conversão paralelo / série (porto de entrada) ou série / paralelo (porto de saída).

7.5 Funcionamento em MODO 1


Neste modo de funcionamento a trama transmitida ou recebida é composta por 10 bits:

Start bit + 8 bits de dados + stop bit

Como em qualquer um dos outros modos de funcionamento, a transmissão é iniciada quando é efectuada
uma operação de escrita no registo SBUF. A partir deste momento a UART começa a colocar em TxD o
start bit, a seguir os 8 bits de dados (primeiro o –sig) e finalmente o stop bit.

O processo de recepção é iniciado sempre que, na amostragem que é feita à linha RxD, é encontrado um
start bit válido (ver 7.2). Quando isto acontece, as amostragens seguintes de RxD colocam os diferentes
bits da trama no shift-register de recepção, terminando o processo com a activação da flag RI (caso se
encontre em 0) e a transferência da palavra lida para o SBUF de recepção.

A taxa de comunicação neste modo de funcionamento é conseguida através do T/C1 que deve ser
programado em modo 2 (auto-reload). O valor com que deve ser carregado o registo de recarga (TH1) é
calculado através da seguinte fórmula:

18
2 SMOD Fosc
Taxa _ comunicação = *
32 12 * (256 − TH 1)

em que SMOD é o bit 7 do registo PCON.

Na tabela seguinte são indicadas algumas configurações possíveis para a obtenção de taxas de
comunicação normalizadas.

Timer 1
Taxa de comunicação fosc SMOD C/T Modo Valor de recarga
19200 bps 11.0592 MHz 1 0 2 FDh
9600 bps 11.0592 MHz 0 0 2 FDh
4800 bps 11.0592 MHz 0 0 2 FAh
2400 bps 11.0592 MHz 0 0 2 F4h
1200 bps 11.0592 MHz 0 0 2 E8h
Tabela 2 – Configurações para taxas de comunicação normalizadas

De notar que, tanto no modo 1 como no modo 3 de funcionamento, o T/C1 fica reservado para gerador
da taxa de comunicação, devendo ser desactivada a sua interrupção.

7.6 Funcionamento em MODO 2


Neste modo de funcionamento, a trama transmitida ou recebida é composta por 11 bits:

Start bit + 8 bits de dados + 9º bit + stop bit

O 9º bit da trama pode ser utilizado para controlo de erros de comunicação, p. ex. bit de paridade, ou para
a implementação do protocolo master-slave que será estudado num dos parágrafos seguintes.

A taxa de comunicação neste modo de funcionamento é dada por

2 SMOD
Taxa _ comunicação = * Fosc
64

7.7 Funcionamento em MODO 3


O modo 3 de funcionamento da UART utiliza uma trama igual à que foi descrita para o modo 2 e uma
taxa de comunicação que é obtida da maneira indicada para o modo 1.

7.8 Comunicações em Rede de µCs


Uma das maneiras mais simples de implementar uma rede de mCs é a utilização de um protocolo do tipo
Master-Slave. Neste tipo de protocolo existe uma disciplina muito rígida de acesso ao meio de
comunicação o que permite evitar colisões de informação e portanto uma grande simplificação nos
processos de comunicação.

Na figura seguinte representa-se uma rede de µCs que poderá funcionar com um protocolo deste tipo.

19
µC
Master

µC µC µC
Slave Slave Slave
1 2 n

Figura 24 – Rede de µCs master-slave

Num sistema deste tipo, qualquer comunicação só pode ser feita por iniciativa do sistema master. Para
isso, o µC master começa por enviar para a rede o endereço do dispositivo slave com quem quer
comunicar. Todos os slaves, que se encontram a “ouvir” a rede, recebem este endereço e só aquele a quem
o endereço diz respeito fica autorizado a estabelecer uma troca de dados com o master, ficando os
restantes à espera que seja lançado na linha um novo endereço.

Para que seja possível distinguir uma palavra de endereço de uma palavra de dados é normal utilizar o 9º
bit de dados da trama de comunicação. Desta maneira, se o 9º bit for 1 significa que a palavra contém um
endereço. Caso contrário, 9º bit igual a 0, a palavra contém dados para a comunicação entre o master e o
slave endereçado anteriormente. Em resumo, numa troca de informação entre o master e um slave, só a
primeira palavra emitida pelo master deve conter o 9º bit a 1. Todas as restantes palavras trocadas entre os
dois devem conter esse bit a 0.

Uma maneira eficiente de funcionar dentro de uma rede deste tipo é a utilização das interrupções ligadas
às UARTs dos µCs master e slave. Quer isto dizer que cada vez que uma nova palavra é enviada para a
linha, os µCs que se encontram a “ouvir” a linha serão interrompidos. É evidente que para os slaves que
não estão endereçados, a troca de mensagens entre o master e o slave endereçado não tem qualquer tipo
de interesse pelo que todas as interrupções sofridas poderiam ser evitadas.

Os µCs da família 51 dispõe de um mecanismo específico que permite resolver este problema e melhorar
o desempenho da rede onde se encontram inseridos. Este mecanismo tem a ver com a utilização do bit
SM2 existente no registo SCON. Quando a UART funciona em modo 2 ou 3 este bit, quando se encontra
activado, permite que só sejam recebidas palavras da linha série quando o 9º bit for igual a 1 e
consequentemente só será gerada uma interrupção ao CPU se isto acontecer. O processo de comunicação
na rede será o seguinte:

O master quando necessita de comunicar com um slave envia o seu endereço para a linha, com o
9º bit a 1.
Todos os slaves que devem estar à “escuta” da linha, e que tem SM2=1, são interrompidos
recebendo o endereço enviado pelo master e comparando-o com o seu próprio endereço.
O slave endereçado deve colocar o SM2=0 de maneira a conseguir receber por interrupção a
restante comunicação do master. SM2 será novamente colocado em 1 quando termina a troca de
informação.
Os slaves não endereçado devem manter o SM2=1. Desta maneira a troca de informação entre o
master e o slave endereçado não provocará interrupções no funcionamento do µC. Só quando for

20
emitido um novo endereço para a linha, no início de uma nova comunicação, é que existirá uma
nova interrupção do slave.

8 Sistema de Interrupções
O sistema base de interrupções dos µCs da família 51 é constituído por 6 fontes de interrupção, duas das
quais pertencem a um mesmo periférico (UART), e encontram-se representadas na figura seguinte.

Vector: 0003h

Vector: 000Bh

6 fontes de 5 níveis de
interrupção interrupção
Vector: 0013h

Vector: 001Bh

Vector: 0023h

Figura 25 – Sistema base de interrupções dos µCs da família 51

Podemos ver a existência de 6 fontes de interrupção sendo as duas últimas provenientes de um mesmo
periférico que é a UART. Estas 6 fontes dão origem a 5 diferentes níveis de interrupção, correspondendo
a cada um deles um determinado vector de interrupção localizado na memória de programa.

As interrupções externas INT0 e INT1 podem ser activadas por nível ou flanco dependendo do valor dos
bits IT0 e IT1 do registo TCON. As flags que provocam a interrupção são IE0 e IE1, pertencentes
também ao registo TCON. Para o caso das interrupções externas, se estiverem activas por flanco, as flags
IE0 e IE1 são colocadas a zero pelo hardware quando é feita a chamada à rotina de serviço da interrupção.
No caso de serem activadas por nível, o sofware da rotina de serviço da interrupção é responsável pela sua
colocação a zero.

As interrupções dos T/Cs são activadas sempre que se verifique uma situação de overflow dos
contadores, através da activação das respectivas flags TF0 e TF1. Estas flag são colocadas a zero pelo
hardware sempre que é feita a chamada à rotina de interrupção.

A interrupção do porto série é gerada a partir do OU lógico das flags TI (transmissão) e RI (recepção).
Dado que qualquer uma destas flags provoca a chamada da mesma rotina de atendimento, o hardware não
faz o seu reset para permitir o reconhecimento da origem da interrupção por parte do software de serviço.
Este reset deve ser feito pelo próprio software.

21
Qualquer uma das flags acima descritas pode ser colocada a 0 ou 1 por software, com os mesmos
resultados que seriam gerados se fossem desactivadas ou activadas pelo hardware, isto é, podem ser
geradas interrupções por software ou podem ser canceladas interrupções pendentes.

Cada uma destas interrupções pode ser permitida ou inibida a partir do registo IE que se descreve no
parágrafo seguinte.

8.1 Registo de Permissão das Interrupções

Bit Símbolo Função


IE.7 EA EA=0 inibe todas as interrupções independentemente do valor que possam ter os
bits de permissão individuais.
EA=1 permite o desencadear das interrupções cujos bits de permissão individual
estejam activados.
IE.6 ----- Reservado
IE.5 ----- Reservado
IE.4 ES Permite ou inibe as interrupções geradas pela UART.
IE.3 ET1 Permite ou inibe a interrupção gerada pelo overflow do T/C1.
IE.2 EX1 Permite ou inibe a interrupção gerada pela entrada externa INT1.
IE.1 ET0 Permite ou inibe a interrupção gerada pelo overflow do T/C0.
IE.0 EX0 Permite ou inibe a interrupção gerada pela entrada externa INT0.
Figura 26 – Registo de Permissão das Interrupções (IE)

8.2 Prioridades das Interrupções


A cada fonte de interrupção pode ser atribuído um de dois níveis de prioridade - prioridade baixa ou
prioridade alta, através do preenchimento dos respectivos bits do registo IP.

Bit Símbolo Função


IP.7 ----- Reservado
IP.6 ----- Reservado
IP.5 ----- Reservado
IP.4 PS Prioridade da interrupção gerada pela UART. PS=1 define prioridade elevada
IP.3 ET1 Prioridade da interrupção gerada pelo T/C1. PS=1 define prioridade elevada
IP.2 EX1 Prioridade da interrupção gerada por INT1. PS=1 define prioridade elevada
IP.1 ET0 Prioridade da interrupção gerada pelo T/C0. PS=1 define prioridade elevada
IP.0 EX0 Prioridade da interrupção gerada por INT0. PS=1 define prioridade elevada
Figura 27 – Registo de Prioridade das Interrupções (IP)

22
A rotina de serviço de uma interrupção de baixa prioridade pode ser interrompida por uma interrupção de
mais alta prioridade, mas não por uma interrupção de baixa prioridade. Uma rotina de serviço de alta
prioridade não pode ser interrompida por qualquer outra fonte de interrupção.

Se forem recebidos simultaneamente dois pedidos de interrupção de níveis de prioridade diferente, é


servido em primeiro lugar o pedido correspondente à interrupção de mais alta prioridade, sendo o outro
pedido servido quando terminar a rotina de serviço da interrupção mais prioritária.
No caso de termos pedidos simultâneos de periféricos com o mesmo nível de prioridade, o serviço das
interrupções é feito atendendo à sequência que se apresenta a seguir:

Fonte Prioridade dentro do mesmo nível


1. IE0 Prioridade mais alta
2. TF0
3. IE1
4. TF1
5. RI + TI Prioridade mais baixa

23
ANEXO

1 Conjunto de Instruções do 8051

As instruções assembly do 8051 devem ter o seguinte formato:

instrução [operando destino [, operando fonte]]

1.1 Endereçamento de Operandos

Endereçamento por registo


Endereçamento directo
Endereçamento indirecto por registo
Endereçamento imediato
Endereçamento indirecto por registo base + índex

Estes cinco métodos podem ser utilizados para o endereçamento dos operandos FONTE.

Os 3 primeiros podem ser utilizados para o endereçamento dos operandos DESTINO

1.1.1 Endereçamento por Registo


Permite o endereçamento dos 8 registos R0 .. R7 pertencentes ao actual banco de registos (definido pelo
PSW). Permite ainda aceder aos registos A, B, C (bit), AB, DPTR.

Ex:
MOV A,R2 MOV C,bit MOV DPTR,#dado(16)
MUL AB DIV AB

1.1.2 Endereçamento directo


Permite o acesso aos SFRs, aos bits dos SFRs e da RAM interna e aos bytes da RAM interna (endereços
entre 0 e 127).

Ex:

MOV A,P0 MOV A,60h CLR P0.5


MOV C,0

1
1.1.3 Endereçamento Indirecto por Registo
Permite o acesso à RAM interna de dados através dos registos R0 e R1 do actual banco de registos. Este
acesso também pode ser feito através do SP (Stack Pointer) com as instruções PUSH e POP.

Permite ainda o acesso à RAM externa de dados, também utilizando os registos R0 e R1.

Pode ainda ser utilizado o DPTR para o acesso à totalidade dos 64K bytes de RAM externa de dados.

Ex:
MOV A,@R0 MOV @R1,A PUSH A
MOVX A,@R0 MOVX @R1,A
MOVX A,@DPTR MOVX @DPTR,A

1.1.4 Endereçamento Imediato


O operando existe na própria instrução.

Ex:
MOV A,#26h

1.1.5 Endereçamento Indirecto por Registo Base + Registo Índex


Utilizado para o acesso a tabelas existentes na memória de programa

Ex:
MOVC A,@A+DPTR
MOVC A,@A+PC

2
2 Tabelas de Instruções

3
4
5
6

You might also like