- Componenti richiesti:
- Schema elettrico:
- Misurazione della temperatura con LM35 utilizzando 8051:
- LCD 16x2:
- IC ADC0804:
- Sensore di temperatura LM35:
- Spiegazione del codice:
A volte le persone trovano difficile leggere la temperatura dal termometro analogico a causa delle fluttuazioni. Quindi qui costruiremo un semplice termometro digitale utilizzando un microcontrollore 8051 in cui il sensore LM35 viene utilizzato per misurare la temperatura. Abbiamo anche utilizzato LM35 per costruire termometro digitale utilizzando Arduino, NodeMCU, PIC, Raspberry Pi e altri microcontrollori.
Questo progetto servirà anche come interfaccia adeguata di ADC0804 con 8051 e LCD 16 * 2 con microcontrollore 8051.
Componenti richiesti:
- Scheda di sviluppo 8051
- Scheda ADC0804
- Display LCD 16 * 2
- Sensore LM35
- Potenziometro
- Cavi jumper
Schema elettrico:
Di seguito è riportato lo schema del circuito per il circuito del termometro digitale che utilizza LM35:
Misurazione della temperatura con LM35 utilizzando 8051:
Il microcontrollore 8051 è un microcontrollore a 8 bit che ha 128 byte di RAM su chip, 4K byte di ROM su chip, due timer, una porta seriale e quattro porte a 8 bit. Il microcontrollore 8052 è un'estensione del microcontrollore. La tabella seguente mostra il confronto di 8051 membri della famiglia.
Caratteristica |
8051 |
8052 |
ROM (in byte) |
4K |
8 MILA |
RAM (byte) |
128 |
256 |
Timer |
2 |
3 |
Pin di I / O |
32 |
32 |
Porta seriale |
1 |
1 |
Fonti di interrupt |
6 |
8 |
LCD 16x2:
L'LCD 16 * 2 è un display ampiamente utilizzato per applicazioni integrate. Ecco la breve spiegazione sui pin e sul funzionamento del display LCD 16 * 2. Ci sono due registri molto importanti all'interno del display LCD. Sono registro dati e registro comandi. Il registro dei comandi viene utilizzato per inviare comandi come la visualizzazione chiara, il cursore a casa, ecc., Il registro dei dati viene utilizzato per inviare i dati che devono essere visualizzati sull'LCD 16 * 2. La tabella sottostante mostra la descrizione dei pin di 16 * 2 lcd.
Pin |
Simbolo |
I / O |
Descrizione |
1 |
Vss |
- |
Terra |
2 |
Vdd |
- |
+ 5V di alimentazione |
3 |
Vee |
- |
Alimentazione per controllare il contrasto |
4 |
RS |
io |
RS = 0 per registro comandi, RS = 1 per registro dati |
5 |
RW |
io |
R / W = 0 per la scrittura, R / W = 1 per la lettura |
6 |
E |
I / O |
Abilitare |
7 |
D0 |
I / O |
Bus dati a 8 bit (LSB) |
8 |
D1 |
I / O |
Bus dati a 8 bit |
9 |
D2 |
I / O |
Bus dati a 8 bit |
10 |
D3 |
I / O |
Bus dati a 8 bit |
11 |
D4 |
I / O |
Bus dati a 8 bit |
12 |
D5 |
I / O |
Bus dati a 8 bit |
13 |
D6 |
I / O |
Bus dati a 8 bit |
14 |
D7 |
I / O |
Bus dati a 8 bit (MSB) |
15 |
UN |
- |
+ 5V per la retroilluminazione |
16 |
K |
- |
Terra |
La tabella seguente mostra i codici di comando LCD utilizzati di frequente.
Codice (esadecimale) |
Descrizione |
01 |
Schermo di visualizzazione chiaro |
06 |
Cursore di incremento (spostamento a destra) |
0A |
Display spento, cursore acceso |
0C |
Display acceso, cursore spento |
0F |
Display acceso, cursore lampeggiante |
80 |
Forza il cursore all'inizio della 1 ° linea |
C0 |
Forza il cursore all'inizio della 2 ° linea |
38 |
2 linee e matrice 5 * 7 |
IC ADC0804:
L' IC ADC0804 è un ADC parallelo a 8 bit della famiglia della serie ADC0800 di National Semiconductor. Funziona con +5 volt e ha una risoluzione di 8 bit. La dimensione del passo e la gamma Vin variano per diversi valori di Vref / 2. La tabella seguente mostra la relazione tra Vref / 2 e la gamma Vin.
Vref / 2 (V) |
Vin (V) |
Dimensione del passo (mV) |
Aperto |
Da 0 a 5 |
19.53 |
2.0 |
Da 0 a 4 |
15.62 |
1.5 |
Da 0 a 3 |
11.71 |
1.28 |
Da 0 a 2,56 |
10 |
Nel nostro caso Vref / 2 è collegato a 1,28 volt, quindi la dimensione del passo è 10 mV. Per ADC0804 la dimensione del passo viene calcolata come (2 * Vref / 2) / 256.
La seguente formula viene utilizzata per calcolare la tensione di uscita:
Dout = Vin / dimensione del passo
Dove Dout è l'uscita di dati digitali in decimale, Vin = tensione di ingresso analogico e dimensione del passo (risoluzione) è la variazione più piccola. Scopri di più su ADC0804 qui, controlla anche l'interfacciamento di ADC0808 con 8051.
Sensore di temperatura LM35:
L'LM35 è un sensore di temperatura la cui tensione di uscita è linearmente proporzionale alla temperatura Celsius. L'LM35 viene fornito già calibrato, quindi non richiede calibrazione esterna. Emette 10 mV per ogni grado di temperatura Celsius.
Il sensore LM35 produce una tensione corrispondente alla temperatura. Questa tensione viene convertita in digitale (da 0 a 256) da ADC0804 ed è alimentata al microcontrollore 8051. Il microcontrollore 8051 converte questo valore digitale in temperatura in gradi Celsius. Quindi questa temperatura viene convertita in un formato ASCII che è adatto per la visualizzazione. Questi valori ASCII vengono inviati a 16 * 2 LCD che visualizza la temperatura sullo schermo. Questo processo viene ripetuto dopo l'intervallo specificato.
Di seguito è riportata l'immagine di configurazione per il termometro digitale LM35 con 8051:
Puoi trovare tutti i termometri digitali basati su LM35 qui.
Spiegazione del codice:
Il programma completo in C per questo termometro digitale che utilizza LM35 è fornito alla fine di questo progetto. Il codice è suddiviso in piccoli blocchi significativi e spiegato di seguito.
Per l'interfacciamento LCD 16 * 2 con il microcontrollore 8051, dobbiamo definire i pin su cui lcd 16 * 2 è collegato al microcontrollore 8051. Il pin RS di 16 * 2 lcd è collegato a P2.7, il pin RW di 16 * 2 lcd è collegato a P2.6 e il pin E di 16 * 2 lcd è collegato a P2.5. I pin dati sono collegati alla porta 0 del microcontrollore 8051.
sbit rs = P2 ^ 7; // Register Select (RS) pin di 16 * 2 lcd sbit rw = P2 ^ 6; // Pin di lettura / scrittura (RW) di 16 * 2 lcd sbit en = P2 ^ 5; // Abilita il pin (E) di 16 * 2 lcd
Allo stesso modo, per l'interfacciamento di ADC0804 con il microcontrollore 8051, dobbiamo definire i pin su cui ADC0804 è collegato al microcontrollore 8051. Il pin RD di ADC0804 è collegato a P3.0, il pin WR di ADC0804 è collegato a P3.1 e il pin INTR di ADC0804 è collegato a P3.2. I pin dati sono collegati alla porta 1 del microcontrollore 8051.
sbit rd_adc = P3 ^ 0; // Leggi (RD) pin di ADC0804 sbit wr_adc = P3 ^ 1; // Scrivi (WR) pin di ADC0804 sbit intr_adc = P3 ^ 2; // Pin di interrupt (INTR) di ADC0804
Successivamente dobbiamo definire alcune funzioni che vengono utilizzate nel programma. La funzione di ritardo viene utilizzata per creare un ritardo di tempo specificato, la funzione c mdwrt viene utilizzata per inviare comandi al display lcd 16 * 2, la funzione datawrt viene utilizzata per inviare dati al display lcd 16 * 2 e la funzione convert_display viene utilizzata per convertire i dati ADC in temperatura e per visualizzarlo sul display lcd 16 * 2.
void delay (unsigned int); // funzione per la creazione di delay void cmdwrt (unsigned char); // funzione per inviare comandi a 16 * 2 display lcd void datawrt (unsigned char); // funzione per inviare dati al display lcd 16 * 2 void convert_display (unsigned char); // funzione per convertire il valore dell'ADC in temperatura e visualizzarlo sul display lcd 16 * 2
Nella parte inferiore del codice, stiamo inviando comandi a 16 * 2 lcd. Comandi come display azzerato, cursore incremento, costringono il cursore all'inizio della 1 ° riga vengono inviati a 16 * 2 display LCD uno per uno dopo un certo intervallo di tempo specificato.
for (i = 0; i <5; i ++) // invia comandi a 16 * 2 display lcd un comando alla volta {cmdwrt (cmd); // chiamata di funzione per inviare comandi a 16 * 2 display lcd delay (1); }
In questa parte del codice, stiamo inviando i dati a 16 * 2 lcd. I dati da visualizzare sul display lcd 16 * 2 vengono inviati al display uno per uno dopo un certo ritardo di tempo specificato.
for (i = 0; i <12; i ++) // invia i dati al display lcd 16 * 2 un carattere alla volta {datawrt (data1); // chiamata di funzione per inviare dati a 16 * 2 ritardo display lcd (1); } In questa parte del codice stiamo convertendo la tensione analogica prodotta dal sensore LM35 in dati digitali e poi viene convertita in temperatura e visualizzata sul display lcd 16 * 2. Affinché ADC0804 inizi la conversione dobbiamo inviare un impulso da basso ad alto sul pin WR di ADC0804, quindi dobbiamo aspettare la fine della conversione. INTR diventa basso alla fine della conversione. Una volta che INTR diventa basso, RD viene reso basso per copiare i dati digitali sulla porta 0 del microcontrollore 8051. Dopo un intervallo di tempo specificato, inizia il ciclo successivo. Questo processo viene ripetuto per sempre.
while (1) // ripeti all'infinito {wr_adc = 0; // invia un impulso da BASSO a ALTO sul ritardo del pin WR (1); wr_adc = 1; while (intr_adc == 1); // attende la fine della conversione rd_adc = 0; // imposta RD = 0 per leggere i dati dal valore ADC0804 = P1; // copia i dati ADC convert_display (value); // chiamata di funzione per convertire i dati ADC in temperatura e visualizzarli su 16 * 2 ritardo display lcd (1000); // intervallo tra ogni ciclo rd_adc = 1; // crea RD = 1 per il ciclo successivo}
Nella parte inferiore del codice, stiamo inviando comandi al display lcd 16 * 2. Il comando viene copiato sulla porta 0 del microcontrollore 8051. RS è ridotta per la scrittura del comando. RW è ridotto per l'operazione di scrittura. L'impulso da alto a basso viene applicato al pin di abilitazione (E) per avviare l'operazione di scrittura del comando.
void cmdwrt (carattere senza segno x) {P0 = x; // invia il comando alla porta 0 a cui è connesso 16 * 2 lcd rs = 0; // imposta RS = 0 per il comando rw = 0; // rendi RW = 0 per l'operazione di scrittura en = 1; // invia un impulso da HIGH a LOW sul pin di abilitazione (E) per avviare il ritardo dell'operazione di scrittura del comando (1); en = 0; }
In questa parte del codice, stiamo inviando i dati al display lcd 16 * 2. I dati vengono copiati sulla porta 0 del microcontrollore 8051. RS è elevato per la scrittura del comando. RW è ridotto per l'operazione di scrittura. L'impulso da alto a basso viene applicato al pin di abilitazione (E) per avviare l'operazione di scrittura dei dati.
void datawrt (unsigned char y) {P0 = y; // invia i dati alla porta 0 a cui è connesso 16 * 2 lcd rs = 1; // imposta RS = 1 per il comando rw = 0; // rendi RW = 0 per l'operazione di scrittura en = 1; // invia un impulso da HIGH a LOW sul pin di abilitazione (E) per avviare il ritardo dell'operazione di scrittura dei dati (1); en = 0; }
In questa parte del codice, convertiamo i dati digitali in temperatura e li visualizziamo sul display LCD 16 * 2.
void convert_display (unsigned char value) {unsigned char x1, x2, x3; cmdwrt (0xc6); // comando per impostare il cursore sulla 6a posizione della 2a riga su 16 * 2 lcd x1 = (valore / 10); // divide il valore per 10 e memorizza il quoziente nella variabile x1 x1 = x1 + (0x30); // converte la variabile x1 in ascii aggiungendo 0x30 x2 = valore% 10; // divide il valore per 10 e memorizza il resto nella variabile x2 x2 = x2 + (0x30); // converte la variabile x2 in ascii aggiungendo 0x30 x3 = 0xDF; // valore ascii del simbolo dei gradi (°) datawrt (x1); // visualizza la temperatura sul display lcd 16 * 2 datawrt (x2); datawrt (x3); datawrt ('C'); }
Inoltre, controlla altri termometri utilizzando LM35 con diversi microcontrollori:
- Termometro digitale che utilizza Arduino e LM35
- Misurazione della temperatura utilizzando LM35 e microcontrollore AVR
- Misurazione della temperatura ambiente con Raspberry Pi