- Potrebne komponente:
- Shema vezja:
- Merjenje temperature z LM35 z uporabo 8051:
- LCD 16x2:
- ADC0804 IC:
- LM35 Temperaturni senzor:
- Razlaga kode:
Včasih ljudje zaradi nihanja težko odčitajo temperaturo z analognega termometra. Tu bomo torej izdelali preprost digitalni termometer z uporabo mikrokrmilnika 8051, v katerem se za merjenje temperature uporablja senzor LM35. LM35 smo uporabili tudi za izdelavo digitalnega termometra z uporabo Arduino, NodeMCU, PIC, Raspberry Pi in drugih mikrokrmilnikov.
Ta projekt bo služil tudi kot pravilno povezovanje ADC0804 z 8051 in 16 * 2 LCD z 8051 mikrokrmilnikom.
Potrebne komponente:
- 8051 razvojna plošča
- Plošča ADC0804
- 16 * 2 LCD zaslon
- Senzor LM35
- Potenciometer
- Jumper žice
Shema vezja:
Shema vezja za vezje digitalnega termometra z uporabo LM35 je podana spodaj:
Merjenje temperature z LM35 z uporabo 8051:
8051 mikrokrmilnik je 8-bitni mikrokrmilnik, ki ima 128 bajtov čipov RAM-a, 4K bajtov čipa ROM, dva časovnika, eno serijsko vrata in štiri 8-bitna vrata. 8052 mikrokrmilnik je podaljšek mikrokrmilnika. Spodnja tabela prikazuje primerjavo 8051 družinskih članov.
Značilnost |
8051 |
8052 |
ROM (v bajtih) |
4K |
8K |
RAM (bajti) |
128 |
256 |
Časovniki |
2. |
3. |
I / O zatiči |
32 |
32 |
Zaporedna vrata |
1. |
1. |
Prekinite vire |
6. |
8. |
LCD 16x2:
16 * 2 LCD je široko uporabljen zaslon za vdelane aplikacije. Tu je kratka razlaga o zatičih in delovanju 16 * 2 LCD zaslona. Znotraj LCD-ja sta dva zelo pomembna registra. So register podatkov in register ukazov. Ukazni register se uporablja za pošiljanje ukazov, kot so jasen prikaz, kurzor doma itd., Podatkovni register pa za pošiljanje podatkov, ki bodo prikazani na 16 * 2 LCD. Spodnja tabela prikazuje pin opis 16 * 2 lcd.
Pin |
Simbol |
V / I |
Opis |
1. |
Vss |
- |
Tla |
2. |
Vdd |
- |
+ 5V napajalnik |
3. |
Vee |
- |
Napajanje za nadzor kontrasta |
4. |
RS |
jaz |
RS = 0 za ukazni register, RS = 1 za podatkovni register |
5. |
RW |
jaz |
R / W = 0 za pisanje, R / W = 1 za branje |
6. |
E |
V / I |
Omogoči |
7. |
D0 |
V / I |
8-bitno podatkovno vodilo (LSB) |
8. |
D1 |
V / I |
8-bitno podatkovno vodilo |
9. |
D2 |
V / I |
8-bitno podatkovno vodilo |
10. |
D3 |
V / I |
8-bitno podatkovno vodilo |
11. |
D4 |
V / I |
8-bitno podatkovno vodilo |
12. |
D5 |
V / I |
8-bitno podatkovno vodilo |
13. |
D6 |
V / I |
8-bitno podatkovno vodilo |
14. |
D7 |
V / I |
8-bitno podatkovno vodilo (MSB) |
15. |
A |
- |
+ 5V za osvetlitev ozadja |
16. |
K |
- |
Tla |
Spodnja tabela prikazuje pogosto uporabljene ukazne kode LCD.
Koda (šestnajstiška) |
Opis |
01 |
Čist zaslon |
06 |
Povečaj kurzor (desni premik) |
0A |
Zaslon izklopljen, kurzor vklopljen |
0C |
Zaslon vklopljen, kurzor izklopljen |
0F |
Zaslon vklopljen, kurzor utripa |
80 |
Premaknite kazalko na začetek prve vrstice |
C0 |
Premaknite kazalko na začetek 2. vrstice |
38 |
2 vrstici in matrica 5 * 7 |
ADC0804 IC:
ADC0804 IC je 8-bitni vzporedni ADC v družini serije ADC0800 od National Semiconductor. Deluje z +5 voltov in ima ločljivost 8 bitov. Velikost koraka in obseg Vin se razlikujeta za različne vrednosti Vref / 2. Spodnja tabela prikazuje razmerje med Vref / 2 in območjem Vin.
Vref / 2 (V) |
Vin (V) |
Velikost koraka (mV) |
odprto |
Od 0 do 5 |
19.53 |
2.0 |
Od 0 do 4 |
15.62 |
1.5 |
0 do 3 |
11.71 |
1.28 |
Od 0 do 2,56 |
10. |
V našem primeru je Vref / 2 priključen na 1,28 volta, zato je velikost koraka 10mV. Za ADC0804 se velikost koraka izračuna kot (2 * Vref / 2) / 256.
Za izračun izhodne napetosti se uporablja naslednja formula:
Dout = Vin / velikost koraka
Kjer je Dout digitalni izhod podatkov v decimalnih številkah, je Vin = analogna vhodna napetost in velikost koraka (ločljivost) najmanjša sprememba. Več o ADC0804 preberite tukaj, preverite tudi povezavo ADC0808 z 8051.
LM35 Temperaturni senzor:
LM35 je temperaturni senzor, katerega izhodna napetost je linearno sorazmerna s temperaturo Celzija. LM35 je že kalibriran, zato ne zahteva zunanje kalibracije. Oddaja 10 mV za vsako stopinjo Celzija.
Senzor LM35 proizvaja napetost, ki ustreza temperaturi. ADC0804 pretvori to napetost v digitalno (od 0 do 256) in jo napaja na mikrokrmilnik 8051. Mikrokrmilnik 8051 pretvori to digitalno vrednost v temperaturo v stopinjah Celzija. Nato se ta temperatura pretvori v ascii obliko, ki je primerna za prikaz. Te vrednosti ascii so podane na 16 * 2 lcd, ki prikazuje temperaturo na svojem zaslonu. Ta postopek se ponovi po določenem intervalu.
Spodaj je nastavitvena slika za digitalni termometer LM35 z uporabo 8051:
Vse digitalne termometre na osnovi LM35 najdete tukaj.
Razlaga kode:
Celoten program C za ta digitalni termometer z uporabo LM35 je podan na koncu tega projekta. Koda je razdeljena na majhne pomembne koščke in je razložena spodaj.
Za povezavo LCD 16 * 2 z mikrokrmilnikom 8051 moramo določiti nožice, na katere je 16 * 2 lcd priključen na mikrokrmilnik 8051. RS pin 16 * 2 lcd je povezan s P2.7, RW pin 16 * 2 lcd je povezan s P2.6 in E pin 16 * 2 lcd je povezan s P2.5. Podatkovni zatiči so povezani na vrata 0 mikrokrmilnika 8051.
sbit rs = P2 ^ 7; // Registriraj (RS) pin 16 * 2 lcd sbit rw = P2 ^ 6; // branje / pisanje (RW) zatič 16 * 2 lcd sbit en = P2 ^ 5; // Omogoči (E) zatič 16 * 2 lcd
Podobno moramo za vmesnik ADC0804 z mikrokrmilnikom 8051 določiti nožice, na katerih je ADC0804 povezan z mikrokrmilnikom 8051. RD pin ADC0804 je povezan s P3.0, WR pin ADC0804 je povezan s P3.1 in INTR pin ADC0804 je povezan s P3.2. Podatkovni zatiči so priključeni na vrata 1 mikrokrmilnika 8051.
sbit rd_adc = P3 ^ 0; // Preberi (RD) zatič ADC0804 sbit wr_adc = P3 ^ 1; // Zapiši (WR) zatič ADC0804 sbit intr_adc = P3 ^ 2; // Prekinitveni (INTR) zatič ADC0804
Nato moramo definirati nekatere funkcije, ki se uporabljajo v programu. Funkcija zakasnitve se uporablja za ustvarjanje določene časovne zakasnitve, funkcija c mdwrt se uporablja za pošiljanje ukazov na 16 * 2 lcd zaslon, funkcija datawrt se uporablja za pošiljanje podatkov na 16 * 2 lcd zaslon, funkcija convert_display pa za pretvorbo podatkov ADC v temperaturo in ga prikazati na 16 * 2 lcd zaslonu.
zamuda pred praznino (nepodpisan int); // funkcija za ustvarjanje zamude void cmdwrt (nepodpisani znak); // funkcija za pošiljanje ukazov na 16 * 2 lcd display void datawrt (unsigned char); // funkcija za pošiljanje podatkov na 16 * 2 lcd display void convert_display (nepodpisan znak); // funkcija za pretvorbo vrednosti ADC v temperaturo in prikaz na 16 * 2 lcd zaslonu
V spodnjem delu kode pošiljamo ukaze na 16 * 2 lcd. Ukazi, kot so jasen prikaz, prirastek kurzorja, prisili kazalko na začetek prve vrstice, se po določenem časovnem zamiku pošljejo na zaslon 16 * 2 lcd enega za drugim.
for (i = 0; i <5; i ++) // pošlji ukaze na 16 * 2 lcd prikaže po en ukaz {cmdwrt (cmd); // funkcijski klic za pošiljanje ukazov na 16 * 2 lcd display delay (1); }
V tem delu kode podatke pošiljamo na 16 * 2 lcd. Podatki, ki se prikažejo na 16 * 2 lcd zaslonu, se po določenem časovnem zamiku pošljejo za prikaz enega po enega.
for (i = 0; i <12; i ++) // pošiljanje podatkov na 16 * 2 lcd prikaže en znak naenkrat {datawrt (data1); // funkcijski klic za pošiljanje podatkov na 16 * 2 lcd display delay (1); } V tem delu kode pretvorimo analogno napetost, ki jo proizvaja senzor LM35, v digitalne podatke, nato pa jo pretvorimo v temperaturo in prikažemo na 16 * 2 lcd zaslonu. Da ADC0804 začne pretvorbo, moramo poslati nizek do visok impulz na WR pin ADC0804, nato moramo počakati na konec pretvorbe. INTR postane nizek na koncu pretvorbe. Ko je vrednost INTR nizka, je RD nizka za kopiranje digitalnih podatkov v vrata 0 mikrokrmilnika 8051. Po določeni časovni zakasnitvi se začne naslednji cikel. Ta postopek se ponavlja za vedno.
while (1) // ponavljamo večno {wr_adc = 0; // pošljemo LOW do HIGH impulz pri zakasnitvi zatiča WR (1); wr_adc = 1; medtem ko (intr_adc == 1); // čakamo na konec pretvorbe rd_adc = 0; // naredimo RD = 0 za branje podatkov iz ADC0804 value = P1; // kopiranje ADC podatkov convert_display (vrednost); // funkcijski klic za pretvorbo ADC podatkov v temperaturo in prikaz na 16 * 2 lcd display delay (1000); // interval med posameznimi cikli rd_adc = 1; // naredimo RD = 1 za naslednji cikel}
V spodnjem delu kode pošiljamo ukaze na 16 * 2 lcd zaslon. Ukaz se kopira v vrata 0 mikrokrmilnika 8051. RS je za pisanje ukazov nizka. RW je nizka za pisanje. Visoki do nizki impulz se uporabi na zatiču (E) za zagon operacije pisanja ukaza.
void cmdwrt (nepodpisani znak x) {P0 = x; // pošljemo ukaz na vrata 0, na katera je priključen 16 * 2 lcd rs = 0; // naredimo RS = 0 za ukaz rw = 0; // naredimo RW = 0 za operacijo pisanja en = 1; // pošljemo HIGH to LOW impulz na zatiču Enable (E), da začnemo z zakasnitvijo delovanja ukaza (1); en = 0; }
V tem delu kode podatke pošiljamo na 16 * 2 lcd zaslon. Podatki se kopirajo v vrata 0 mikrokrmilnika 8051. RS je visok za pisanje ukazov. RW je nizka za pisanje. Visoki do nizki impulz se uporabi na zatiču (E) za zagon operacije zapisovanja podatkov.
void datawrt (nepodpisani znak y) {P0 = y; // podatke pošljemo na vrata 0, na katera je priključen 16 * 2 lcd rs = 1; // naredimo RS = 1 za ukaz rw = 0; // naredimo RW = 0 za operacijo pisanja en = 1; // pošljemo impulz HIGH to LOW na zatiču Enable (E), da začnemo z zamudo pri pisanju podatkov (1); en = 0; }
V tem delu kode digitalne podatke pretvarjamo v temperaturo in prikazujemo na 16 * 2 lcd zaslonu.
void convert_display (nepodpisana vrednost znaka) {nepodpisani znak x1, x2, x3; cmdwrt (0xc6); // ukaz za nastavitev kazalca na 6. mesto 2. vrstice na 16 * 2 lcd x1 = (vrednost / 10); // vrednost delimo z 10 in količnik shranimo v spremenljivko x1 x1 = x1 + (0x30); // spremenljivko x1 pretvorimo v ascii tako, da dodamo 0x30 x2 = vrednost% 10; // vrednost delimo z 10 in ostanek shranimo v spremenljivko x2 x2 = x2 + (0x30); // spremenimo spremenljivko x2 v ascii z dodajanjem 0x30 x3 = 0xDF; // ascii vrednost stopnje (°) simbola datawrt (x1); // prikaz temperature na 16 * 2 lcd display datawrt (x2); datawrt (x3); datawrt ('C'); }
Preverite tudi druge termometre z uporabo LM35 z različnimi mikrokrmilniki:
- Digitalni termometer z uporabo Arduina in LM35
- Merjenje temperature z mikrokrmilnikom LM35 in AVR
- Merjenje sobne temperature z Raspberry Pi