- Componente necesare:
- Diagrama circuitului:
- Măsurarea temperaturii cu LM35 folosind 8051:
- 16x2 LCD:
- ADC0804 IC:
- Senzor de temperatură LM35:
- Explicarea codului:
Uneori, oamenilor le este greu să citească temperatura din termometru analog din cauza fluctuațiilor. Deci, aici vom construi un termometru digital simplu folosind microcontrolerul 8051 în care senzorul LM35 este utilizat pentru măsurarea temperaturii. De asemenea, am folosit LM35 pentru a construi termometru digital folosind Arduino, NodeMCU, PIC, Raspberry Pi și alte microcontrolere.
Acest proiect va servi și ca o interfață adecvată a ADC0804 cu 8051 și 16 * 2 LCD cu 8051 microcontroler.
Componente necesare:
- Placa de dezvoltare 8051
- Placă ADC0804
- Afisaj LCD 16 * 2
- Senzor LM35
- Potențiometru
- Sârme de jumper
Diagrama circuitului:
Diagrama circuitului pentru circuitul termometrului digital care utilizează LM35 este prezentată mai jos:
Măsurarea temperaturii cu LM35 folosind 8051:
8051 microcontroler este un microcontroler de 8 biți care are 128 de octeți pe cip RAM, 4K octeți pe cip ROM, două temporizatoare, un port serial și patru porturi de 8 biți. Microcontrolerul 8052 este o extensie a microcontrolerului. Tabelul de mai jos arată comparația a 8051 membri ai familiei.
Caracteristică |
8051 |
8052 |
ROM (în octeți) |
4K |
8K |
RAM (octeți) |
128 |
256 |
Cronometre |
2 |
3 |
Pinii I / O |
32 |
32 |
Port serial |
1 |
1 |
Surse de întrerupere |
6 |
8 |
16x2 LCD:
16 * 2 LCD este un ecran utilizat pe scară largă pentru aplicații încorporate. Iată o scurtă explicație despre pini și funcționarea afișajului LCD 16 * 2. Există două registre foarte importante în interiorul ecranului LCD. Sunt registre de date și registre de comenzi. Registrul de comandă este utilizat pentru a trimite comenzi precum afișarea clară, cursorul acasă etc., registrul de date este utilizat pentru a trimite date care urmează să fie afișate pe ecranul LCD 16 * 2. Tabelul de mai jos prezintă descrierea pinului a 16 * 2 lcd.
Pin |
Simbol |
I / O |
Descriere |
1 |
Vss |
- |
Sol |
2 |
Vdd |
- |
Alimentare + 5V |
3 |
Vee |
- |
Alimentare pentru controlul contrastului |
4 |
RS |
Eu |
RS = 0 pentru registrul de comandă, RS = 1 pentru registrul de date |
5 |
RW |
Eu |
R / W = 0 pentru scriere, R / W = 1 pentru citire |
6 |
E |
I / O |
Permite |
7 |
D0 |
I / O |
Magistrală de date pe 8 biți (LSB) |
8 |
D1 |
I / O |
Magistrală de date pe 8 biți |
9 |
D2 |
I / O |
Magistrală de date pe 8 biți |
10 |
D3 |
I / O |
Magistrală de date pe 8 biți |
11 |
D4 |
I / O |
Magistrală de date pe 8 biți |
12 |
D5 |
I / O |
Magistrală de date pe 8 biți |
13 |
D6 |
I / O |
Magistrală de date pe 8 biți |
14 |
D7 |
I / O |
Magistrală de date pe 8 biți (MSB) |
15 |
A |
- |
+ 5V pentru iluminare din spate |
16 |
K |
- |
Sol |
Tabelul de mai jos prezintă codurile de comandă LCD utilizate frecvent.
Cod (hex) |
Descriere |
01 |
Ștergeți ecranul de afișare |
06 |
Cursor de incrementare (schimbare dreapta) |
0A |
Afișare dezactivată, cursor activat |
0C |
Afișare activată, cursor oprit |
0F |
Afișarea este activată, cursorul clipește |
80 |
Forțați cursorul la începutul primei linii |
C0 |
Forțați cursorul să înceapă a doua linie |
38 |
2 linii și 5 * 7 matrice |
ADC0804 IC:
ADC0804 IC este o paralelă ADC de 8 biți în familia seriei ADC0800 de la National Semiconductor. Funcționează cu +5 volți și are o rezoluție de 8 biți. Mărimea pasului și gama Vin variază pentru diferite valori ale Vref / 2. Tabelul de mai jos arată relația dintre Vref / 2 și gama Vin.
Vref / 2 (V) |
Vin (V) |
Dimensiunea pasului (mV) |
deschis |
De la 0 la 5 |
19.53 |
2.0 |
De la 0 la 4 |
15.62 |
1.5 |
De la 0 la 3 |
11,71 |
1.28 |
De la 0 la 2,56 |
10 |
În cazul nostru, Vref / 2 este conectat la 1,28 volți, deci dimensiunea pasului este de 10mV. Pentru ADC0804, mărimea pasului este calculată ca (2 * Vref / 2) / 256.
Următoarea formulă este utilizată pentru a calcula tensiunea de ieșire:
Dout = dimensiunea Vin / pas
În cazul în care Dout este ieșirea digitală a datelor în zecimal, Vin = tensiunea de intrare analogică și mărimea pasului (rezoluția) este cea mai mică modificare. Aflați mai multe despre ADC0804 aici, verificați și interfața ADC0808 cu 8051.
Senzor de temperatură LM35:
LM35 este un senzor de temperatură a cărui tensiune de ieșire este liniar proporțională cu temperatura Celsius. LM35 vine deja calibrat, prin urmare nu necesită calibrare externă. Emite 10mV pentru fiecare grad de temperatură Celsius.
Senzorul LM35 produce tensiune corespunzătoare temperaturii. Această tensiune este convertită în digital (de la 0 la 256) de către ADC0804 și este alimentată la 8051 microcontroler. Microcontrolerul 8051 convertește această valoare digitală în temperatură în grade Celsius. Apoi, această temperatură este convertită în formă ascii, care este potrivită pentru afișare. Aceste valori ascii sunt alimentate la 16 * 2 lcd, care afișează temperatura pe ecranul său. Acest proces se repetă după intervalul specificat.
Mai jos este imaginea de configurare pentru termometrul digital LM35 folosind 8051:
Aici puteți găsi toate termometrele digitale bazate pe LM35.
Explicarea codului:
Programul complet C pentru acest termometru digital care utilizează LM35 este dat la sfârșitul acestui proiect. Codul este împărțit în mici bucăți semnificative și explicat mai jos.
Pentru interfața LCD 16 * 2 cu microcontrolerul 8051, trebuie să definim pinii pe care 16 * 2 lcd este conectat la microcontrolerul 8051. Pinul RS de 16 * 2 lcd este conectat la P2.7, pinul RW de 16 * 2 lcd este conectat la P2.6 și pinul E de 16 * 2 lcd este conectat la P2.5. Pinii de date sunt conectați la portul 0 al microcontrolerului 8051.
sbit rs = P2 ^ 7; // Înregistrare Select (RS) pin de 16 * 2 lcd sbit rw = P2 ^ 6; // Citire / Scriere (RW) pin de 16 * 2 lcd sbit en = P2 ^ 5; // Activați pinul (E) de 16 * 2 lcd
În mod similar, pentru interfața ADC0804 cu microcontrolerul 8051, trebuie să definim pinii pe care ADC0804 este conectat la microcontrolerul 8051. Pinul RD al ADC0804 este conectat la P3.0, pinul WR al ADC0804 este conectat la P3.1 și pinul INTR al ADC0804 este conectat la P3.2. Pinii de date sunt conectați la portul 1 al microcontrolerului 8051.
sbit rd_adc = P3 ^ 0; // Citiți (RD) pinul ADC0804 sbit wr_adc = P3 ^ 1; // Scrieți (WR) pinul ADC0804 sbit intr_adc = P3 ^ 2; // Întrerupeți pinul (INTR) al ADC0804
În continuare trebuie să definim câteva funcții care sunt utilizate în program. Funcția de întârziere este utilizată pentru a crea întârziere specificată, funcția c mdwrt este utilizată pentru a trimite comenzi către afișajul 16 * 2 lcd, funcția datawrt este utilizată pentru a trimite date către afișajul 16 * 2 lcd și funcția convert_display este utilizată pentru a converti datele ADC în temperatură și pentru a-l afișa pe ecran LCD de 16 * 2.
întârziere nulă (int semnat); // funcție pentru crearea întârzierii void cmdwrt (caracter nesemnat); // funcție pentru trimiterea de comenzi la 16 * 2 afișaj lcd void datawrt (caractere nesemnate); // funcție pentru trimiterea de date la 16 * 2 afișaj LCD void convert_display (caractere nesemnate); // funcție pentru conversia valorii ADC la temperatură și afișarea acesteia pe un ecran LCD de 16 * 2
În partea de jos a codului, trimitem comenzi către 16 * 2 lcd. Comenzi precum afișarea clară, cursorul incremental, forțarea cursorului la începutul primei linii sunt trimise pe afișaj 16 * 2 lcd unul câte unul după o anumită întârziere.
for (i = 0; i <5; i ++) // trimite comenzi către 16 * 2 lcd afișează câte o comandă la un moment dat {cmdwrt (cmd); // apel funcțional pentru a trimite comenzi la 16 * 2 întârziere afișaj LCD (1); }
În această parte a codului, trimitem date către 16 * 2 lcd. Datele care vor fi afișate pe afișajul LCD 16 * 2 sunt trimise pentru a fi afișate unul câte unul după o anumită întârziere.
for (i = 0; i <12; i ++) // trimite date la 16 * 2 lcd afișează câte un caracter odată {datawrt (data1); // apel funcțional pentru a trimite date la 16 * 2 întârziere afișaj LCD (1); } În această parte a codului convertim tensiunea analogică produsă de senzorul LM35 în date digitale și apoi este convertită la temperatură și afișată pe afișaj LCD 16 * 2. Pentru ca ADC0804 să înceapă conversia, trebuie să trimitem un impuls scăzut la mare pe pinul WR al ADC0804, apoi trebuie să așteptăm sfârșitul conversiei. INTR devine scăzut la sfârșitul conversiei. Odată ce INTR devine redus, RD este redus pentru a copia datele digitale în portul 0 al microcontrolerului 8051. După o întârziere specificată, începe următorul ciclu. Acest proces se repetă pentru totdeauna.
while (1) // repetați pentru totdeauna {wr_adc = 0; // trimite puls LOW la HIGH pe întârziere pin WR (1); wr_adc = 1; while (intr_adc == 1); // așteptați sfârșitul conversiei rd_adc = 0; // faceți RD = 0 pentru a citi datele din valoarea ADC0804 = P1; // copiați datele ADC convert_display (valoare); // apel funcțional pentru a converti datele ADC în temperatură și a le afișa pe 16 * 2 lcd display delay (1000); // intervalul dintre fiecare ciclu rd_adc = 1; // faceți RD = 1 pentru următorul ciclu}
În partea de jos a codului, trimitem comenzi către un ecran LCD de 16 * 2. Comanda este copiată în portul 0 al microcontrolerului 8051. RS este redus pentru scrierea comenzii. RW este redus pentru operația de scriere. Pulsul de mare la mic se aplică pe pinul de activare (E) pentru a începe operația de scriere a comenzii.
void cmdwrt (caracter nesemnat x) {P0 = x; // trimiteți comanda la Portul 0 la care este conectat 16 * 2 lcd rs = 0; // faceți RS = 0 pentru comanda rw = 0; // faceți RW = 0 pentru operația de scriere en = 1; // trimiteți un impuls HIGH la LOW pe pinul Enable (E) pentru a începe întârzierea operației de scriere a comenzilor (1); ro = 0; }
În această parte a codului, trimitem date către un ecran LCD de 16 * 2. Datele sunt copiate în portul 0 al microcontrolerului 8051. RS este ridicat pentru scrierea comenzilor. RW este redus pentru operația de scriere. Pulsul de mare la scăzut este aplicat pe pinul de activare (E) pentru a începe operația de scriere a datelor.
void datawrt (caracter nesemnat y) {P0 = y; // trimite datele la Portul 0 la care este conectat 16 * 2 lcd rs = 1; // faceți RS = 1 pentru comanda rw = 0; // faceți RW = 0 pentru operația de scriere en = 1; // trimiteți un impuls HIGH la LOW pe pinul Enable (E) pentru a începe întârzierea operației de scriere a datelor (1); ro = 0; }
În această parte a codului, convertim datele digitale în temperatură și le afișăm pe un ecran LCD de 16 * 2.
void convert_display (valoare de caracter nesemnat) {unsigned char x1, x2, x3; cmdwrt (0xc6); // comanda pentru a seta cursorul la poziția a 6-a a 2-a linie pe 16 * 2 lcd x1 = (valoare / 10); // împarte valoarea la 10 și stochează coeficientul în variabila x1 x1 = x1 + (0x30); // convertiți variabila x1 în ascii adăugând 0x30 x2 = valoarea% 10; // împarte valoarea la 10 și stochează restul în variabila x2 x2 = x2 + (0x30); // convertiți variabila x2 în ascii adăugând 0x30 x3 = 0xDF; // valoarea ascii a gradului (°) simbolul datawrt (x1); // afișarea temperaturii pe 16 * 2 lcd display datawrt (x2); datawrt (x3); datawrt („C”); }
De asemenea, verificați alte termometre care utilizează LM35 cu diferite microcontrolere:
- Termometru digital folosind Arduino și LM35
- Măsurarea temperaturii utilizând microcontrolerul LM35 și AVR
- Măsurarea temperaturii camerei cu Raspberry Pi