You are on page 1of 78

MICROCONTROLADOR

8051

Eng. Jefferson Couto


INDICE
1) SISTEMAS DE NUMERAÇÃO................................................................................................................................................... 3
1.1) SISTEMA BINÁRIO (BASE 2) ............................................................................................................................................ 3
1.2) SISTEMA HEXADECIMAL (BASE 16)................................................................................................................................ 4
1.3) FORMAS DE APRESENTAÇÃO ........................................................................................................................................ 4
1.4) CONVERSÃO DO SISTEMA BINÁRIO PARA O SISTEMA DECIMAL ............................................................................... 5
1.5) CONVERSÃO DO SISTEMA HEXADECIMAL PARA O SISTEMA DECIMAL .................................................................... 5
1.6) CONVERSÃO DO SISTEMA DECIMAL PARA O SISTEMA BINÁRIO ............................................................................... 5
1.7) CONVERSÃO DE DECIMAL PARA UMA BASE QUALQUER............................................................................................ 6
1.8) CONVERSÃO ENTRE AS BASES 2 E 16 .......................................................................................................................... 6
2) OPERAÇÕES ARITMÉTICAS NO SISTEMA BINÁRIO ............................................................................................................. 8
2.1) ADIÇÃO.............................................................................................................................................................................. 8
2.2) SUBTRAÇÃO ..................................................................................................................................................................... 8
2.3) COMPLEMENTO DE 2 ....................................................................................................................................................... 9
2.4) DESLOCAMENTO............................................................................................................................................................ 11
3) OPERAÇÕES LÓGICAS ......................................................................................................................................................... 12
3.1) AND.................................................................................................................................................................................. 12
3.2) OR .................................................................................................................................................................................... 13
3.3) NOT.................................................................................................................................................................................. 13
3.4) XOR.................................................................................................................................................................................. 14
4) TERMOS IMPORTANTES ....................................................................................................................................................... 16

5) MICROCONTROLADORES..................................................................................................................................................... 21
5.1) MICROPROCESSADOR: ................................................................................................................................................. 21
5.2) BARRAMENTOS DE UM MICROCONTROLADOR.......................................................................................................... 23
5.3) MODOS DE ATENDIMENTO DE I/O................................................................................................................................ 24
6) MICROCONTROLADOR 8031/8051........................................................................................................................................ 25
6.1) PINAGEM:........................................................................................................................................................................... 25
6.2) BARRAMENTO MULTIPLEXADO:............................................................................................................................................. 26
6.3) CLOCK NO 80C51............................................................................................................................................................ 27
................................................................................................................................................................................................ 28
6.4) RESET DO MICROCONTROLADOR ............................................................................................................................... 28
6.5) INTERRUPÇOES ............................................................................................................................................................. 30
................................................................................................................................................................................................ 33
6.6) INTERRUPÇÃO EXTERNA .............................................................................................................................................. 34
6.7) TEMPORIZADOR E CONTADOR .................................................................................................................................... 35
6.8) COMUNICAÇÃO SERIAL ................................................................................................................................................. 37
6.9) INTERFACE SERIAL NO 8051......................................................................................................................................... 38
6.10) TAXA DE TRANSMISSÃO PARA OS MODOS 1 E 3 .................................................................................................... 39
6.11) TABELA PRÁTICA COM TAXAS PARA O CRISTAL DE 11,0592 MHZ .......................................................................... 39
7) PROGRAMAÇÃO “C” PARA O MICROCONTROLADOR 8051.............................................................................................. 40
7.1) TIPOS DE VARIÁVEIS EM C ........................................................................................................................................... 41
7.2) OPERADORES ARITMÉTICOS ....................................................................................................................................... 41
7.3) OPERADORES LÓGICOS E RELACIONAIS ................................................................................................................... 42
7.4) OPERADORES DE MANIPULAÇÃO DE BIT ................................................................................................................... 42
7.5) DIRETIVAS FUNDAMENTAIS DO PRÉ – COMPILADOR................................................................................................ 43
7.6) CONTROLE DE FLUXO ................................................................................................................................................... 44
7.7) MAPA DE ALOCAÇÃO DE VARIÁVEIS NO 8051 ............................................................................................................ 50

8) AMBIENTE DE DESENVOLVIMENTO INTEGRADO ( IDE )................................................................................................... 51


8.1) MIDE-51 ........................................................................................................................................................................... 52
8.1.1) PRIMEIRO PROGRAMA ............................................................................................................................................... 53
8.1.2) COMPILANDO E CARREGADO O PROGRAMA .......................................................................................................... 54
8.1.3) CONFIGURANDO O EDITOR PARA A PLACA DIDÁTICA ........................................................................................... 55
8.2) W INLOADER51 ................................................................................................................................................................... 56
9) EXEMPLO DE PROGRAMAS PARA A PLACA DIDÁTICA PWLOADER51............................................................................ 60
9.1) ENTRADA DE DADOS PELO TECLADO E SAÍDA PELO DISPLAY DE LCD ....................................................................................... 60
9.2) LEITURA NO CONVERSOR ANALÓGICO/DIGITAL (A/D) ............................................................................................................. 61
9.3) ESCRITA NO CONVERSOR ANALÓGICO/DIGITAL (D/A) ............................................................................................................ 64
9.4) PHASE WIDTH MODULATION ( PWM) ........................................................................................................................... 65
9.5) MEDIR LARGURA DE PULSO .................................................................................................................................................. 67
10) FUNÇÕES DA BIBLIOTECA PWLIB..................................................................................................................................... 69

11) INFORMAÇÕES SOBRE O KIT ............................................................................................................................................ 78


PROWARE PROJ. E SIST. ELETRÔNICOS

1) SISTEMAS DE NUMERAÇÃO

Existem vários sistemas de numéricos, dentre os quais se destacam o decimal, o


binário, o octal e o hexadecimal.
O sistema decimal é utilizado por nós no dia a dia, e é sem dúvida o mais
importante dos sistemas numéricos, com os quais podemos formar qualquer número
através da lei de formação.

AnBn + An-1Bn-1 + An-2Bn-2 + ... + A0B0

Onde:

An = Algarismo

B = Base do número

n = quantidade de algarismos - 1
Ex: 25934

n = 5 -1 = 4
B = 10
A0 = 4; A1 = 3; A2= 9; A3 = 5; e A4 = 2

2.104 + 5.103 + 9.102 + 3.101 + 4.100

2.10000 + 5.1000 + 9.100 + 3.10 + 4.1 = 25934

1.1) SISTEMA BINÁRIO (BASE 2)

O sistema binário de numeração apresenta apenas dois algarismos, o zero e o


um.
Cada algarismo ou dígito de um número binário é chamado de BIT que é a
abreviação de BInary DigiT.
O conjunto de 4 bits é denominado de NIBBLE, e o de 8 bits de BYTE.
O sistema binário é utilizado em sistemas digitais e em microprocessadores,
onde o 0 é representado por 0V e o 1 geralmente por 5V.

© Jefferson Leal Couto Página 3 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

1.2) SISTEMA HEXADECIMAL (BASE 16)

O sistema hexadecimal possui 16 símbolos para representar qualquer


quantidade. Como são conhecidos apenas dez símbolos numéricos ( 0 a 9), adotou-
se outros seis ( A a F).
O sistema hexadecimal também é muito utilizado na área de
microprocessadores, e tem uma estreita relação com o sistema binário.

1.3) FORMAS DE APRESENTAÇÃO

DECIMAL: 1234d ou (1234)10

BINÁRIO: 0101b ou (0101)2

HEXADECIMAL: 9CF7h ou (9CF7)16

CONVERSÃO ENTRE BASES

DECIMAL BINÁRIO HEXADECIMAL


0 0 0
1 1 1
2 10 2
3 11 3
4 100 4
5 101 5
6 110 6
7 111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
16 10000 10

© Jefferson Leal Couto Página 4 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

1.4) CONVERSÃO DO SISTEMA BINÁRIO PARA O SISTEMA DECIMAL

Para converter um número binário em decimal basta utilizar a lei de formação.

EX: Convertendo o número 101b em decimal:

n= 3 -1= 2
A0 = 1; A1 = 0 e A2 = 1

1.22 + 0.21 + 1.20 =


1.4 + 0.2 + 1.1 =
4+0+1=5

1.5) CONVERSÃO DO SISTEMA HEXADECIMAL PARA O SISTEMA DECIMAL

Para converter um número hexadecimal em decimal basta utilizar a lei de


formação.

EX: Convertendo o número ABh em decimal:

n= 2 -1= 1
A0 = 11(B) e A1 = 10(A)

10.161 + 11.160 = 171d

1.6) CONVERSÃO DO SISTEMA DECIMAL PARA O SISTEMA BINÁRIO

Quando trabalhamos com sistemas digitais, muitas vezes existe a necessidade


de convertermos os valores decimais em binários.
Para converter um número decimal basta dividi-lo pela base 2 tantas vezes
quantas necessárias para que o quociente da divisão seja menor que a base 2. O
Último quociente da divisão e os restos das divisões sucessivas, tomados na ordem
inversa, correspondem ao número na base 2.

EX: 129d = ?b

© Jefferson Leal Couto Página 5 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

129d = 10000001b

1.7) CONVERSÃO DE DECIMAL PARA UMA BASE QUALQUER

Para converter de decimal para a base “B” basta utilizar o método das divisões
sucessivas dividindo o número pela base “B”

3882d = F2Ah

1.8) CONVERSÃO ENTRE AS BASES 2 E 16

Existe uma relação estreita entre os sistemas binário e hexadecimal. Esta


relação vem do fato de que o número 16 pode ser escrito como 24. Os números
hexadecimais podem ser vistos como uma forma compacta de representar os
números binários.

Para converter de binário para hexadecimal devemos seguir os seguintes passos:

1) Divide-se o número em grupos de 4 algarismos da direita para a esquerda.

2) Converte-se cada grupo no seu equivalente em hexadecimal, conforme a tabela


dada anteriormente.

Ex: 1001 1010 0010 1110b


9 A 2 E h

A conversão de hexadecimal para binário é realizada na seqüência inversa.

© Jefferson Leal Couto Página 6 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

1) Converte-se cada algarismo no seu equivalente em binário utilizando sempre 4


algarísmos. Coloca-se zeros a esquerda quando necessário.

2) Reune-se os grupos de 4 algarismos.

Ex: A2C7h = ?b

A 2 C 7
1010 0010 1100 0111

A2C7h = 1010001011000111b

Exercícios: Converter os números na base solicitada.

1) 23Fh = ?d
2) 47d = ?b
3) 11010011b = ?d
4) 11100010b = ?h
5) A2Ch = ?d
6) 2DAh = ?b
7) 1110 0001b = ?d
8) 352d = ?h
9) 510d = ?h
10) 120d = ?b
Se você está confuso e não sabe qual o método
usado para fazer a conversão, lembre-se:
• Para converter de binário ou hexadecimal
para decimal utilize a lei de formação.
• Para converter de decimal para hexadecimal
ou binário faça divisões sucessivas.
• Para converter entre binário e hexadecimal
utilize a tabela.

© Jefferson Leal Couto Página 7 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

2) OPERAÇÕES ARITMÉTICAS NO SISTEMA BINÁRIO

2.1) ADIÇÃO

Para efetuarmos a adição no sistema binário, devemos agir como numa adição
convencional do sistema decimal. Convém observar que no sistema decimal 1+1 = 2d
e no sistema binário como temos apenas dois algarismos
1+1 = 0 e transporta 1.
A operação de transporte também é denominada carry.

Ex: 11b + 10b

Ex: 110b + 111b

2.2) SUBTRAÇÃO

O método de resolução é análogo a uma subtração no sistema decimal.


È importante observar o caso 0 - 1, onde o resultado será igual a 1 porém
haverá um transporte para a coluna da esquerda que deve ser acumulado (somado)
no subtraindo e, obviamente subtraído do minuendo.
A este estouro dá-se o nome de borrow.

© Jefferson Leal Couto Página 8 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

Ex: 1000 - 0011

2.3) COMPLEMENTO DE 2

Uma forma para representar números binários negativos bastante utilizada nos
sistemas já citados é a notação de complemento de 2 (C2), mas para obtê-la,
devemos primeiramente converter o número na notação de complemento de 1.
A obtenção do complemento de um ( C1) de um número binário se dá pela
troca de cada bit do número pelo seu inverso ou complemento.

Binário: 1011
Complemento 1: 0 1 0 0

A notação de complemento de 2 é utilizada para representar números binários


negativos. Para obter basta somar 1 ao complemento de 1 do número binário inicial.

Decimal -1 -2 -4 -8
Binário - 0001 - 0010 - 0100 - 1000
Comp. 2 1111 1110 1100 1000

© Jefferson Leal Couto Página 9 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

O método do complemento de 2 é muito útil nas operações de subtração.


Ex: Subtração do binário 1110 - 0011 em complemento de 2

Ex: Subtração de 0101 - 1100

Como o resultado é negativo para obtermos o módulo devemos fazer o C2 da adição


para obtermos o módulo da subtração de 0101 - 1100. Portanto teremos:
0110 (C1) + 1 = 0111

© Jefferson Leal Couto Página 10 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

2.4) DESLOCAMENTO

Deslocando-se os algarismos de um número para a sua esquerda, o resultado


será o número multiplicado pela sua base.

Ex:

O número que inicialmente era 0010 ( 2d) foi multiplicado pela sua base (2), que
resultou no binário 0100 (4d).

De forma análoga se deslocarmos os algarismos de um número para a direita,


o resultado será a divisão do número pela sua base.

Ex:

O binário 1000 que representa 8d como foi deslocado para a direita resultou em 0100
que representa 4d, portanto podemos verificar que o número foi dividido pela base 2.

© Jefferson Leal Couto Página 11 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

3) OPERAÇÕES LÓGICAS

3.1) AND

Esta função executa a multiplicação de duas ou mais variáveis booleanas. Sua


representação algébrica para duas variáveis é S = A.B, onde se lê S = A e B.

A B S
0 0 0
0 1 0
1 0 0
1 1 1

© Jefferson Leal Couto Página 12 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

3.2) OR

A função “OR” é aquela que assume valor 1 quando uma ou mais entradas
forem iguais a “um” e assume valor “zero” se todas as entradas forem zero.
Sua representação algébrica para duas variáveis de entrada é S = A + B, onde
se lê S = A ou B.

A B S
0 0 0
0 1 1
1 0 1
1 1 1

3.3) NOT

A função “not” inverte ou complementa o estado da variável, ou seja, se a


variável estiver em zero, a saída vai para 1, e se estiver em 1, a saída vai a zero. É
representada algebricamente da seguinte forma S = /A, onde se lê não A.

A S
0 1
1 0

© Jefferson Leal Couto Página 13 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
3.4) XOR

A função lógica “xor”, também conhecida como ou-exclusivo, apresenta como


resultado nível lógico 1 sempre que existir um número “impar” de níveis lógicos 1 nas
entradas. A sua representação algébrica é a seguinte S = A ⊕ B.

A B S
0 0 0
0 1 1
1 0 1
1 1 0

A função xor é utilizada para gerar PARIDADE PAR, onde este é um dos
métodos para detecção de erro em comunicação digital.

© Jefferson Leal Couto Página 14 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

Exercícios: Obtenha o resultado lógico em hexadecimal para as seguintes operações:

1) 10d AND 4d
2) 3Fh OR 80h
3) 1001b XOR 1010b
4) 13d OR 9Ch
5) 11000010 AND FFh
6) 24h OR 0d
7) 82h XOR 13h
8) 10101010 AND 55h
9) 5d OR 3h
10) 10111100 AND 00001010
11) NOT 5Ah
12) NOT 13d

© Jefferson Leal Couto Página 15 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

4) TERMOS IMPORTANTES

4.1) BUFFER: Em geral, chamamos de buffer o circuito que tem por objetivo o
armazenamento temporário de informações.

4.2) DRIVER: Amplificador de corrente. Usado quando temos que ampliar a


capacidade de fornecimento de uma porta.

4.3) FIRMWARE: Programa associado a um hardware para a execução de funções


específicas. Ex: programa gravado em eprom

4.4) TRI-STATE: Nome dado, quando o sistema está fisicamente ligado, porém não
interfere no sistema devido a alta resistência apresentada.

4.5) LATCH: Componente eletrônico que tem a função de “trava” de informações. O


latch funciona como uma porta, que estando ativa, deixa passar a informação
presente em suas entradas, e se inativa, faz com que a informação na saída não se
altere, independente das alterações na entrada.

4.6) MAPEAMENTO REDUNDANTE: Cada endereço decodificado não é único. O


decodificador é projetado para separar apenas os dispositivos entre si. Este tipo
apresenta hardware menos complexo.

4.7) MAPEAMENTO NÃO REDUNDANTE: Cada endereço decodificado é único.


Constrói-se o decodificador utilizando o menor espaço de memória. Este tipo de
decodificação necessita de um hardware bastante complexo.

4.8) CHIP SELECT (/CS): Este pino está presente na grande maioria dos dispositivos
associados a microprocessadores.
Como todos os dispositivos (EPROM, RAM, I/O) estão ligados à via de dados
(D0 ... D7), os mesmos devem estar sempre em alta impedância para evitar que
enquanto um bit esteja em “0”, outro esteja em “1”, ocasionando um conflito e até
mesmo danificando o sistema.
Normalmente todos os dispositivos estão com o /CS em “1”, e somente irá a “0”
aquele dispositivo que está sendo acionado e apenas durante o tempo necessário.
Estes tempos e esta seleção são efetuados por “circuitos lógicos” conhecidos
como DECODIFICADORES DE ENDEREÇO.

© Jefferson Leal Couto Página 16 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
EX: Projetar um decodificador para I/O mapeado em memória nas seguintes
configurações:

A) 32K bytes de RAM, 32K bytes para I/O mapeamento redundante.

A.1) Utilizando portas lógicas

A15 = 0 32k inferior


A15 = 1 32k superior

A.2 ) Utilizando o 74139

Tabela verdade:

A B Y0 Y1 Y2 Y3
0 0 0 1 1 1
0 1 1 0 1 1
1 0 1 1 0 1
1 1 1 1 1 0

© Jefferson Leal Couto Página 17 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
A.3 ) Utilizando apenas 2 decodificador 74139

A.4 ) Utilizando apenas 1 decodificador 74139

© Jefferson Leal Couto Página 18 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

B) 32K RAM, 32K para I/O com mapeamento redundante nos endereços 8000H e
8001H

B.1 ) Utilizando portas lógicas

B.2 ) Utilizando o 74139

C) 32K RAM, 32K para I/O com mapeamento não redundante nos endereços 8000H
e 8001H

© Jefferson Leal Couto Página 19 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
Exercícios:

1) Projetar um decodificador com 16K de RAM e 48K bytes de I/O, mapeando 16K
para cada dispositivo. Mapeamento redundante.

2) Projetar um decodificador com 16K de RAM e os endereços 8000, A000 e C000


para I/O mapeamento redundante.

3) Projetar um decodificador de I/O mapeado em memória com 24K de RAM e o


restante em 3 endereços para I/O. Mapeamento redundante.

3.1) Utilizar o 74xx139


3.2) Utilizar o 74xx138

4) Projetar um decodificador de I/O mapeado em memória com 32K de RAM e os


endereços 8000h, 8004h, 8008h e 800Ch para I/O.

4.1) Utilizar o 74xx139


4.2) Utilizar o 74xx138

5) Projetar um decodificador com 32K de RAM e 8 saídas para I/O. Mapeamento


redundante:

5.1) Utilizar o 74xx139


5.2) Utilizar o 74xx138

A maior dificuldade em projetar um decodificador é que não existe uma formula ou


receita pronta. Um bom projeto, depende basicamente de experiência e conhecimento
de circuitos digitais. Algumas dicas que poderão ajudar.
• Em mapeamento redundante, devemos analisar o menor espaço de memória
utilizado no projeto e então definir a quantidade de endereços do barramento que
serão necessários. O 8051 acessa 64K de memória RAM com seus 16 endereços.
• Em mapeamento não redundante devemos utilizar sempre todos os endereços para
mapear o dispositivo de I/O, pois o endereço é específico.

© Jefferson Leal Couto Página 20 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

5) MICROCONTROLADORES

5.1) MICROPROCESSADOR:
É uma máquina seqüencial que executa um conjunto de comandos (instruções )
previamente gravados em uma memória (ROM). Embora todos os
microprocessadores utilizem um sinal de clock, é comum encontrar na literatura, a
classificação de microprocessadores síncronos e assíncronos.
Com a evolução tecnológica, principalmente na confecção de CI’s, os
fabricantes de microprocessadores começaram a incorporar memórias e dispositivos
periféricos na mesma pastilha de seus microprocessadores. Surgiram então os
microcontroladores.
Uma vez que incorporam grande parte dos dispositivos periféricos, a
construção de um sistema baseado em um microcontrolador, freqüentemente se
resume a um circuito com um cristal, um botão de reset e a memória de programa.

Arquitetura Von Nuemann - A maioria dos microprocessadores segue esta


arquitetura. O microprocessador é composto por um conjunto de blocos funcionais,
controlados por uma máquina seqüencial que determina os tempos em que cada
sinal de controle está presente nos barramentos internos e externos. É importante
ressaltar que nesta arquitetura não temos distinção entre a memória de programa e
dados.
Para caracterizar uma arquitetura Von Nuemann o processador deve atender três
postulados:

1) Um único controle central.

© Jefferson Leal Couto Página 21 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
2) Uma única memória para programa e dados
3) As instruções devem fazer operações elementares sobre os dados.

O Z80 é um exemplo de processador que utiliza arquitetura Von Nuemann.

Arquitetura Harvard – Esta arquitetura apresenta memórias distintas para programa


e dados, isto é, o processador é projetado para gerar sinais de leitura e escrita
distintos para cada memória. Uma das vantagens desta arquitetura, é evitar que a
memória se torne o fator limitante no desempenho do processador. Alguns
processadores mais modernos já utilizam esta arquitetura. O 8051 é um exemplo.

Destas arquiteturas surgiram duas tendências:

RISC - Reduce Instruction Set Computer


CISC - Complex Instruction Set Computer

A CPU do tipo CISC possui um conjunto muito grande de instruções (8051, Z80).

VANTAGENS: Possibilita a confecção de programas enxutos. Grande número de


modos de endereçamento. Uma instrução executa muitas tarefas.
DESVANTAGEM: Difícil memorização dos comandos. Instruções com diferentes
tamanhos de ciclos de máquina. Subutilização da CPU. Difícil depuração.

A CPU do tipo RISC possui um conjunto de instruções reduzido.

VANTAGEM: Fácil memorização, rapidez, fácil depuração.

DESVANTAGEM: Programa muito extenso. Número reduzido de registradores e


modos de endereçamento. Muitas instruções para realizar uma tarefa simples.

© Jefferson Leal Couto Página 22 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

5.2) BARRAMENTOS DE UM MICROCONTROLADOR

Barramento de endereço: Barramento unidirecional, por onde trafega os sinais que


endereçam os dispositivos de memória e I/O. Em geral, os microprocessadores de 8
bits endereçam 64 Kbytes de memória.

Barramento de dados: Barramento bidirecional por onde trafegam dados entre os


dispositivos externos e o microcontrolador. O tamanho deste barramento define o
tamanho do microcontrolador. O 8051 é de 8 bits.

Barramento de controle: Barramento por onde o microcontrolador controla os


dispositivos externos.

© Jefferson Leal Couto Página 23 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

5.3) MODOS DE ATENDIMENTO DE I/O

Pooling: Neste tipo de atendimento, a CPU fica constantemente questionando o


dispositivo de I/O se o mesmo necessita receber ou enviar um dado.
Este tipo de atendimento é fácil de implementar, porém desperdiça o tempo da
CPU.

Interrupção: Neste tipo de atendimento, a CPU é avisada pelo dispositivo de I/O, que
o mesmo necessitam receber ou enviar dados.
Este tipo de atendimento é mais complexo, tendo como vantagem não
desperdiçar o tempo da CPU.
Como é um evento assíncrono, a CPU sempre atende no momento solicitado.
Necessita de um hardware adicional.

DMA (Direct Memory Acess) : Este tipo de atendimento é o mais complexo, porém o
mais rápido. O dispositivo de I/O solicita os barramentos da CPU (Tri - State) e
acessa diretamente a memória, transferindo então os dados. Nem toda a CPU
suporta este tipo de atendimento.

© Jefferson Leal Couto Página 24 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

6) MICROCONTROLADOR 8031/8051

6.1) Pinagem:

© Jefferson Leal Couto Página 25 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

6.2) Barramento Multiplexado:

Para evitar que o chip tenha mais que 40 pinos, a Intel adotou a solução de
multiplexar no mesmo barramento os dados e endereço.

Desta forma, devemos utilizar a seguinte ligação para obter as 16 linhas de


endereços e 8 de dados no 8051.

© Jefferson Leal Couto Página 26 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
6.3) CLOCK NO 80C51

Existem duas formas de gerar circuito de clock no microcontrolador. O clock pode ser
externo ou interno.
uso do clock externo é interessante quando temos outros dispositivos que utilizam um
sinal TTL para gerar sua base de tempo. Sua implementação resume-se em colocar o
pino 19 (XTAL1) no nível de terra e injetar o sinal externo no pino 18 (XTAL2), que irá
diretamente para o sistema de controle e temporização do chip.

Para utilizar o clock interno, devemos colocar entre os pinos 18 e 19 um cristal ou um


ressonados cerâmico (o oscilador com cristal é mais estável e preciso ) na freqüência
desejada e dois capacitores de realimentação. Geralmente utilizamos capacitores
entre 27 e 33pF.

© Jefferson Leal Couto Página 27 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

O clock do microcontrolador é chamado de “ciclo de clock” e ele é a referência ou


base para geração do “ciclo de máquina”. O ciclo de máquina é calculado dividindo a
freqüência do cristal por 12 (doze) no 80C51.

Para um sistema utilizando um cristal de 12Mhz, teremos um ciclo de máquina de


1Mhz, isto é, o microcontrolador irá executar a seqüência de busca, decodificação e
execução em tempos de no mínimo 1µs.

Lembre – se, o ciclo de clock depende basicamente do


cristal utilizado na CPU e o ciclo de máquina determina
o tempo necessário para executar as instruções. No 8051
o Ciclo Máquina = Ciclo de clock / 12

6.4) RESET DO MICROCONTROLADOR

O reset no 80C51 é ativado quando o pino 9 (RST) permanece em nível lógico 1 por 2
ou mais ciclos de máquina. Neste caso a CPU executa o chamado reset interno, que
consiste em inicializar seus registros internos com valores predeterminados:

• O PC, o ACC (acumulador), o registro B (Auxiliar), os Flags, O DPTR e todos os


registros de temporização e contagem serão zerados.

• O SP (stack pointer - pilha) é carregado com o valor 07H.

• As portas P0 a P3 terão o valor FFH.

• O SBUF (buffer serial) estará com um valor indeterminado e o registro de controle


da porta serial - SCON será zerado.

• O registro PCON terá apenas seu bit mais significativo zerado.

• Os registradores de interrupção IE (Interrupt Enable) e IP (Interrupt Priorit) terão o


valor XXX00000, onde X representa um valor irrelevante (Don’t Care)

• A memória interna não é afetada pelo reset forçado, sendo que ao ligar seu valor é
aleatório.

© Jefferson Leal Couto Página 28 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

Ao inicializarmos um sistema é necessário que uma seqüência de funções sejam


executadas, desta forma podemos afirmar que nosso sistema irá executar as tarefas
para o qual foi projetado.
Toda vez que realizamos um reset no 8051, ele irá começar a executar o software a
partir do endereço 0000H da memória de programa. Geralmente esta rotina é
conhecida como Inicialização do sistema.

O microcontrolador pode ser resetado automaticamente toda vez que a fonte é ligada.
Normalmente utilizamos um resistor de 10K entre o pino do reset e o terra, e um
capacitor de 10µF entre o VCC e o pino de reset.

© Jefferson Leal Couto Página 29 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

6.5) INTERRUPÇOES

A interrupção é, uma das formas mais importantes de atendimento aos dispositivos


de I/O. Este recurso permite interromper o fluxo normal de execução do firmware para
a execução de um fluxo específico do programa.
No 8051, temos três fontes geradoras de interrupção, a interrupção de software
(instrução) a solicitada por um periférico externo e a interrupção gerada por
dispositivos internos do processador (timer, serial, etc).
Para o bom entendimento deste recurso, devemos esclarecer alguns conceitos:

Mascaramento - É a capacidade de inibir, geralmente via software que uma


determinada interrupção seja atendida.

Prioridade - Define o grau ou a preferência que uma determinada interrupção será


executada.

Interrupção vetorada ou não vetorada - Define se ao atender uma interrupção o


microcontrolador irá executar uma rotina em um endereço fixo de memória e que não
pode ser alterado, ou se o programa irá para um endereço definido pelo programador.
O 8051 possui todas as suas interrupções vetoradas, isto é, com o endereço de
desvio determinado pelo fabricante do componente.

Ativação - Existem três formas que o sistema pode reconhecer uma interrupção:
No 8051, todas as interrupções são
• pelo nível (alto ou baixo) mascaráveis e vetoradas.
• pela borda (subida ou descida)
• pela combinação de borda e nível.

O 8051 possui 5 formas de interrupção:

Interrupção externa 0 - INT0\


Interrupção externa 1 - INT1\
Interrupção do timer\contador 0 - T0
Interrupção do timer\contador 1 - T1
Interrupção do canal serial - TI ou RI

© Jefferson Leal Couto Página 30 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

Sendo que cada uma destas interrupções será desviada para os seguintes
endereços:

INT0\ ………………. 03H


T0 .………………… 0BH
INT1\ ……………….. 13H
T1 …………………… 1BH
TI - RI ………………. 23H

A seguir temos um mapa parcial da memória de programa do 8051 com seus


respectivos endereços de interrupção e reset.

© Jefferson Leal Couto Página 31 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

O processador possui um recurso de prioridade interna, que permite determinar qual


interrupção será atendida ou se uma interrupção em andamento deverá ser
interrompida para o atendimento de outra de maior prioridade.

Para determinar quais interrupções estarão habilitadas, devermos escrever no


registrador especial IE - (Interrupt Enable) do SFR.

EA - Localizado no bit 7 do IE, Habilita todas as interrupções quando em nível lógico


1, desde que estas estejam habilitadas individualmente. Quanto em nível lógico 0,
desabilita todas as interrupções, mesmo que estejam ativadas individualmente.

ES - Localizado no bit 4 do IE, Habilita a comunicação serial quando em nível lógico 1


e desabilita em nível lógico 0 mesmo que o bit EA esteja ativado.

ET1 - Localizado no bit 3 do IE, Habilita o timer/conter 1 quando em nível lógico 1 e


desabilita em nível lógico 0 mesmo que o bit EA esteja ativado.

EX1 - Localizado no bit 2 do IE, Habilita a interrupção externa 1 quando em nível


lógico 1 e desabilita em nível lógico 0, mesmo que o bit EA esteja em 1.

ET0 - Localizado no bit 1 do IE, Habilita o timer/conter 0 quando em nível lógico 1 e


desabilita em nível lógico 0 mesmo que o bit EA esteja ativado.

EX0 - Localizado no bit 0 do IE, Habilita a interrupção externa 0 quando em nível


lógico 1 e desabilita em nível lógico 0, mesmo que o bit EA esteja em 1.

Para alterar a seqüência padrão de prioridade das interrupções devemos habilitar os


bit`s do registrador IP (Interrupt Priorit)

© Jefferson Leal Couto Página 32 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

Onde,

PS - Localizado no bit 4, seleciona prioridade da serial. Quanto em 1 define como alta


a prioridade da serial.

PT1 - Localizado no bit 3, seleciona prioridade do timer1. Quanto em 1 define como


alta a prioridade do timer 1.

PX1 - Localizado no bit 2, seleciona prioridade da interrupção externa 1. Quanto em 1


define como alta a prioridade da interrupção externa 1.

PT0 - Localizado no bit 1, seleciona prioridade do timer0. Quanto em 1 define como


alta a prioridade do timer 0.

PX0 - Localizado no bit 0, seleciona prioridade da interrupção externa 0. Quanto em 1


define como alta a prioridade da interrupção externa 0.

Um certo tempo irá decorrer entre o reconhecimento da


interrupção pelo processador e o efetivo desvio para o respectivo
vetor. No melhor caso teremos um atraso de 3,2 ciclos de máquina
e no pior caso teremos um atraso de 7,2 ciclos de máquina.

© Jefferson Leal Couto Página 33 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

6.6) INTERRUPÇÃO EXTERNA

As interrupções externa0 e externa1 podem ser configuradas para reconhecer uma


transição de 1 para 0 (borda de descida) ou um nível lógico 0. A configuração deste
controle é feito no registrador TCON (Timer Control) através do nibble menos
significativo.

Onde,

IT0 - Localizado no bit 0 de TCON. Quando em nível lógico 0 a interrupção Externa0


será aceita simplesmente pela presença do nível zero no pino. Quando em nível
lógico 1 a interrupção será aceita quanto ocorrer uma transição de 1 para 0 e o sinal
permanecer em zero por pelo menos 1ciclo de máquina.

IE0 - Localizado no bit 1 de TCON. É setado pelo hardware interno quando for
detectado um pedido de interrupção. É resetado quando a interrupção for atendida.

IT1 - Localizado no bit 2 de TCON. Quando em nível lógico 0 a interrupção Externa1


será aceita simplesmente pela presença do nível zero no pino. Quando em nível
lógico 1 a interrupção será aceita quanto ocorrer uma transição de 1 para 0 e o sinal
permanecer em zero por pelo menos 1ciclo de máquina.

IE1 - Localizado no bit 3 de TCON. É setado pelo hardware interno quando for
detectado um pedido de interrupção. É resetado quando a interrupção for atendida.

© Jefferson Leal Couto Página 34 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

6.7) TEMPORIZADOR E CONTADOR

O 8051 possui 2 T/C (timer/conter) que são configurados através do firmware e


podem operar de maneira totalmente independente dos demais recursos do chip. Os
dois T/C podem ser ativados ou desativados pelo hardware ou pelo software,
dependendo da configuração adotado pelo projetista.
No nibble mais significativo de TCON podemos ativar ou desativar os T/C`s como
veremos a seguir:

Onde,

TF1 - É setado pelo hardware sempre que ocorrer um overflow (estouro no contador)
no T/C1. É resetado ao final da rotina de interrupção de T/C1.

TR1 - Quando em nível lógico 1 irá ligar o T/C1, e quando em zero o mesmo será
desligado.

TF0 - É setado pelo hardware sempre que ocorrer um overflow (estouro no contador)
no T/C0. É resetado ao final da rotina de interrupção de T/C0.

TR0 - Quando em nível lógico 1 irá ligar o T/C0, e quando em zero o mesmo será
desligado.

Para realizar a configuração do modo de funcionamento do temporizador/contador


devemos manipular os bit`s de TMOD.

Onde,

Gate0; Gate1 – Definem como o timer/contador irá funcionar. Quando este bit estiver
em nível lógico 1 o timer/contador será ativado se TRn e o pino INTn forem 1. Esta
configuração é bastante útil quando queremos medir largura de pulso externo.
Quando este bit estiver em nível lógico 0 o timer/contador será ativado simplesmente
colocando TRn em 1.

© Jefferson Leal Couto Página 35 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

C/T0;C/T1 - Definem a fonte do sinal de clock. Quando em nível lógico 0 ele terá a
função de timer e a base de tempo será o clock do cristal. Quando este bit estiver em
1 ele estará operando como contador e o clock será os pulsos presentes no pino Tn

M1-x;M0-x - Determinam o modo como irá operar o Timer/contador, como veremos a


seguir:

MODO 0 - Temporizador/Contador de 8 bit`s com divisor de freqüência de até 32


vezes. Neste modo o TL0 ou TL1 servem como prescaler do divisor e os
registradores TH0 e TH1 como contador de 8 bit`s.

MODO 1 - Temporizador/Contador de 16 bit`s. Neste modo o TLn e THn formam um


par de forma a obter um registrador de 16 bit`s. Neste modo podemos contar até
65535, com o valor inicial programável por software.

MODO 2 - Contador/Temporizador de 8 bit`s com recarga automática. Neste modo o


registrador TLn realiza a contagem e o registrador THn possui o valor que será
recarregado em TLn sempre que ocorrer um overflow (estouro do contador). Os
registradores podem ser alterados por software a qualquer momento, tornando
bastante flexível o uso.

MODO 3 - Intervalador ou contador de eventos em 8 bit`s e temporizador de 8 bit`s.


OBS: Este modo não é muito usual e não será estudado.

© Jefferson Leal Couto Página 36 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

6.8) COMUNICAÇÃO SERIAL

Na comunicação serial, a transmissão de um byte é feita pelo envio seqüencial de


cada bit, um após o outro.
Para permitir a comunicação entre os sistemas, criou-se um código binário para cada
caractere de forma a existir uma padronização entre os sistemas. Este código é
conhecido por ASCII ( American Standart Code for Interchange of Information). Neste
código, cada caractere possui seu valor em binário, incluindo os caracteres de
controle e especiais, totalizando 256 símbolos.

O modo mais utilizado de comunicação entre sistemas de controle e automação é o


sistema assíncrono. Neste modo não há necessidade de gerarmos o sincronismo
(sinal de clock entre os sistemas). Neste modo cada caractere é transmitido
individualmente, e para caractere é enviado um bit de início da transmissão (start bit)
e um de final de transmissão (stop bit).

Existem, três formas de interligar os sistemas digitais (considerando apenas os sinais


de dados):

A) Simplex: A comunicação é feita apenas em um sentido


B) Half Duplex: A comunicação é feita nos dois sentidos, mas não simultânea
C) Full Duplex: Comunicação nos dois sentidos e de forma simultânea.

© Jefferson Leal Couto Página 37 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

6.9) INTERFACE SERIAL NO 8051

No 8051 temos uma interface serial do tipo full duplex. Desta forma, sistemas de
comunicação podem enviar e receber dados de forma simultânea com o
microcontrolador. Para este fim, o 8051 possui um registrador chamado SBUF(Serial
Buffer).Quando queremos enviar uma informação pelo canal serial devemos escrever
o byte no SBUF, e quando desejamos receber o byte pelo microcontrolador devemos
ler o SBUF. Pode parecer que ele possui apenas um registrador para Tx e Rx, mas
na verdade existem dois registradores com o mesmo nome e que serão reconhecidos
pelo sistema através da instrução assembler.

Para fazer e analisar a configuração da serial devemos acessar o registrador SCON


(Serial Control) como veremos a seguir.

Onde,

RI - É setado pelo hardware ao receber o oitavo bit no modo síncrono ou no meio do


stop bit no modo assíncrono. Deve ser zerado para permitir que sejam geradas novas
interrupções.

TI - É setado pelo hardware ao transmitir o oitavo bit no modo síncrono ou no início


do stop bit no modo assíncrono. Permite que a transmissão dos dados seja
independente do fluxo principal do programa. Deve ser zerado para permitir que
sejam geradas novas interrupções.

RB8 - No modo 0 indica o estado do stop bit Nos modos 2 e 3 indica o estado do
nono bit recebido.

TB8 - Nos modos 2 e 3 é usado para transmitir o nono bit.

REN - Habilita a recepção serial. Se estiver zerado a recepção estará desabilitada e o


pino RXD pode ser usado como pino de I/O

SM2 - No modo 0 deve permanecer zerado. No modo 1 não gera pedido de


interrupção se estiver setado e o stop bit for inválido. Nos modos 2 e 3 permite a
interligação entre vários 8051

© Jefferson Leal Couto Página 38 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

SM1,SM0 - A combinação destes bits fornece o modo de funcionamento da serial:

SM0 SM1 MODO Taxa de comunicação


0 0 0 Fclock / 12
0 1 1 Variável (Conforme Timer1)
1 0 2 Fclock / 32 ou Fclock / 64
1 1 3 Variável (Conforme Timer1)

O modo 0 é usado para comunicação serial síncrona e os demais para comunicação


assíncrona. No modo 1 são transmitidos 8 bits de dados, 1 stop bit e o start bit. No
modo 3 após os 8 bits de dados é transmitido um nono bit.

6.10) TAXA DE TRANSMISSÃO PARA OS MODOS 1 E 3

Frequência( Mhz).106
TH 1 = 256 −
384.Taxa( BPS )

2 SMOD .Frequência
TAXA =
384 ( 256 − THI )
6.11) TABELA PRÁTICA COM TAXAS PARA O CRISTAL DE 11,0592 Mhz

TAXA (BPS) VALOR RECARGA(TH1)


300 160
1200 232
2400 244
4800 250
9600 253

Os valores da tabela foram calculados para SMOD = 0.

© Jefferson Leal Couto Página 39 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
7) PROGRAMAÇÃO “C” PARA O MICROCONTROLADOR 8051

Existem basicamente três linguagens de programação que são utilizadas com o 8051,
o BASIC, ASSEMBLY e o C. Nos últimos cinco anos, a programação de
microcontroladores em linguagem C tem sido adotada pela maioria das empresas
devido as facilidades para programação e ao nível de portabilidade apresentada.

Muitos livros ensinam a programação padrão ANSI C, porém devemos tomar o


cuidado ao utilizar este tipo de bibliografia, pois ela aborda a programação para o PC.
Funções do tipo “printf”, “scanf”, “sprintf” entre outras, geralmente não estão
disponíveis para o projetista ou apresentam um comportamento diferente quando
utilizamos o compilador para microcontrolador. No nosso curso, será abordado o
compilador SDCC.

Outro detalhe importante é que no 8051 podemos utilizar uma grande variedade de
modos de acesso a memória. Como o microcontrolador suporta acesso a BIT,
memória RAM interna, memória RAM externa devemos ficar atento ao padrão
adotado pelo compilador(small ou large para o SDCC) ou especificar onde desejamos
que a memória seja reservada.

Se você utilizar um compilador como o Turbo C, Visual C ou outro para


PC nenhum “santo” vai fazer seu programa funcionar. Eu teria receio de
gravar o programa no KIT ou na memória EPROM. Quando você estiver
programando para o 8051, devemos utilizar SEMPRE um compilador
próprio para o microcontrolador como o SDCC que veremos no curso.

© Jefferson Leal Couto Página 40 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

7.1) TIPOS DE VARIÁVEIS EM C

TIPO NUMERO DE BITS ALCANCE


char 8 bits -128 a + 127
unsigned char 8 bits 0 a 255
Int 16 bits -32768 a 32767
unsigned int 16 bits 0 a 65535
long 32 bits -2147483648 a +2147483647
float 32 bits 3.4e-38 a 3.4e38
void 0 Sem valor

Exemplo de declaração de variáveis:

Int iLContador; // Variável do tipo inteiro com sinal


unsigned char ucGLeitura;// Variável do tipo char sem sinal
char buffNome[6]; // Array do tipo char com 6 posicões
Int buffTotal[4]; // Array do tipo int com sinal com 4 posições

7.2) OPERADORES ARITMÉTICOS

- Subtração ou sinalização de negativo


+ Soma
* Multiplicação
/ Divisão
% Resto da divisão
++ Incremento (Variável = Variável + 1)
-- Decremento (Variável = Variável – 1)

Exemplo de operações aritméticas

iLTotal = iLContador * 3; // Atribui para iLTotal o valor de //ILContador


multiplicado por 3

ucLLeitura++; // ucLLeitura será incrementada de uma //unidade

© Jefferson Leal Couto Página 41 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

7.3) OPERADORES LÓGICOS E RELACIONAIS

> Maior que


< Menor que
>= Maior ou igual que
<= Menor ou igual que
== igual
!= Diferente
&& Relacional “e”
|| Relacional “ou”
! Relacional “não”

7.4) OPERADORES DE MANIPULAÇÃO DE BIT

& Operação lógica AND


| Operação lógica OR
^ Operação lógica XOR
~ Operação lógica NOT
>> Operação de deslocamento(shift) em bit para a direita
<< Operação de deslocamento em bit para a esquerda

Exemplo de operação com bit

ucLValor = ucLValor & 0x7F; // Zera o bit mais significativo do byte //ucLValor

ucLValor = ucLValor | 0x02; // Coloca em um o segundo bit do byte


// ucLValor

© Jefferson Leal Couto Página 42 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

7.5) DIRETIVAS FUNDAMENTAIS DO PRÉ – COMPILADOR

A) #DEFINE <NOME> <ATRIBUICAO>

Permite atribuir antes da compilação um valor para NOME.

Exemplo:
#define LIGADO 1
#define MAXIMO 50 //`Substitui o nome MAXIMO por 50 no programa

B) #INCLUDE <ARQUIVO>

Informa ao que deverá ser incluído o ARQUIVO antes de realizar a compilação do


programa.

Exemplo:
#include <8051.h> // Inclui o arquivo 8051.h da pasta padrão
#include “8051.h” // Inclui o arquivo 8051.h da pasta do programa

Se você pretende utilizar uma constante várias vezes no


programa utilize a diretiva DEFINE. Esta prática é muito
utilizada por programadores mais experientes. O formato
do INCLUDE depende onde está seu arquivo HEADER.
Ele geralmente é um arquivo .h

Agora estou entendendo. Então se meu


arquivo HEADER estive na pasta padrão
do compilador uso <ARQUIVO> e se
estiver na mesma pasta do programa uso o
formato “ARQUIVO”

© Jefferson Leal Couto Página 43 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
7.6) CONTROLE DE FLUXO

A) IF – ELSE

A atribuição IF-ELSE permite que um determinado enunciado, que pode ser simples
ou composto, seja executado desde que uma determinada condição seja satisfeita. A
sintaxe é a seguinte:

If (condição)
enunciado1;
else
enunciado2;

Embora a condição normalmente estar relacionada com um operador relacional,


pode, também ser qualquer expressão que resulte em um valor ZERO caso não seja
verdadeira ou um valor diferente de ZERO se a condição for verdadeira.

Exemplo: Se o valor da variável for zero o pino zero da porta P3 deverá ser colocado
em nível lógico 1 senão em nível lógico zero

#include <pwlib.h>
unsigned char ucGLeitura;
void main (void)
{
ucGLeitura = P1;
if(!ucGLeitura)
P3_0 = 1;
else
P3_0 = 0;
}

A presença do ELSE e consequentemente o enunciado2, é opcional, se não estiver


presente e a condição for verdadeira, o enunciado1 será executado. Se não estiver
presente e a condição for FALSA o fluxo do programa será desviado para o
enunciado seguinte ao da instrução IF.

If (condição)
enunciado1;

© Jefferson Leal Couto Página 44 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

Exemplo: Se o valor da variável for zero o pino zero da porta P3 deverá ser colocado
em nível lógico 1.

#include <pwlib.h>
unsigned char ucGLeitura;
void main (void)
{
ucGLeitura = P1;
if(!ucGLeitura)
P3_0 = 1;

Se tivermos enunciados compostos, ou seja um conjunto de enunciados, é obrigatório


o uso do delimitador chaves.
Você quer a minha opinião?! …. Faz o seguinte,
como você ainda não tem experiência com a
If (condição) programação C, utilize sempre os delimitadores
{ chaves. Mesmo em enunciados simples !!!
enunciado11;
enunciado12;
}
else
{
enunciado21;
enunciado22;
enunciado23;
}
Exemplo de enunciado composto:

#include <pwlib.h>
unsigned char ucGLeitura;
void main (void)
{
ucGLeitura = P1;
if(!ucGLeitura)
{
P3_0 = 1;
P3_1 = 0;
}
else
{
P3_0 = 0;
P3_1 = 1:
}
}

© Jefferson Leal Couto Página 45 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
B) SWITCH – CASE

A instrução SWITCH-CASE visa substituir em muitas situações o uso da instrução IF-


ELSE aninhadas. A instrução possibilita que, de acordo com o valor de entrada para
a expressão, seja executado um entre vários enunciados. Será selecionado para
execução o enunciado que estiver associado ao CASE cujo valor for equivalente ao
de entrada. A sintaxe é a seguinte:

SWITCH(VALOR)
{
CASE comparacao1:

enunciado1;

BREAK;

CASE comparacao2:

enunciado2;

BREAK;

DEFAULT:

enunciado3;

BREAK;
}

A palavra chave DEFAULT, tem por objetivo especificar um enunciado para ser
executado caso o valor de entrada não seja encontrado em nenhum valor de
comparação do CASE. Se não for necessário executar um enunciado quando o valor
não for encontrado a palavra chave DEFAULT não será necessária.

Exemplo: Se o valor da variável for 00h o microcontrolador deverá mostrar “desligado”


se for FFh deverá mostrar “maximo valor” senão a mensagem “intermediario”

© Jefferson Leal Couto Página 46 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

#include <pwlib.h>
#include <8051.h>
unsigned char ucGLeitura;
void main (void)
{
ucGLeitura = P1;
switch(ucGLeitura)
{
case 0x00:
PWDisplayEscreveString("Desligado ",2,1);
break;

case 0xFF:
PWDisplayEscreveString("Maximo ",2,1);
break;

default:
PWDisplayEscreveString("Intermediario ",2,1);
break;
}

C) WHILE

A instrução WHILE possibilita a repetida execução de um enunciado simples ou


composto, enquanto uma determinada condição for satisfeita. Esta instrução é
bastante versátil. A sintaxe é a seguinte:

WHILE(condição) Uma aplicação bem interessante para o


{ while é utilizar com a condição 1. Desta
Enunciado1; forma o microcontrolador ficará em um
loop infinito.
}

© Jefferson Leal Couto Página 47 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

Exemplo: Enquanto o usuário não digitar uma tecla fica aguardando

#include <pwlib.h>
#include <8051.h>
unsigned char ucGLeitura;
void main (void)
{
ucGLeitura = P1;
ucGLeitura = PWLeTeclado( );
PWDisplayEscreveString (“Selecione tecla: ”,1,1);
while (ucGLeitura == 0)
{
ucGLeitura = PWLeTeclado( );

}
}

D) DO – WHILE

A instrução DO – WHILE permite que o enunciado1, que pode ser simples ou


composto, seja executado enquanto a condição for verdadeira.
A diferença entre a instrução DO-WHILE e a WHILE resume-se no fato de que,
enquanto a instrução WHILE testa a condição antes da execução do enunciado1,
esta testa a condição após a execução do enunciado1, isto é, o enunciado1 será
executado pelo menos uma vez.
Veja que neste exemplo não é necessário a primeira leitura da tecla

#include <pwlib.h>
#include <8051.h>
unsigned char ucGLeitura;
void main (void)
{
ucGLeitura = P1;
PWDisplayEscreveString (“Selecione tecla:”,1,1);
do
{
ucGLeitura = PWLeTeclado ( );

} while (ucGLeitura == 0);


}

© Jefferson Leal Couto Página 48 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
E) FOR

A instrução FOR possibilita a execução de um conjunto de enunciados enquanto o


valor da variável varia entre uma faixa de valores. A principal vantagem em relação ao
uso do WHILE consiste no fato da instrução for manter centralizado o controle do
loop, resultando em um programa mais claro. A sintaxe é a seguinte:

FOR(expressao1; expressao2;expressao3)
{
enunciado1;
}

onde,
A expressao1 é a inicialização, sendo executada apenas uma vez, normalmente para
inicializar uma variável presente na condicao2. A expressao2 é a condição, cujo
resultado determina se o enunciado1 que pode ser simples ou composto será
executado. A expressao3 é o incremento ou decremento, sendo executado ao final da
passagem do loop. O loop só será abandonado quando a condição(expressao2) for
falsa ou quando dentro do loop for executada a instrução break ou return.

Exemplo: O programa limpa com espaço as 20 posições do array do tipo char

#include <pwlib.h>
#include <8051.h>
unsigned char ucGLoop;
void main (void)
{
unsigned char ucLBuffNome[20];

for(ucGLoop = 0; ucGLoop < 20; ucGLoop++)


{
ucLBuffNome[ucGLoop] = ‘ ‘;

}
}

F) RETURN

A instrução RETURN possibilita que se retorne da execução de uma função. Quando


retorna, podemos passar um valor para a função que originou a chamada. Caso seja
retornado um valor, é necessário que o tipo seja o mesmo especificado na declaração
da função.

© Jefferson Leal Couto Página 49 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

7.7) MAPA DE ALOCAÇÃO DE VARIÁVEIS NO 8051

Um dos pontos importantes mas de difícil compreensão é o mapa de memória da


arquitetura MCS51. A Intel originalmente colocou no mercado o processador
chamado de 8031 que não tinha memória de programa interno. Posteriormente foi
lançado o 8051 já com memória ROM interna. Estes microcontroladores permitem o
armazenamento de até 128 bytes de dados em memória RAM interna no modo direto
e 64K bytes de memória RAM externa.Com a boa aceitação do microcontrolador pelo
mercado foi produzido os modelos 8032 e 8052 com a mesma característica de
memória de programa do 8031/8051 respectivamente porém com um adicional de
128 bytes de memória de dados. Esta memória possui o mesmo endereço dos
registradores do SFR e devido a este fato foi implementado o acesso por
endereçamento indireto.

Para permitir o acesso a todos estes modos distintos de memória de dados, o


compilador SDCC possui os seguintes tipos de alocação de memória

DATA (DSEG) : Intervalo do endereço 00h ao 7Fh. Inclui o banco de registradores, a


área bit endereçável e o “stack pointer”. O SDCC pode ser configurado para iniciar a
alocação a partir do endereço 30h que é posterior aos 4 bancos de registradores e no
topo da área bit endereçável.

XDATA (XSEG) : Se você possui memória RAM externa na CPU então esta memória
é acessada com este modo de endereçamento. Os dispositivos de I/O mapeado em
memória também são acessados através deste segmento.

CODE (CSEG) : Construído na área interna ou externa da memória de programa


(ROM/EPROM). Bastante utilizado quando desejamos armazenar um array de
constantes, como mensagens em display.

IDATA (ISEG) : Este são os128 bytes extra de memória de dados acessados através
do endereçamento indireto. É importante lembrar que IDATA está disponível apenas
nas versões 8032, 8052 ou similar.

BIT (BSEG): Esta área fica entre os endereços 20h e 2Fh na memória de acesso
direto. Ela é bastante útil quando queremos sinalizar situações do tipo VERDADEIRO
ou FALSO, LIGADO ou DESLIGADO permitindo uma eficiente economia de espaço
de memória.

© Jefferson Leal Couto Página 50 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
8) AMBIENTE DE DESENVOLVIMENTO INTEGRADO ( IDE )

Atualmente, existem vários fabricantes de compiladores para microcontroladores da


família MCS-51. Um dos melhores compiladores para 8051 é o ambiente integrado da
Keil, que possui todos os recursos necessário para escrever, compilar e analisar o
programa, porém este apresenta um custo muito elevado até mesmo, para o
desenvolvimento de projetos comerciais, onde teremos retorno do capital investido.
Uma ferramenta de desenvolvimento como esta, está custando em torno de US$
3000,00.
Desta forma, buscamos algumas alternativas que apresentem um ambiente integrado
para o desenvolvimento de projetos e com uma boa relação custo/benefício.
Neste capítulo, conheceremos um ambiente integrado adaptado que apresenta
características dos melhores ambientes existentes no mercado e com uma grande
vantagem, totalmente GRÁTIS.

O IDE é composto de três aplicativos, a saber:

1) MIDE-51 – Editor utilizado para escrever o programa em “C” e com a interface


para o compilador e aplicativo de carga.

2) WinLoader51 – Aplicativo em plataforma Windows para a carga do firmware na


placa didática.

3) SDCC – Compilador freeware para os principais microcontroladores existentes no


mercado (Z80, 8051, PIC, etc)

© Jefferson Leal Couto Página 51 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

8.1) MIDE-51

A seguir temos uma imagem do editor MIDE-51

Suas principais características são:

1) Identificação destacada para as palavras reservadas utilizadas na linguagem C e


para os registradores padrão da família MCS-51.

2) Área de trabalho com suporte para múltiplos arquivos.

3) Suporte as principais características dos editores como copiar, colar, procurar,


substituir.

4) Configuração do tamanho e tipo de fonte.

5) Salvar o arquivo aberto recentemente.

6) Atalho para o manual do compilador SDCC

7) Relatório com as mensagens do compilador SDCC

© Jefferson Leal Couto Página 52 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
8) Copiar e Colar arquivos manipulados através do Windows Explorer

9) Suporte para mouse com Scroll

10) Bookmark para até 10 posições no programa fonte.

11) Ativar ou desativar o número das linhas no editor.

8.1.1) PRIMEIRO PROGRAMA

Veremos agora como iniciar o editor e escrever um pequeno programa.

1) Abrir o editor com um duplo clique no ícone da figura abaixo que está na área de
trabalho do Windows

2) Com o ambiente do editor aberto, selecione no menu FILE / NEW.

3) Coloque o cabeçalho do projeto , a chamada para a biblioteca padrão para a placa


didática e a rotina principal MAIN como no exemplo abaixo:

/*###############################################################
# #
# PROWARE PROJ. E SIST. ELETRONICOS #
# #
# PROJETO: TESTE #
# #
# MODULO: PRIMEIRO.C #
# #
# REVISÃO: 1 #
# #
# FUNCAO: #
# #
# HISTORICO: #
# #
# - Software inicial #
# Autor: Jefferson Couto Data: 20/03/06 #
# #
##############################################################*/

#include <pwlib.h>
void main( )
{
/* Escreva o seu programa aqui */
}

© Jefferson Leal Couto Página 53 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

4) Salve o arquivo em FILE / SAVE AS como Primeiro.C. Se tudo você fez todos os
passos de forma correta, o programa deverá ficar com alguns detalhes com cor
diferente.

5) Escreva o seu programa.

Como você está utilizando um ambiente adaptado, é


importante tomar um pequeno cuidado com o nome
do arquivo. Ele deve seguir o padrão utilizado pelo
antigo DOS, isto é, você pode utilizar no máximo 8
letras para o nome do arquivo.

8.1.2) COMPILANDO E CARREGADO O PROGRAMA

Para compilar o programa, basta clicar no ícone da figura abaixo.

Se tudo correr bem e o programa não possuir nenhum erro, na parte de baixo do
editor vai aparecer uma mensagem que o arquivo HEX foi gerado.

DONE. C:\PROJETOS\PRIMEIXO.HEX HAD BEEN GENERATED

Para carregar o firmware na placa didática, basta clicar no icone da figura abaixo.

© Jefferson Leal Couto Página 54 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

8.1.3) CONFIGURANDO O EDITOR PARA A PLACA DIDÁTICA

Para que o arquivo HEX gerado pelo edito seja compatível com a placa didática
utilizada na escola, devemos configurar o editor da seguinte forma:

Selecione no menu EDIT / PREFERENCE.

No TAB C-COMPILER verifique a existência das seguintes linhas de configuração:

PARAMETER

-l pwlib.lib --code-loc 0x0000 --iram-size 0xFF --idata-loc 0x80 --xram-loc 0x0000

PATH

c:\mide\sdcc

No TAB PROGRAMMER verifique a existência da seguinte linha de configuração:

EXECUTE FILE

C:\Arquivos de programas\WinLoader51\WinLoader51.exe

© Jefferson Leal Couto Página 55 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

8.2) WinLoader51

Agora veremos um pouco sobre o aplicativo utilizado para a carga do programa na


placa didática. Na figura abaixo temos a imagem da interface principal do programa.

Após clicar no icone para fazer a carga do firmware ( 8.1.2 ) o botão de GRAVAR no
aplicativo deverá estar habilitado se o programa for compilado e carregado com
sucesso, isto é, o texto “Gravar” deverá estar na cor verde. Caso o botão esteja com
o texto em cinza existem duas possibilidades:

1) O arquivo HEX não foi gerado devido a algum erro no programa.


2) O arquivo gerado não pode ser aberto pelo aplicativo.
3) O aplicativo não conectou com a placa porque não estava em modo carga.

Se o botão estiver habilitado, você poderá ver na parte de baixo do aplicativo o nome
do arquivo HEX que foi carregado pelo WinLoader51 e o Checksum do firmware
selecionando a opção FERRAMENTAS / STATUS.

NOTA: O checksum é a soma de todos os bytes do arquivo HEX gerado pelo


compilador.

Para gravar o programa na placa didática devemos seguir os seguintes passos:

Pressione o botão de CARGA na placa didática de forma que o LED da placa fique na
cor vermelha. Se o aplicativo estiver sendo executado, o LED de STATUS deverá
ficar na mesma cor da placa, informando que existe comunicação entre eles.

© Jefferson Leal Couto Página 56 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
Havendo comunicação com a placa, no menu SOBRE / PROGRAMA O usuário
poderá verificar que o aplicativo estará em MODO DESENVOLVIMENTO

Neste momento, o usuário deve clicar no botão “Gravar”. Após alguns segundos o
aplicativo deve mostrar uma barra com o andamento da carga do firmware na placa.

© Jefferson Leal Couto Página 57 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
O usuário deverá pressionar novamente o botão CARGA na placa didática. O LED do
aplicativo deve alterar para a cor verde. A placa deve executar o programa que foi
enviado pela interface serial.

© Jefferson Leal Couto Página 58 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

8.2.1) RECURSOS AVANÇADOS DO APLICATIVO

O aplicativo WinLoader51 foi desenvolvido com alguns recursos para agilizar o


processo de carga do firmware na placa didática.
Devido ao fato de utilizarmos a interface serial para fazer a carga do programa, em
alguns casos, a porta serial poderá estar sendo utilizada pelo sistema operacional
para o controle do “mouse”. O aplicativo possui um recurso de varredura que procura
a placa na porta serial que estiver disponível. Se realmente não for possível a
conexão, você será informado com uma mensagem de erro.

Se o usuário desejar verificar se o conteúdo do buffer do aplicativo ( Arquivo HEX


gerado ) foi transferido com sucesso, basta clicar no botão VERIFICAR que o
aplicativo faz a verificação do checksum armazenado na placa. Se o valor estiver
correto o aplicativo mostrara a seguinte mensagem:

As principais dúvidas do usuário poderão ser esclarecidas através do help do


aplicativo. Basta clicar em SOBRE / AJUDA para abrir o programa de ajuda.

© Jefferson Leal Couto Página 59 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

9) EXEMPLO DE PROGRAMAS PARA A PLACA DIDÁTICA PWLOADER51

9.1) Entrada de dados pelo teclado e saída pelo display de LCD

#####################################################################################
# #
# PROWARE PROJ. E SIST. ELETRONICOS #
# #
# PROJETO: DIGITAR VELOCIDADE #
# #
# MODULO: TECLCD.C #
# #
# REVISÃO: 1 #
# #
# FUNCAO: #
# #
# HISTORICO: #
# #
# - Software inicial #
# Autor: Jefferson Couto Data: 10/09/06 #
# #
# #
# #
#####################################################################################*/
#include <pwlib.h>
unsigned int uiGVelocidade;

void main()
{
unsigned char ucLContador;

while(1)
{
PWDisplayLimpa(); // Limpa display
PWDisplayEscreveString ("Velocidade =" 1,1); // Mostra mensagem na linha 1

uiGVelocidade = PWEntraIntxxxxx (); // Aguarda usuário digitar valor


PWDisplayEscreveString ("Digitado= "2,1); // Coloca mensagem na posição …

PWMostraIntxxxxx (uiGVelocidade); // Mostra variável inteiro no display

for(ucLContador = 0; ucLContador < 8; ucLContador++)


{
PWDelayms (250); // Delay de 250ms x 8
}

© Jefferson Leal Couto Página 60 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

9.2) Leitura no conversor Analógico/Digital (A/D)


#####################################################################################
# #
# PROWARE PROJ. E SIST. ELETRONICOS #
# #
# PROJETO: CONVERSOR ANALOGICO DIGITAL #
# #
# MODULO: AD/DA.C #
# #
# REVISÃO: 1 #
# #
# FUNCAO: #
# #
# HISTORICO: #
# #
# - Software inicial #
# Autor: Jefferson Couto Data: 10/09/06 #
# #
#####################################################################################

#include <pwlib.>
#include <8051.h>
void InicializaRegistradores(void);

void main(void)
{
unsigned char ucLRetorno;
unsigned char ucLPosicaoLCD;
unsigned char ucLContador = 0;
unsigned char ucLOpcao;
unsigned char ucLByte;
unsigned char ucLCanal = 0;

InicializaRegistradores();
PWDisplayInicializa();
PWDisplayPosicionaCursor(2,7);
PWDelay(30000);

PWDisplayEscreveString(" Teste AD/DA ",1,1);


PWDisplayEscreveString(" ",2,1);
PWDelay1Segundo(1);

ucLPosicaoLCD = 0;
ucLContador = 0;
while(1)
{

PWDisplayEscreveString("Selecione Opcao:",1,1);
PWDisplayEscreveString(" 1-A/D 2-D/A ",2,1);
do
{

ucLRetorno = PWLeTeclado();

}while(ucLRetorno == 0);

© Jefferson Leal Couto Página 61 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

if((ucLRetorno >= '1')&&(ucLRetorno < '3'))


{
ucLOpcao = ucLRetorno;
switch(ucLOpcao)
{
case '1':
PWDisplayEscreveString("Selecione Canal:",1,1);
PWDisplayEscreveString("1-A/D0 2-A/D1 ",2,1);
do
{
ucLRetorno = PWLeTeclado();
}
while(ucLRetorno != 0);

do
{
ucLRetorno = PWLeTeclado();
switch(ucLRetorno)
{
case '1':
ucLCanal = 1;
break;

case '2':
ucLCanal = 2;
break;

}
}while(ucLCanal == 0);

break;

case '2':
PWDisplayEscreveString("Selecionado: ",1,1);
PWDisplayEscreveString("Conversor D/A 0 ",2,1);
break;
}
PWDelay1Segundo(1);
break;

}
else
{
PWDisplayEscreveString("Selecao invalida",1,1);
PWDisplayEscreveString("Tente novamente.",2,1);
PWDelay1Segundo(1);
}

}
ucLByte = 0;
PWDisplayLimpa();

© Jefferson Leal Couto Página 62 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

if(ucLOpcao == '2')
{
PWDisplayEscreveString("Fechar jump. JP1",1,1);
PWDisplayEscreveString("pres. tecla test",2,1);
do
{
ucLRetorno = PWLeTeclado();

}while(ucLRetorno == 0);
}

while(1)
{
if(ucLOpcao == '1') // Seleciona leitura do A/D canal 0
{

if(ucLCanal == 1)
{
ucLByte = PWLeituraAD(0);
}
else
{
ucLByte = PWLeituraAD(1);
}

PWBinToASCII(2,1,ucLByte );
PWDelay1Segundo(1);
}

if(ucLOpcao == '2') // Seleciona escrita no D/A canal 0


{
PWDisplayEscreveString("WR ",1,1);
PWDisplayEscreveString("RD ",2,1);
PWEscreveDA(0,ucLByte); // Escreve valor da variável

PWDelayms(50);

PWBinToASCII(1,4,ucLByte );
ucLByte++;
do
{
ucLRetorno = PWLeituraAD(0);
PWDelay1Segundo(1);
PWBinToASCII(2,4,ucLRetorno );
ucLRetorno = PWLeTeclado();
}
while(ucLRetorno == 0);
}

}
void InicializaRegistradores(void)
{

IP = 0x00; // Configura prioridade padrao para interrupcoes


TMOD = 0x00; // Configura modo do TIMER
IE = 0x00; // Habilita interrupção timer 0
TMOD = 0x01; // Timer zero no modo 1
TR0 = 1;

© Jefferson Leal Couto Página 63 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

9.3) Escrita no Conversor Analógico/Digital (D/A)

#####################################################################################
# #
# PROWARE PROJ. E SIST. ELETRONICOS #
# #
# PROJETO: CONTROLE DE SAIDA DO D/A #
# #
# MODULO: DIGITAVO.C #
# #
# REVISÃO: 1 #
# #
# FUNCAO: #
# #
# HISTORICO: #
# #
# - Software inicial #
# Autor: Jefferson Couto Data: 20/03/06 #
#####################################################################################
#include <PWlib.h>
#include <8051.h>
void MostraValor(unsigned char);
void InicializaRegistradores(void);
void main()
{
unsigned char ucLValor;
unsigned char ucLCopia;

InicializaRegistradores(); // Chama subrotina que inicializa registradores


PWDisplayInicializa();
PWDisplayLimpa();
while(1)
{
PWDisplayEscreveString("Tensao VO: ",1,1);
ucLValor = PWEntraCharx_x(1,11);
ucLValor = ucLValor * 2;
PWEscreveDA(0,ucLValor);
MostraValor(ucLValor);
PWDisplayLimpaLinha(2);
}
}

void InicializaRegistradores(void)
{
IP = 0x00; // Configura prioridade padrao para interrupcoes
TMOD = 0x00; // Configura modo do TIMER
IE = 0x00; // Desabilita interrupções
}

void MostraValor(unsigned char Valor)


{
unsigned char ucLTecla;

PWDisplayEscreveString ("DEC: ",2,1);


PWMostraCharxxx(Valor); // Mostra valor atual da variável
do
{
ucLTecla = PWLeTeclado(); // Aguarda usuário pressionar uma tecla
}while( ucLTecla == 0);
}

© Jefferson Leal Couto Página 64 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

9.4) PHASE WIDTH MODULATION ( PWM)

#####################################################################################
# #
# PROWARE PROJ. E SIST. ELETRONICOS #
# #
# PROJETO: PWM #
# #
# MODULO: PWM.C #
# #
# REVISÃO: 1 #
# #
# FUNCAO: #
# #
# HISTORICO: #
# #
# - Software inicial #
# Autor: Jefferson Couto Data: 28/05/06 #
#####################################################################################
#include <PWlib.h>
#include <8051.h>
void InicializaRegistradores(void);
unsigned char ucGPwmHigh = 0;
unsigned char ucGPwmLow = 0;
unsigned char ucGTecla;
unsigned char ucAtualiza = 0;
unsigned char ucGDutyCicle = 50;
#define CONTAGEM 46 // Tempo de 1ms Ciclo de máquina x 9 X 100 = aproximadamente 1mS
#define CONTAGEMH (65535-CONTAGEM)/256
#define CONTAGEML (65535-CONTAGEM)
void Int_Timer0(void) interrupt 1
{
IT0 = 0;
if(ucGPwmHigh > 0)
{
P1_0 = 1;
ucGPwmHigh--;
}
else
{
if(ucGPwmLow > 0)
{
P1_0 = 0;
ucGPwmLow--;
}
else
{ if(ucGDutyCicle == 0)
P1_0 = 0;
else
P1_0 = 1;
ucGPwmHigh = ucGDutyCicle;
ucGPwmLow = 100 - ucGDutyCicle;
}
}
TH0 = CONTAGEMH;
TL0 = CONTAGEML;
IT0 = 1;
}

void main()

© Jefferson Leal Couto Página 65 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
{

ucGDutyCicle = 50; // Duty cicle do PWM em 50%


InicializaRegistradores();
PWDisplayInicializa();
PWDisplayLimpa();
PWDisplayEscreveString ("GERANDO PWM ",1,1);
PWMostraCharxxx(ucGDutyCicle);
PWEscreveCaractere('%');

while(1)
{

ucGTecla = PWLeTeclado();
if(ucGTecla == '2')
{ if(ucGDutyCicle < 100)
ucGDutyCicle++;

PWDisplayLimpa();
PWDisplayEscreveString("Aumenta PWM ",1,1); // Mostra mensagem na linha 1
PWMostraCharxxx(ucGDutyCicle);
PWEscreveCaractere('%');
PWDelayms(100);
ucAtualiza = 1;
}
if(ucGTecla == '1')
{
if(ucGDutyCicle > 0)
ucGDutyCicle--;

PWDisplayLimpa();
PWDisplayEscreveString("Diminui PWM ",1,1); // Mostra mensagem na linha 1
PWMostraCharxxx(ucGDutyCicle);
PWEscreveCaractere('%');
PWDelayms(100);
ucAtualiza = 1;
}
if((ucAtualiza)&&(ucGTecla == 0)) // Se nenhuma tecla pressionada e alterou Duty Cicle
{
PWDisplayLimpa();
PWDisplayEscreveString ("GERANDO PWM ",1,1);
PWMostraCharxxx(ucGDutyCicle);
PWEscreveCaractere('%');
ucAtualiza = 0;
}

void InicializaRegistradores(void)
{

IP = 0x00; // Configura prioridade padrao para interrupcoes


IE = 0x82; // Habilita interrupção timer 0
TMOD = 0x01; // Timer zero no modo 1
TR0 = 1;
TH0 = CONTAGEMH;
TL0 = CONTAGEML;

© Jefferson Leal Couto Página 66 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

9.5) Medir largura de pulso


#####################################################################################
# #
# PROWARE PROJ. E SIST. ELETRONICOS #
# #
# PROJETO: MEDIR LARGURA DE PULSO #
# #
# MODULO: LARGURAP.C #
# #
# REVISÃO: 1 #
# #
# FUNCAO: #
# #
# HISTORICO: #
# #
# - Software inicial #
# Autor: Jefferson Couto Data: 20/03/06 #
#####################################################################################*
#include<PWlib.h>
#include <8051.h>

void InicializaRegistradores(void);
unsigned char ucAtualiza = 0;
unsigned char ucGFlag = 0;
unsigned int uiGLarguraPulso;

void Int_Ex1(void) interrupt 2


{
EX1 = 0; // Desliga a interrupção externa 0
TR1 = 0;
if(!ucGFlag)
{
ucGFlag = 1;
ucAtualiza = 1;
uiGLarguraPulso = ((256 * TH1) + TL1);
}
else
{

TH1 = 0;
TL1 = 0; // Zera regustradores utilizados na medida
EX1 = 1; // Liga a interrupção externa 0
ucGFlag = 0;
TR1 = 1;
}

© Jefferson Leal Couto Página 67 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

void main()
{
unsigned char ucLByte;

SP = 0x80; // Inicializa Stack Pointer


RS0 = 0; // Seleciona banco zero
RS1 = 0; // Seleciona banco zero
uiGLarguraPulso = 0; // Duty cicle do PWM em 50%

PWDisplayInicializa();
PWDisplayLimpa();
PWDisplayEscreveString("Largura = ",1,1); // Mostra mensagem na linha 1
InicializaRegistradores(); // Chama subrotina que inicializa registradores
ucAtualiza = 1;
while(1)
{

if(ucAtualiza)
{
PWEscreveComando(0x8A);
PWMostraIntxxxx(uiGLarguraPulso);
PWDisplayEscreveString("TH1=",2,1);
ucLByte = TH1;
PWMostraCharxxx(ucLByte);
PWDisplayEscreveString("TL1=",2,9);
ucLByte = TL1;
PWMostraCharxxx(ucLByte);
ucAtualiza = 0;
PWDelayms(400);
IE1 = 0;
EX1 = 1;

void InicializaRegistradores(void)
{

IP = 0x00; // Configura prioridade padrao para interrupcoes


IE = 0x84; // Habilita interrupção Externa 1
TMOD = 0x90; // Timer UM no modo 1 medindo largura de pulso
TCON = 0x41; // Liga TR1 e Configura Int Externa 0 por borda
TH1 = 0;
TL1 = 0;

© Jefferson Leal Couto Página 68 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

10) FUNÇÕES DA BIBLIOTECA PWLIB

10.1) void PWDelayms(unsigned int)

Descrição: Rotina de delay por software.

Entrada: Tempo de atraso multiplo de 1ms.


Saida: Nenhuma

Exemplo:

PWDelayms(45); // Delay de 45 ms

10.2) void PWDelay1Segundo(char)

Descrição: Rotina de delay por software.

Entrada: Tempo de atraso multiplo de 1 segundo


Saida: Nenhuma

Exemplo:

PWDelay1Segundo(4); // Delay de 4 segundos

10.3) void PWDelay (int)

Descrição: Rotina de delay por software.

Entrada: Tempo de atraso


Saida: Nenhuma

Exemplo:
PWDelay(3000); // Delay

10.4) void PWDisplayInicializa (void)

Descrição: Inicializa o display (programação inicial).

Entrada: Nenhuma
Saida: Nenhuma

Exemplo:
PWDisplayInicializa(); // Inicializa o display

© Jefferson Leal Couto Página 69 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
10.5) void PWDisplayEscreveString (unsigned char*,char,char)

Descrição: Mostra uma sequência de caracteres no display de LCD.

Entrada: Ponteiro para a string


Linha do display
Coluna do display
Saida: Nenhuma

Exemplo:

PWDisplayEscreveString(“Proware”,2,1); // Mensagem na Linha 2 Coluna 1

10.6) void PWEscreveStringPadrao (void)


Descrição: Mostra uma sequência padrão de caracteres no display de LCD.

Entrada: Nenhuma
Saida: Nenhuma

Exemplo:

PWEscreveStringPadrao ( ); // Mostra tela padrão

10.7) void PWDisplayLimpa(void)

Descrição: Limpa todo o display de LCD.

Entrada: Nenhuma
Saida: Nenhuma

Exemplo:

PWDisplayLimpa (); // Limpa do display

10.8) void PWDisplayLimpaLinha(char)

Descrição: Limpa uma das linhas do display.

Entrada: 1 – Para limpar primeira linha e 2 – Para limpar segunda linha


Saida: Nenhuma

Exemplo:

PWDisplayLimpaLinha(2); // Limpa segunda linha do display

© Jefferson Leal Couto Página 70 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
10.9) void PWEscreveCaractere (unsigned char)

Descrição: Mostra o caractere na posição atual do display.

Entrada: Caractere a ser mostrado no display de LCD


Saida: Nenhuma

Exemplo:

PWEscreveCaractere (‘J’); // Mostra a letra ‘J’ no display de LCD

10.10) void PWEscreveComando(unsigned char)

Descrição: Envia comando de programação para o display de LCD.

Entrada: Comando a ser enviado para o display


Saida: Nenhuma

Exemplo:
PWEscreveComando (0xC0); // Comando para posicionar o cursor na Linha 2 e
// Coluna 1

10.11) void PWDisplayAtivaCursor(void)

Descrição: Faz com que o cursor fique visível no LCD. Permite que o usuário visualize
a posição atual do cursor.

Entrada: Nenhuma
Saida: Nenhuma

Exemplo:
PWDisplayAtivaCursor(); // Ativa o cursor no LCD

10.12) void PWDisplayDesativaCursor(void)

Descrição: Faz com que o cursor fique invisível no LCD. O usuário não poderá
visualizar a posição atual do cursor.

Entrada: Nenhuma
Saida: Nenhuma

Exemplo:
PWDisplayDesativaCursor(); // Desativa o cursor no LCD

© Jefferson Leal Couto Página 71 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
10.13) void PWDisplayPosicionaCursor (char,char)

Descrição: Posiciona o cursor em uma determinada linha e coluna do LCD.

Entrada: Linha – 1 para primeira linha e 2 - para segunda linha


Coluna – 1 a 16 – Conforme colunas do display
Saida: Nenhuma

Exemplo:

PWDisplayPosicionaCursor (2,4); // Posiciona o cursor da linha 2 coluna 4

10.14) char PWLeTeclado (void)


Descrição: Faz a varredura do teclado e verifica se alguma tecla foi pressionada.

Entrada: Nenhuma

Saida: Retorna 00h se nenhuma tecla foi pressionada ou o valor da tecla em ASCII
conforme a tecla que foi pressionada.

Exemplo:

ucLTecla = PWLeTeclado (); // Armazena em ucLTecla o valor lido no teclado

10.15) char PWLeituraAD (unsigned char)

Descrição: Faz a leitura do conversor A/D, conforme o número do conversor.

Entrada: 0 – A/D0 , 1 – A/D1, 2 – A/D2 e 3 – A/D3 ( Sendo A/D 2 e 3 na expansão)

Saida: Retorna um valor de 8 bits ( 0 a 255 ) conforme a leitura do A/D

Exemplo:

ucLAD = PWLeituraAD (0); // Armazena em ucLAD o valor lido no A/D

10.16) void PWEscreveDA ( char, unsigned char )


Descrição: Escreve no conversor Digital/Analógico um valor de 8 bits na saída
determinada pelo parâmetro número do D/A

Entrada: Saída – Valor de 0 a 3 conforme conversor


Dado – Valor entre 0 a 255 referente ao dado a ser gravado no conversor.
Saida: Nenhuma

© Jefferson Leal Couto Página 72 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
Exemplo:

PWEscreveDA (0,Byte); // Armazena o Byte na saída do conversor D/A0

10.17) char PWConfiguraSerial8N1(unsigned char)

Descrição: Programa a velocidade da serial assíncrona no modo 8 bits de dados, sem


paridade e um stop bit.

Entrada: 0 – 1200, 1 – 2400, 2 – 4800, 3 - 9600


Saida: Nenhuma.

Exemplo:
PWConfiguraSerial8N1(3); // Programa na velocidade de 9600 bps.

10.18) char PWEnviaSerial(char*, unsigned char)

Descrição: Envia um array pela porta serial.

Entrada: Dados – Ponteiro para o array


Tamanho – Quantidade de bytes ( 0 a 255 )
Saida: Retorna um byte com a resposta do dispositivo ou 0 se não recebeu
nenhum byte como retorno.

Exemplo:
PWEnviaSerial(BuffDados,12 ); // Envia o conteúdo de BuffDados

10.19) char PWEnviaRecebeSerial(char*, unsigned char,unsigned char)

Descrição: Envia um array pela porta serial. Aguarda os dados da resposta.

Entrada: Dados – Ponteiro para o array com dados enviados e recebidos.


TamanhoSaida – Quantidade de bytes que serão enviados( 0 a 255 )
TamanhoEntrada – Quantidade de bytes que serão recebidos

Saida: Retorna um byte com 0 para sucesso e 1 para erro.

Exemplo:
PWEnviaRecebeSerial(BuffDados,12,3 ); // Envia 12 bytes de BuffDados e
// armazena 3 bytes de retorno em
// BuffDados.

© Jefferson Leal Couto Página 73 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

10.20) void PWBinToASCII (unsigned char,unsigned char,unsigned char)

Descrição: Mostra o valor de um byte em binário no display de LCD.

Entrada: Byte que será convertido para binário.


Linha – Número da linha onde será mostrado no display ( 1 ou 2 )
Coluna – Número da coluna onde será mostrado no display ( 1 a 16 )
Saida: Nenhuma

Exemplo:
PWBinToASCII ( Byte,1,1 ); // Mostra o valor de Byte na linha 1 e coluna 1

10.21) void PWMostraCharxx(unsigned char)

Descrição: Mostra o conteúdo de um variável byte no formato decimal na posição


atual do display. Valor entre 00 e 99.

Entrada: Byte que será mostrado no LCD


Saida: Nenhuma

Exemplo:
PWMostraCharxx(Byte); // Mostra o valor de Byte no LCD

10.22) void PWMostraCharxxx(unsigned char)

Descrição: Mostra o conteúdo de uma variável byte no formato decimal na posição


atual do display. Valor entre 00 e 255.

Entrada: Byte que será mostrado no LCD


Saida: Nenhuma

Exemplo:
PWMostraCharxxx(Byte); // Mostra o valor de Byte no LCD

10.23) void PWMostraIntxxx(unsigned int)

Descrição: Mostra o conteúdo de uma variável word no formato decimal na posição


atual do display. Valor entre 00 e 999.

Entrada: Word que será mostrado no LCD


Saida: Nenhuma

Exemplo:
PWMostraIntxxx(uiLValor); // Mostra o valor de uiLValor no LCD

© Jefferson Leal Couto Página 74 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
10.24) void PWMostraIntxxxx(unsigned int)

Descrição: Mostra o conteúdo de uma variável word no formato decimal na posição


atual do display. Valor entre 00 e 9999.

Entrada: Word que será mostrado no LCD


Saida: Nenhuma

Exemplo:
PWMostraIntxxxx(uiLValor); // Mostra o valor de uiLValor no LCD

10.25) void PWMostraIntxxxxx(unsigned int)

Descrição: Mostra o conteúdo de uma variável word no formato decimal na posição


atual do display. Valor entre 00 e 65535.

Entrada: Word que será mostrado no LCD


Saida: Nenhuma

Exemplo:
PWMostraIntxxxx(uiLValor); // Mostra o valor de uiLValor no LCD

10.26) void PWMostraIntxx_xx (unsigned int)

Descrição: Mostra o conteúdo de uma variável word no formato decimal com duas
casas decimais na posição atual do display. Valor entre 00 e 99,99.

Entrada: Word que será mostrado no LCD. Valor dividido por 100
Saida: Nenhuma

Exemplo:
PWMostraIntxx_xx(1278); // Mostra o valor 12,78 no LCD

10.27) unsigned char PWEntraCharx_x(unsigned char, unsigned char)

Descrição: Solicita a entrada de um valor com uma casa decimal. Retorna um valor
entre 0 e 255 ( 255 / 10 ). Anula limpa valor e solicita nova entrada.

Entrada: Linha no LCD onde será feita a entrada dos dados.


Coluna no LCD onde será feita a entrada dos dados.
Saida: Valor entre 0 e 255 conforme o valor digitado pelo usuário.

Exemplo:
ucLByte = PWEntraCharx_x(1,4); // Aguarda o usuário digital o valor

© Jefferson Leal Couto Página 75 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
10.28) unsigned char PWEntraCharxx_x(unsigned char, unsigned char)

Descrição: Solicita a entrada de um valor com uma casa decimal. Retorna um valor
entre 0 e 255 ( 255 / 100 ). Anula limpa valor e solicita nova entrada.

Entrada: Linha no LCD onde será feita a entrada dos dados.


Coluna no LCD onde será feita a entrada dos dados.
Saida: Valor entre 0 e 255 conforme o valor digitado pelo usuário.

Exemplo:
ucLByte = PWEntraCharxx_x(1,4); // Aguarda o usuário digital o valor

10.29) unsigned char PWEntraCharxx(unsigned char, unsigned char)

Descrição: Solicita a entrada de um valor com duas casas. Retorna um valor entre 0 e
99. Anula limpa valor e solicita nova entrada.

Entrada: Linha no LCD onde será feita a entrada dos dados.


Coluna no LCD onde será feita a entrada dos dados.
Saida: Valor entre 0 e 99 conforme o valor digitado pelo usuário.

Exemplo:
ucLByte = PWEntraCharxx(1,4); // Aguarda o usuário digital o valor
10.30) unsigned char PWEntraCharxxx(unsigned char, unsigned char)

Descrição: Solicita a entrada de um valor com três casas. Retorna um valor entre 0 e
255. Anula limpa valor e solicita nova entrada.

Entrada: Linha no LCD onde será feita a entrada dos dados.


Coluna no LCD onde será feita a entrada dos dados.
Saida: Valor entre 0 e 255 conforme o valor digitado pelo usuário.

Exemplo:
ucLByte = PWEntraCharxxx(1,4); // Aguarda o usuário digital o valor

10.31) unsigned int PWEntraIntxxx(unsigned char, unsigned char)

Descrição: Solicita a entrada de um valor com três casas. Retorna um valor entre 0 e
999. Anula limpa valor e solicita nova entrada.

Entrada: Linha no LCD onde será feita a entrada dos dados.


Coluna no LCD onde será feita a entrada dos dados.
Saida: Valor entre 0 e 999 conforme o valor digitado pelo usuário.

Exemplo:
uiLValor = PWEntraIntxxx(1,4); // Aguarda o usuário digital o valor

© Jefferson Leal Couto Página 76 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS
10.32) unsigned int PWEntraIntxxxx(unsigned char, unsigned char)

Descrição: Solicita a entrada de um valor com três casas. Retorna um valor entre 0 e
9999. Anula limpa valor e solicita nova entrada.

Entrada: Linha no LCD onde será feita a entrada dos dados.


Coluna no LCD onde será feita a entrada dos dados.
Saida: Valor entre 0 e 9999 conforme o valor digitado pelo usuário.

Exemplo:
uiLValor = PWEntraIntxxxx(1,4); // Aguarda o usuário digital o valor

10.33) unsigned int PWEntraIntxxxxx(unsigned char, unsigned char)

Descrição: Solicita a entrada de um valor com três casas. Retorna um valor entre 0 e
.65535 Anula limpa valor e solicita nova entrada.

Entrada: Linha no LCD onde será feita a entrada dos dados.


Coluna no LCD onde será feita a entrada dos dados.
Saida: Valor entre 0 e 65535 conforme o valor digitado pelo usuário.

Exemplo:
uiLValor = PWEntraIntxxxx(1,4); // Aguarda o usuário digital o valor

10.34) unsigned int PWEntraIntxx_xx (unsigned char, unsigned char)

Descrição: Solicita a entrada de um valor com duas casas decimais. Retorna um valor
entre 0 e 9999. Anula limpa valor e solicita nova entrada.

Entrada: Linha no LCD onde será feita a entrada dos dados.


Coluna no LCD onde será feita a entrada dos dados.
Saida: Valor entre 0 e 9999 conforme o valor digitado pelo usuário. O valor em
ponto flutuante será multiplicado por 100.

Exemplo:
uiLValor = PWEntraIntxx_xx(1,4); // Aguarda o usuário digital o valor
Se o usuário digitar 76,25, o valor de uiLValor será 7625 sem vírgulas.

© Jefferson Leal Couto Página 77 Rev. E


PROWARE PROJ. E SIST. ELETRÔNICOS

11) INFORMAÇÕES SOBRE O KIT

© Jefferson Leal Couto Página 78 Rev. E

You might also like