Microcontroladores Família MCS51



Documentos relacionados
Microprocessadores e Microcontroladores. Prova Substitutiva Uma Solução

Estrutura de um Computador

Microprocessadores e Microcontroladores Parte 3. Expansão de Memória Mapeamento de Memória

Acetatos de apoio às aulas teóricas

1. SINTAXE DA LINGUAGEM ASSEMBLY

EXPERIÊNCIA 17 USO DO TEMPORIZADOR INTERNO

ULA Sinais de Controle enviados pela UC

Arquitetura de Computadores. Tipos de Instruções

Oprojeto apresenta três níveis de dificuldade: fácil, médio e difícil. No modo fácil tem-se uma

BARRAMENTO DO SISTEMA

Componentes do Computador e. aula 3. Profa. Débora Matos

CAPÍTULO 2 CARACTERÍSTICAS DE E/S E PORTA PARALELA

Laboratório de Microprocessadores e Microcontroladores

Unidade Central de Processamento (CPU) Processador. Renan Manola Introdução ao Computador 2010/01

Aula 10 Microcontrolador Intel 8051 Parte 2

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

Capítulo 4. MARIE (Machine Architecture Really Intuitive and Easy)

ARQUITETURA DE COMPUTADORES

PROJETOS COM MICROCONTROLADORES

Edeyson Andrade Gomes

Aplicações de Microprocessadores I. Prof. Adilson Gonzaga

Figura 1 - O computador

Tais operações podem utilizar um (operações unárias) ou dois (operações binárias) valores.

Interrupções. As interrupções são casos especiais de chamadas de procedimentos.

Arquitetura de Computadores - Revisão -

O processador é composto por: Unidade de controlo - Interpreta as instruções armazenadas; - Dá comandos a todos os elementos do sistema.

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann

Conjunto de instruções do CPU. Arquitectura de um computador. Definição das instruções (1) Definição das instruções (2)

Dispositivos de Entrada e Saída

ENTRADA E SAÍDA DE DADOS

EEC2104 Microprocessadores

Programação Básica em Arduino Aula 2

7. PROGRAMANDO O MICROCONTROLADOR. Microcontroladores - Prof: Demantova

SEL-614 MICROPROCESSADORES E APLICAÇÕES. Adilson Gonzaga

CONJUNTO DE INSTRUÇÕES

Ambiente de desenvolvimento de Programação Assembly MCU 8051 IDE

2 Formalidades referentes ao trabalho

Organização Básica do Computador

O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware

Linguagem de Montagem Funcionamento de CPU e Assembly Rudimentar

Microcontroladores 8051

28/9/2010. Unidade de Controle Funcionamento e Implementação

Sistemas Microprocessados. sato<at>utfpr<dot>edu<dot>br

Organização e Arquitetura de Computadores

Sistemas Operacionais. Prof. André Y. Kusumoto

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 UMA SOLUÇÃO POSSÍVEL. Obs.: Todas as questões têm valor 2,0. Boa prova e Feliz Natal e Ano Novo!!!!

Organização de Computadores 1

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 UMA SOLUCAO POSSÍVEL

Arquitetura e Organização de Computadores I

Campus Capivari Análise e Desenvolvimento de Sistemas (ADS) Prof. André Luís Belini prof.andre.luis.belini@gmail.com /

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

Introdução. INF1005 Programação I 33K Prof. Gustavo Moreira gmoreira@inf.puc-rio.br

PROJETO LÓGICO DE COMPUTADORES Prof. Ricardo Rodrigues Barcelar

CONSTRUÇÃO DE UMA UCP HIPOTÉTICA M++ INTRODUÇÃO

Capítulo 3 Processadores de Propósito Geral: Software

3. Arquitetura Básica do Computador

Processadores BIP. Conforme Morandi et al (2006), durante o desenvolvimento do BIP, foram definidas três diretrizes de projeto:

Gerenciamento de Entrada e Saída Hélio Crestana Guardia e Hermes Senger

MICROCONTROLADORES FAMÍLIA 8031/8051

ORGANIZACÃO DE COMPUTADORES PROCESSADORES CHIPS TRANSISTORES

ARQUITETURA DE COMPUTADORES

Programação de Microprocessadores. Programação de Microprocessadores SEL-433 APLICAÇÕES DE MICROPROCESSADORES I

Sistemas Microcontrolados

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias:

DIAGRAMA DE BLOCOS DE UM MICROCONTROLADOR

MICROCONTROLADOR 8051

Copyright 2011 VW Soluções

Organização e Arquitetura de Computadores I

As 5 partes fundamentais. Linguagem de Programação Pinagem Características Elétricas Ambiente de Desenvolvimento Integrado - IDE

Entrada e Saída. Prof. Leonardo Barreto Campos 1

MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 (Tema: Microcontrolador 8051) Resposta Esperada

ARQUITETURA DE COMPUTADORES

Sistemas Operacionais

Memória Cache. Prof. Leonardo Barreto Campos 1

CAPÍTULO II FAMÍLIA MCS-51

Organização e Arquitetura de Computadores I

Sistemas Computacionais II Professor Frederico Sauer

CEFET-SP. Microcontroladores Família MCS-51 Conceitos, Aplicações e Projetos versão Wilson Ruiz. Wilson Ruiz

Entrada e Saída. Interface entre periféricos, processador e memória. Fonte: Minho - Portugal 1

Organização de Computadores Como a informação é processada?

Arquitectura de Computadores

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária

5 Entrada e Saída de Dados:

Visão Geral de Sistemas Operacionais

Primeiros "computadores" digitais. Execução de um programa. Consolas. Primórdios dos computadores. Memória interna. Computadores com memória interna

Memória de Dados Interna. Memória de Dados Interna

1. CAPÍTULO COMPUTADORES

EXERCÍCIOS RESOLVIDOS

Introdução à Organização e Arquitetura de Computadores. Prof. Leonardo Barreto Campos 1

Introdução à Arquitetura de Computadores

O microcontrolador Quatro partes importantes

Família 8051 (introdução) 2011/1

Copyright 2013 VW Soluções

Notas de Aula Prof. André R. Hirakawa Prof. Paulo S. Cugnasca Prof. Carlos E. Cugnasca

14/3/2016. A escolha do microprocessador mais adequado depende basicamente da aplicação, e deve se levar em conta os seguintes critérios:

2. A influência do tamanho da palavra

A Unidade Central de Processamento é a responsável pelo processamento e execução de programas armazenados na MP.

Máquina Multinível. Um programa pode ser definido como uma seqüência de instruções que descrevem como executar uma determinada tarefa.

Programação Básica em STEP 7 Operações Binárias. SITRAIN Training for Automation and Drives. Página 6-1

INSTITUTO POLITÉCNICO DE BRAGANÇA ESCOLA SUPERIOR DE TECNOLOGIA E DE GESTÃO. Engenharia Electrotécnica. Microprocessadores. 2ºano - 1ºsemestre

Transcrição:

Microcontroladores Família MCS51 Colégio Técnico de Campinas COTUCA Disciplina TDM II- Departamento Eletroeletrônica

1- Conceitos Básicos Um sistema computador é constituído por três blocos de base ligados através de três barramentos como se pode ver na figura 1. Figura 1 Diagrama de blocos de um computador. Os três blocos de base são: a unidade central de processamento (CPU), as memórias de programa e de dados e o sistema de comunicação com o exterior (sistema E/S). A ligação entre os blocos de base é feita através de três barramentos: barramento de dados, barramento de endereços e barramento de controle. A unidade central de processamento divide-se funcionalmente em duas unidades: a unidade de processamento de dados (CPU) e a unidade de controle e é responsável pela execução do programa. A unidade de controle decodifica e controla a execução das instruções gerando os comandos que permitem o processamento da informação de acordo com o programa que está sendo executado. O registrador program counter (PC) e o registrador de status fazem também parte da unidade de controle. A unidade de processamento de dados faz o processamento da informação e é constituída por uma unidade aritmética e lógica e por um conjunto variável de registradores com funções genéricas. A estrutura descrita designa-se estrutura de Von Neumann. 1.1 Conceitos de microprocessador Designa-se por microprocessador um circuito integrado que implemente as funções de uma unidade central de processamento. O primeiro microprocessador, designado 4004, surgiu em 1971 tendo sido produzido pela empresa Intel. Antes dessa data as unidades centrais de processamento eram implementadas recorrendo a diversos componentes. 1.2 Conceitos de microcontrolador Designa-se por microcontrolador um circuito integrado que implementa um sistema computador. Um microcontrolador é constituído por um microprocessador e um ou mais dos seguintes dispositivos: memória, temporizador/contador, conversor A/D, conversor D/A, controlador DMA, porta paralela, porta série, circuitos para interface com memória externa, nomeando apenas os blocos mais comuns. A principal aplicação dos microcontroladores são os sistemas embarcados, em que o microcontrolador é programado para cumprir determinada função sendo colocado junto do sistema com que vai interagir. Estes componentes são utilizados para estas funções porque são pequenos, versáteis e (quase) auto-suficientes. Como exemplos típicos de microcontroladores de 8 bits podem referir-se os microcontroladores das famílias seguintes: família MCS-51 da Intel, família M68HC11 da Motorola e família PIC da Microchip.

2 - Família MCS-51 A arquitetura básica da família MCS-51 é constituída por uma unidade central de processamento de 8 bits otimizada para aplicações de controle, 64 Kbytes de espaço de endereçamento para a memória de programa, 64 Kbytes de espaço de endereçamento para a memória de dados, 4 Kbytes de memória de programa interna, 128 bytes de memória de dados interna, 32 linhas entrada/saída bidirecionais endereçáveis individualmente. Dois temporizadores/contadores de 16 bits, uma UART (universal asynchronous receiver transmiter) full duplex, uma estrutura de interrupções com 5 fontes de interrupção correspondentes a 5 vetores de interrupção com dois níveis de prioridades cada e um circuito oscilador para gerar o sinal de relógio. O diagrama de blocos da arquitetura de base da família MCS-51 pode ser visto na figura 2. Figura 2- Arquitetura do microcontrolador 80C51. As diferenças deste microcontrolador para outros membros da família MCS-51 relacionam-se fundamentalmente com a quantidade de memória interna (memória de programa e memória de dados) e com as capacidades de E/S de cada um. Na tabela 1 apresentam-se algumas das características de alguns dos microcontroladores da família MCS-51.

Tabela 1- Tabela comparativa das características de alguns microcontroladores da família MCS- 51. 3 - Organização da memória A memória de dados e a memória de programa têm espaços de endereçamento diferentes cada um com 64 Kbytes, organizados segundo os mapas de memória da figura 3. 3.1 - Memória de programa Figura 3- Mapas de memória do microcontrolador 80C51. A memória de programa é uma memória do tipo ROM, por isso sobre ela só se efetuam operações de leitura. Este memória pode ser interna e/ou externa e ocupa no máximo 64 Kbytes. O acesso à memória de programa externa faz-se recorrendo ao sinal /PSEN (Program Strobe Enable) que deverá ser ligado ao pino de output enable da memória. O sinal aplicado ao pino /EA do microcontrolador determina qual o tipo de acesso a ser feito para os 4 Kbytes inferiores da memória de

programa. Se /EA = 0, para endereços a partir de 0000H o acesso é feito à memória de programa externa, se /EA = 1, o acesso é feito è memória de programa interna para endereços de 0000H até 0FFFH, sendo feito o acesso à memória de programa externa para endereços mais elevados. 3.2 - Memória de dados A memória de dados é do tipo RAM podendo ser lida ou escrita pelo microcontrolador. Esta memória pode ser interna e/ou externa. O espaço de endereçamento associado à memória de dados é de 64 Kbytes. 3.2.1 Memória de programa externa O acesso à memória de programa externa faz-se recorrendo aos sinais /RD (Read) e /WR (Write) fornecidos pelo microcontrolador para controle da operação da memória. O endereçamento pode fazer-se recorrendo a um mínimo de um e máximo de dois bytes. Para acesso à memória de programa externa utiliza-se a porta P0 como barramento multiplexado de endereços/dados (byte menos significativo). A porta P2, caso seja necessária a sua utilização, funciona como barramento de endereços (byte mais significativo). 3.2.2 - Memória de dados interna A memória de dados interna encontra-se dividida em 3 blocos distintos, de acordo com o mapa da figura 4. O acesso à memória de dados interna faz-se utilizando endereços de 8 bits. Figura 4- Memória de dados interna. A área de memória superior contém os registrradores com funções especiais, SFRs (Special Function Registers). O acesso a esta área de memória faz-se utilizando endereçamento direto. A função de cada um destes registradores será analisada em detalhe no item 5. A área de memória superior representada na figura 4 a tracejado não está implementada no microcontrolador 80C51 existindo apenas nos dispositivos com 256 bytes de RAM interna. O acesso a esta área de memória é feito utilizando endereçamento indireto sendo uma região de uso genérico. A parte inferior da memória de dados interna encontra-se dividida em três regiões distintas como se pode ver no mapa da figura 5. O acesso pode ser feito utilizando endereçamento direto ou indireto. Figura 5- Espaço inferior da memória de dados interna.

Os 32 bytes inferiores destinam-se aos quatro bancos de oito registradores designados R0 a R7. A seleção do banco de registrradores é feita recorrendo aos bits RS1 (Register Select) e RS0 do registrador PSW (Program Status Word). Segue-se uma área de 16 bytes (128 bits) endereçáveis bit a bit sendo a restante área de uso genérico. 3.3 - Esquemas de montagem para acesso à memória externa As ligações à memória externa fazem-se utilizando os sinais de controle disponibilizados pelo microcontrolador. 3.3.1 - Memória de programa externa No exemplo apresentado na figura 6 considera-se que toda a memória de programa é externa e por isso o pino /EA do microcontrolador é ligada a terra. O endereçamento é feito utilizando 16 bits o que implica a utilização para endereçamento da porta P2 (além da porta P0). O sinal ALE (Address Latch Enable) utiliza-se para fazer a desmultiplexagem do barramento P0 permitindo que o byte menos significativo do endereço fique disponível através da latch durante a fase de acesso à memória. O sinal /PSEN controla a operação da memória sendo a leitura dos dados feita através de P0. 3.3.2 - Memória de dados externa Figura 6- Acesso à memória de programa externa. A figura 7 apresenta um esquema de montagem para acesso à memória de dados externa. Neste exemplo considerou-se que toda a memória de programa é interna (/EA = VCC). Utiliza-se o esquema de demultiplexagem referido anteriormente. Os sinais /RD e /WR são utilizados para fazer o controle da memória. Caso não seja necessário acessar a todo o espaço de endereçamento pode recorrer-se só à utilização de alguns dos bits da porta P2 (além da porta P0) para fazer o endereçamento da memória. A troca de dados faz-se através da porta P0. Figura 7- Acesso à memória de dados externa.

4 - Registradores com funções especiais (SFRs) Os registradores com funções especiais encontram-se mapeados na parte superior da memória de dados interna e são acessados utilizando endereçamento direto. A tabela 2 apresenta o símbolo, o nome, o endereço e o tipo de endereçamento para cada SFR do microcontrolador 80C51. Símbolo Nome End. [Hexadecimal] Endereçamento ACC Acumulador E0 Bit B Registrador B F0 Bit PSW Program Status Word D0 Bit SP Stack Pointer 81 Registrador DPTR Data Pointer [2 bytes] DPL Byte menos significativo 82 Registrador DPH Byte mais significativo 83 Registrador P0 Porta 0 80 Bit P1 Porta 1 90 Bit P2 Porta 2 A0 Bit P3 Porta 3 B0 Bit IP Interrupty Priority Control B8 Bit IE Interrupty Enable Control A8 Bit TMOD Timer/Counter mode Control 89 Registrador TCON Timer/Counter Control 88 Bit TH0 Timer/Counter 0 high byte 8C Registrador TL0 Timer/Counter 0 low byte 8A Registrador TH1 Timer/Counter 1 high byte 8B Registrador TL1 Timer/Counter 1 low byte 8D Registrador SCON Serial control 98 Bit SBUF Serial Data Buffer 99 Registrador PCON Power Control 87 Registrador 4.1 - Registrador acumulador Tabela 2 Registradores com funções especiais. O registrador acumulador serve de interface com a unidade aritmética e lógica da CPU. Nos programas deve ser referido por [A]. Este registrador pode ser endereçado bit a bit. 4.2 - Registrador B Este registrador é utilizado durante as operações de divisão e multiplicação em conjunto com o registrador acumulador. Para outras operações pode ser tratado como um registrador comum. É endereçável bit a bit. 4.3 - Registrador Program Status Word O registrador PSW corresponde ao registrador de status da arquitetura de Von Newman e contém informação sobre a execução dos programas. O registrador é apresentado em detalhe na figura 8. Figura 8- Registrador PSW.

O bit mais significativo do registrador (PSW.7) designa-se CY (carry flag) e reflete a condição de carry no oitavo bit do acumulador. O bit seguinte (PSW.6), designado AC (Auxiliary Carry flag), reflete a condição de carry no quarto bit do registrador acumulador. O bit PSW.5 designa-se F0 e utiliza-se como flag de uso genérico. Os bits PSW.4 e PSW.3 são os bits de seleção do banco de registradores, designados RS1 e RS0 respectivamente. A seleção é feita de acordo com a tabela 3. Tabela 3- Seleção do banco de registradores. O bit PSW.2 designa-se OV e reflete a condição de overflow. O bit PSW.1 não tem nome atribuído e representa uma flag a ser definida pelo utilizador. Finalmente o bit PSW.0, designado P, reflete a paridade do registrador acumulador. O bit P é colocado no nível lógico 1 se o número de 1s no acumulador for impar e nos outros casos o bit P é colocado no nível lógico 0. 4.4 - Registrador Stack Pointer Contém o endereço do topo da stack. A stack é uma estrutura de dados do tipo LIFO (last-in-first-out) utilizada para guardar informação de modo temporário. 4.5 - Registrador Data Pointer Conjunto de dois registradores de 8 bits, DPL e DPH, que contêm um endereço de 16 bits. Este registrador tem três aplicações principais: fazer procura em tabelas no espaço de memória de programa utilizando a instrução MOVC A, @A+DPTR. Implementar saltos multi-direcionais utilizando a instrução JMP @A+DPTR. acesso à memória de dados externa, utilizando a instrução MOVX A,@DPTR ou a instrução MOVX @DPTR,A. 4.6 - Registradores associados às Portas P0 a P3 são os registradores associados aos latches das portas de E/S P0, P1, P2 e P3, respectivamente. 4.7 - Registradores para controle de interrupções IP e IE são os registradores que permitem fazer a seleção de prioridades e a ativação das interrupções, respectivamente. 4.8 - Registradores dos temporizadores/contadores TH0, TL0 e TH1, TL1 são os registradores que contém as contagens dos temporizadores/contadores 0 e 1 respectivamente. TMOD e TCON são os registradores de controle e status dos temporizadores/contadores. O primeiro permite fazer a programação do modo de operação e no segundo encontram-se bits relacionados com o controle do funcionamento dos temporizadores/contadores.

4.9 - Registradores da porta série SBUF representa dois registradores distintos um de recepção e outro de transmissão. A utilização de um ou de outro é selecionada automaticamente pelo hardware da porta série dependendo do contexto em que SBUF está a ser referido na instrução do programa (leitura ou escrita). SCON é o registrador de controle e status da porta série. 4.10 - Registrador Power Control O registrador power control permite efetuar a programação do modo de operação do microcontrolador. 4.11 - Registrador Program Counter O registrador program counter (PC) embora não seja referido na tabela, pois não pode ser diretamente acessado pelo programador, é um registrador de 16 bits que contém o endereço da próxima instrução a executar. Depois de efetuado o reset do microcontrolador o conteúdo deste registrador é zero. 5 - Modos de endereçamento A codificação das instruções da família MCS-51 é feita utilizando um byte para o código de operação (opcode) e 0 a 2 bytes para informação sobre os operandos. Os modos de endereçamento utilizam-se para especificar os operandos necessários para cada instrução. A família MCS-51 dispõe de 10 modos de endereçamento divididos por três classes: modos de endereçamento de dados, modos de endereçamento relativos a saltos e modos de endereçamento relativos a bits. 5.1 - Modos de endereçamento de dados Existem cinco modos de endereçamento de dados: registrador inerente, direto, imediato, indireto e indexado. 5.1.1 - Registrador inerente O modo de endereçamento registrador inerente utiliza-se para os registradores em que não é necessário especificar nenhum byte adicional para designar o operando. O registrador a operar é codificado no código de operação da instrução. Os registradores para os quais este método de codificação é feito são os seguintes: R0 a R7, A, PSW, SP e PC. Este modo de endereçamento caracteriza-se pelo tipo de codificação explícita que fornece para todas as instruções que utilizem os registradores referidos. Este modo de endereçamento pode coexistir na mesma instrução com os outros modos de endereçamento de dados referidos nos pontos seguintes. Exemplos: 5.1.2 - Direto MOV R1,#25 INC R0 ; coloca o valor 25 no registrador R1 ; adiciona 1 ao conteúdo do registrador R0 Este modo de endereçamento utiliza-se para acessar a memória de dados interna. A codificação da instrução é feita com um byte para o código de operação da instrução e um byte adicional para especificar o endereço a acessar. Como a especificação do endereço se faz num único byte a gama de endereços possível é de 0 a 255. A gama de endereçamento referida permite acessar a toda a área de

memória de dados interna podendo especificar-se o acesso a um registrador ou a uma variável. Exemplos de operação sobre variáveis em RAM interna: MOV 23H,A ADD A,40H ; copia o conteúdo do acumulador para a posição de ; memória cujo endereço é 23H. ; soma o conteúdo da posição de memória 40H ao ; acumulador. Exemplos de operação sobre SFRs: MOV B0H,A ; coloca o conteúdo do acumulador à saída da porta P3. Este estilo de programação, embora correto, não é muito claro e facilita a ocorrência de erros. Sempre que sejam referidos SFRs deve optar-se pela utilização do seu nome simbólico, o que torna o código mais perceptível evitando a ocorrência de erros. O assembler do MCS-51 permite a utilização de nomes simbólicos para os SFRs. MOV P3,A ; coloca o conteúdo do acumulador à saída da porta P3 ; recorrendo ao nome simbólico do registrador associado ; a porta 3. O assembler procede à tradução do nome simbólico para o endereço correspondente. 5.1.3 - Imediato O modo de endereçamento imediato permite especificar um valor numérico constante. As constantes a especificar podem ter 8 bits ou 16 bits. Os valores de 16 bits só podem ser usados em conjunto com o registrador DPTR. Em assembly os valores numéricos imediatos são precedidos do caractere #. Exemplos: MOV A,#22 ; carrega o acumulador com o valor 22. ADD A,#30 ; soma 30 ao acumulador MOV DPTR,#20F0H ; carrega o valor hexadecimal 20F0 ; no registrador DPTR. 5.1.4 - Indireto No modo de endereçamento indireto a instrução especifica um registrador que contém o endereço do operando. Tanto a memória de dados interna como a externa podem ser endereçadas deste modo. Este modo de endereçamento é útil no acesso a arrays. Só os registradores R0, R1 e DPTR podem ser utilizados como ponteiros de dados. R0 e R1 são ponteiros de 8 bits e DPTR é um ponteiro de 16 bits. O registrador a utilizar é precedido do caractere @. Exemplos: ADD A,@R1 MOV @R0, A MOVX A,@DPTR ; adiciona o conteúdo da posição de memória ; pontada por R1 ao acumulador. ; guarda o conteúdo do acumulador na posição de ; memória apontada por R0. ; copia o conteúdo da posição de memória externa ; apontada por DPTR para o acumulador.

5.1.5 - Indexado Este modo de endereçamento só é permitido para acesso à memória de programa, por isso só é utilizado para leitura. Destina-se ao acesso a tabelas e a instruções de salto. No acesso a tabelas um registrador de 16 bits (DPTR ou PC) contém o endereço base da tabela e o acumulador é carregado com o número de entrada na tabela. O endereço da entrada na tabela é calculado somando ao valor do registrador o valor do acumulador. Na instrução JMP o endereço do destino é calculado como a soma do ponteiro base (DPTR ou PC) e do valor do acumulador. Exemplos: JMP @A+DPTR MOVC A,@A+DPTR MOVC A,@A+PC ; coloca no registrador PC o valor igual à soma do ; conteúdo dos registradores DPTR e acumulador e ; continua a execução do programa a partir desse ; endereço. ; carrega o conteúdo da posição de memória ; apontada pela soma dos registradores acumulador ; e DPTR no acumulador. ; carrega o acumulador com o conteúdo da posição ; de memória cujo endereço é a soma dos ; registradores acumulador e PC. 5.2 - Modos de endereçamento relativos a saltos São três os modos de endereçamento relativos a saltos: relativo, absoluto e longo. 5.2.1 - Relativo Este modo de endereçamento é utilizado com instruções de salto condicional. O deslocamento (offset) do salto é de 8 bits, tendo uma gama de 128 a 127 bytes, e calcula-se tendo por referência o primeiro byte depois da instrução de salto. Quando o salto é executado o deslocamento é somado ao conteúdo do registrador PC para formar o endereço de destino. O destino do salto é normalmente especificado utilizando um rótulo (label) sendo o assembler que calcula o valor do deslocamento efetivo de acordo com as regras descritas. Exemplos: JZ et1 JNC et2 ; salta para a instrução com o rótulo et1 se o ; valor no acumulador for nulo. ; salta para a instrução com o rótulo et2 se a ; flag de carry do registrador PSW for igual a 0. 5.2.1 - Absoluto Este modo de endereçamento é utilizado com as instruções ACALL e AJMP. São especificados os 11 bits menos significativos da instrução de destino. Os 5 bits mais significativos são iguais aos 5 bits mais significativos do registrador PC. Devido ao fato de só ser possível especificar 11 bits do endereço de destino só são permitidos saltos dentro da página corrente de 2 Kbytes da memória de programa. O endereço absoluto é normalmente especificado recorrendo a um rótulo que o assembler traduz. Exemplos: ACALL et3 ; chama a sub-rotina que tem início na posição ; dada por et3 AJMP ciclo1 ; faz com que a instrução com o rótulo ciclo1 ; seja executada a seguir à instrução corrente.

5.2.3 - Longo Colégio Técnico de Campinas Cotuca Disciplina - TDM II Este modo de endereçamento utiliza-se com as instruções LCALL e LJMP. É especificado um endereço de 16 bits para destino do salto. O endereço longo é normalmente referido no programa recorrendo a um rótulo. Exemplos: LCALL et5 ; chama a sub-rotina cujo início corresponde à ; posição de memória ao rótulo et5. LJMP ciclo2 ; faz com que a instrução como rótulo ciclo2 ; seja executada a seguir a esta instrução. 5.3 - Modos de endereçamento relativos a bits Os modos de endereçamento relativos a bits são dois: bit inerente e bit direto. 5.3.1 - Bit inerente O modo de endereçamento bit inerente utiliza-se com instruções booleanas que operam com o bit carry flag do registrador PSW. O bit carry flag é codificado no código de operação não sendo necessário nenhum byte adicional para codificar o operando. Exemplos: SETB C ; coloca CY = 1. CLR C ; coloca CY = 0. CPL C ; complementa CY. 5.3.2 - Bit direto Este modo de endereçamento utiliza-se com instruções booleanas que necessitam que o bit a operar seja identificado através de um byte adicional quando é feita a codificação da operação, para além do byte utilizado para o código de operação. São endereçáveis bits no espaço de RAM interna entre 20H e 2FH e bits da maioria dos SFRs. Endereços de bit entre 0 e 127 definem bits na área de memória de dados interna que pode ser endereçada bit a bit. Endereços de bit entre 128 e 255 correspondem a bits dos SFRs que são endereçáveis individualmente.

Figura 9 - Mapa de endereços de bit em memória interna. A linguagem assembly do MCS-51 especifica que o endereçamento a bit pode ser feito de três modos: pelo número ou expressão correspondente ao endereço direto do bit (0-255), pelo nome ou endereço do registrador que contém o bit seguido de um ponto e da posição do bit no registrador (0-7) ou pelo símbolo predefinido do bit em assembly. Nome do Posição do BIT Registrador 7 6 5 4 3 2 1 0 PSW CY AC FO RS1 RS0 OV P P3 RD WR T1 T0 INT1 INT0 TXD RXD TCON TF1 TR1 TF0 TR0 IE1 IT1 TE0 IT0 SCON SM0 SM1 SM2 REN TB8 RB8 TI RI IE EA ES ET1 EX1 ET0 EX0 IP PS PT1 PX1 PT0 PX0 Exemplos: Tabela 4 - Símbolos dos bits dos registradores de controle e status. CLR PSW.6 SETB TR1 SETB 08H ; coloca a 0 o bit 6 (auxiliary carry) do registrador ; PSW. ; coloca a 1 o bit 6 do registrador TCON. ; coloca a 1 o bit 0 da posição de memória de dados ; interna 21H, correspondente ao endereço de bit 08H.

5.4 - Espaço de memória de dados / modos de endereçamento A área de memória de dados a acessar relaciona-se diretamente com o modo de endereçamento a utilizar. Assim para a área de memória de dados externa utilizase endereçamento indireto através dos registradores DPTR, R0 ou R1. Para a parte inferior (128 bytes menos significativos) da área de memória de dados interna, utilizam-se os modos de endereçamento direto ou indireto e para a parte superior da área de memória de dados interna (128 bytes mais significativos correspondentes aos SFRs) utiliza-se o modo de endereçamento direto. Finalmente para as áreas de memória interna acessíveis bit a bit utiliza-se o modo de endereçamento bit direto, a menos que a instrução atue sobre o bit de carry, sendo nesse caso utilizado o modo de endereçamento bit inerente. 6 - Conjunt o de Instruções O conjunto de instruções de qualquer microcontrolador pode dividir-se em cinco grupos fundamentais de operações: operações de transferência, operações aritméticas, operações lógicas (por vezes estes dois grupos são considerados em conjunto), operações sobre variáveis booleanas e operações de salto. A família MCS-51 não constitui exceção, podendo o seu conjunto de instruções ser dividido nos cinco grupos referidos. As operações pertencentes a cada grupo são apresentadas em seguida. As notações utilizadas pela família MCS-51 na apresentação do seu conjunto de instruções são as seguintes: Rn Registradores R0-R7 do banco de registradores selecionado. direto endereço de uma posição de memória (8 bits) do espaço de endereçamento direto (RAM de dados interna ou SFRs). @Ri posição de memória de dados interna (8 bits) endereçada indiretamente através dos registradores R0 ou R1. #dados constante de 8 bits incluída na instrução. #dados16 constante de 16 bits incluída na instrução. end16 endereço de destino de 16 bits. end11 endereço de destino de 11 bits. Rel byte de deslocamento com sinal (complemento para 2). 6.1 - Operações de Transferência O grupo de operações de transferência é constituído pelas operações que permitem a transferência ou troca de informação entre duas posições de memória. Existem operações para transferência de código (MOVC), para manipulação da stack (PUSH e POP) e para troca de dados entre o acumulador e um registrador ou byte direto (XCH). As operações pertencentes a este grupo de instruções são apresentadas na tabela de SET de Instruções no final da apostila. Na tabela são apresentados os mnemônicos da operação, utilizadas para a escrita do programa, a descrição sumária da operação, o número de bytes que a operação ocupa depois de codificada e o número de períodos do oscilador necessários para a execução da operação. 6.2 - Operações Aritméticas O grupo de operações aritméticas inclui operações para adição (ADD e ADDC), subtração (SUBB), incremento (INC), decremento (DEC), multiplicação (MUL), divisão (DIV) e ajuste decimal (DA). De acordo com a arquitetura da unidade aritmética e lógica, um dos operandos das operações aritméticas tem que estar colocado no registrador acumulador, sendo o resultado apresentado no mesmo registrador (adição e subtração). No caso das operações de multiplicação e de divisão o segundo operando tem que estar colocado no registrador B. O resultado da operação de multiplicação é de 16 bits sendo o byte menos significativo apresentado no acumulador e o byte mais significativo no registrador B.

Na operação de divisão o quociente é colocado no acumulador e o resto no registrador B. A operação de ajuste decimal utiliza-se o ajuste para BCD do valor contido no acumulador. Verificar este conjunto de instruções no final da apostila 6.3 - Operações Lógicas As operações lógicas do conjunto de instruções são as operações AND, OR, XOR, clear (CLR), complemento (CPL), rotação simples para a direita ou para a esquerda (RL, RR), rotação com carry, para a esquerda ou para a direita (RLC, RRC) e troca de nibbles (conjunto de 4 bits) no acumulador. 6.4 - Operações sobre variáveis booleanas Este grupo de operações dispõe de instruções para colocar um bit a zero (CLR) ou a um (SETB), para complementar (CPL), para efetuar a operação AND ou OR entre um bit e a flag de carry, para transferência de um bit para a flag de carry ou da flag de carry para um bit e operações de salto condicional baseadas no teste da flag de carry (JC, JNC) ou no teste de um bit (JB, JNB). 6.5 - Operações de salto As instruções do grupo de operações de salto permitem alterar o fluxo de execução do programa. Existem instruções para chamada de rotinas (ACALL, LCALL), retorno de rotinas (RET) e de rotinas de serviço a interrupções (RETI), salto incondicional (AJMP, LJMP) e salto condicional (JZ, JNZ, CJNE, DJNZ). Existe ainda uma instrução que não produz nenhum resultado (NOP). A instrução de salto condicional JZ e JNZ permite o salto com base no teste do valor da flag de zero. A instrução CJNE compara o valor contido no acumulador, num registrador ou numa posição de memória acessível indiretamente, com o valor imediato ou com o byte direto referido na instrução e salta se os valores forem iguais. A instrução DJNZ decrementa o registrador ou byte direto e salta se o resultado da operação de decremento for zero. 6.6- Exercícios Resolvidos 1- Considere uma tabela com 50 elementos de 8 bits. A tabela está armazenada na memória de programa com início no endereço 1000H. Escreva uma seqüência de instruções que carregue o nono elemento da tabela no acumulador. MOV DPTR,#1000H MOV A,#8 MOVC A,@A+DPTR ; colocar endereço base no DPTR. ; colocar 8 no acumulador. ; utilizar endereçamento indexado para transferir ; o nono elemento da tabela para o acumulador. 2- Escrever uma seqüência de instruções para trocar o conteúdo das posições de memória 40H e 30H. MOV A,40H ; colocar conteúdo do endereço 40H (end. direto) em A. MOV B,30H ; colocar conteúdo do endereço 30H em B. MOV 30H,A ; guardar conteúdo de A na posição 30H. MOV 40H,B ; guardar conteúdo de B na posição 40H. 3- Adicione o conteúdo das posições de memória 40H e 30H e deixe o conteúdo no acumulador. MOV A,30H ; colocar o conteúdo do endereço 30H em A. ADD A,40H ; somar o conteúdo do endereço 40H a A. 4- Subtrair o conteúdo da posição de memória 40H e o carry ao conteúdo da posição de memória 30H.

MOV A,30H ; colocar o conteúdo do endereço 30H em A. SUBB A,40H ; subtrair o conteúdo do endereço 40H e o carry a A. 7- Temporização da unidade central de processamento A temporização da CPU faz-se recorrendo ao circuito oscilador do microcontrolador ou através de um sinal de relógio externo. Quando se utiliza o circuito oscilador à montagem recomendada segue o esquema da figura 10. Torna-se necessária a utilização de dois capacitores e um cristal oscilador como componentes externos. O cristal deve respeitar a especificação de freqüência máxima permitida e o valor dos capacitores depende do tipo de cristal utilizado e pode ser determinado consultando o datasheet do microcontrolador a utilizar. Figura 10- Esquema de montagem do circuito temporizador utilizando o oscilador interno do microcontrolador. Se o sinal de relógio for fornecido a partir do exterior pode utilizar-se o esquema da figura 11. Figura 11- Esquema de montagem do circuito temporizador para dispositivos HMOS ou CHMOS, utilizando um sinal de relógio externo. 7.1- Ciclos máquina e execução de instruções A execução de uma instrução implica a realização de uma série de operações base sobre o hardware que não podem ser executadas num único período de oscilação. Um ciclo máquina corresponde ao número mínimo de períodos do oscilador de que o microcontrolador necessita para executar uma instrução. Na família MCS-51 um ciclo máquina encontra-se dividido em 6 estados S1 a S6, cada um com duração de dois períodos do oscilador. Assim um ciclo máquina corresponde a um total de doze períodos do oscilador. O sinal ALE é ativado durante os estados S1 e S4 de cada ciclo máquina apresentado por isso uma freqüência igual a 1/6 da freqüência do oscilador.

8- O assembly da família MCS-51 Um programa em linguagem assembly MCS-51 é constituído por linhas de que podem ser: instruções da linguagem assembly. comentários. diretivas para o assembler. Cada linha contendo instruções em assembly está dividida em 4 campos alguns dos quais podem estar vazios. Esses campos são: campo da etiqueta ou rótulo. campo da operação. campo dos operandos (0 a 3 operandos). campo de comentário. O campo da etiqueta [ou rótulo]; é facultativo e consiste num identificador que constitui a etiqueta seguida de [:]. Os campos da operação e dos operandos estão diretamente relacionados, pois o número de operandos a utilizar depende da operação. Estes campos são constituídos pelas operações descritas no conjunto de instruções seguindo o formato apresentado nas tabelas 5 a 9 (onde são apresentados os tipos de operandos permitidos para cada operação). O campo de comentário é facultativo e inicia-se com [;]. Podem existir linhas que contenham apenas comentários que deverão iniciar-se por [;]. Designa-se por programa assembler ou simplesmente assembler o programa que traduz o código em linguagem assembly para código máquina, que corresponde ao código que a CPU consegue processar. Cada assembler tem as suas particularidades próprias e as suas limitações sendo sempre necessária a consulta do manual a ele associado quando durante a fase de programação do código. As linhas de diretivas para o assembler correspondem a ordens para o assembler sobre o modo como ele vai efetuar a tradução do código escrito em assembly para código máquina. Em seguida são apresentadas as diretivas utilizadas pelos assemblers da família MCS-51, devendo notar que nem todos os assemblers utilizam todas as diretivas descritas, por isso a consulta da documentação relacionada com o assembler é indispensável. 8.1- Diretivas do assembler Existem oito tipos de diretivas: para controle de segmentos. para definição de símbolos. para inicialização de memória. para reserva de memória. para ligação do programa. para controle de endereços. para definição de macros. outras diretivas. Em seguida serão apresentadas as diretivas correspondentes a cada tipo. 8.1.1- Diretivas para controlo de segmentos Designa-se por segmento um bloco de memória de código ou de dados criado pelo assembler. As diretivas para controle de segmentos servem para criar e selecionar segmentos. Estão definidas cinco classes de memória que podem ser utilizadas na definição ou criação do segmento:

BIT bit em memória interna. Endereços até de 0 a 255. CODE memória de código. Endereços de 0000H a 0FFFFH. DATA memória de dados acessíveis através de endereçamento direto. Endereços de 0 a 255 (posições genéricas de 0 a 127 e SFRs de 128 a 255). IDATA memória de dados interna. Endereços de 0 a 255. XDATA memória de dados externa. Endereços de 0000H a 0FFFFH. As diretivas deste tipo são apresentadas na tabela 5. Exemplos: Tabela 5- Diretivas para controle de segmentos. mprogr SEGMENT CODE ; define o segmento de código mprogr. RSEG mprogr ; ativa o segmento mprogr. dd1 SEGMENT DATA ; define o segmento de dados dd1. mprog1 SEGMENT CODE AT 1000H ;define o segmento de código mprogr1 com ; início no endereço 1000H. xdd SEGMENT XDATA PAGE ; define o segmento de dados externos xdd ; alinhado com uma página de 256 bytes. BSEG AT 20H ; define um segmento absoluto de bit com ; início no endereço 20H. 8.1.2- Diretivas para definição de símbolos As diretivas para atribuição de símbolos atribuem determinado valor a um símbolo. As diferenças entre as várias diretivas deste tipo relacionam-se com o tipo de valor a atribuir ao símbolo. A lista das diretivas deste tipo é apresentada na tabela 6. Exemplos: Tabela 6- Diretivas para definição de símbolos. pt_leitura SET R1 ; utilizar R1 como pt_leitura. falso EQU 0 ; utilizar falso para representar 0. flag1 BIT 50H ; utilizar o bit cujo endereço é 50H como flag1. restart CODE 00H ; faz restart igual à memória de código 00H. PORT1 DATA 90H ; atribui a PORT1 o valor 90H correspondente ; ao endereço do registrador associado ao porto P1.

8.1.3- Diretivas para inicialização de memória As diretivas para inicialização de memória permitem inicializar em memória de código posições de 8 ou 16 bits. A tabela 7 apresenta as diretivas disponíveis com esta função. Exemplos: Tabela 7- Diretivas para inicialização de memória. segmento1: DB 7EH,60H,6DH,79H ; inicializa 4 posições de 8 bits, com início ; na posição cujo endereço corresponde à ; etiqueta segmento1, com os valores ; indicados. prompt: DB Ola, como esta! ; neste caso a inicialização é feita com ; os códigos ASCII ; correspondentes aos caracteres entre. tab_salto: DW end1, end2, end3 ; inicializa o segmento de ; código com os endereços ; correspondentes às etiquetas ; end1, end2 e end3. 8.1.4- Diretivas para reserva de memória Este tipo de diretivas serve para reservar espaços de memória de 1 ou de 8 bits. As diretivas deste tipo são apresentadas na tabela 8. Exemplos: Tabela 8- Diretivas para reserva de memória. DBIT 9 DS 25 ; reserva nove bits. ; reserva 25 bytes no segmento ativo. 8.1.5- Diretivas para ligação do programa As diretivas para ligação do programa utilizam-se quando o programa a desenvolver se encontra distribuído por vários módulos. Como os módulos necessitam de partilhar informação torna-se necessário identificar a origem da informação (quando externa) ou qual a informação que vai ser partilhada. As diretivas deste tipo utilizam-se para essas funções e encontram-se na tabela 9. Tabela 9- Diretivas para ligação do programa.

Exemplos: Colégio Técnico de Campinas Cotuca Disciplina - TDM II PUBLIC s1, s2, s3 ; torna públicos os símbolos s1, s2 e s3. EXTRN CODE(s1, s2) ; declara que os símbolos s1 e s2 estão definidos noutro ; módulo. NAME módulo1 ; especifica que o módulo objeto a se deve chamar ; módulo1. 8.1.6- Diretivas para controle de endereços Estas diretivas servem para determinar o endereço em que o código deve ser posicionado e para seleção do banco de registradores a utilizar. Estas diretivas encontram-se na tabela 10. Exemplos: Tabela 10- Diretivas para controle de endereços. ORG 2000H ; posiciona o contador de localização no endereço 2000H ORG reset ; em que reset é um símbolo predefinido correspondendo a um ; dado endereço. USING 2 ; seleciona o banco de registradores número 2. 8.1.7- Diretivas para definição de macros Este tipo de diretivas permite definir macros. Designa-se por macro um conjunto de instruções reunidas sob uma determinada etiqueta utilizando diretivas específicas. Quando a etiqueta é referida no programa o assembler procede à sua substituição pelo código referido anteriormente. Nem todos os assemblers suportam a utilização de macros. Estas diretivas são apresentadas na tabela 11. Tabela 11- Diretivas para definição de macros. Uma macro define-se do seguinte modo: nome_macro: MACRO ard1, arg2,..... ENDM ; comentário 8.1.8- Outras diretivas A única diretiva listada neste ponto serve para assinalar o fim do módulo e por isso corresponde sempre à última linha de um programa em linguagem assembly. O seu formato é apresentado na tabela 12.

9- Reset Tabela 12- Outras diretivas. O reset do microcontrolador efetua-se colocando o pino RST no nível lógico 1 durante pelo menos dois ciclos máquina (24 períodos do oscilador). Na tabela 13 é apresentado o conteúdo dos SFRs depois do reset. Tabela 13- Valor dos SFRs depois do reset. O esquema de montagem recomendado para power-on reset do microcontrolador é apresentado na figura 12. 10- Estrutura e operação das portas E/S Figura 12- Circuito para power-on reset. O 8051 possui 4 portas de entrada/saída, designados P0 a P3, todas elas bidirecionais. As portas são constituídas por uma latch, um driver de saída e um buffer de entrada. As latches correspondem aos SFRs P0 a P3.

10.1- Funções alternativas das portas E/S As portas P0, P2 e P3 têm funções específicas associadas à utilização de certas configurações ou blocos de hardware. A porta P0 é utilizada como barramento de endereços/dados nos acessos à memória externa. Esta porta serve para endereçar o byte menos significativo do endereço. A porta P2 é utilizada como barramento de endereços nos acessos à memória externa quando o endereçamento é de 16 bits. Esta porta endereça o byte mais significativo do endereço. A porta P3 é multifuncional estando os seus bits associados a diferentes blocos internos de hardware. As funções alternativas da porta P3 são apresentadas na tabela 14. Tabela 14- Funções alternativas da porta P3. 10.2- Estrutura dos pinos E/S Os esquemas elétricos de um bit de cada um das portas são apresentados nas figuras 13, 14, 15 e 16. Figura 13- Esquema elétrico de um bit da porta P0.

Figura 14- Esquema elétrico de um bit da porta P1. Figura 15- Esquema elétrico de um bit da porta P2. Figura 16- Esquema elétrico de um bit da porta P3. A estrutura dos pinos E/S não é igual para todos eles. As portas P0 e P2 têm multiplexadores para redirecionar o pino para os barramentos de endereços ou dados, quando são utilizados para acesso à memória externa. As portas P1, P2 e P3 possuem pull-ups internos pelo que dispensam a utilização de pull-ups externos em circuitos de entrada. A porta P0 tem saídas open-drain devido à sua utilização como barramento multiplexado de endereços e dados. A operação das portas como entradas implicam a colocação das latches associadas às portas a 1, quando não estão sendo usadas para funções alternativas, para que os driver de saída sejam desativados. Algumas instruções para leitura das portas atuam sobre a latch, outras sobre o pino. As instruções que atuam sobre a latch, são instruções do tipo readmodify-write e encontram-se listadas na tabela 15.

Tabela 15- Instruções do tipo read-modify-write. Durante o acesso externo o conteúdo do registrador associado a P2 não é alterado e o conteúdo do registrador associado a P0 é colocado a 1. Os pinos de P3 ficam controlados pela função alternativa quando o conteúdo do registrador P3 é colocado a 1. 10.3- Utilização das portas E/S como entradas Podem utilizar-se diversos dispositivos de entrada como sejam interruptores, conversores A/D, teclado, entre outros. De seguida apresentam-se alguns exemplos de interfaces com dispositivos de entrada. 10.3.1- Interface com um DIP switch Um DIP switch consiste num conjunto de interruptores. Para a interface sugere-se o esquema de montagem da figura 17, que deve ser repetida para cada um dos interruptores utilizados na montagem. Figura 17- Esquema de montagem para interface com DIP switch. A montagem apresentada utiliza-se para portas que não tenham pull-ups internos. Caso a porta utilizado na ligação tenha pull-ups internos não é necessário colocar os resistores no circuito. Supondo que as ligações foram feitas para um DIP switch com 8 interruptores e que se utilizou a porta P2 para a ligação ao microcontrolador, o código para configuração da porta como entrada e para leitura do valor colocado à entrada é o seguinte. MOV P2,#FFH ; configuração da porta P2 como entrada. MOV A,P2 ; leitura da porta P2. 10.3.2 Interface com um teclado Existem diversos tipos de teclados: mecânicos, capacitivos, de efeito de Hall ou de membrana. Cada um destes tipos de teclados apresenta características distintas e requer um modo de processamento e hardware de interfaces diferentes.

Consideremos um teclado mecânico. Os teclados mecânicos quando são pressionados apresentam à saída uma série de pulsos e não uma única transição, como se pode ver na figura 18. Este fenômeno designa-se por contact bounce e pode durar de 5ms a 20ms. Figura 18- Ilustração do fenômeno de contact bounce. Para tornar obvio este problema é necessário usar uma das várias técnicas de deboucing, que podem ser implementadas utilizando hardware (circuito set-reset, porta CMOS, circuito RC, entre outros) ou por software. Neste exemplo o deboucing será feito por software. O algoritmo a utilizar num programa para leitura do teclado deverá seguir os passos seguintes: 1- Procura no teclado para determinar se alguma tecla foi pressionada. 2- Debouncing. 3- Consultam-se uma tabela para determinar o código ASCII associado à tecla pressionada (se necessário). A implementação da rotina para procura no teclado da tecla premida depende do modo como é feito a interface com o microcontrolador e do número de teclas disponíveis. O debouncing por software pode ser implementado através do algoritmo seguinte: 1- Espera X ms (X depende do tempo que o contacto leva a estabilizar). 2- Lê de novo o sinal associado à tecla. 3- Se o sinal estiver no nível lógico zero a tecla foi pressionada. Caso contrário a tecla não foi pressionada. Implementação de um salto de acordo com a decisão anterior. A rotina para determinação do código ASCII correspondente à tecla pressionada pode ser implementada colocando em memória de código a tabela com os códigos correspondentes às teclas existentes. Esta tabela pode ser acedida através da instrução MOVC A,@A+DPTR, colocando o índice de acesso, de acordo com a tecla pressionada, em A. O código base para implementação desta rotina é apresentado de seguida. tabela: DB... ; definição da tabela. Os caracteres devem ser ; colocados entre aspas. conv: MOV DPTR,#tabela ;coloca em DPTR o endereço base da tabela. MOVC A,@A+DPTR ;lê código ASCII da tabela. LCALL display ;chamada da rotina que faz o display do caractere. RET 10.4- Utilização dos portos I/O como saídas Podem utilizar-se como dispositivos de saída LEDs, displays de sete segmentos, LCDs, motores, conversores D/A entre outros. Em seguida são apresentados exemplos de interfaces para alguns dos dispositivos de saída referidos.

10.4.1 Interface com LEDs O LED permite de um modo simples a visualização do valor de um dado pino de saída. A interface pode ser implementada recorrendo ao esquema da figura 19. Figura 19- Esquema de montagem para interface com LEDs. As resistências utilizam-se para limitar a corrente nos LEDs. O seu valor deve ser calculado tendo em conta as características dos LEDs utilizados. Não é necessário nenhum tipo de configuração para utilizar uma porta como saída. A ativação dos pinos como saída faz-se escrevendo para a latch associada ao pino. Por exemplo, o código necessário para acender os LEDs L1 e L3 e para apagar o LED L2 do circuito anterior seria: MOV P1,#5 10.4.2 Interface com um display de sete segmentos Um display de 7 segmentos permite a visualização de dígitos entre 0 e 9. Este circuito tem sete entradas correspondentes aos 7 segmentos que podem ser manipulados de modo a permitir a visualização dos dígitos de acordo com a tabela 16. Tabela 16- Tabela de conversão BCD para 7 segmentos. O esquema para interface entre o microcontrolador e o display é apresentado na figura 20. O buffer é utilizado no caso da porta do microcontrolador não fornecer corrente suficiente para fazer o drive do display.

Figura 20- Esquema de montagem para interface com um display de 7 segmentos. Código para escrita do dígito 6 no display: 10.4.3- Interface com LCD MOV P1,#5FH O esquema de montagem para a interface depende do tipo de dispositivo LCD a utilizar. Como exemplo apresenta-se na figura 21 uma interface com o LCD LM015 que pode servir de modelo para o desenvolvimento de interfaces para outros LCDs. Figura 21- Esquema de montagem para interface com o LCD LM015. O LCD recebe dois tipos de informação: ordens, para posicionamento do cursor, por exemplo, e dados. A seleção do tipo de informação faz-se através do pino RS do LCD. A latch é utilizada para fazer a desmultiplexagem do barramento do microcontrolador fornecendo o sinal para o pino RS. O decodificador de endereços é utilizado para fazer a seleção do LCD. O LM015 inclui um circuito de driving interno por isso não é necessária a colocação de buffers externos. Algoritmo para escrita no LCD: 1- Inicialização do display. 2- Envio dos códigos ASCII dos caracteres a serem mostrados. O código a desenvolver para implementar cada um dos passos do algoritmo anterior depende do LCD, do seu conjunto de instruções e do modo de operação.

11- Acesso à memória externa Num sistema com microcontrolador podem existem dois tipos de memória externa: memória de programa e memória de dados. Nos acessos à memória externa a porta P0 utiliza-se como barramento multiplexado de endereços/dados (byte menos significativo). Durante o acesso externo a latch associada a P0 é escrita com 1s e a porta não pode ser utilizado para outros fins. Quando o endereçamento da memória externa é feito a 16 bits a porta P2 é utilizado como barramento de endereços para endereçar o byte mais significativo. O sinal ALE deve ser usado para capturar o endereço para uma latch, de acordo com o esquema proposto na figura 6. 11.1- Acesso à memória de programa externa O acesso à memória de programa externa é feito quando o sinal /EA está ativo para os endereços contidos no registrador PC que excedem a capacidade de memória interna do microcontrolador. O comando de leitura é dado pelo sinal /PSEN. O endereçamento é sempre feito a 16 bits, pelo que a porta P2 fica dedicado a esta função. O diagrama temporal típico de um acesso à memória de programa externa é apresentado na figura 22. A.D.- amostragem dados Figura 22- Diagrama temporal do acesso à memória de programa externa. 11.2- Acesso à memória de dados externa O acesso à memória de dados externa pode ser de leitura ou de escrita. Os sinais de comando para essas operações são /RD, para leitura, e /WR, para escrita. O endereçamento pode ser de 16 bits (MOVX @DPTR) ou 8 bits (MOVX @Ri, com i=0 ou i =1). Com endereçamento de 8 bits a porta P2 pode ser usado para fins genéricos, podendo utilizar-se algumas das suas linhas para fazer paging da memória, caso seja necessário. A figura 7 apresenta uma interface para acesso à memória de dados externa. As figuras 23 e 24 apresentam os diagramas temporais típicos para os acessos de leitura e escrita, respectivamente, à memória de dados externa. Figura 23- Diagrama temporal do acesso à memória de dados ciclo leitura.

Figura 24- Diagrama temporal do acesso à memória de dados ciclo escrita. 12- Temporização / Contagem Todos os microcontroladores incluem um bloco de hardware que possui capacidades para fazer temporização ou contagem. Este bloco é de extrema importância tendo em consideração as aplicações típicas dos microcontroladores (sistemas de controle de tempo real). O bloco de temporização/contagem permite criar atrasos com determinada duração, impor instantes de amostragem, medir a largura do pulso de um dado sinal, medir a freqüência de um sinal periódico ou contar o número de ocorrências de um dado evento, entre outras. Na função de temporização o registrador de contagem associado ao temporizador é incrementado a um ritmo fixo dependente da freqüência de oscilação aplicada ao o microcontrolador. Na função de contagem o registrador de contagem é incrementado em resposta a uma transição num sinal externo aplicado a um pino específico. 12.1- Temporização/ contagem na família MCS-51 A família MCS-51 possui dois tipos de blocos temporizadores/contadores: os Timers 0 e 1 e o Timer 2. Na função de temporização são contados ciclos de máquina, ou seja, a taxa de contagem é de f OSC /12, sendo f OSC a freqüência de oscilação aplicada ao microcontrolador. Na função de contagem, o incremento é feito na ocorrência de uma transição de 1 para 0 no sinal externo aplicado. O reconhecimento dessa transição demora dois ciclos de máquina, sendo por isso a taxa máxima de contagem igual à fosc/24. 12.1.1- Timers 0 e 1 Os Timers 0 e 1 são temporizadores/contadores de 16 bits com quatro modos de operação possíveis. Os registradores de contagem a eles associados são TH0, TL0, TH1 e TL1. Associado a cada temporizador/contador existe ainda uma flag de overflow que é ativada por hardware quando se excede a capacidade de contagem do registrador de contagem. Na ocorrência da condição de overflow o registrador de contagem passa a conter zeros e a contagem prossegue a partir desse valor. O registrador TMOD permite fazer a seleção tipo de função e do modo de operação de cada um dos temporizadores/contadores. Este registrador não é endereçável bit a bit. Este registrador é apresentado na figura 25. Figura 25- Registrador TMOD (endereço 89H).