Escolar Documentos
Profissional Documentos
Cultura Documentos
Introdução
Nesta apostila vamos utilizar como exemplo o PIC 16F877A, mas as in-
formações fornecidas se aplicam a qualquer microcontrolador das linhas 12 ou
16 que possuam conversor AD interno.
2
UNIALFA – Prof. Eduardo J. Nogueira
Verificamos na tabela também as tensões de referência (VREF+ e VREF-).
Nesta configuração, a tensão nos pinos configurados será comparada com as
tensões de referência, sendo que se a tensão aplicada for igual à tensão de re-
ferência VREF+, o resultado da conversão será o máximo (1024) e quando a
tensão de entrada for igual a VREF-, o resultado será 0.
As referências podem ser internas (VDD e VSS) ou externas que são co-
nectadas aos pinos RA2 (VREF-) e RA3 (VREF+).
Temos abaixo uma tabela com os limites elétricos das tensões de referên-
cia. Estes valores precisam ser respeitados:
Processo de conversão
Configuração
SETUP_ADC () // configura o conversor AD interno.
3
UNIALFA – Prof. Eduardo J. Nogueira
Sintaxe:
SETUP_ADC(opções); // opções é uma variável ou constante inteira de 8 bits.
Exemplo:
SETUP_ADC(ADC_OFF);
Sintaxe:
4
UNIALFA – Prof. Eduardo J. Nogueira
SETUP_ADC_PORTS(opções); //opções é uma variável ou constante inteira
//de 8 bits.
Sintaxe:
SET_ADC_CHANNEL(canal); //Onde: canal é uma variável inteira de 8 bits.
Exemplo:
SET_ADC_CHANNEL(0); //Configura o canal 0 como analógico.
Sintaxe:
ad = READ_ADC(); //Guarda o valor lido na variável ad.
5
UNIALFA – Prof. Eduardo J. Nogueira
Podemos utilizar também a diretiva #device ADC = x para especificar o
número (x) de bits que a função READ_ADC() retornará.
LCD1
LM016L
U1
RV2 13 33
OSC1/CLKIN RB0/INT
2
14 34
OSC2/CLKOUT RB1
35
VDD
VSS
VEE
RB2
RW
RS
D0
D1
D2
D3
D4
D5
D6
D7
2 36
E
50%
RA0/AN0 RB3/PGM
3 3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5 39
RA3/AN3/VREF+ RB6/PGC
RV1
1
10k 6 40
RA4/T0CKI/C1OUT RB7/PGD
7
2
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
8 16
RE0/AN5/RD RC1/T1OSI/CCP2
52%
9 17
RE1/AN6/WR RC2/CCP1 3
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO
1
10k
+2.50 25
RC6/TX/CK
26
Volts RC7/RX/DT
19
RD0/PSP0
20
R1 RD1/PSP1
21
4k7 RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877A
Definições do Projeto:
6
UNIALFA – Prof. Eduardo J. Nogueira
8
Ex:
#include "C:\PROJETOS\LCD_PRO\LCD8B.c" //Diretiva de inclusão do
//arquivo LCD8B.c ao projeto
7
UNIALFA – Prof. Eduardo J. Nogueira
8
UNIALFA – Prof. Eduardo J. Nogueira
Código do LCD8B.c na janela de edição do PCW.
Função printf
Neste exemplo a função printf foi utilizada com uma formatação diferente
da que utilizamos na comunicação serial, neste caso especificamos que o con-
teúdo da variável ad deve ser impresso no formato inteiro longo (long int).
9
UNIALFA – Prof. Eduardo J. Nogueira
Utilização de mais de um conversor AD
R3
+12V
+12V
56R
R4 Q2
NPN D1
2k2
RV1 LCD1
2
LM016L
52%
RV2 U1
Q1
1
10k 13 33
2
VEE
RB2
RW
RS
D0
D1
D2
D3
D4
D5
D6
D7
50%
2 36
E
3 RA0/AN0 RB3/PGM
3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5 R2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5 39
RA3/AN3/VREF+ RB6/PGC
1
10k 2k2
6 40
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
1 U2 1
MCLR/Vpp/THV RC5/SDO
24
25
RC6/TX/CK
26
RC7/RX/DT
23.0 19
RD0/PSP0
20
R1 RD1/PSP1
21
2 4k7 RD2/PSP2
VOUT 22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
3 LM35 RD6/PSP6
30
RD7/PSP7
PIC16F877A
Definições do projeto
Arquivo : ADC_Aq.c
10
UNIALFA – Prof. Eduardo J. Nogueira
Código escrito na janela de edição do PCW.
https://youtu.be/gIr1LTXB39Y
11
UNIALFA – Prof. Eduardo J. Nogueira
Referências:
12
UNIALFA – Prof. Eduardo J. Nogueira
Anexo 1
ADC_1.c
#include<16F877A.h> //Aqui é incluso o header (*.h) para o microcontrolador
//utilizado.
13
UNIALFA – Prof. Eduardo J. Nogueira
Anexo 2
ADC_2.c
#include<16F877A.h> //Aqui é incluso o header (*.h) para o microcontrolador
//utilizado.
14
UNIALFA – Prof. Eduardo J. Nogueira
Anexo 3
LCD8B.c
//////////////////// LCD8B.c ///////////////////////////////////////////////////
//Programa para controle do display LCD por 8 vias do Port D //
//Este programa foi feito pela ACEPIC, fabricante da maior parte dos kits de //
//microcontroladores usados em nossos laboratórios no UNIALFA e foi adaptado
//
//pelo Professor Eduardo J. Nogueira. //
////////////////////////////////////////////////////////////////////////////////
15
UNIALFA – Prof. Eduardo J. Nogueira
switch(c) //comando switch com a variável c
{
case '\f' : lcd_envia_byte(0,1); //Caso c seja ‘\f’, o dado 1 será enviado
//ao LCD para limpar todo o seu conteúdo.
delay_ms(2); //Atraso de 2 ms
break; //Comando break, terminou o processo acima, já
//não testa
//nenhum outro caso...
case '\n' : //Caso c seja ‘\n’
case '\r' : lcd_pos_xy(1,2); //ou ‘\r’, muda o cursor para a segunda linha
//do LCD
break; //Comando break
case '\b' : lcd_envia_byte(0,0x10); //Caso c seja ‘\b’ então desloca o
//cursor para a esquerda
break; //Comando break
default : lcd_envia_byte(1,c); //caso seja um caractere qualquer, então
//este será escrito no LCD pela função lcd_envia_byte…
break; //Comando break
}
}
void lcd_ini() //Função de inicialização do LCD
{
byte conta; //Variável de contagem
DATA(0x00); //Coloca na porta D o valor 0x00
OUTPUT_LOW(RS); //Coloca em nível baixo o pino RS
OUTPUT_LOW(EN); //Coloca em nível baixo o pino EN
delay_ms(15); //Atraso de 15ms
for (conta=1;conta<=3;conta++) //Executará 3 vezes os comandos abaixo
{
lcd_cmd(0x30); //Envia o comando 0x30 para o LCD
delay_ms(5); //Atraso de 5ms
}
lcd_cmd(0x38); //Escreve comando para interface de 8 vias de dados
lcd_cmd(0x01); //Escreve comando para limpar todo o display
delay_ms(1); //Atraso de 1ms
lcd_cmd(0x0C); //Escreve comando para ligar o display sem cursor
lcd_cmd(0x06); //Escreve comando para incrementar automaticamente à di-
reita
}
OBS: Todos os códigos dos anexos pode ser copiado da apostila e colados na
janela de edição do PCW.
16
UNIALFA – Prof. Eduardo J. Nogueira