- Componentes requeridos:
- Diagrama de circuito:
- Medición de temperatura con LM35 usando 8051:
- LCD 16x2:
- ADC0804 IC:
- Sensor de temperatura LM35:
- Explicación del código:
A veces, a las personas les resulta difícil leer la temperatura de un termómetro analógico debido a las fluctuaciones. Entonces, aquí vamos a construir un termómetro digital simple usando un microcontrolador 8051 en el que se usa el sensor LM35 para medir la temperatura. También hemos utilizado LM35 para construir un termómetro digital usando Arduino, NodeMCU, PIC, Raspberry Pi y otros microcontroladores.
Este proyecto también servirá como una interfaz adecuada de ADC0804 con 8051 y LCD 16 * 2 con microcontrolador 8051.
Componentes requeridos:
- Placa de desarrollo 8051
- Tablero ADC0804
- Pantalla LCD 16 * 2
- Sensor LM35
- Potenciómetro
- Cables de puente
Diagrama de circuito:
El diagrama de circuito para el circuito de termómetro digital que utiliza LM35 se muestra a continuación:
Medición de temperatura con LM35 usando 8051:
El microcontrolador 8051 es un microcontrolador de 8 bits que tiene 128 bytes de RAM en el chip, 4K bytes de ROM en el chip, dos temporizadores, un puerto serie y cuatro puertos de 8 bits. El microcontrolador 8052 es una extensión del microcontrolador. La siguiente tabla muestra la comparación de 8051 miembros de la familia.
Característica |
8051 |
8052 |
ROM (en bytes) |
4K |
8K |
RAM (bytes) |
128 |
256 |
Temporizadores |
2 |
3 |
Pines de E / S |
32 |
32 |
Puerto serial |
1 |
1 |
Fuentes de interrupción |
6 |
8 |
LCD 16x2:
16 * 2 LCD es una pantalla ampliamente utilizada para aplicaciones integradas. Aquí está la breve explicación sobre los pines y el funcionamiento de la pantalla LCD de 16 * 2. Hay dos registros muy importantes dentro de la pantalla LCD. Son registro de datos y registro de comando. El registro de comando se usa para enviar comandos como pantalla clara, cursor en casa, etc., el registro de datos se usa para enviar datos que se mostrarán en la pantalla LCD de 16 * 2. La siguiente tabla muestra la descripción de los pines de la pantalla LCD de 16 * 2.
Alfiler |
Símbolo |
E / S |
Descripción |
1 |
Vss |
- |
Suelo |
2 |
Vdd |
- |
Fuente de alimentación de + 5V |
3 |
Vee |
- |
Fuente de alimentación para controlar el contraste |
4 |
RS |
yo |
RS = 0 para registro de comando, RS = 1 para registro de datos |
5 |
RW |
yo |
R / W = 0 para escritura, R / W = 1 para lectura |
6 |
mi |
E / S |
Habilitar |
7 |
D0 |
E / S |
Bus de datos de 8 bits (LSB) |
8 |
D1 |
E / S |
Bus de datos de 8 bits |
9 |
D2 |
E / S |
Bus de datos de 8 bits |
10 |
D3 |
E / S |
Bus de datos de 8 bits |
11 |
D4 |
E / S |
Bus de datos de 8 bits |
12 |
D5 |
E / S |
Bus de datos de 8 bits |
13 |
D6 |
E / S |
Bus de datos de 8 bits |
14 |
D7 |
E / S |
Bus de datos de 8 bits (MSB) |
15 |
UN |
- |
+ 5V para retroiluminación |
dieciséis |
K |
- |
Suelo |
La siguiente tabla muestra los códigos de comando de la pantalla LCD de uso frecuente.
Código (hexadecimal) |
Descripción |
01 |
Pantalla de visualización clara |
06 |
Cursor de incremento (desplazamiento a la derecha) |
0A |
Pantalla apagada, cursor encendido |
0C |
Pantalla encendida, cursor apagado |
0F |
Pantalla encendida, cursor parpadeando |
80 |
Forzar el cursor al comienzo de la 1ª línea |
C0 |
Forzar el cursor al comienzo de la 2ª línea |
38 |
2 líneas y matriz 5 * 7 |
ADC0804 IC:
El ADC0804 IC es un ADC paralelo de 8 bits de la familia de la serie ADC0800 de National Semiconductor. Funciona con +5 voltios y tiene una resolución de 8 bits. El tamaño del paso y el rango de Vin varían para diferentes valores de Vref / 2. La siguiente tabla muestra la relación entre Vref / 2 y el rango Vin.
Vref / 2 (V) |
Vin (V) |
Tamaño de paso (mV) |
abierto |
0 a 5 |
19.53 |
2.0 |
0 a 4 |
15,62 |
1,5 |
0 a 3 |
11,71 |
1,28 |
0 hasta 2,56 |
10 |
En nuestro caso, Vref / 2 está conectado a 1,28 voltios, por lo que el tamaño del paso es de 10 mV. Para ADC0804, el tamaño de paso se calcula como (2 * Vref / 2) / 256.
La siguiente fórmula se utiliza para calcular el voltaje de salida:
Dout = Vin / tamaño de paso
Donde Dout es la salida de datos digitales en decimal, Vin = voltaje de entrada analógica y el tamaño del paso (resolución) es el cambio más pequeño. Obtenga más información sobre ADC0804 aquí, también verifique la interfaz de ADC0808 con 8051.
Sensor de temperatura LM35:
El LM35 es un sensor de temperatura cuyo voltaje de salida es linealmente proporcional a la temperatura Celsius. El LM35 ya viene calibrado, por lo que no requiere calibración externa. Produce 10 mV por cada grado de temperatura Celsius.
El sensor LM35 produce voltaje correspondiente a la temperatura. Este voltaje se convierte a digital (0 a 256) por ADC0804 y se alimenta al microcontrolador 8051. El microcontrolador 8051 convierte este valor digital en temperatura en grados Celsius. Luego, esta temperatura se convierte en forma ascii, que es adecuada para mostrar. Estos valores ascii se alimentan a una pantalla LCD de 16 * 2 que muestra la temperatura en su pantalla. Este proceso se repite después de un intervalo especificado.
A continuación se muestra la imagen de configuración para el termómetro digital LM35 con 8051:
Puede encontrar todos los termómetros digitales basados en LM35 aquí.
Explicación del código:
El programa C completo para este termómetro digital que utiliza LM35 se proporciona al final de este proyecto. El código se divide en pequeños fragmentos significativos y se explica a continuación.
Para la interfaz de 16 * 2 LCD con el microcontrolador 8051, tenemos que definir los pines en los que 16 * 2 lcd se conecta al microcontrolador 8051. El pin RS de 16 * 2 lcd está conectado a P2.7, el pin RW de 16 * 2 lcd está conectado a P2.6 y el pin E de 16 * 2 lcd está conectado a P2.5. Los pines de datos están conectados al puerto 0 del microcontrolador 8051.
sbit rs = P2 ^ 7; // Registrar el pin de selección (RS) de 16 * 2 lcd sbit rw = P2 ^ 6; // Pin de lectura / escritura (RW) de 16 * 2 lcd sbit en = P2 ^ 5; // Habilita el pin (E) de 16 * 2 lcd
De manera similar, para la interfaz ADC0804 con el microcontrolador 8051, tenemos que definir los pines en los que ADC0804 está conectado al microcontrolador 8051. El pin RD de ADC0804 está conectado a P3.0, el pin WR de ADC0804 está conectado a P3.1 y el pin INTR de ADC0804 está conectado a P3.2. Los pines de datos están conectados al puerto 1 del microcontrolador 8051.
sbit rd_adc = P3 ^ 0; // Leer pin (RD) de ADC0804 sbit wr_adc = P3 ^ 1; // Escribir pin (WR) de ADC0804 sbit intr_adc = P3 ^ 2; // Pin de interrupción (INTR) de ADC0804
A continuación, tenemos que definir algunas funciones que se utilizan en el programa. La función de retardo se utiliza para crear un retardo de tiempo especificado, la función c mdwrt se utiliza para enviar comandos a una pantalla lcd de 16 * 2, la función datawrt se utiliza para enviar datos a una pantalla lcd de 16 * 2 y la función convert_display se utiliza para convertir los datos de ADC en temperatura y mostrarlo en una pantalla lcd de 16 * 2.
demora nula (unsigned int); // función para crear delay void cmdwrt (unsigned char); // función para enviar comandos a una pantalla lcd de 16 * 2 void datawrt (unsigned char); // función para enviar datos a una pantalla lcd de 16 * 2 void convert_display (unsigned char); // función para convertir el valor ADC a temperatura y mostrarlo en una pantalla lcd de 16 * 2
En la parte siguiente del código, enviamos comandos a 16 * 2 lcd. Los comandos tales como borrar pantalla, incrementar el cursor, forzar el cursor al comienzo de la 1ª línea se envían a la pantalla lcd de 16 * 2 uno por uno después de un tiempo de retraso especificado.
for (i = 0; i <5; i ++) // enviar comandos a la pantalla lcd 16 * 2 un comando a la vez {cmdwrt (cmd); // llamada de función para enviar comandos a 16 * 2 lcd display delay (1); }
En esta parte del código, enviamos datos a 16 * 2 lcd. Los datos que se mostrarán en la pantalla lcd de 16 * 2 se envían para mostrar uno por uno después de un retraso de tiempo especificado.
for (i = 0; i <12; i ++) // enviar datos a la pantalla lcd 16 * 2 un carácter a la vez {datawrt (data1); // llamada de función para enviar datos a 16 * 2 pantalla lcd delay (1); } En esta parte del código, estamos convirtiendo el voltaje analógico producido por el sensor LM35 en datos digitales y luego se convierte a temperatura y se muestra en una pantalla lcd de 16 * 2. Para que ADC0804 inicie la conversión, tenemos que enviar un pulso de bajo a alto en el pin WR de ADC0804, luego tenemos que esperar al final de la conversión. INTR se vuelve bajo al final de la conversión. Una vez que INTR se vuelve bajo, RD se baja para copiar los datos digitales al puerto 0 del microcontrolador 8051. Después de un retraso de tiempo especificado, comienza el siguiente ciclo. Este proceso se repite para siempre.
while (1) // repetir para siempre {wr_adc = 0; // enviar pulso de BAJO a ALTO en el retraso del pin WR (1); wr_adc = 1; while (intr_adc == 1); // esperar el fin de la conversión rd_adc = 0; // haga RD = 0 para leer los datos de ADC0804 value = P1; // copia los datos de ADC convert_display (value); // llamada a la función para convertir los datos de ADC en temperatura y mostrarlos en el retraso de la pantalla lcd 16 * 2 (1000); // intervalo entre ciclos rd_adc = 1; // hacer RD = 1 para el próximo ciclo}
En la siguiente parte del código, enviamos comandos a una pantalla lcd de 16 * 2. El comando se copia al puerto 0 del microcontrolador 8051. RS se hace bajo para la escritura de comandos. RW se hace bajo para la operación de escritura. El pulso de alto a bajo se aplica en el pin de habilitación (E) para iniciar la operación de escritura del comando.
cmdwrt vacío (carácter sin firmar x) {P0 = x; // envía el comando al puerto 0 en el que 16 * 2 lcd están conectados rs = 0; // hacer RS = 0 para el comando rw = 0; // hacer RW = 0 para la operación de escritura en = 1; // envía un pulso de ALTO a BAJO en el pin Habilitar (E) para iniciar el retardo de operación de escritura de comando (1); en = 0; }
En esta parte del código, enviamos datos a una pantalla lcd de 16 * 2. Los datos se copian en el puerto 0 del microcontrolador 8051. RS se hace alto para la escritura de comandos. RW se hace bajo para la operación de escritura. El pulso de alto a bajo se aplica en el pin de habilitación (E) para iniciar la operación de escritura de datos.
void datawrt (carácter sin signo y) {P0 = y; // envía los datos al puerto 0 en el que están conectados 16 * 2 lcd rs = 1; // hacer RS = 1 para el comando rw = 0; // hacer RW = 0 para la operación de escritura en = 1; // envía un pulso de ALTO a BAJO en el pin Habilitar (E) para iniciar el retardo de la operación de escritura de datos (1); en = 0; }
En esta parte del código, convertimos datos digitales en temperatura y los mostramos en una pantalla lcd de 16 * 2.
void convert_display (valor de carácter sin firmar) {carácter sin firmar x1, x2, x3; cmdwrt (0xc6); // comando para colocar el cursor en la 6ª posición de la 2ª línea en 16 * 2 lcd x1 = (valor / 10); // dividir el valor entre 10 y almacenar el cociente en la variable x1 x1 = x1 + (0x30); // convierte la variable x1 a ascii agregando 0x30 x2 = valor% 10; // dividir el valor por 10 y almacenar el resto en la variable x2 x2 = x2 + (0x30); // convierte la variable x2 a ascii agregando 0x30 x3 = 0xDF; // valor ascii del símbolo de grado (°) datawrt (x1); // muestra la temperatura en la pantalla lcd de 16 * 2 datawrt (x2); datawrt (x3); datawrt ('C'); }
Además, verifique otros termómetros que usen LM35 con diferentes microcontroladores:
- Termómetro digital con Arduino y LM35
- Medición de temperatura con microcontrolador LM35 y AVR
- Medición de temperatura ambiente con Raspberry Pi