- Components necessaris:
- Esquema de connexions:
- Mesurament de la temperatura amb LM35 mitjançant 8051:
- LCD de 16 x 2:
- ADC0804 IC:
- Sensor de temperatura LM35:
- Explicació del codi:
De vegades, a la gent li costa llegir la temperatura des del termòmetre analògic a causa de les fluctuacions. Per tant, aquí anem a construir un simple termòmetre digital amb microcontrolador 8051 en el qual s’utilitza el sensor LM35 per mesurar la temperatura. També hem utilitzat LM35 per construir termòmetres digitals amb Arduino, NodeMCU, PIC, Raspberry Pi i altres microcontroladors.
Aquest projecte també servirà com a interfície adequada de l'ADC0804 amb 8051 i LCD de 16 * 2 amb microcontrolador 8051.
Components necessaris:
- Taula de desenvolupament 8051
- Tauler ADC0804
- Pantalla LCD de 16 * 2
- Sensor LM35
- Potenciòmetre
- Filferros de pont
Esquema de connexions:
A continuació es mostra el diagrama del circuit del termòmetre digital que utilitza LM35:

Mesurament de la temperatura amb LM35 mitjançant 8051:
El microcontrolador 8051 és un microcontrolador de 8 bits que té 128 bytes de RAM del xip, 4K bytes de ROM del xip, dos temporitzadors, un port sèrie i quatre ports de 8 bits. El microcontrolador 8052 és una extensió del microcontrolador. La taula següent mostra la comparació de 8051 membres de la família.
|
Funció |
8051 |
8052 |
|
ROM (en bytes) |
4K |
8K |
|
RAM (bytes) |
128 |
256 |
|
Temporitzadors |
2 |
3 |
|
Pines d'E / S |
32 |
32 |
|
Port sèrie |
1 |
1 |
|
Interrompre fonts |
6 |
8 |

LCD de 16 x 2:
16 * 2 LCD és una pantalla àmpliament utilitzada per a aplicacions incrustades. Aquí teniu una breu explicació sobre els pins i el funcionament de la pantalla LCD de 16 * 2. Hi ha dos registres molt importants dins de la pantalla LCD. Són registre de dades i registre d’ordres. El registre d’ordres s’utilitza per enviar ordres com ara la visualització neta, el cursor a casa, etc., el registre de dades s’utilitza per enviar dades que es mostraran a la pantalla LCD de 16 * 2. A la taula següent es mostra la descripció del pin de 16 * 2 lcd.
|
Pin |
Símbol |
E / S |
Descripció |
|
1 |
Vss |
- |
Terra |
|
2 |
Vdd |
- |
Alimentació + 5V |
|
3 |
Vee |
- |
Font d'alimentació per controlar el contrast |
|
4 |
RS |
Jo |
RS = 0 per al registre d'ordres, RS = 1 per al registre de dades |
|
5 |
RW |
Jo |
R / W = 0 per a escriptura, R / W = 1 per a lectura |
|
6 |
E |
E / S |
Activa |
|
7 |
D0 |
E / S |
Bus de dades de 8 bits (LSB) |
|
8 |
D1 |
E / S |
Bus de dades de 8 bits |
|
9 |
D2 |
E / S |
Bus de dades de 8 bits |
|
10 |
D3 |
E / S |
Bus de dades de 8 bits |
|
11 |
D4 |
E / S |
Bus de dades de 8 bits |
|
12 |
D5 |
E / S |
Bus de dades de 8 bits |
|
13 |
D6 |
E / S |
Bus de dades de 8 bits |
|
14 |
D7 |
E / S |
Bus de dades de 8 bits (MSB) |
|
15 |
A |
- |
+ 5V per a la llum de fons |
|
16 |
K |
- |
Terra |
A la taula següent es mostren els codis d’ordres LCD d’ús freqüent.
|
Codi (hexadecimal) |
Descripció |
|
01 |
Esborra la pantalla |
|
06 |
Cursor d'increment (desplaçament a la dreta) |
|
0A |
Visualització desactivada, cursor activat |
|
0C |
Visualització activada, cursor desactivat |
|
0F |
Pantalla activada, el cursor parpelleja |
|
80 |
Força el cursor al començament de la primera línia |
|
C0 |
Força el cursor al començament de la segona línia |
|
38 |
2 línies i matriu 5 * 7 |
ADC0804 IC:
L' ADC0804 IC és un ADC paral·lel de 8 bits de la família de la sèrie ADC0800 de National Semiconductor. Funciona amb +5 volts i té una resolució de 8 bits. La mida del pas i l’interval de Vin varia segons els diferents valors de Vref / 2. La taula següent mostra la relació entre el rang Vref / 2 i Vin.
|
Vref / 2 (V) |
Vin (V) |
Mida del pas (mV) |
|
obert |
De 0 a 5 |
19.53 |
|
2.0 |
De 0 a 4 |
15,62 |
|
1.5 |
0 a 3 |
11,71 |
|
1,28 |
De 0 a 2,56 |
10 |
En el nostre cas, Vref / 2 està connectat a 1,28 volts, de manera que la mida del pas és de 10 mV. Per a ADC0804, la mida del pas es calcula com (2 * Vref / 2) / 256.
S’utilitza la següent fórmula per calcular el voltatge de sortida:
Dout = mida Vin / pas
Quan Dout és la sortida de dades digitals en decimal, Vin = tensió d'entrada analògica i mida de pas (resolució) és el canvi més petit. Més informació sobre ADC0804 aquí, també comproveu la interfície de l'ADC0808 amb el 8051.
Sensor de temperatura LM35:
El LM35 és un sensor de temperatura el voltatge de sortida del qual és linealment proporcional a la temperatura Celsius. El LM35 ja està calibrat, per tant no requereix cap calibració externa. Emet 10 mV per a cada grau de temperatura Celsius.
El sensor LM35 produeix una tensió corresponent a la temperatura. Aquest voltatge es converteix en digital (de 0 a 256) mitjançant ADC0804 i s’alimenta al microcontrolador 8051. El microcontrolador 8051 converteix aquest valor digital en temperatura en graus centígrads. A continuació, aquesta temperatura es converteix en forma ascii que és adequada per mostrar. Aquests valors ascii s’alimenten a 16 * 2 lcd, que mostra la temperatura a la pantalla. Aquest procés es repeteix després de l'interval especificat.
A continuació es mostra la imatge de configuració del termòmetre digital LM35 amb 8051:

Aquí podeu trobar tots els termòmetres digitals basats en LM35.
Explicació del codi:
El programa C complet d’aquest termòmetre digital que utilitza LM35 es dóna al final d’aquest projecte. El codi es divideix en petits trossos significatius i s’explica a continuació.
Per a la interfície LCD de 16 * 2 amb el microcontrolador 8051, hem de definir els pins on es connecti 16 * 2 lcd al microcontrolador 8051. El pin RS de 16 * 2 lcd està connectat a P2.7, el pin RW de 16 * 2 lcd està connectat a P2.6 i el pin E de 16 * 2 lcd està connectat a P2.5. Els pins de dades estan connectats al port 0 del microcontrolador 8051.
sbit rs = P2 ^ 7; // Registre Seleccioneu (RS) pin de 16 * 2 lcd sbit rw = P2 ^ 6; // Pin de lectura / escriptura (RW) de 16 * 2 lcd sbit en = P2 ^ 5; // Activa el pin (E) de 16 * 2 lcd
De la mateixa manera, per a la interfície ADC0804 amb el microcontrolador 8051, hem de definir els pins on ADC0804 està connectat al microcontrolador 8051. El pin RD d'ADC0804 està connectat a P3.0, el pin WR d'ADC0804 està connectat a P3.1 i el pin INTR d'ADC0804 està connectat a P3.2. Els pins de dades estan connectats al port 1 del microcontrolador 8051.
sbit rd_adc = P3 ^ 0; // Llegiu el pin (RD) de l'ADC0804 sbit wr_adc = P3 ^ 1; // Escriviu el pin (WR) d'ADC0804 sbit intr_adc = P3 ^ 2; // Pin d'interrupció (INTR) de l'ADC0804
A continuació, hem de definir algunes funcions que s'utilitzen al programa. La funció de retard s'utilitza per crear un retard de temps especificat, la funció c mdwrt s'utilitza per enviar ordres a una pantalla lcd de 16 * 2, la funció datawrt s'utilitza per enviar dades a una pantalla lcd de 16 * 2 i la funció convert_display s'utilitza per convertir les dades ADC en temperatura i per mostrar-lo en pantalla lcd de 16 * 2.
retard nul (int sense signar); // funció per crear delay void cmdwrt (caràcter sense signar); // funció per enviar comandes a 16 * 2 lcd display void datawrt (caràcter sense signar); // funció per a l'enviament de dades a la pantalla lcd de 16 * 2 void convert_display (caràcter sense signar); // funció per convertir el valor ADC a temperatura i mostrar-lo en pantalla lcd de 16 * 2
A la part inferior del codi, estem enviant comandes a 16 * 2 lcd. Ordres com la visualització neta, el cursor d'increment i la força del cursor a l'inici de la primera línia s'envien a la pantalla LCD de 16 * 2 un per un després d'un cert retard de temps especificat.
for (i = 0; i <5; i ++) // enviar ordres a 16 * 2 lcd mostra una ordre cada vegada {cmdwrt (cmd); // trucada de funció per enviar ordres a 16 * 2 retard de pantalla lcd (1); }
En aquesta part del codi, estem enviant dades a 16 * 2 lcd. Les dades que es mostraran a la pantalla lcd de 16 * 2 s’envien per mostrar-les una a una després d’un cert temps de retard.
for (i = 0; i <12; i ++) // enviar dades a 16 * 2 lcd mostrar un caràcter a la vegada {datawrt (data1); // trucada de funció per enviar dades a 16 * 2 retard de pantalla lcd (1); } En aquesta part del codi estem convertint la tensió analògica produïda pel sensor LM35 a dades digitals i després es converteix a temperatura i es mostra a la pantalla LCD de 16 * 2. Perquè ADC0804 comenci la conversió, hem d’enviar un pols de baix a alt al pin WR d’ADC0804, i després hem d’esperar al final de la conversió. INTR es redueix al final de la conversió. Un cop INTR es redueix, RD es redueix per copiar les dades digitals al port 0 del microcontrolador 8051. Després d'un retard de temps especificat, s'inicia el següent cicle. Aquest procés es repeteix per sempre.
while (1) // repeteix per sempre {wr_adc = 0; // enviar pols BAIX a ALT en retard de pin WR (1); wr_adc = 1; while (intr_adc == 1); // espera Final de conversió rd_adc = 0; // Feu RD = 0 per llegir les dades del valor ADC0804 = P1; // copiar dades ADC convert_display (valor); // trucada de funció per convertir les dades ADC en temperatura i mostrar-les en un retard de pantalla lcd de 16 * 2 (1000); // interval entre tots els cicles rd_adc = 1; // fer RD = 1 per al següent cicle}
A la part inferior del codi, estem enviant ordres a una pantalla lcd de 16 * 2. L'ordre es copia al port 0 del microcontrolador 8051. RS es redueix per escriure ordres. RW es redueix per a l'operació d'escriptura. S’aplica un pols d’alt a baix al pin habilitar (E) per iniciar l’operació d’escriptura d’ordres.
void cmdwrt (caràcter sense signe x) {P0 = x; // envieu l'ordre al port 0 al qual està connectat 16 * 2 lcd rs = 0; // fes RS = 0 per a l'ordre rw = 0; // fes RW = 0 per a l'operació d'escriptura en = 1; // envieu un pols HIGH a LOW al pin Habilita (E) per iniciar el retard de l'operació d'escriptura d'ordres (1) ca = 0; }
En aquesta part del codi, estem enviant dades a una pantalla lcd de 16 * 2. Les dades es copien al port 0 del microcontrolador 8051. RS es fa elevat per escriure ordres. RW es redueix per a l'operació d'escriptura. El pols d’alt a baix s’aplica al pin habilitar (E) per iniciar l’operació d’escriptura de dades.
void datawrt (caràcter sense signar y) {P0 = y; // envieu les dades al port 0 al qual està connectat 16 * 2 lcd rs = 1; // fes RS = 1 per a l'ordre rw = 0; // fes RW = 0 per a l'operació d'escriptura en = 1; // envieu un pols HIGH a LOW al pin Habilita (E) per iniciar el retard de l'operació d'escriptura de dades (1); ca = 0; }
En aquesta part del codi, estem convertint les dades digitals en temperatura i les mostrem en una pantalla lcd de 16 * 2.
void convert_display (valor de caràcter sense signar) {unsigned char x1, x2, x3; cmdwrt (0xc6); // ordre per configurar el cursor a la 6a posició de la 2a línia a 16 * 2 lcd x1 = (valor / 10); // divideix el valor per 10 i emmagatzema el quocient a la variable x1 x1 = x1 + (0x30); // converteix la variable x1 en ascii afegint 0x30 x2 = valor% 10; // divideix el valor per 10 i emmagatzema la resta en la variable x2 x2 = x2 + (0x30); // converteix la variable x2 en ascii afegint 0x30 x3 = 0xDF; // valor ascii del grau (°) símbol datawrt (x1); // mostra la temperatura a 16 * 2 lcd display datawrt (x2); datawrt (x3); datawrt ('C'); }
A més, comproveu altres termòmetres amb LM35 amb diferents microcontroladors:
- Termòmetre digital amb Arduino i LM35
- Mesura de la temperatura mitjançant microcontrolador LM35 i AVR
- Mesura de la temperatura ambient amb Raspberry Pi
