Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Microcontroladores 8051, Notas de estudo de Mecatrônica

Microcontroladores 8051

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 26/06/2010

ederson-lima-12
ederson-lima-12 🇧🇷

5

(2)

10 documentos

1 / 33

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
EEL7030
A família de microcontroladores 8051
1 Comentários sobre microcontroladores
Um microcontrolador é um componente que tem, num único chip, além de uma CPU, elementos tais
como memórias ROM e RAM, temporizadores/contadores, PWM, conversor AD, canais de
comunicação e conversores analógico-digitais. Esta característica diferencia os sistemas baseados em
microcontroladores daqueles baseados em microprocessadores, onde normalmente se utilizam vários
componentes para implementar essas funções. Com isso, os microcontroladores permitem a
implementação de sistemas mais compactos e baratos do que aqueles baseados em
microprocessadores.
Em contrapartida, as CPUs dos microcontroladores são, menos poderosas do que os
microprocessadores. Seu conjunto de instruções costuma se limitar às instruções mais simples, sua
freqüência de clock é mais baixa e o espaço de memória endereçável costuma ser bem menor. Vê-se
daí que o campo de aplicação dos microcontroladores é diferente daquele dos microprocessadores, e
que um sistema que possa ser controlado por um microcontrolador tende a ter menor complexidade e
menor custo do que um sistema que exija a capacidade de processamento de um microprocessador.
Exemplos de sistemas onde os microcontroladores encontram aplicação incluem controle de
semáforos, balanças eletrônicas, microterminais, telefones públicos, controle de carregadores de
baterias, inversores eletrônicos, controles de acesso, taxímetros, sistemas de aquisição de dados de
manufatura e eletrodomésticos em geral.
A programação dos microcontroladores é mais simples do que a dos microprocessadores. Isto
acontece porque os periféricos on-chip dos microcontroladores são acessados de uma forma
padronizada e integrada na própria linguagem de programação, dispensando o conhecimento de
detalhes externos. Não se deve pensar, porém, que isto simplifique a tarefa do programador em todos
os níveis: é necessário que ele conheça bem o hardware conectado ao microcontrolador para poder
produzir programas que funcionem corretamente.
Cabe citar ainda uma vantagem particular dos microcontroladores que possuem memória ROM, que é
a possibilidade de armazenar programas internamente, dificultando sensivelmente a cópia ilícita do
código.
1.1 A família 8051 introduzida pela Intel
Diversos fabricantes produzem microcontroladores da família 8051 (Intel, AMD, Atmel, Dallas, OKI,
Matra, Philips, Siemens, SMC, SSI). A Intel iniciou a produção do 8051 em 1981. Em 1982 foram
produzidos 2 milhões de unidades, em 1985 foram 18 milhões e em 1993, 126 milhões. A tendência
atual é uma participação crescente dos microprocessadores de 8 bits e uma diminuição da fatia de
mercado dos microcontroladores de 4 bits.
Além do 8051 propriamente dito, existem variantes como o 8031 (sem memória ROM interna e com
apenas 128 bytes de memória RAM), o 8751 (4 kB de memória EPROM) e o 8052 (8 kB de memória
ROM, um terceiro timer e 256 bytes de memória RAM). A menos dessas diferenças, os modelos
citados são idênticos, e o texto utilizará o termo “8051” de forma genérica, citando as outras versões
8051hari.29.01.2004 01/29/04 1/33
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21

Pré-visualização parcial do texto

Baixe Microcontroladores 8051 e outras Notas de estudo em PDF para Mecatrônica, somente na Docsity!

EEL

A família de microcontroladores 8051

1 Comentários sobre microcontroladores

Um microcontrolador é um componente que tem, num único chip, além de uma CPU, elementos tais como memórias ROM e RAM, temporizadores/contadores, PWM, conversor AD, canais de comunicação e conversores analógico-digitais. Esta característica diferencia os sistemas baseados em microcontroladores daqueles baseados em microprocessadores, onde normalmente se utilizam vários componentes para implementar essas funções. Com isso, os microcontroladores permitem a implementação de sistemas mais compactos e baratos do que aqueles baseados em microprocessadores.

Em contrapartida, as CPUs dos microcontroladores são, menos poderosas do que os microprocessadores. Seu conjunto de instruções costuma se limitar às instruções mais simples, sua freqüência de clock é mais baixa e o espaço de memória endereçável costuma ser bem menor. Vê-se daí que o campo de aplicação dos microcontroladores é diferente daquele dos microprocessadores, e que um sistema que possa ser controlado por um microcontrolador tende a ter menor complexidade e menor custo do que um sistema que exija a capacidade de processamento de um microprocessador.

Exemplos de sistemas onde os microcontroladores encontram aplicação incluem controle de semáforos, balanças eletrônicas, microterminais, telefones públicos, controle de carregadores de baterias, inversores eletrônicos, controles de acesso, taxímetros, sistemas de aquisição de dados de manufatura e eletrodomésticos em geral.

A programação dos microcontroladores é mais simples do que a dos microprocessadores. Isto acontece porque os periféricos on-chip dos microcontroladores são acessados de uma forma padronizada e integrada na própria linguagem de programação, dispensando o conhecimento de detalhes externos. Não se deve pensar, porém, que isto simplifique a tarefa do programador em todos os níveis: é necessário que ele conheça bem o hardware conectado ao microcontrolador para poder produzir programas que funcionem corretamente.

Cabe citar ainda uma vantagem particular dos microcontroladores que possuem memória ROM, que é a possibilidade de armazenar programas internamente, dificultando sensivelmente a cópia ilícita do código.

1.1 A família 8051 introduzida pela Intel

Diversos fabricantes produzem microcontroladores da família 8051 (Intel, AMD, Atmel, Dallas, OKI, Matra, Philips, Siemens, SMC, SSI). A Intel iniciou a produção do 8051 em 1981. Em 1982 foram produzidos 2 milhões de unidades, em 1985 foram 18 milhões e em 1993, 126 milhões. A tendência atual é uma participação crescente dos microprocessadores de 8 bits e uma diminuição da fatia de mercado dos microcontroladores de 4 bits.

Além do 8051 propriamente dito, existem variantes como o 8031 (sem memória ROM interna e com apenas 128 bytes de memória RAM), o 8751 (4 kB de memória EPROM) e o 8052 (8 kB de memória ROM, um terceiro timer e 256 bytes de memória RAM). A menos dessas diferenças, os modelos citados são idênticos, e o texto utilizará o termo “8051” de forma genérica, citando as outras versões

apenas onde for necessário. Informações complementares podem ser obtidas em [Inte89], [Siem90] e [Silv94]. : http://www.ustr.net/

1.2 Principais características

  • Freqüência de clock de 12 MHz, com algumas versões que alcançam os 40 MHz;
  • até 64 kB de memória de dados externa;
  • 128 bytes de RAM interna;
  • até 64 kB de memória de programa configurável de duas formas mutuamente excludentes: ◊ 4 kB internos (ROM no 8051 e EPROM no 8751) e mais 60 kB externos; ◊ 64 kB externos;
  • 4 portas bidirecionais de I/O, cada uma com 8 bits individualmente endereçáveis; duas dessas portas (P0 e P2) e parte de uma terceira (P3) ficam comprometidas no caso de se utilizar qualquer tipo de memória externa;
  • 2 temporizadores /contadores de 16 bits;
  • 1 canal de comunicação serial;
  • 5 fontes de interrupção (dois timers, dois pinos externos e o canal de comunicação serial) com 2 níveis de prioridade selecionáveis por software;
  • oscilador de clock interno.

As características citadas são básicas e formam o núcleo da família 8051, que pode ser acrescido de uma ou mais das características especiais mostradas na figura 0.2.

80C NÚCLEO EEPROM DERIVATIVES

MEMÓRIA 1k - 32k

EPROM & OTP

CLOCK I²C & CAN

FUNÇÕES

de até 40 MHz SERIAL BUS

ESPECIAIS

I/O ESTENDIDAS

ENCAPSULAMENTO MINIMIZADO

CONVERSOR AD (^) LOW VOLTAGELOW POWER

Fig. 0.2 - Características especiais da família 8051

A título de exemplo, a tabela 0.2 apresenta as características de alguns componentes da família 8051 com a indicação de seus fabricantes. O número total de variantes é muito maior. A Philips, por exemplo, produz mais de 40 tipos diferentes.

Tipo Pinos Fabr. RAM CODE Notes (LV - low voltage) MCS251 40 Intel 1K 16K 16 Bit 80x51FX! Preliminar 80C517A 84 Siemens 256 64Kx ALU;8PWM;CC;2UART;10bA/D 80C537A 84 Siemens 256 32K ALU;8PWM;CC;2UART;10bA/D 80C535A 68 Siemens 256 64Kx 515+10bA/D;1K XRAM;BRG;OWD 80C515A 68 Siemens 256 32K 515+10bA/D;1K XRAM;BRG;OWD 80535 68 Siemens 256 64Kx Timer2CaptComp 6ports 8/10bA/D 80515 68 Siemens 256 8K Timer2 CaptComp 4 ports 8b A/D 80C535 68 Siemens 256 64Kx Timer2 CaptComp 5 ports 8b A/D 80C51GB 68 Intel 256 64Kx 8051FA+PCA; 8b A/D; SPI 87C51GB 68 Intel 256 8K 8051FA+PCA; 8b A/D; SPI 80C592 68 Philips 256 64Kx 552-I2C+CAN+XRAM 87C598 80 Philips 256 32K 552-I2C+CAN+XRAM 80C552 68 Philips 256 64Kx 10b A/D; I2C; CaptComp; PWM 87C552 68 Philips 256 8K 10b A/D; I2C; CaptComp; PWM

Tab. 0.2 - Alguns integrantes da família MCS

bits, que se denomina DPTR. Este registrador é o único que pode conter valores de 16 bits e por isso é freqüentemente utilizado no endereçamento da memória externa, que é sempre indireto. PC contém o endereço da próxima instrução executável e SP aponta para o topo da pilha.

15 0 7 0 PC SP 15 8 7 0 A DH DL DPTR B 7 0 7 0 7 0 7 0 R0 R1 R2 R R4 R5 R6 R

7 6 5 4 3 2 1 0 CY AC F0 RS1 RS0 OV F1 P PSW Fig. 0.6 - Registros internos do 8051

O 8051 conta com quatro flags de sistema (carry, auxiliary carry, overflow e parity) e dois flags de usuário (F0 e F1), que o programador pode utilizar como desejar. Os flags estão todos reunidos no registrador PSW (program status word), que contém ainda os bits de seleção de banco de registradores, RS0 e RS1. Estes últimos são descritos na seção 0.12.6, que também apresenta mais detalhes sobre os registradores R0 a R7.

Os registradores de controle dos periféricos on-chip, que não aparecem no modelo acima, serão detalhados nas seções subseqüentes.

1.5 Organização da memória de programa

A memória de programa do 8051 pode ocupar até 64 kB. Aqui há duas opções: se a memória ROM interna do controlador for utilizada, então esta será mapeada nos primeiros 4 kB deste espaço de endereçamento (endereços 0000H a 0FFFH), e os demais 60 kB (1000H a FFFFH) serão externos. Caso não se deseje utilizar a ROM interna, então toda a memória será externa.

A escolha é feita por hardware, de acordo com o nível de tensão aplicado ao pino EA. Nível lógico zero seleciona memória de programa externa para todos os endereços; com nível 1, as instruções são lidas da memória interna se seu endereço for menor do que 1000H (primeiros 4 kB).

1.6 Organização da memória de dados

1.6.1 Memória de dados interna

A memória interna é dividida em três blocos fisicamente distintos, conforme ilustra a figura 0.8. Há dois blocos de RAM, de 128 bytes cada, mapeados nos endereços 00H-7FH e 80H-FFH, e mais cerca de 20 registradores de funções especiais, espalhados em endereços da faixa 80H-FFH. A distinção entre os dois blocos cujos endereços coincidem é feita pelos modos de endereçamento, também indicados na figura.

EEL Bloco superior de 128 bytes

FFH Registradores de funções especiais

FFH

MOV com endereçamento indireto

80H MOV com endereçamento direto

80H

Bloco inferior de 128 bytes

7FH

MOV com endereçamento direto ou indireto

00H

Fig. 0.8 - Organização da memória de dados interna do 8051

1.6.2 Memória de dados externa

A memória de dados externa pode ocupar até 64 kB. Portanto, há coincidências de endereços com toda a faixa de memória de programa e com os endereços 00H a FFH da memória de dados interna. Estes conflitos são resolvidos por dois mecanismos distintos:

  1. conforme mencionado na seção 1.3, a distinção entre memória de programa e memória de dados é feita pelo sinal PSEN, que o hardware utiliza para habilitar o banco de memória correspondente. Este sinal é ativado na leitura de instruções da memória na utilização da instrução MOVC, transfere dados entre registradores e a memória de programa;
  2. para distinguir entre memória de dados interna e memória de dados externa , o microcontrolador oferece duas instruções distintas: MOV, para acessar a memória interna, e MOVX (move external), para a memória externa. É interessante notar que esta última instrução exige sempre endereçamento indireto. Por exemplo, a instrução MOV 20H,A armazena na posição 20H da memória RAM interna o conteúdo do acumulador. Por outro lado, para armazenar o mesmo conteúdo na posição 20H da memória de dados externa, o procedimento seria: MOV R0,#20H ; coloca o endereço em R MOVX @R0,A ; copia A para a posição em R

1.6.3 Mais detalhes sobre a RAM interna

Os primeiros 48 bytes da RAM interna (00H a 2FH) apresentam ainda algumas particularidades, conforme mostra a figura 0.10. Os endereços 00H a 1FH compreendem quatro bancos de oito registradores cada. Em cada banco, os registradores são denominados R0, R1, ... R7 (os nomes são repetidos). Estes podem ser endereçados por seus nomes nas instruções (como em MOV A,R0), ou então diretamente através dos seus endereços (MOV A,00H). No primeiro caso, o processador precisa decidir ainda a qual banco a instrução se refere, por causa da repetição dos nomes. Esta seleção de banco é feita configurando os bits RS1 e RS0 do registrador PSW de acordo com a tabela 0.4.

EEL F8 B FF F0 B F E8 EF E0 ACC^ E D8 DF D0 PSW D C8 CF C0 C B8 IP BF B0 P3 B A8 IE AF A0 P2^ A 98 SCON SBUF 9F 90 P1 97 88 TCON TMOD TL0 TL1 TH0 TH1 8F 80 P0^ SP^ DPL^ DPH^ PCON^ 87

1.7 Modos de endereçamento

O conjunto de instruções oferece diversos modos de endereçamento, projetados de modo a agilizar o acesso à RAM interna e também para facilitar as operações de manipulação de bits e bytes.

1.7.1 Endereçamento imediato

O valor do operando faz parte do corpo da instrução e segue o opcode na memória de programa. O operando deve ser precedido do símbolo ‘#’, a fim de evitar a confusão com o modo direto. Exemplo: MOV B,#255 - faz o registrador B igual a FFH.

1.7.2 Endereçamento direto

Neste modo, a instrução especifica o endereço do operando, que deve ser um número de 8 bits. Conforme a seção 1.6, somente dados dos primeiros 128 bytes da memória RAM interna e dos registradores de funções especiais são endereçados deste modo. Exemplo: MOV A,25H - traz para o acumulador o conteúdo do byte 25H da RAM interna.

1.7.3 Endereçamento de bits individuais

As instruções que manipulam bits individuais especificam este bit de forma direta, quer sob a forma de um número (os endereços dos bits individualmente endereçáveis da figura 0.10), quer sob a forma de uma abreviatura, como no caso das portas de E/S ou de outros bits dos registradores de funções especiais. Exemplos: SETB 0FH - seta o bit mais significativo do byte 21H da memória interna; CLR P1.0 - zera o bit menos significativo da porta 1.

1.7.4 Endereçamento indireto

A instrução especifica um registrador, cujo conteúdo é o endereço do operando. Este modo pode ser utilizado para endereçar tanto a memória interna quanto a memória externa. Se o endereço do operando for de 8 bits, os registradores que podem ser especificados no corpo da instruções são R0, R1 ou SP. Caso o endereço seja de 16 bits, o registrador a ser utilizado tem que ser DPTR. Exemplos: MOV @R1,#15H - coloca o valor 15H no byte endereçado por R1; MOV @DPTR,A - copia o valor do acumulador para o byte endereçado por DPTR.

1.7.5 Endereçamento indexado

Este modo serve apenas para endereçar a memória de programa (instrução MOVC). Nesse tipo de acesso, o endereço do operando é dado pela soma do conteúdo de um registrador de base, que pode ser DPTR ou PC, com o conteúdo do acumulador. Dessa forma, DPTR ou PC apontam para a base

de uma tabela enquanto o acumulador seleciona um elemento dentro da tabela. Exemplos: MOVC A,@A+DPTR - o acumulador indica o offset de um byte dentro da tabela que inicia em DPTR e que deve ser copiado para o acumulador; MOVC B,@A+PC - o registrador B recebe uma cópia do valor do byte que está A posições à frente do PC.

1.7.6 Endereçamento dos registradores R0 a R

Os opcodes das instruções de acesso aos registradores R0 a R7 utilizam três dos seus oito bits para especificar o registrador endereçado. Desta forma, este modo consegue instruções mais curtas do que o modo direto, por dispensar byte com o endereço. O banco de registradores referenciado é aquele que está selecionado pelos bits RS1 e RS0 no instante em que a instrução é executada. Exemplo: MOV A,R3 - copia R3 para A.

1.7.7 Endereçamento implícito de registradores

Algumas instruções trabalham sempre com um certo registradores, e portanto nenhum byte é necessário para endereçar o operando. Exemplo: a instrução DA A atua sempre sobre o acumulador, e por isso não se pode especificar um registrador diferente de A..

1.8 Funcionamento da pilha

É importante notar que SP é um registrador de 8 bits , e que por isso o tamanho da pilha do 8051 é bem menor do que o das pilhas normalmente usadas com outros microprocessadores. Além disso, SP endereça somente a RAM interna.

O funcionamento da pilha também é diferente, pois aqui o armazenamento se faz no sentido dos endereços crescentes e os bytes são empilhados um a um, de acordo com as seguintes regras:

  • instrução PUSH: SP é incrementado e o byte é escrito na posição apontada por SP;
  • instrução POP: o byte da posição apontada por SP é copiado para o destino e em seguida SP é decrementado;
  • chamadas de sub-rotinas e interrupções: os dois bytes que formam o endereço de retorno são empilhados, com o byte menos significativo no endereço mais baixo;
  • retorno de sub-rotinas e interrupções: os dois bytes que formam o endereço de retorno são copiados para o PC.

Desta forma, o registrador SP aponta sempre para o topo da pilha.

O valor de SP após um reset é 07H, de modo que a pilha começa, por default, no byte de memória interna 08H, onde inicia também o banco de registradores 1. Portanto, se o programa precisar trabalhar com mais de um banco de registradores, deve escolher outro local para a pilha.

1.9 As interrupções

O 8051 tem cinco fontes de interrupção: duas entradas externas (INT0 e INT1), dois temporizadores/contadores (Timer 0 e Timer 1) e o canal de comunicação serial. Conforme descrito na seção 0.6, as entradas das interrupções externas e o canal serial ocupam pinos da porta P3.

Os endereços de desvio das interrupções são fixos e dados pela tabela 0.6.

O 8051 permite habilitar ou desabilitar cada interrupção individualmente através dos bits EX0, ET0, EX1, ET1 e ES do registrador IE (Interrupt Enable), que aparece na figura 0.12. Esses bits controlam as interrupções externa 0, do timer 0, externa 1, do timer 1 e do canal serial, respectivamente. O bit EA (Enable All) permite habilitar (1) ou desabilitar (0) todas as interrupções de uma só vez. Para que uma interrupção esteja habilitada, tanto o bit correspondente quanto EA precisam estar setados.

Os bits TF0 e TF1 (5 e 7) de TCON são flags associados aos Timers 0 e 1, respectivamente. Cada vez que ocorre um overflow (passagem de FFH para 0) na contagem de um timer, o bit correspondente é setado, o que gera um pedido de interrupção (que será atendido se a interrupção correspondente estiver habilitada). TR0 e TR1 (bits 4 e 6) permitem habilitar ou desabilitar (parar) a contagem, respectivamente para Timer 0 e Timer 1. Os bits de 0 a 3 deste registrador dizem respeito às interrupções e foram discutidos na seção 0.18.

O registrador TMOD (figura 0.16b) define o modo de funcionamento dos timers, discutido logo adiante.

1.10.1 Habilitação da contagem

Diz-se que um timer está habilitado quando estão satisfeitas todas as condições para que sua contagem progrida com o passar do tempo. A habilitação dos timers depende dos valores atribuídos aos bits C/T.x e GATE.x, bem como dos sinais externos aplicados aos pinos T.x e INT.x (entenda-se, deste ponto em diante, ‘x’ como um nome genérico para 0 ou 1).

As condições de habilitação de um timer são as seguintes:

  • o bit TR.x deve estar em 1;
  • se o bit GATE.x estiver em 0, o timer estará habilitado;
  • caso contrário (bit GATE.x = 1), a habilitação pode ser controlada pelo usuário através do pino externo INT.x, da seguinte forma: ◊ INT.x = 0: contador desabilitado; ◊ INT.x = 1: contador habilitado.

Satisfeitas estas condições, a contagem avançará de acordo com a configuração do timer:

  • temporizador (bit C/T.x = 0): a contagem é incrementada a cada 12 ciclos do oscilador interno, o que significa que o contador avança a cada ciclo de instrução do microcontrolador;
  • contador (bit C/T.x = 1): neste modo, a contagem não avança de acordo com o oscilador interno, mas sim a cada transição descendente de um sinal externo, colocado no pino T.x (não confundir com o pino INT.x, utilizado na habilitação).

1.10.2 Aplicações

A possibilidade de se habilitar um timer externamente através do pino INT.x permite medir a largura de pulsos externos. Para tanto, conecta-se o sinal cuja largura se deseja medir ao pino INT.x, com o timer correspondente configurado como temporizador (C/T.x = 0) e com o bit GATE.x = 1. Desta forma, a contagem avançará enquanto o sinal externo estiver em nível alto, obtendo-se uma contagem proporcional à duração do pulso. A largura do pulso pode então ser calculada a partir do período do sinal de clock.

É possível também contar pulsos externos. Para tanto, conecta-se o sinal a medir ao pino T.x, com o contador configurado como contador (C/T.x = 1) e com o bit GATE.x = 0. Desta forma, a contagem avançará a cada pulso do sinal externo.

Os dois mecanismos acima podem ainda ser combinados para contar pulsos de um sinal externo somente durante um intervalo de tempo determinado por outro sinal externo. Para tanto, configura-se o timer como contador (bit C/T.x = 1) com o bit GATE.x=1. Desta forma, a contagem avançará de acordo com os pulsos recebidos no pino Tx, mas somente enquanto o nível em INT.x estiver em 1.

1.10.3 Modos de operação

Cada timer pode operar em um de quatro modos de operação diferentes. O modo de operação é definido pelos valores dos bits M0.x e M1.x do registrador TMOD.

EEL

Modo 0 (M1.x = 0 e M0.x = 0)

Neste modo, os registradores TLx e THx são vistos como um contador de 13 bits, formado por THx e pelos 5 bits menos significativos de TLx. Os 3 bits mais significativos de TLx são indeterminados e devem ser ignorados. O registrador THx pode ser visto como um contador de 8 bits, cuja freqüência de contagem é igual a 1/32 da freqüência de clock. Este modo existe por razões de compatibilidade com a família MCS48, mais antiga.

Modo 1 (M1.x = 0 e M0.x = 1)

O funcionamento deste modo é semelhante ao do modo 0. A única diferença é que o par de registradores TLxTHx é visto como um contador de 16 bits.

A figura 0.20 representa o funcionamento dos timers nos modos 0 e 1. Note a representação do bit C/T.x, em forma de uma chave que seleciona a fonte de pulsos de clock para o timer e também a saída “overflow”, que gera o pedido de interrupção associado. Essa figura mostra ainda o mecanismo de habilitação da contagem, descrito no início desta seção.

GATE

INTx PIN

TRx

OSC / C/T=

C/T= CONTROL

(5 bits)TLx THx (8 bits) (8 bits)^ TFx INTERRUPT

Tx PIN overflow

Fig. 0.20 - Funcionamento dos timers nos modos 0 e 1

Modo 2 (M1.x = 1 e M0.x = 0)

Neste modo , o registrador TLx funciona como um contador recarregável de 8 bits, conforme a figura 0.22. O registrador THx contém o valor que é recarregado automaticamente em TLx sempre que a contagem deste sofre um overflow (passagem de FFH para 00). O overflow faz também com que o flag TFx seja setado e portanto gera um pedido de interrupção, que será atendido de acordo com as regras de habilitação das interrupções. O valor de THx não sofre qualquer alteração e TLx retoma a contagem a partir do valor carregado.

GATE

INTx PIN

TRx

OSC / C/T=

C/T= CONTROL

TLx

THx (8 bits)

TFx (8 bits) INTERRUPT

Tx PIN overflow

Fig. 0.22 - Funcionamento dos timers no modo 2

EEL

SM0 SM1 Modo Tipo Bits Taxa de TX 0 0 0 Síncrona, HD 8 Fclock/ 0 1 1 Assíncrona, FD 10 Variável 1 0 2 Assíncrona, FD Fclock/32 ou / 1 1 3 Assíncrona, FD Variável

Tab. 0.8 - Modos de funcionamento do canal serial

Modo 0 (SM0 = 0 e SM1 = 0)

Este modo implementa a comunicação síncrona de palavras de 8 bits. As palavras são transmitidas e recebidas através do pino RxD, o que significa que, neste modo, apenas a comunicação half-duplex (HD, transmissão nos dois sentidos, mas não simultânea) é possível. O sinal de clock necessário para o sincronismo é enviado pelo pino TxD. A taxa de transmissão é fixa e igual a 1/12 da freqüência do clock do sistema.

Nos demais modos, os dados são enviados através do pino TxD e recebidos através do pino RxD. Assim, esses modos permitem comunicação full-duplex (FD, transmissão simultânea nos dois sentidos).

Modo 1 (SM0 = 0 e SM1 = 1)

A palavra transmitida é composta por 10 bits: um start bit (nível lógico 0), oito bits de dados, e um stop bit (nível lógico 1). A taxa de transmissão é dada pela equação

Tx

f TH

SMOD = × clock

onde SMOD é o bit 7 do registrador PCON (figura 0.28b) e TH1 é o registrador mais significativo da contagem do timer 1.

Modo 2 (SM0 = 1 e SM1 = 0)

Cada palavra de dados é composta de 11 bits. O bit adicional enviado é o bit TB8 de SCON. Na recepção, é este bit que se lê em RB8. A taxa de transmissão pode ser escolhida entre 1/64 (SMOD =

  1. ou 1/32 (SMOD = 1) da freqüência de clock do sistema.

Modo 3 (SM0 = 1 e SM1 = 1)

Igual ao modo 2 exceto pela taxa de transmissão, dada também pela equação 0.2.

O bit SM2 do registrador SCON tem diferentes interpretações, dependendo do modo de operação selecionado:

  • no modo 0, não tem qualquer efeito, devendo permanecer em 0;
  • no modo 1, inibe (SM2 = 1) ou habilita (0) a geração de um pedido de interrupção da porta serial quando da recepção de um stop bit inválido;
  • nos modos 2 e 3, permite habilitar a comunicação entre vários 8051.

REN (Reception ENable) habilita a recepção. Quando está em 1, o primeiro start bit em RxD implica recepção de um dado em SBUF.

TI é o bit de requisição de interrupção da transmissão. É setado pelo hardware após a transmissão do oitavo bit de dados quando no modo 0, e no início da transmissão do stop bit nos outros modos.

O bit RI é o bit de requisição de interrupção na recepção. É setado pelo hardware no momento da recepção do oitavo bit de dados no modo 0, ou durante a recepção de um stop bit nos outros modos. TI e RI devem ser reinicializados pelas rotinas de tratamento das respectivas interrupções de modo a habilitar novas interrupções.

1.12 Sistema de desenvolvimento Avocet

Um sistema de desenvolvimento é um sistema que permite fazer a edição, depuração e teste de programas para um determinado tipo de processador. A maioria dos sistemas de desenvolvimento para microprocessadores e microcontroladores se baseiam no PC. Normalmente são necessários um editor de programas, um cross-assembler e/ou um compilador e um linker, além de simuladores ou emuladores.

Muitos cross-assemblers permitem a inclusão de macros, que são trechos de programas fontes aos quais é atribuído um nome. Este nome pode então ser usado em qualquer parte do programa como se fosse uma instrução.

1.12.1 Sistema de desenvolvimento Avocet

Dentre as diversas ferramentas de software para o desenvolvimento de programas para a família 8051, uma das mais conhecidas é o conjunto da Avocet, ilustrado na figura 0.30. Praticamente todos os fornecedores de software para este tipo de desenvolvimento apresentam o mesmo elenco de programas utilitários.

X.C

AVC

X.OBJ

XY.LIB

AVLIB

Y.ASM

AVMAC

Y.OBJ

AVLINK

HARDWARE

XYZ.HEX

GRAVADOR

DE EPROM

SIMULADOR

CARREGADOR

Programa Fonte em Assembly

Fig. 0.30 - Conjunto de ferramentas de desenvolvimento

1.12.2 Roteiro de elaboração de um programa

Esta seção apresenta os passos a serem seguidos para a elaboração de um programa para microcontroladores da família 8051, utilizando as ferramentas da Avocet.

1.12.2.1 Edição do programa-fonte

Utilizando um editor de texto simples, que permita gravar arquivos em formato ASCII, criar o programa fonte. O nome do arquivo deve ter no máximo oito letras e extensão .ASM.

1.12.2.2 Montagem

A sintaxe para chamar o assembler é, no caso do exemplo acima:

Controle de execução e exibição Movimentação do cursor

F1 RUN Esc Regs. / linha de comando F10 Single Step (passo a passo) F7 Cursor - Hex, Bin, ASCII F9 UNDO - volta um comando Ctrl Pg Up Scroll lock F2 Move Breakpoint UP Ctrl A / B Registradores A / B F3 Set breakpoint Ctrl D Data Pointer F4 Move Breakpoint DOWN Ctrl CXFO Flags C/AC/FO/OV F5 Velocidade de simulação Ctrl I Interrupções Alt F5 Alternar apresentação de símbolos / valores hexadecimais

Ctrl P PC

F6 Atualizar todas as janelas / somente janelas com trace ligado

Ctrl R Banco de Registradores

Tab. 0.10 - Comandos do simulador AVSIM

A representação de constantes na tela do simulador se dá segundo a convenção da tabela 0.12.

Sistema de numeração Notação Decimal 255 Hexadecimal $FF ou 0FFH Binário %1111 ou 1111B

Tab. 0.12 - Representação de constantes no AVSIM

1.13 Exercícios

  1. Estude as instruções que aparecem no programa abaixo e procure determinar o valor do acumulador ao final da execução. Crie um arquivo-fonte com o programa, gere o arquivo .hex e simule-o no AVSIM51. São necessárias as diretivas ORG e END, que constam dos anexos. MOV R1,# MOV R3,# INC @R MOV A,@R MOV DPTR,#MENS MOVC A,@A+DPTR SJMP $ MENS DB "1234567890ABCDE", END
  2. Use o simulador para ver a troca dos bancos de registradores no programa abaixo ( BANCO.asm) ORG 2000H; MOV A,12 ; confirme no simulador o que faz esta instrução? INICIO: CLR RS CLR RS MOV R0,A ; DADOS NO BANCO0 RS1=RS0= MOV R1,A MOV R2,#00H MOV R3,#00H INC A SETB RS0 ; DADOS NO BANCO1 RS1 RS0 = 01 MOV R0,A MOV R1,A

EEL MOV R2,#11H MOV R3,#11H INC A CLR RS0 ; DADOS NO BANCO2 RS1 RS0 = 10 SETB RS MOV R0,A MOV R1,A MOV R2,#22H MOV R3,#22H INC A SETB RS0 ; DADOS NO BANCO3 RS1 RS0 = 11 MOV R0,A MOV R1,A MOV R2,#33H MOV R3,#33H INC A JMP INICIO END

  1. O programa abaixo lê a porta P1. Se o valor lido for par, incrementa R2; em caso contrário, incrementa R1. Os dados pares são colocados na porta P2 e os dados ímpares na porta P3; todos os dados são armazenados seqüencialmente a partir da posição de memória 20H ORG 2000H PARIDADE.ASM e P1.DAT MOV R0,#20H ; INICIO DO ARMAZENAMENTO MOV R1,#0H ; CONTADOR DOS IMPARES MOV R2,#0H ; CONTADOR DOS PARES INICIO:MOV A,P MOV @R0,A ; GRAVA DADO ANL A,#01 ; VER SE PAR OU IMPAR JNZ IMPAR PAR: INC R MOV A,@R MOV P2,A INC R JMP INICIO IMPAR:INC R MOV A,@R INC R MOV P3,A ; MOSTRA DADO JMP INICIO END Este programa utiliza a porta P1 como porta de entrada, dentro do simulador. Esta entrada de dados pode ser feita por meio de um arquivo (ideal quando existem muitos dados ) ou com uma entrada manual, neste caso desloque o cursor até a porta P1 e digite ali o valor pretendido. Também pode-se associar um arquivo a essa porta. Cada vez que o programa acessa a porta, um novo caracter do arquivo é lido. O valor lido é o valor hexadecimal do caracter, incluindo espaços em branco e caracteres de fim de linha (0DH, 0AH). Opcionalmente, pode-se fazer com que a leitura do arquivo recomece do início sempre que o programa chegar ao fim do arquivo, o que garante uma fonte ininterrupta de dados para simulação. Para o programa acima, crie com um editor de texto um arquivo chamado P1.DAT, contendo a linha: 0123456789 e um “ENTER” no final. Monte o programa e carregue-o no AVSIM51. Para associar o arquivo de entrada à porta P1, siga os passos abaixo: ◊ use o comando IO , opção Open; ◊ digite o nome do arquivo de entrada, P1.DAT ;

EEL

2 - Conjunto de instruções do 8051

2.1 Abreviaturas utilizadas na tabela de instruções

Abreviatura Interpretação Rn registrador R0 a R7 do banco selecionado por RS1 e RS @Ri endereçamento indireto do byte endereçado por Ri; i ≤ 1 #dado8 endereçamento imediato; dado8 é uma constante de 8 bits #dado16 endereçamento imediato; dado16 é uma constante de 16 bits Direto endereçamento direto; direto é um endereço da RAM interna Bit endereçamento direto de um bit da memória RAM interna ou SFR End16 endereço de 16 bits (LJMP e LCALL) End11 endereço de 11 bits (SJMP e SCALL) End. rel. endereçamento relativo (SJMP e todos os JMPs condicionais)

2.2 Principais diretivas

Diretiva Significado Função Exemplo

ORG Origin Definir ende. montagem ORG 2000H EQU Equate Criar sinônimos CR EQU 0DH; LF EQU 0AH DB Define byte Criar variáveis CONTAGEM DB 00H DB ,.. Define byte Criar vetores TABELA DB 15H, 22H, 35H DB Define byte Criar strings ASCII MSG DB “Mensagem 1” %INCLUDE Include Incluir arquivos-fonte %INCLUDE RET.ASM END End Indica final de programa END

2.3 As instruções

As tabelas a seguir apresentam o conjunto de instruções do microcontrolador 8051. As colunas “B” e “C” indicam, respectivamente, o número de bytes e o número de ciclos de clock de cada instrução. As colunas “CY”, “AC” e “OV” de cada tabela indica como cada instrução afeta, respectivamente, os flags de carry, auxiliary carry e overflow, de acordo com a seguinte notação:

  • 0: o flag é resetado nesta operação;
  • 1: o flag é setado nesta operação
  • *: o flag é afetado e seu valor pode ser 0 ou 1, dependendo do resultado da operação. Observe que

só algumas instruções alteram os flags!!!!.

  • -: o flag não é afetado.

2.3.1 Instruções aritméticas

Mnem. Operando Descrição B C CY AC OV ADD A,Rn Soma registrador ao acumulador 1 1 * * * ADD A,direto Soma byte ao acumulador 2 1 * * * ADD A,@Ri Soma byte no endereço Ri a A 1 1 * * * ADD A,#dado8 Soma dados imediatos a A 2 1 * * * ADDC A,Rn Soma o registrador e o carry a A 1 1 * * * ADDC A,direto Soma byte e o carry a A 2 1 * * *

ADDC A,@Ri Soma byte no endereço Ri e carry a A 1 1 * * * ADDC A,#dado8 Soma dados imediatos e o carry a A 2 1 * * * SUBB A,Rn Subtrai Rn e borrow de A: A = A-CY-Rn 1 1 * * * SUBB A,direto Subtrai byte e borrow do acumulador 2 1 * * * SUBB A,@Ri Subtrai byte no end. Ri e borrow de A 1 1 * * * SUBB A,#dado8 Subtrai dados imediatos e borrow de A 2 1 * * * INC A Incrementa acumulador 1 1 - - - INC Rn Incrementa registrador 1 1 - - - INC Direto Incrementa byte 2 1 - - - INC @Ri Incrementa byte no endereço Ri 1 1 - - - DEC A Decrementa acumulador 1 1 - - - DEC Rn Decrementa registrador 1 1 - - - DEC Direto Decrementa byte 2 1 - - - DEC @Ri Decrementa byte no endereço Ri 1 1 - - - INC DPTR Incrementa datapointer 1 2 - - - MUL AB Multiplica A e B, resultado em BA 1 4 0 - * DIV AB Divide A/B, quociente em A e resto em B 1 4 0 * 0 DA A Ajuste do acumulador após adição BCD 1 1 * * -

2.3.2 Instruções lógicas

Mnem. Operando Descrição B C CY AC OV ANL A,Rn AND entre registrador e acumulador 1 1 - - - ANL A,direto AND entre byte e acumulador 2 1 - - - ANL A,@Ri AND entre o conteúdo do endereço Ri e A 1 1 - - - ANL A,#dado8 AND entre dado imediato e o acumulador 2 1 - - - ANL direto,A AND entre acumulador e byte 2 1 - - - ANL dir,#dado8 AND entre dado imediato e byte 3 2 - - - ORL A,Rn OR entre registrador e acumulador 1 1 - - - ORL A,direto OR entre byte e acumulador 2 1 - - - ORL A,@Ri OR entre o conteúdo do endereço Ri e A 1 1 - - - ORL A,#dado8 OR entre dado imediato e o acumulador 2 1 - - - ORL direto,A OR entre acumulador e byte 2 1 - - - ORL dir,#dado OR entre byte e dado imediato 3 2 - - - XRL A,Rn XOR entre o acumulador e Registrador 1 1 - - - XRL A,direto XOR entre acumulador e byte 2 1 - - - XRL A,@Ri XOR entre A e o conteúdo do endereço Ri 1 1 - - - XRL A,#dado8 XOR p/ dado imediato e o acumulador 2 1 - - - XRL direto,A XOR entre acumulador e byte 2 1 - - - XRL dir,#dado XOR entre byte e dado imediato 3 2 - - - CLR A Zera o acumulador 1 1 - - - CPL A Complementa o acumulador 1 1 - - - RL A Rotaciona o acumulador para a esquerda 1 1 - - - RLC A Rotaciona A para a esquerda pelo carry 1 1 * - - RR A Rotaciona A à direita 1 1 - - - RRC A Rotaciona A à direita pelo carry 1 1 * - - SWAP A Permuta os bits (3-0) e (7-4) de A 1 1 - - -

2.3.3 Instruções de manipulação de bits

Mnem. Operando Descrição B C CY AC OV CLR C Reseta CY 1 1 0 - - CLR bit Reseta o bit endereçado 2 1 - - - SETB C Seta o CY 1 1 1 - - SETB bit Seta o bit endereçado 2 1 - - - CPL C Complementa CY 1 1 * - - CPL bit Complementa o bit endereçado 2 1 - - - ANL C,bit AND entre o bit endereçado e CY 2 2 * - - ANL C,/bit AND entre CY e complemento do bit 2 2 * - - ORL C,bit OR entre CY e o bit endereçado 2 2 * - - ORL C,/bit OR entre CY e complemento do bit 2 2 * - - MOV C,bit Copia bit endereçado para CY 2 1 * - -