View
128
Download
0
Category
Preview:
Citation preview
MICROCONTROLADOR8051
Eng. Jefferson Couto
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
© 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.
© 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
© 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
© 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.
© 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.
© 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.
© 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
© 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
© 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.
© 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
© 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
© 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.
© 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
© 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.
© 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
© 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
© 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
© 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.
© 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.
© 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.
© 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.
© 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.
© Jefferson Leal Couto Página Rev. E25
PROWARE PROJ. E SIST. ELETRÔNICOS
6) MICROCONTROLADOR 8031/8051
6.1) Pinagem:
© 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.
© 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.
© 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
© 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.
© 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.
© 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.
© 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)
© 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.
© 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.
© 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.
© 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.
© 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.
© 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
© 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.
© 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.
© 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
© 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
© 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”
© 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;}
© 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 !!!
© 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”
© 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.
© 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);}
© 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] = ‘ ‘;
}}
© 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.
© 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)
© 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
© 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 */}
© 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.
© 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
© 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.
© 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.
© 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.
© 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.
© 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}
}
}
© 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);
© 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();
© 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;
© 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);}
© 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()
© 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;
}
© 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; }
}
© 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;
}
© 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
© 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
© 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
© 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
© 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.
© 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
© 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
© 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
© 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.
© Jefferson Leal Couto Página Rev. E78
PROWARE PROJ. E SIST. ELETRÔNICOS
11) INFORMAÇÕES SOBRE O KIT
Recommended