78
MICROCONTROLADOR 8051 Eng. Jefferson Couto

programação em C para 8051

Embed Size (px)

Citation preview

Page 1: programação em C para 8051

MICROCONTROLADOR8051

Eng. Jefferson Couto

Page 2: programação em C para 8051

INDICE1) SISTEMAS DE NUMERAÇÃO................................................................................................................................................... 3

1.1) SISTEMA BINÁRIO (BASE 2) ............................................................................................................................................ 31.2) SISTEMA HEXADECIMAL (BASE 16)................................................................................................................................ 41.3) FORMAS DE APRESENTAÇÃO ........................................................................................................................................ 41.4) CONVERSÃO DO SISTEMA BINÁRIO PARA O SISTEMA DECIMAL............................................................................... 51.5) CONVERSÃO DO SISTEMA HEXADECIMAL PARA O SISTEMA DECIMAL .................................................................... 51.6) CONVERSÃO DO SISTEMA DECIMAL PARA O SISTEMA BINÁRIO............................................................................... 51.7) CONVERSÃO DE DECIMAL PARA UMA BASE QUALQUER............................................................................................ 61.8) CONVERSÃO ENTRE AS BASES 2 E 16 .......................................................................................................................... 6

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

2.1) ADIÇÃO.............................................................................................................................................................................. 82.2) SUBTRAÇÃO ..................................................................................................................................................................... 82.3) COMPLEMENTO DE 2....................................................................................................................................................... 92.4) DESLOCAMENTO............................................................................................................................................................ 11

3) OPERAÇÕES LÓGICAS ......................................................................................................................................................... 12

3.1) AND.................................................................................................................................................................................. 123.2) OR.................................................................................................................................................................................... 133.3) NOT.................................................................................................................................................................................. 133.4) XOR.................................................................................................................................................................................. 14

4) TERMOS IMPORTANTES....................................................................................................................................................... 16

5) MICROCONTROLADORES..................................................................................................................................................... 21

5.1) MICROPROCESSADOR: ................................................................................................................................................. 215.2) BARRAMENTOS DE UM MICROCONTROLADOR.......................................................................................................... 235.3) MODOS DE ATENDIMENTO DE I/O................................................................................................................................ 24

6) MICROCONTROLADOR 8031/8051........................................................................................................................................ 25

6.1) PINAGEM:........................................................................................................................................................................... 256.2) BARRAMENTO MULTIPLEXADO:............................................................................................................................................. 266.3) CLOCK NO 80C51............................................................................................................................................................ 27................................................................................................................................................................................................ 286.4) RESET DO MICROCONTROLADOR ............................................................................................................................... 286.5) INTERRUPÇOES ............................................................................................................................................................. 30................................................................................................................................................................................................ 336.6) INTERRUPÇÃO EXTERNA .............................................................................................................................................. 346.7) TEMPORIZADOR E CONTADOR .................................................................................................................................... 356.8) COMUNICAÇÃO SERIAL................................................................................................................................................. 376.9) INTERFACE SERIAL NO 8051......................................................................................................................................... 386.10) TAXA DE TRANSMISSÃO PARA OS MODOS 1 E 3 .................................................................................................... 396.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 ........................................................................................................................................... 417.2) OPERADORES ARITMÉTICOS ....................................................................................................................................... 417.3) OPERADORES LÓGICOS E RELACIONAIS ................................................................................................................... 427.4) OPERADORES DE MANIPULAÇÃO DE BIT ................................................................................................................... 427.5) DIRETIVAS FUNDAMENTAIS DO PRÉ – COMPILADOR................................................................................................ 437.6) CONTROLE DE FLUXO ................................................................................................................................................... 447.7) MAPA DE ALOCAÇÃO DE VARIÁVEIS NO 8051 ............................................................................................................ 50

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

8.1) MIDE-51 ........................................................................................................................................................................... 528.1.1) PRIMEIRO PROGRAMA ............................................................................................................................................... 538.1.2) COMPILANDO E CARREGADO O PROGRAMA .......................................................................................................... 548.1.3) CONFIGURANDO O EDITOR PARA A PLACA DIDÁTICA ........................................................................................... 558.2) WINLOADER51 ................................................................................................................................................................... 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 ....................................................................................... 609.2) LEITURA NO CONVERSOR ANALÓGICO/DIGITAL (A/D) ............................................................................................................. 619.3) ESCRITA NO CONVERSOR ANALÓGICO/DIGITAL (D/A) ............................................................................................................ 649.4) PHASE WIDTH MODULATION ( PWM) ........................................................................................................................... 659.5) MEDIR LARGURA DE PULSO .................................................................................................................................................. 67

10) FUNÇÕES DA BIBLIOTECA PWLIB..................................................................................................................................... 69

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

Page 3: programação em C para 8051

© Jefferson Leal Couto Página Rev. E3

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, obinário, o octal e o hexadecimal.

O sistema decimal é utilizado por nós no dia a dia, e é sem dúvida o maisimportante dos sistemas numéricos, com os quais podemos formar qualquer númeroatravé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 = 4B = 10A0 = 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 oum.

Cada algarismo ou dígito de um número binário é chamado de BIT que é aabreviaçã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.

Page 4: programação em C para 8051

© Jefferson Leal Couto Página Rev. E4

PROWARE PROJ. E SIST. ELETRÔNICOS

1.2) SISTEMA HEXADECIMAL (BASE 16)

O sistema hexadecimal possui 16 símbolos para representar qualquerquantidade. 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 demicroprocessadores, 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 HEXADECIMAL0 0 01 1 12 10 23 11 34 100 45 101 56 110 67 111 78 1000 89 1001 9

10 1010 A11 1011 B12 1100 C13 1101 D14 1110 E15 1111 F16 10000 10

Page 5: programação em C para 8051

© Jefferson Leal Couto Página Rev. E5

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= 2A0 = 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 deformação.

EX: Convertendo o número ABh em decimal:

n= 2 -1= 1A0 = 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 necessidadede convertermos os valores decimais em binários.

Para converter um número decimal basta dividi-lo pela base 2 tantas vezesquantas 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 ordeminversa, correspondem ao número na base 2.

EX: 129d = ?b

Page 6: programação em C para 8051

© Jefferson Leal Couto Página Rev. E6

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õessucessivas 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. Estarelação vem do fato de que o número 16 pode ser escrito como 24. Os númeroshexadecimais podem ser vistos como uma forma compacta de representar osnú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 tabeladada anteriormente.

Ex: 1001 1010 0010 1110b 9 A 2 E h

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

Page 7: programação em C para 8051

© Jefferson Leal Couto Página Rev. E7

PROWARE PROJ. E SIST. ELETRÔNICOS

1) Converte-se cada algarismo no seu equivalente em binário utilizando sempre 4algarísmos. Coloca-se zeros a esquerda quando necessário.

2) Reune-se os grupos de 4 algarismos.

Ex: A2C7h = ?b

A 2 C 71010 0010 1100 0111

A2C7h = 1010001011000111b

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

1) 23Fh = ?d2) 47d = ?b3) 11010011b = ?d4) 11100010b = ?h5) A2Ch = ?d6) 2DAh = ?b7) 1110 0001b = ?d8) 352d = ?h9) 510d = ?h10) 120d = ?b

Se você está confuso e não sabe qual o métodousado 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.

Page 8: programação em C para 8051

© Jefferson Leal Couto Página Rev. E8

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çãoconvencional do sistema decimal. Convém observar que no sistema decimal 1+1 = 2de no sistema binário como temos apenas dois algarismos1+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.

Page 9: programação em C para 8051

© Jefferson Leal Couto Página Rev. E9

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 nossistemas 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á pelatroca de cada bit do número pelo seu inverso ou complemento.

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

A notação de complemento de 2 é utilizada para representar números bináriosnegativos. Para obter basta somar 1 ao complemento de 1 do número binário inicial.

Decimal -1 -2 -4 -8Binário - 0001 - 0010 - 0100 - 1000

Comp. 2 1111 1110 1100 1000

Page 10: programação em C para 8051

© Jefferson Leal Couto Página Rev. E10

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çãopara obtermos o módulo da subtração de 0101 - 1100. Portanto teremos:0110 (C1) + 1 = 0111

Page 11: programação em C para 8051

© Jefferson Leal Couto Página Rev. E11

PROWARE PROJ. E SIST. ELETRÔNICOS

2.4) DESLOCAMENTO

Deslocando-se os algarismos de um número para a sua esquerda, o resultadoserá o número multiplicado pela sua base.

Ex:

O número que inicialmente era 0010 ( 2d) foi multiplicado pela sua base (2), queresultou 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 0100que representa 4d, portanto podemos verificar que o número foi dividido pela base 2.

Page 12: programação em C para 8051

© Jefferson Leal Couto Página Rev. E12

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. Suarepresentação algébrica para duas variáveis é S = A.B, onde se lê S = A e B.

A B S0 0 00 1 01 0 01 1 1

Page 13: programação em C para 8051

© Jefferson Leal Couto Página Rev. E13

PROWARE PROJ. E SIST. ELETRÔNICOS

3.2) OR

A função “OR” é aquela que assume valor 1 quando uma ou mais entradasforem 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, ondese lê S = A ou B.

A B S0 0 00 1 11 0 11 1 1

3.3) NOT

A função “not” inverte ou complementa o estado da variável, ou seja, se avariá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 S0 11 0

Page 14: programação em C para 8051

© Jefferson Leal Couto Página Rev. E14

PROWARE PROJ. E SIST. ELETRÔNICOS

3.4) XOR

A função lógica “xor”, também conhecida como ou-exclusivo, apresenta comoresultado nível lógico 1 sempre que existir um número “impar” de níveis lógicos 1 nasentradas. A sua representação algébrica é a seguinte S = A ⊕ B.

A B S0 0 00 1 11 0 11 1 0

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

Page 15: programação em C para 8051

© Jefferson Leal Couto Página Rev. E15

PROWARE PROJ. E SIST. ELETRÔNICOS

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

1) 10d AND 4d2) 3Fh OR 80h3) 1001b XOR 1010b4) 13d OR 9Ch5) 11000010 AND FFh6) 24h OR 0d7) 82h XOR 13h8) 10101010 AND 55h9) 5d OR 3h10) 10111100 AND 0000101011) NOT 5Ah12) NOT 13d

Page 16: programação em C para 8051

© Jefferson Leal Couto Página Rev. E16

PROWARE PROJ. E SIST. ELETRÔNICOS

4) TERMOS IMPORTANTES

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

4.2) DRIVER: Amplificador de corrente. Usado quando temos que ampliar acapacidade de fornecimento de uma porta.

4.3) FIRMWARE: Programa associado a um hardware para a execução de funçõesespecíficas. Ex: programa gravado em eprom

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

4.5) LATCH: Componente eletrônico que tem a função de “trava” de informações. Olatch funciona como uma porta, que estando ativa, deixa passar a informaçãopresente em suas entradas, e se inativa, faz com que a informação na saída não sealtere, independente das alterações na entrada.

4.6) MAPEAMENTO REDUNDANTE: Cada endereço decodificado não é único. Odecodificador é projetado para separar apenas os dispositivos entre si. Este tipoapresenta 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 dedecodificação necessita de um hardware bastante complexo.

4.8) CHIP SELECT (/CS): Este pino está presente na grande maioria dos dispositivosassociados 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 queenquanto 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” conhecidoscomo DECODIFICADORES DE ENDEREÇO.

Page 17: programação em C para 8051

© Jefferson Leal Couto Página Rev. E17

PROWARE PROJ. E SIST. ELETRÔNICOS

EX: Projetar um decodificador para I/O mapeado em memória nas seguintesconfigurações:

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

A.1) Utilizando portas lógicas

A15 = 0 32k inferiorA15 = 1 32k superior

A.2 ) Utilizando o 74139

Tabela verdade:

A B Y0 Y1 Y2 Y30 0 0 1 1 10 1 1 0 1 11 0 1 1 0 11 1 1 1 1 0

Page 18: programação em C para 8051

© Jefferson Leal Couto Página Rev. E18

PROWARE PROJ. E SIST. ELETRÔNICOS

A.3 ) Utilizando apenas 2 decodificador 74139

A.4 ) Utilizando apenas 1 decodificador 74139

Page 19: programação em C para 8051

© Jefferson Leal Couto Página Rev. E19

PROWARE PROJ. E SIST. ELETRÔNICOS

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

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 8000He 8001H

Page 20: programação em C para 8051

© Jefferson Leal Couto Página Rev. E20

PROWARE PROJ. E SIST. ELETRÔNICOS

Exercícios:

1) Projetar um decodificador com 16K de RAM e 48K bytes de I/O, mapeando 16Kpara 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 orestante em 3 endereços para I/O. Mapeamento redundante.

3.1) Utilizar o 74xx1393.2) Utilizar o 74xx138

4) Projetar um decodificador de I/O mapeado em memória com 32K de RAM e osendereços 8000h, 8004h, 8008h e 800Ch para I/O.

4.1) Utilizar o 74xx1394.2) Utilizar o 74xx138

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

5.1) Utilizar o 74xx1395.2) Utilizar o 74xx138

A maior dificuldade em projetar um decodificador é que não existe uma formula oureceita pronta. Um bom projeto, depende basicamente de experiência e conhecimentode circuitos digitais. Algumas dicas que poderão ajudar.• Em mapeamento redundante, devemos analisar o menor espaço de memóriautilizado no projeto e então definir a quantidade de endereços do barramento queserã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 paramapear o dispositivo de I/O, pois o endereço é específico.

Page 21: programação em C para 8051

© Jefferson Leal Couto Página Rev. E21

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 osmicroprocessadores utilizem um sinal de clock, é comum encontrar na literatura, aclassificação de microprocessadores síncronos e assíncronos.

Com a evolução tecnológica, principalmente na confecção de CI’s, osfabricantes de microprocessadores começaram a incorporar memórias e dispositivosperiféricos na mesma pastilha de seus microprocessadores. Surgiram então osmicrocontroladores.

Uma vez que incorporam grande parte dos dispositivos periféricos, aconstrução de um sistema baseado em um microcontrolador, freqüentemente seresume 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 estaarquitetura. O microprocessador é composto por um conjunto de blocos funcionais,controlados por uma máquina seqüencial que determina os tempos em que cadasinal de controle está presente nos barramentos internos e externos. É importanteressaltar que nesta arquitetura não temos distinção entre a memória de programa edados.Para caracterizar uma arquitetura Von Nuemann o processador deve atender trêspostulados:

1) Um único controle central.

Page 22: programação em C para 8051

© Jefferson Leal Couto Página Rev. E22

PROWARE PROJ. E SIST. ELETRÔNICOS

2) Uma única memória para programa e dados3) 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 programae dados, isto é, o processador é projetado para gerar sinais de leitura e escritadistintos para cada memória. Uma das vantagens desta arquitetura, é evitar que amemória se torne o fator limitante no desempenho do processador. Algunsprocessadores mais modernos já utilizam esta arquitetura. O 8051 é um exemplo.

Destas arquiteturas surgiram duas tendências:

RISC - Reduce Instruction Set ComputerCISC - 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 demodos de endereçamento. Uma instrução executa muitas tarefas.DESVANTAGEM: Difícil memorização dos comandos. Instruções com diferentestamanhos 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 emodos de endereçamento. Muitas instruções para realizar uma tarefa simples.

Page 23: programação em C para 8051

© Jefferson Leal Couto Página Rev. E23

PROWARE PROJ. E SIST. ELETRÔNICOS

5.2) BARRAMENTOS DE UM MICROCONTROLADOR

Barramento de endereço: Barramento unidirecional, por onde trafega os sinais queendereçam os dispositivos de memória e I/O. Em geral, os microprocessadores de 8bits endereçam 64 Kbytes de memória.

Barramento de dados: Barramento bidirecional por onde trafegam dados entre osdispositivos externos e o microcontrolador. O tamanho deste barramento define otamanho do microcontrolador. O 8051 é de 8 bits.

Barramento de controle: Barramento por onde o microcontrolador controla osdispositivos externos.

Page 24: programação em C para 8051

© Jefferson Leal Couto Página Rev. E24

PROWARE PROJ. E SIST. ELETRÔNICOS

5.3) MODOS DE ATENDIMENTO DE I/O

Pooling: Neste tipo de atendimento, a CPU fica constantemente questionando odispositivo 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 daCPU.

Interrupção: Neste tipo de atendimento, a CPU é avisada pelo dispositivo de I/O, queo mesmo necessitam receber ou enviar dados.

Este tipo de atendimento é mais complexo, tendo como vantagem nãodesperdiç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 omais rápido. O dispositivo de I/O solicita os barramentos da CPU (Tri - State) eacessa diretamente a memória, transferindo então os dados. Nem toda a CPUsuporta este tipo de atendimento.

Page 25: programação em C para 8051

© Jefferson Leal Couto Página Rev. E25

PROWARE PROJ. E SIST. ELETRÔNICOS

6) MICROCONTROLADOR 8031/8051

6.1) Pinagem:

Page 26: programação em C para 8051

© Jefferson Leal Couto Página Rev. E26

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 demultiplexar no mesmo barramento os dados e endereço.

Desta forma, devemos utilizar a seguinte ligação para obter as 16 linhas deendereços e 8 de dados no 8051.

Page 27: programação em C para 8051

© Jefferson Leal Couto Página Rev. E27

PROWARE PROJ. E SIST. ELETRÔNICOS

6.3) CLOCK NO 80C51

Existem duas formas de gerar circuito de clock no microcontrolador. O clock pode serexterno ou interno.uso do clock externo é interessante quando temos outros dispositivos que utilizam umsinal TTL para gerar sua base de tempo. Sua implementação resume-se em colocar opino 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 umressonados cerâmico (o oscilador com cristal é mais estável e preciso ) na freqüênciadesejada e dois capacitores de realimentação. Geralmente utilizamos capacitoresentre 27 e 33pF.

Page 28: programação em C para 8051

© Jefferson Leal Couto Página Rev. E28

PROWARE PROJ. E SIST. ELETRÔNICOS

O clock do microcontrolador é chamado de “ciclo de clock” e ele é a referência oubase para geração do “ciclo de máquina”. O ciclo de máquina é calculado dividindo afreqüência do cristal por 12 (doze) no 80C51.

Para um sistema utilizando um cristal de 12Mhz, teremos um ciclo de máquina de1Mhz, isto é, o microcontrolador irá executar a seqüência de busca, decodificação eexecução em tempos de no mínimo 1µs.

6.4) RESET DO MICROCONTROLADOR

O reset no 80C51 é ativado quando o pino 9 (RST) permanece em nível lógico 1 por 2ou mais ciclos de máquina. Neste caso a CPU executa o chamado reset interno, queconsiste 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.

Lembre – se, o ciclo de clock depende basicamente docristal utilizado na CPU e o ciclo de máquina determinao tempo necessário para executar as instruções. No 8051o Ciclo Máquina = Ciclo de clock / 12

Page 29: programação em C para 8051

© Jefferson Leal Couto Página Rev. E29

PROWARE PROJ. E SIST. ELETRÔNICOS

Ao inicializarmos um sistema é necessário que uma seqüência de funções sejamexecutadas, desta forma podemos afirmar que nosso sistema irá executar as tarefaspara o qual foi projetado.Toda vez que realizamos um reset no 8051, ele irá começar a executar o software apartir 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 umcapacitor de 10µF entre o VCC e o pino de reset.

Page 30: programação em C para 8051

© Jefferson Leal Couto Página Rev. E30

PROWARE PROJ. E SIST. ELETRÔNICOS

6.5) INTERRUPÇOES

A interrupção é, uma das formas mais importantes de atendimento aos dispositivosde I/O. Este recurso permite interromper o fluxo normal de execução do firmware paraa 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 pordispositivos 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 umadeterminada 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 omicrocontrolador irá executar uma rotina em um endereço fixo de memória e que nãopode 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 dedesvio determinado pelo fabricante do componente.

Ativação - Existem três formas que o sistema pode reconhecer uma interrupção:

• pelo nível (alto ou baixo)• 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 - T0Interrupção do timer\contador 1 - T1Interrupção do canal serial - TI ou RI

No 8051, todas as interrupções sãomascaráveis e vetoradas.

Page 31: programação em C para 8051

© Jefferson Leal Couto Página Rev. E31

PROWARE PROJ. E SIST. ELETRÔNICOS

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

INT0\ ………………. 03HT0 .………………… 0BHINT1\ ……………….. 13HT1 …………………… 1BHTI - RI ………………. 23H

A seguir temos um mapa parcial da memória de programa do 8051 com seusrespectivos endereços de interrupção e reset.

Page 32: programação em C para 8051

© Jefferson Leal Couto Página Rev. E32

PROWARE PROJ. E SIST. ELETRÔNICOS

O processador possui um recurso de prioridade interna, que permite determinar qualinterrupção será atendida ou se uma interrupção em andamento deverá serinterrompida para o atendimento de outra de maior prioridade.

Para determinar quais interrupções estarão habilitadas, devermos escrever noregistrador especial IE - (Interrupt Enable) do SFR.

EA - Localizado no bit 7 do IE, Habilita todas as interrupções quando em nível lógico1, 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 1e 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 edesabilita 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ívelló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 edesabilita 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ívelló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 osbit`s do registrador IP (Interrupt Priorit)

Page 33: programação em C para 8051

© Jefferson Leal Couto Página Rev. E33

PROWARE PROJ. E SIST. ELETRÔNICOS

Onde,

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

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

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

PT0 - Localizado no bit 1, seleciona prioridade do timer0. Quanto em 1 define comoalta a prioridade do timer 0.

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

Um certo tempo irá decorrer entre o reconhecimento dainterrupção pelo processador e o efetivo desvio para o respectivovetor. No melhor caso teremos um atraso de 3,2 ciclos de máquinae no pior caso teremos um atraso de 7,2 ciclos de máquina.

Page 34: programação em C para 8051

© Jefferson Leal Couto Página Rev. E34

PROWARE PROJ. E SIST. ELETRÔNICOS

6.6) INTERRUPÇÃO EXTERNA

As interrupções externa0 e externa1 podem ser configuradas para reconhecer umatransição de 1 para 0 (borda de descida) ou um nível lógico 0. A configuração destecontrole é feito no registrador TCON (Timer Control) através do nibble menossignificativo.

Onde,

IT0 - Localizado no bit 0 de TCON. Quando em nível lógico 0 a interrupção Externa0será aceita simplesmente pela presença do nível zero no pino. Quando em nívellógico 1 a interrupção será aceita quanto ocorrer uma transição de 1 para 0 e o sinalpermanecer em zero por pelo menos 1ciclo de máquina.

IE0 - Localizado no bit 1 de TCON. É setado pelo hardware interno quando fordetectado 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 Externa1será aceita simplesmente pela presença do nível zero no pino. Quando em nívellógico 1 a interrupção será aceita quanto ocorrer uma transição de 1 para 0 e o sinalpermanecer em zero por pelo menos 1ciclo de máquina.

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

Page 35: programação em C para 8051

© Jefferson Leal Couto Página Rev. E35

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 epodem operar de maneira totalmente independente dos demais recursos do chip. Osdois 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 comoveremos 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/contadordevemos manipular os bit`s de TMOD.

Onde,

Gate0; Gate1 – Definem como o timer/contador irá funcionar. Quando este bit estiverem nível lógico 1 o timer/contador será ativado se TRn e o pino INTn forem 1. Estaconfiguraçã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 simplesmentecolocando TRn em 1.

Page 36: programação em C para 8051

© Jefferson Leal Couto Página Rev. E36

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á afunção de timer e a base de tempo será o clock do cristal. Quando este bit estiver em1 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 aseguir:

MODO 0 - Temporizador/Contador de 8 bit`s com divisor de freqüência de até 32vezes. Neste modo o TL0 ou TL1 servem como prescaler do divisor e osregistradores TH0 e TH1 como contador de 8 bit`s.

MODO 1 - Temporizador/Contador de 16 bit`s. Neste modo o TLn e THn formam umpar 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 oregistrador TLn realiza a contagem e o registrador THn possui o valor que serárecarregado em TLn sempre que ocorrer um overflow (estouro do contador). Osregistradores podem ser alterados por software a qualquer momento, tornandobastante 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.

Page 37: programação em C para 8051

© Jefferson Leal Couto Página Rev. E37

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

O modo mais utilizado de comunicação entre sistemas de controle e automação é osistema assíncrono. Neste modo não há necessidade de gerarmos o sincronismo(sinal de clock entre os sistemas). Neste modo cada caractere é transmitidoindividualmente, 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 sinaisde dados):

A) Simplex: A comunicação é feita apenas em um sentidoB) Half Duplex: A comunicação é feita nos dois sentidos, mas não simultâneaC) Full Duplex: Comunicação nos dois sentidos e de forma simultânea.

Page 38: programação em C para 8051

© Jefferson Leal Couto Página Rev. E38

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 decomunicação podem enviar e receber dados de forma simultânea com omicrocontrolador. Para este fim, o 8051 possui um registrador chamado SBUF(SerialBuffer).Quando queremos enviar uma informação pelo canal serial devemos escrevero byte no SBUF, e quando desejamos receber o byte pelo microcontrolador devemosler o SBUF. Pode parecer que ele possui apenas um registrador para Tx e Rx, masna verdade existem dois registradores com o mesmo nome e que serão reconhecidospelo 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 dostop bit no modo assíncrono. Deve ser zerado para permitir que sejam geradas novasinterrupções.

TI - É setado pelo hardware ao transmitir o oitavo bit no modo síncrono ou no iníciodo stop bit no modo assíncrono. Permite que a transmissão dos dados sejaindependente do fluxo principal do programa. Deve ser zerado para permitir quesejam geradas novas interrupções.

RB8 - No modo 0 indica o estado do stop bit Nos modos 2 e 3 indica o estado donono 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 opino RXD pode ser usado como pino de I/O

SM2 - No modo 0 deve permanecer zerado. No modo 1 não gera pedido deinterrupção se estiver setado e o stop bit for inválido. Nos modos 2 e 3 permite ainterligação entre vários 8051

Page 39: programação em C para 8051

© Jefferson Leal Couto Página Rev. E39

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ção0 0 0 Fclock / 120 1 1 Variável (Conforme Timer1)1 0 2 Fclock / 32 ou Fclock / 641 1 3 Variável (Conforme Timer1)

O modo 0 é usado para comunicação serial síncrona e os demais para comunicaçãoassíncrona. No modo 1 são transmitidos 8 bits de dados, 1 stop bit e o start bit. Nomodo 3 após os 8 bits de dados é transmitido um nono bit.

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

)(.38410).(

25616

BPSTaxaMhzFrequência

TH −=

)256(384.2

THIFrequência

TAXASMOD

−=

6.11) TABELA PRÁTICA COM TAXAS PARA O CRISTAL DE 11,0592 Mhz

TAXA (BPS) VALOR RECARGA(TH1)300 160

1200 2322400 2444800 2509600 253

Os valores da tabela foram calculados para SMOD = 0.

Page 40: programação em C para 8051

© Jefferson Leal Couto Página Rev. E40

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 demicrocontroladores em linguagem C tem sido adotada pela maioria das empresasdevido 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 ocuidado 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ãodisponíveis para o projetista ou apresentam um comportamento diferente quandoutilizamos o compilador para microcontrolador. No nosso curso, será abordado ocompilador SDCC.

Outro detalhe importante é que no 8051 podemos utilizar uma grande variedade demodos 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ãoadotado pelo compilador(small ou large para o SDCC) ou especificar onde desejamosque a memória seja reservada.

Se você utilizar um compilador como o Turbo C, Visual C ou outro paraPC nenhum “santo” vai fazer seu programa funcionar. Eu teria receio degravar o programa no KIT ou na memória EPROM. Quando você estiverprogramando para o 8051, devemos utilizar SEMPRE um compiladorpróprio para o microcontrolador como o SDCC que veremos no curso.

Page 41: programação em C para 8051

© Jefferson Leal Couto Página Rev. E41

PROWARE PROJ. E SIST. ELETRÔNICOS

7.1) TIPOS DE VARIÁVEIS EM C

TIPO NUMERO DE BITS ALCANCEchar 8 bits -128 a + 127unsigned char 8 bits 0 a 255Int 16 bits -32768 a 32767unsigned int 16 bits 0 a 65535long 32 bits -2147483648 a +2147483647float 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 sinalunsigned char ucGLeitura;// Variável do tipo char sem sinalchar buffNome[6]; // Array do tipo char com 6 posicõesInt 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 //ILContadormultiplicado por 3

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

Page 42: programação em C para 8051

© Jefferson Leal Couto Página Rev. E42

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

Page 43: programação em C para 8051

© Jefferson Leal Couto Página Rev. E43

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 doprograma.

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 noprograma utilize a diretiva DEFINE. Esta prática é muitoutilizada por programadores mais experientes. O formatodo INCLUDE depende onde está seu arquivo HEADER.Ele geralmente é um arquivo .h

Agora estou entendendo. Então se meuarquivo HEADER estive na pasta padrãodo compilador uso <ARQUIVO> e seestiver na mesma pasta do programa uso oformato “ARQUIVO”

Page 44: programação em C para 8051

© Jefferson Leal Couto Página Rev. E44

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 simplesou composto, seja executado desde que uma determinada condição seja satisfeita. Asintaxe é a seguinte:

If (condição)enunciado1;

elseenunciado2;

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 sejaverdadeira 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 colocadoem nível lógico 1 senão em nível lógico zero

A presença do ELSE e consequentemente o enunciado2, é opcional, se não estiverpresente e a condição for verdadeira, o enunciado1 será executado. Se não estiverpresente e a condição for FALSA o fluxo do programa será desviado para oenunciado seguinte ao da instrução IF.

If (condição)enunciado1;

#include <pwlib.h>unsigned char ucGLeitura;void main (void){

ucGLeitura = P1;if(!ucGLeitura)

P3_0 = 1;else

P3_0 = 0;}

Page 45: programação em C para 8051

© Jefferson Leal Couto Página Rev. E45

PROWARE PROJ. E SIST. ELETRÔNICOS

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

Se tivermos enunciados compostos, ou seja um conjunto de enunciados, é obrigatórioo uso do delimitador chaves.

If (condição){

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;

}

#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:

}}

Você quer a minha opinião?! …. Faz o seguinte,como você ainda não tem experiência com aprogramação C, utilize sempre os delimitadoreschaves. Mesmo em enunciados simples !!!

Page 46: programação em C para 8051

© Jefferson Leal Couto Página Rev. E46

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 paraa expressão, seja executado um entre vários enunciados. Será selecionado paraexecução o enunciado que estiver associado ao CASE cujo valor for equivalente aode 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 serexecutado caso o valor de entrada não seja encontrado em nenhum valor decomparação do CASE. Se não for necessário executar um enunciado quando o valornã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”

Page 47: programação em C para 8051

© Jefferson Leal Couto Página Rev. E47

PROWARE PROJ. E SIST. ELETRÔNICOS

C) WHILE

A instrução WHILE possibilita a repetida execução de um enunciado simples oucomposto, enquanto uma determinada condição for satisfeita. Esta instrução ébastante versátil. A sintaxe é a seguinte:

WHILE(condição){

Enunciado1;}

#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;}

}

Uma aplicação bem interessante para owhile é utilizar com a condição 1. Destaforma o microcontrolador ficará em umloop infinito.

Page 48: programação em C para 8051

© Jefferson Leal Couto Página Rev. E48

PROWARE PROJ. E SIST. ELETRÔNICOS

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

D) DO – WHILE

A instrução DO – WHILE permite que o enunciado1, que pode ser simples oucomposto, 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;ucGLeitura = PWLeTeclado( );PWDisplayEscreveString (“Selecione tecla: ”,1,1);while (ucGLeitura == 0){

ucGLeitura = PWLeTeclado( );

}}

#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);}

Page 49: programação em C para 8051

© Jefferson Leal Couto Página Rev. E49

PROWARE PROJ. E SIST. ELETRÔNICOS

E) FOR

A instrução FOR possibilita a execução de um conjunto de enunciados enquanto ovalor da variável varia entre uma faixa de valores. A principal vantagem em relação aouso do WHILE consiste no fato da instrução for manter centralizado o controle doloop, 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 parainicializar uma variável presente na condicao2. A expressao2 é a condição, cujoresultado determina se o enunciado1 que pode ser simples ou composto seráexecutado. A expressao3 é o incremento ou decremento, sendo executado ao final dapassagem do loop. O loop só será abandonado quando a condição(expressao2) forfalsa 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

F) RETURN

A instrução RETURN possibilita que se retorne da execução de uma função. Quandoretorna, podemos passar um valor para a função que originou a chamada. Caso sejaretornado um valor, é necessário que o tipo seja o mesmo especificado na declaraçãoda função.

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

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

ucLBuffNome[ucGLoop] = ‘ ‘;

}}

Page 50: programação em C para 8051

© Jefferson Leal Couto Página Rev. E50

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 daarquitetura MCS51. A Intel originalmente colocou no mercado o processadorchamado de 8031 que não tinha memória de programa interno. Posteriormente foilançado o 8051 já com memória ROM interna. Estes microcontroladores permitem oarmazenamento de até 128 bytes de dados em memória RAM interna no modo diretoe 64K bytes de memória RAM externa.Com a boa aceitação do microcontrolador pelomercado foi produzido os modelos 8032 e 8052 com a mesma característica dememória de programa do 8031/8051 respectivamente porém com um adicional de128 bytes de memória de dados. Esta memória possui o mesmo endereço dosregistradores do SFR e devido a este fato foi implementado o acesso porendereçamento indireto.

Para permitir o acesso a todos estes modos distintos de memória de dados, ocompilador 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 aalocação a partir do endereço 30h que é posterior aos 4 bancos de registradores e notopo 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 emmemó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 deconstantes, como mensagens em display.

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

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

Page 51: programação em C para 8051

© Jefferson Leal Couto Página Rev. E51

PROWARE PROJ. E SIST. ELETRÔNICOS

8) AMBIENTE DE DESENVOLVIMENTO INTEGRADO ( IDE )

Atualmente, existem vários fabricantes de compiladores para microcontroladores dafamília MCS-51. Um dos melhores compiladores para 8051 é o ambiente integrado daKeil, que possui todos os recursos necessário para escrever, compilar e analisar oprograma, porém este apresenta um custo muito elevado até mesmo, para odesenvolvimento 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 integradopara o desenvolvimento de projetos e com uma boa relação custo/benefício.Neste capítulo, conheceremos um ambiente integrado adaptado que apresentacaracterísticas dos melhores ambientes existentes no mercado e com uma grandevantagem, 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 interfacepara o compilador e aplicativo de carga.

2) WinLoader51 – Aplicativo em plataforma Windows para a carga do firmware naplaca didática.

3) SDCC – Compilador freeware para os principais microcontroladores existentes nomercado (Z80, 8051, PIC, etc)

Page 52: programação em C para 8051

© Jefferson Leal Couto Página Rev. E52

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 epara 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

Page 53: programação em C para 8051

© Jefferson Leal Couto Página Rev. E53

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 detrabalho 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 placadidá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 */}

Page 54: programação em C para 8051

© Jefferson Leal Couto Página Rev. E54

PROWARE PROJ. E SIST. ELETRÔNICOS

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

5) Escreva o seu programa.

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 doeditor 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.

Como você está utilizando um ambiente adaptado, éimportante tomar um pequeno cuidado com o nomedo arquivo. Ele deve seguir o padrão utilizado peloantigo DOS, isto é, você pode utilizar no máximo 8letras para o nome do arquivo.

Page 55: programação em C para 8051

© Jefferson Leal Couto Página Rev. E55

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áticautilizada 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

Page 56: programação em C para 8051

© Jefferson Leal Couto Página Rev. E56

PROWARE PROJ. E SIST. ELETRÔNICOS

8.2) WinLoader51

Agora veremos um pouco sobre o aplicativo utilizado para a carga do programa naplaca 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 noaplicativo deverá estar habilitado se o programa for compilado e carregado comsucesso, isto é, o texto “Gravar” deverá estar na cor verde. Caso o botão esteja como 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 nomedo arquivo HEX que foi carregado pelo WinLoader51 e o Checksum do firmwareselecionando a opção FERRAMENTAS / STATUS.

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

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 nacor 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.

Page 57: programação em C para 8051

© Jefferson Leal Couto Página Rev. E57

PROWARE PROJ. E SIST. ELETRÔNICOS

Havendo comunicação com a placa, no menu SOBRE / PROGRAMA O usuáriopoderá verificar que o aplicativo estará em MODO DESENVOLVIMENTO

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

Page 58: programação em C para 8051

© Jefferson Leal Couto Página Rev. E58

PROWARE PROJ. E SIST. ELETRÔNICOS

O usuário deverá pressionar novamente o botão CARGA na placa didática. O LED doaplicativo deve alterar para a cor verde. A placa deve executar o programa que foienviado pela interface serial.

Page 59: programação em C para 8051

© Jefferson Leal Couto Página Rev. E59

PROWARE PROJ. E SIST. ELETRÔNICOS

8.2.1) RECURSOS AVANÇADOS DO APLICATIVO

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

Se o usuário desejar verificar se o conteúdo do buffer do aplicativo ( Arquivo HEXgerado ) foi transferido com sucesso, basta clicar no botão VERIFICAR que oaplicativo faz a verificação do checksum armazenado na placa. Se o valor estivercorreto o aplicativo mostrara a seguinte mensagem:

As principais dúvidas do usuário poderão ser esclarecidas através do help doaplicativo. Basta clicar em SOBRE / AJUDA para abrir o programa de ajuda.

Page 60: programação em C para 8051

© Jefferson Leal Couto Página Rev. E60

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 displayPWDisplayEscreveString ("Velocidade =" 1,1); // Mostra mensagem na linha 1

uiGVelocidade = PWEntraIntxxxxx (); // Aguarda usuário digitar valorPWDisplayEscreveString ("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}

}

}

Page 61: programação em C para 8051

© Jefferson Leal Couto Página Rev. E61

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);

Page 62: programação em C para 8051

© Jefferson Leal Couto Página Rev. E62

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();

Page 63: programação em C para 8051

© Jefferson Leal Couto Página Rev. E63

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;

Page 64: programação em C para 8051

© Jefferson Leal Couto Página Rev. E64

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);}

Page 65: programação em C para 8051

© Jefferson Leal Couto Página Rev. E65

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()

Page 66: programação em C para 8051

© Jefferson Leal Couto Página Rev. E66

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;

}

Page 67: programação em C para 8051

© Jefferson Leal Couto Página Rev. E67

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; }

}

Page 68: programação em C para 8051

© Jefferson Leal Couto Página Rev. E68

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;

}

Page 69: programação em C para 8051

© Jefferson Leal Couto Página Rev. E69

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 segundoSaida: Nenhuma

Exemplo:

PWDelay1Segundo(4); // Delay de 4 segundos

10.3) void PWDelay (int)

Descrição: Rotina de delay por software.

Entrada: Tempo de atrasoSaida: Nenhuma

Exemplo:PWDelay(3000); // Delay

10.4) void PWDisplayInicializa (void)

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

Entrada: NenhumaSaida: Nenhuma

Exemplo:PWDisplayInicializa(); // Inicializa o display

Page 70: programação em C para 8051

© Jefferson Leal Couto Página Rev. E70

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 displaySaida: 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: NenhumaSaida: Nenhuma

Exemplo:

PWEscreveStringPadrao ( ); // Mostra tela padrão

10.7) void PWDisplayLimpa(void)

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

Entrada: NenhumaSaida: 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 linhaSaida: Nenhuma

Exemplo:

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

Page 71: programação em C para 8051

© Jefferson Leal Couto Página Rev. E71

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 LCDSaida: 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 displaySaida: 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 visualizea posição atual do cursor.

Entrada: NenhumaSaida: 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: NenhumaSaida: Nenhuma

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

Page 72: programação em C para 8051

© Jefferson Leal Couto Página Rev. E72

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 displaySaida: 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 ASCIIconforme 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ídadeterminada 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

Page 73: programação em C para 8051

© Jefferson Leal Couto Página Rev. E73

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, semparidade e um stop bit.

Entrada: 0 – 1200, 1 – 2400, 2 – 4800, 3 - 9600Saida: 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 recebeunenhum 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.

Page 74: programação em C para 8051

© Jefferson Leal Couto Página Rev. E74

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çãoatual do display. Valor entre 00 e 99.

Entrada: Byte que será mostrado no LCDSaida: 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çãoatual do display. Valor entre 00 e 255.

Entrada: Byte que será mostrado no LCDSaida: 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çãoatual do display. Valor entre 00 e 999.

Entrada: Word que será mostrado no LCDSaida: Nenhuma

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

Page 75: programação em C para 8051

© Jefferson Leal Couto Página Rev. E75

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çãoatual do display. Valor entre 00 e 9999.

Entrada: Word que será mostrado no LCDSaida: 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çãoatual do display. Valor entre 00 e 65535.

Entrada: Word que será mostrado no LCDSaida: 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 duascasas decimais na posição atual do display. Valor entre 00 e 99,99.

Entrada: Word que será mostrado no LCD. Valor dividido por 100Saida: 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 valorentre 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

Page 76: programação em C para 8051

© Jefferson Leal Couto Página Rev. E76

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 valorentre 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 e99. 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 valor10.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 e255. 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 e999. 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

Page 77: programação em C para 8051

© Jefferson Leal Couto Página Rev. E77

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 e9999. 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 valorentre 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 emponto flutuante será multiplicado por 100.

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

Page 78: programação em C para 8051

© Jefferson Leal Couto Página Rev. E78

PROWARE PROJ. E SIST. ELETRÔNICOS

11) INFORMAÇÕES SOBRE O KIT