- Componentes necessários:
- Diagrama de circuito:
- Medindo a temperatura com LM35 usando 8051:
- LCD 16x2:
- ADC0804 IC:
- Sensor de temperatura LM35:
- Explicação do código:
Às vezes, as pessoas têm dificuldade em ler a temperatura do termômetro analógico devido às flutuações. Então aqui vamos construir um termômetro digital simples usando o microcontrolador 8051 no qual o sensor LM35 é usado para medir a temperatura. Também usamos o LM35 para construir termômetro digital usando Arduino, NodeMCU, PIC, Raspberry Pi e outros microcontroladores.
Este projeto também servirá como uma interface adequada de ADC0804 com 8051 e LCD 16 * 2 com microcontrolador 8051.
Componentes necessários:
- Placa de desenvolvimento 8051
- Placa ADC0804
- Visor LCD 16 * 2
- Sensor LM35
- Potenciômetro
- Fios de ligação
Diagrama de circuito:
O diagrama do circuito para o circuito do termômetro digital usando LM35 é fornecido abaixo:
Medindo a temperatura com LM35 usando 8051:
O microcontrolador 8051 é um microcontrolador de 8 bits que possui 128 bytes de RAM no chip, 4K bytes de ROM no chip, dois temporizadores, uma porta serial e quatro portas de 8 bits. O microcontrolador 8052 é uma extensão do microcontrolador. A tabela abaixo mostra a comparação de 8051 membros da família.
Característica |
8051 |
8052 |
ROM (em bytes) |
4K |
8K |
RAM (bytes) |
128 |
256 |
Cronômetros |
2 |
3 |
Pinos de I / O |
32 |
32 |
Porta serial |
1 |
1 |
Fontes de interrupção |
6 |
8 |
LCD 16x2:
16 * 2 LCD é um display amplamente utilizado para aplicações embarcadas. Aqui está uma breve explicação sobre os pinos e o funcionamento do display LCD 16 * 2. Existem dois registros muito importantes dentro do LCD. Eles são registro de dados e registro de comando. O registro de comando é usado para enviar comandos como exibição clara, cursor em casa, etc., o registro de dados é usado para enviar dados que devem ser exibidos no LCD 16 * 2. A tabela abaixo mostra a descrição do pino de 16 * 2 lcd.
PIN |
Símbolo |
I / O |
Descrição |
1 |
Vss |
- |
Terra |
2 |
Vdd |
- |
Fonte de alimentação + 5V |
3 |
Vee |
- |
Fonte de alimentação para controlar o contraste |
4 |
RS |
Eu |
RS = 0 para registro de comando, RS = 1 para registro de dados |
5 |
RW |
Eu |
R / W = 0 para gravação, R / W = 1 para leitura |
6 |
E |
I / O |
Habilitar |
7 |
D0 |
I / O |
Barramento de dados de 8 bits (LSB) |
8 |
D1 |
I / O |
Barramento de dados de 8 bits |
9 |
D2 |
I / O |
Barramento de dados de 8 bits |
10 |
D3 |
I / O |
Barramento de dados de 8 bits |
11 |
D4 |
I / O |
Barramento de dados de 8 bits |
12 |
D5 |
I / O |
Barramento de dados de 8 bits |
13 |
D6 |
I / O |
Barramento de dados de 8 bits |
14 |
D7 |
I / O |
Barramento de dados de 8 bits (MSB) |
15 |
UMA |
- |
+ 5V para luz de fundo |
16 |
K |
- |
Terra |
A tabela abaixo mostra os códigos de comando LCD usados com freqüência.
Código (hex) |
Descrição |
01 |
Limpar tela de exibição |
06 |
Incrementar o cursor (deslocamento para a direita) |
0A |
Display desligado, cursor ligado |
0C |
Display ligado, cursor desligado |
0F |
Display ligado, cursor piscando |
80 |
Forçar o cursor para o início da 1 st linha |
C0 |
Força o cursor para o início da 2ª linha |
38 |
2 linhas e matriz 5 * 7 |
ADC0804 IC:
O ADC0804 IC é um ADC paralelo de 8 bits da família da série ADC0800 da National Semiconductor. Funciona com +5 volts e tem resolução de 8 bits. O tamanho do passo e a faixa de Vin variam para diferentes valores de Vref / 2. A tabela abaixo mostra a relação entre Vref / 2 e faixa de Vin.
Vref / 2 (V) |
Vin (V) |
Tamanho do passo (mV) |
abrir |
0 a 5 |
19,53 |
2.0 |
0 a 4 |
15,62 |
1,5 |
0 a 3 |
11,71 |
1,28 |
0 a 2,56 |
10 |
No nosso caso, o Vref / 2 está conectado a 1,28 volts, então o tamanho do passo é 10mV. Para ADC0804, o tamanho do passo é calculado como (2 * Vref / 2) / 256.
A seguinte fórmula é usada para calcular a tensão de saída:
Dout = Vin / tamanho do passo
Onde Dout é a saída de dados digitais em decimal, Vin = tensão de entrada analógica e o tamanho do passo (resolução) é a menor alteração. Saiba mais sobre ADC0804 aqui, também verifique a interface de ADC0808 com 8051.
Sensor de temperatura LM35:
O LM35 é um sensor de temperatura cuja tensão de saída é linearmente proporcional à temperatura Celsius. O LM35 já vem calibrado, portanto, não requer calibração externa. Ele produz 10mV para cada grau de temperatura Celsius.
O sensor LM35 produz tensão correspondente à temperatura. Esta tensão é convertida em digital (0 a 256) pelo ADC0804 e é alimentada pelo microcontrolador 8051. O microcontrolador 8051 converte este valor digital em temperatura em graus Celsius. Em seguida, essa temperatura é convertida em forma ascii, que é adequada para exibição. Os valores ascii são alimentados para 16 * 2 LCD que exibe a temperatura em sua tela. Este processo é repetido após um intervalo especificado.
Abaixo está a imagem de configuração para o termômetro digital LM35 usando 8051:
Você pode encontrar todos os termômetros digitais baseados em LM35 aqui.
Explicação do código:
O programa C completo para este termômetro digital usando LM35 é fornecido no final deste projeto. O código é dividido em pequenos pedaços significativos e explicado a seguir.
Para interface de LCD 16 * 2 com microcontrolador 8051, temos que definir os pinos nos quais o LCD 16 * 2 está conectado ao microcontrolador 8051. O pino RS de 16 * 2 lcd está conectado a P2.7, o pino RW de 16 * 2 lcd está conectado a P2.6 e o pino E de 16 * 2 lcd está conectado a P2.5. Os pinos de dados são conectados à porta 0 do microcontrolador 8051.
sbit rs = P2 ^ 7; // Registrar o pino de seleção (RS) de 16 * 2 lcd sbit rw = P2 ^ 6; // Pino de leitura / gravação (RW) de 16 * 2 lcd sbit en = P2 ^ 5; // Habilitar pino (E) de 16 * 2 lcd
Da mesma forma, para a interface do ADC0804 com o microcontrolador 8051, temos que definir os pinos nos quais o ADC0804 está conectado ao microcontrolador 8051. O pino RD de ADC0804 está conectado a P3.0, o pino WR de ADC0804 está conectado a P3.1 e o pino INTR de ADC0804 está conectado a P3.2. Os pinos de dados são conectados à porta 1 do microcontrolador 8051.
sbit rd_adc = P3 ^ 0; // Pino de leitura (RD) de ADC0804 sbit wr_adc = P3 ^ 1; // Pino de gravação (WR) de ADC0804 sbit intr_adc = P3 ^ 2; // Pino de interrupção (INTR) de ADC0804
Em seguida, temos que definir algumas funções que são usadas no programa. A função de atraso é usada para criar um atraso de tempo especificado, a função c mdwrt é usada para enviar comandos para o display LCD 16 * 2, a função datawrt é usada para enviar dados para o display LCD 16 * 2 e a função convert_display é usada para converter os dados ADC em temperatura e exibi-lo em um display LCD 16 * 2.
void delay (unsigned int); // função para criar atraso void cmdwrt (unsigned char); // função para enviar comandos para display LCD 16 * 2 void datawrt (unsigned char); // função para enviar dados para display LCD 16 * 2 void convert_display (unsigned char); // função para converter o valor ADC em temperatura e exibi-lo no display LCD 16 * 2
Na parte abaixo do código, estamos enviando comandos para 16 * 2 LCD. Comandos, tais como exposição do espaço livre, o cursor incremento, forçar o cursor para o início de uma r linha são enviados para um visor LCD 16 * 2 por um após algum atraso de tempo especificado.
for (i = 0; i <5; i ++) // enviar comandos para 16 * 2 lcd exibir um comando por vez {cmdwrt (cmd); // chamada de função para enviar comandos para 16 * 2 lcd display delay (1); }
Nesta parte do código, estamos enviando dados para 16 * 2 lcd. Os dados a serem exibidos no display LCD 16 * 2 são enviados para exibição um por um após algum atraso de tempo especificado.
for (i = 0; i <12; i ++) // enviar dados para 16 * 2 lcd exibir um caractere por vez {datawrt (data1); // chamada de função para enviar dados para 16 * 2 lcd display delay (1); } Nesta parte do código, estamos convertendo a tensão analógica produzida pelo sensor LM35 em dados digitais e, em seguida, é convertida em temperatura e exibida no display LCD 16 * 2. Para que o ADC0804 inicie a conversão, temos que enviar um pulso baixo para alto no pino WR do ADC0804, então temos que esperar pelo final da conversão. INTR torna-se baixo no final da conversão. Uma vez que o INTR torna-se baixo, o RD é reduzido para copiar os dados digitais para a porta 0 do microcontrolador 8051. Após um atraso de tempo especificado, o próximo ciclo é iniciado. Este processo é repetido para sempre.
while (1) // repetir para sempre {wr_adc = 0; // envia pulso LOW para HIGH no retardo do pino WR (1); wr_adc = 1; enquanto (intr_adc == 1); // aguarde o fim da conversão rd_adc = 0; // faça RD = 0 para ler os dados de ADC0804 value = P1; // copia os dados ADC convert_display (value); // chamada de função para converter dados ADC em temperatura e exibi-los em 16 * 2 lcd display delay (1000); // intervalo entre cada ciclo rd_adc = 1; // faça RD = 1 para o próximo ciclo}
Na parte abaixo do código, estamos enviando comandos para um display LCD 16 * 2. O comando é copiado para a porta 0 do microcontrolador 8051. RS é reduzido para gravação de comando. RW é reduzido para operação de gravação. O pulso de alto a baixo é aplicado no pino de habilitação (E) para iniciar a operação de gravação de comando.
void cmdwrt (unsigned char x) {P0 = x; // envia o comando para a porta 0 na qual 16 * 2 lcd está conectado rs = 0; // torna RS = 0 para o comando rw = 0; // torna RW = 0 para operação de gravação en = 1; // envia um pulso de ALTO para BAIXO no pino Enable (E) para iniciar o retardo da operação de escrita de comando (1); en = 0; }
Nesta parte do código, estamos enviando dados para um display LCD 16 * 2. Os dados são copiados para a porta 0 do microcontrolador 8051. RS é elevado para gravação de comando. RW é reduzido para operação de gravação. O pulso alto para baixo é aplicado no pino de habilitação (E) para iniciar a operação de gravação de dados.
void datawrt (unsigned char y) {P0 = y; // envia os dados para a porta 0 na qual 16 * 2 lcd está conectado rs = 1; // torna RS = 1 para o comando rw = 0; // torna RW = 0 para operação de gravação en = 1; // envia um pulso de ALTO para BAIXO no pino Habilitar (E) para iniciar o retardo da operação de gravação de dados (1); en = 0; }
Nesta parte do código, estamos convertendo dados digitais em temperatura e exibindo-os em um display LCD 16 * 2.
void convert_display (unsigned char valor) {unsigned char x1, x2, x3; cmdwrt (0xc6); // comando para definir o cursor para a 6ª posição da 2ª linha em 16 * 2 lcd x1 = (valor / 10); // divida o valor por 10 e armazene o quociente na variável x1 x1 = x1 + (0x30); // converte a variável x1 em ascii adicionando 0x30 x2 = valor% 10; // divida o valor por 10 e armazene o resto na variável x2 x2 = x2 + (0x30); // converte a variável x2 em ascii adicionando 0x30 x3 = 0xDF; // valor ascii do símbolo de grau (°) datawrt (x1); // exibe a temperatura em 16 * 2 display lcd datawrt (x2); datawrt (x3); datawrt ('C'); }
Além disso, verifique outros termômetros usando LM35 com diferentes microcontroladores:
- Termômetro digital usando Arduino e LM35
- Medição de temperatura usando LM35 e microcontrolador AVR
- Medição da temperatura ambiente com Raspberry Pi