- Būtini komponentai:
- Grandinės schema:
- Temperatūros matavimas naudojant LM35 naudojant 8051:
- 16x2 LCD ekranas:
- ADC0804 IC:
- LM35 temperatūros jutiklis:
- Kodo paaiškinimas:
Kartais žmonėms sunku nuskaityti temperatūrą iš analoginio termometro dėl svyravimų. Taigi čia mes sukursime paprastą skaitmeninį termometrą, naudodami 8051 mikrovaldiklį, kuriame temperatūros matavimui naudojamas LM35 jutiklis. Mes taip pat naudojome LM35, kad sukurtume skaitmeninį termometrą naudodami „Arduino“, „NodeMCU“, PIC, „Raspberry Pi“ ir kitus mikrovaldiklius.
Šis projektas taip pat bus tinkamas ADC0804 sąsaja su 8051 ir 16 * 2 LCD su 8051 mikrovaldikliu.
Būtini komponentai:
- 8051 plėtros lenta
- ADC0804 plokštė
- 16 * 2 LCD ekranas
- LM35 jutiklis
- Potenciometras
- Džemperių laidai
Grandinės schema:
Žemiau pateikiama skaitmeninio termometro grandinės, naudojančios LM35, grandinės schema:
Temperatūros matavimas naudojant LM35 naudojant 8051:
8051 mikrovaldiklis yra 8 bitų mikrovaldiklis, turintis 128 baitų lusto RAM, 4K baitų lusto ROM, du laikmačius, vieną nuoseklųjį ir keturis 8 bitų prievadus. 8052 mikrovaldiklis yra mikrovaldiklio pratęsimas. Žemiau esančioje lentelėje parodytas 8051 šeimos nario palyginimas.
Funkcija |
8051 |
8052 |
ROM (baitais) |
4K |
8 tūkst |
RAM (baitai) |
128 |
256 |
Laikmačiai |
2 |
3 |
I / O kaiščiai |
32 |
32 |
Nuoseklusis prievadas |
1 |
1 |
Nutraukti šaltinius |
6 |
8 |
16x2 LCD ekranas:
16 * 2 skystųjų kristalų ekranas yra plačiai naudojamas įterptųjų programų ekranas. Čia yra trumpas paaiškinimas apie 16 * 2 skystųjų kristalų ekrano kaiščius ir veikimą. Skystųjų kristalų ekrane yra du labai svarbūs registrai. Jie yra duomenų registras ir komandų registras. Komandų registras naudojamas komandoms siųsti, pvz., Išvalyti ekraną, žymeklį namuose ir pan., Duomenų registras naudojamas duomenims, kurie turi būti rodomi 16 * 2 LCD, siųsti. Žemiau esančioje lentelėje pateikiamas 16 * 2 lcd kaiščių aprašymas.
Smeigtukas |
Simbolis |
I / O |
apibūdinimas |
1 |
Vss |
- |
Žemė |
2 |
Vdd |
- |
+ 5 V maitinimo šaltinis |
3 |
Vee |
- |
Maitinimas, skirtas kontroliuoti kontrastą |
4 |
RS |
Aš |
RS = 0 komandų registrui, RS = 1 duomenų registrui |
5 |
RW |
Aš |
R / W = 0 rašant, R / W = 1 skaitant |
6 |
E |
I / O |
Įgalinti |
7 |
D0 |
I / O |
8 bitų duomenų magistralė (LSB) |
8 |
D1 |
I / O |
8 bitų duomenų magistralė |
9 |
D2 |
I / O |
8 bitų duomenų magistralė |
10 |
D3 |
I / O |
8 bitų duomenų magistralė |
11 |
D4 |
I / O |
8 bitų duomenų magistralė |
12 |
D5 |
I / O |
8 bitų duomenų magistralė |
13 |
D6 |
I / O |
8 bitų duomenų magistralė |
14 |
D7 |
I / O |
8 bitų duomenų magistralė (MSB) |
15 |
A |
- |
+ 5 V apšvietimui |
16 |
K. |
- |
Žemė |
Žemiau esančioje lentelėje pateikiami dažnai naudojami LCD komandų kodai.
Kodas (šešiakampis) |
apibūdinimas |
01 |
Išvalyti ekraną |
06 |
Padidėjimo žymeklis (dešinysis poslinkis) |
0A |
Rodymas išjungtas, žymeklis įjungtas |
0C |
Ekranas įjungtas, žymeklis išjungtas |
0F |
Ekranas įjungtas, žymeklis mirksi |
80 |
Priversti žymeklį pradedant 1 -osios linijos |
C0 |
Priversti žymeklį pradedant 2 -osios linijos |
38 |
2 eilutės ir 5 * 7 matrica |
ADC0804 IC:
„ ADC0804 IC“ yra 8 bitų lygiagretus ADC ADC0800 serijos „National Semiconductor“ šeimoje. Jis veikia su +5 voltų įtampa ir skiria 8 bitų skiriamąją gebą. Žingsnio dydis ir Vin diapazonas skiriasi esant skirtingoms Vref / 2 vertėms. Žemiau esančioje lentelėje parodytas santykis tarp Vref / 2 ir Vin diapazono.
„Vref / 2“ (V) |
Vin (V) |
Žingsnio dydis (mV) |
atviras |
Nuo 0 iki 5 |
19.53 val |
2.0 |
Nuo 0 iki 4 |
15.62 |
1.5 |
0–3 |
11.71 |
1.28 |
Nuo 0 iki 2,56 |
10 |
Mūsų atveju „Vref / 2“ yra prijungtas prie 1,28 voltų, taigi žingsnio dydis yra 10mV. ADC0804 žingsnio dydis apskaičiuojamas kaip (2 * Vref / 2) / 256.
Išėjimo įtampai apskaičiuoti naudojama ši formulė:
Dout = Vin / žingsnio dydis
Kai „Dout“ yra skaitmeninių duomenų išvestis dešimtainiu skaičiumi, Vin = analoginė įėjimo įtampa ir žingsnio dydis (skiriamoji geba) yra mažiausias pokytis. Sužinokite daugiau apie ADC0804 čia, taip pat patikrinkite ADC0808 sąsają su 8051.
LM35 temperatūros jutiklis:
LM35 yra temperatūros jutiklis, kurio išėjimo įtampa yra tiesiškai proporcinga Celsijaus temperatūrai. LM35 yra jau sukalibruotas, todėl nereikia išorinio kalibravimo. Kiekvienam Celsijaus temperatūros laipsniui jis išleidžia 10mV.
LM35 jutiklis sukuria temperatūrą atitinkančią įtampą. ADC0804 šią įtampą paverčia skaitmenine (nuo 0 iki 256) ir ji tiekiama į 8051 mikrovaldiklį. 8051 mikrovaldiklis šią skaitmeninę vertę paverčia temperatūra Celsijaus laipsniais. Tada ši temperatūra paverčiama ascii forma, kuri yra tinkama rodyti. Šios ascii vertės perduodamos į 16 * 2 lcd, kuri ekrane rodo temperatūrą. Šis procesas kartojamas po nurodyto laiko.
Žemiau pateikiamas „ LM35“ skaitmeninio termometro, kuriame naudojamas 8051, nustatymo vaizdas :
Visus LM35 pagrindu pagamintus skaitmeninius termometrus rasite čia.
Kodo paaiškinimas:
Visa šio skaitmeninio termometro, naudojančio LM35, C programa pateikiama šio projekto pabaigoje. Kodas yra padalintas į mažus reikšmingus gabalėlius ir paaiškinamas toliau.
16 * 2 skystųjų kristalų sąsajai su 8051 mikrovaldikliu turime apibrėžti kaiščius, ant kurių 16 * 2 lcd yra prijungtas prie 8051 mikrovaldiklio. RS kaištis 16 * 2 lcd yra prijungtas prie P2.7, RW kaištis 16 * 2 lcd yra prijungtas prie P2.6 ir E kaištis 16 * 2 lcd yra prijungtas prie P2.5. Duomenų kaiščiai yra prijungti prie 8051 mikrovaldiklio 0 prievado.
sbit rs = P2 ^ 7; // „Register Select“ (RS) kaištis iš 16 * 2 lcd sbit rw = P2 ^ 6; // Skaitymo / rašymo (RW) kaištis iš 16 * 2 lcd sbit en = P2 ^ 5; // Įjungti (E) kaištį iš 16 * 2 lcd
Panašiai, ADC0804 sąsajai su 8051 mikrovaldikliu turime apibrėžti kaiščius, ant kurių ADC0804 yra prijungtas prie 8051 mikrovaldiklio. ADC0804 RD kaištis yra prijungtas prie P3.0, WR kaištis ADC0804 yra prijungtas prie P3.1, o INTR kaištis ADC0804 yra prijungtas prie P3.2. Duomenų kaiščiai yra prijungti prie 8051 mikrovaldiklio 1 prievado.
sbit rd_adc = P3 ^ 0; // Perskaitykite (RD) ADC0804 sbit smeigtuką wr_adc = P3 ^ 1; // ADC0804 sbit intr_adc = P3 ^ 2 rašymo (WR) kaištis; // ADC0804 pertraukimo (INTR) kaištis
Toliau turime apibrėžti keletą funkcijų, kurios naudojamos programoje. „Delay“ funkcija naudojama nurodytam laiko atidėjimui sukurti, „c mdwrt“ funkcija komandoms siųsti į 16 * 2 lcd ekraną, „ datawrt“ funkcija naudojama duomenims siųsti į 16 * 2 lcd ekranus ir „ convert_display“ funkcija naudojama ADC duomenims paversti temperatūra ir parodyti jį 16 * 2 LCD ekrane.
negaliojantis vėlavimas (nepasirašytas int); // funkcija sukurti atidėjimą void cmdwrt (unsigned char); // funkcija komandoms siųsti į 16 * 2 lcd ekraną „void datawrt“ (nepasirašyta simbolis); // funkcija siųsti duomenis į 16 * 2 LCD ekraną void convert_display (nepasirašyta simbolis); // funkcija konvertuoti ADC vertę į temperatūrą ir parodyti ją 16 * 2 lcd ekrane
Žemiau esančioje kodo dalyje mes siunčiame komandas į 16 * 2 lcd. Komandos pavyzdžiui, ryškus ekranas, prieaugio žymeklio, priversti žymeklį pradedant 1 -osios linijos yra siunčiami į 16 * 2 LCD ekranas po vieną po tam tikrą vėlavimo.
for (i = 0; i <5; i ++) // komandų siuntimas 16 * 2 lcd ekrane rodo vieną komandą vienu metu {cmdwrt (cmd); // funkcijos iškvietimas komandoms siųsti į 16 * 2 lcd ekrano vėlavimą (1); }
Šioje kodo dalyje duomenis siunčiame į 16 * 2 lcd. Duomenys, kurie turi būti rodomi 16 * 2 lcd ekrane, siunčiami rodyti po vieną po tam tikro nurodyto laiko.
for (i = 0; i <12; i ++) // siųsti duomenis į 16 * 2 lcd rodyti po vieną simbolį {datawrt (data1); // funkcijos iškvietimas siųsti duomenis į 16 * 2 LCD ekrano vėlavimą (1); } Šioje kodo dalyje mes konvertuojame analoginę įtampą, kurią sukuria jutiklis LM35, į skaitmeninius duomenis, tada ji paverčiama temperatūra ir rodoma 16 * 2 LCD ekrane. Kad ADC0804 pradėtų konversiją, mes turime siųsti žemą arba aukštą impulsą ant ADC0804 WR kaiščio, tada turime laukti, kol baigsis konversija. Konvertavimo pabaigoje INTR tampa mažas. Kai INTR tampa žemas, RD yra žemas, kad būtų galima nukopijuoti skaitmeninius duomenis į 8051 mikrovaldiklio 0 prievadą. Po nustatyto laiko vėlavimo prasideda kitas ciklas. Šis procesas kartojasi amžinai.
while (1) // amžinai kartoti {wr_adc = 0; // siųsti „LOW to HIGH“ impulsą į „WR pin delay“ (1); wr_adc = 1; o (intr_adc == 1); // laukti konversijos pabaigos rd_adc = 0; // padarykite RD = 0, kad nuskaitytumėte duomenis iš ADC0804 vertės = P1; // nukopijuokite ADC duomenis convert_display (reikšmė); // funkcijos iškvietimas konvertuoti ADC duomenis į temperatūrą ir parodyti juos 16 * 2 lcd ekrano vėlavime (1000); // intervalas tarp kiekvieno ciklo rd_adc = 1; // padaryti kito ciklo RD = 1}
Žemiau esančioje kodo dalyje mes siunčiame komandas į 16 * 2 lcd ekraną. Komanda nukopijuojama į 8051 mikrovaldiklio 0 prievadą. RS komandų rašymui yra mažai. RW yra žemas rašymo operacijai. Įjungimo (E) kaiščiui taikomas didelis arba mažas impulsas, kad būtų pradėta komandų rašymo operacija.
void cmdwrt (nepasirašyta char x) {P0 = x; // nusiųskite komandą 0 prievadui, kuriame yra prijungtas 16 * 2 lcd rs = 0; // komandai rw = 0 padaryti RS = 0; // padaryti RW = 0 rašymo operacijai en = 1; // siųskite HIGH to LOW impulsą įjungdami (E) kaištį, kad pradėtumėte komandų rašymo operacijos vėlavimą (1); lt = 0; }
Šioje kodo dalyje duomenis siunčiame į 16 * 2 lcd ekraną. Duomenys nukopijuojami į 8051 mikrovaldiklio 0 prievadą. RS yra aukštas komandų rašymui. RW yra žemas rašymo operacijai. Įjungimo (E) kaiščiui taikomas didelis arba mažas impulsas, kad būtų galima pradėti rašyti duomenis.
void datawrt (nepasirašyta char y) {P0 = y; // siųsti duomenis į 0 prievadą, kuriame yra prijungtas 16 * 2 lcd, rs = 1; // komandai rw = 0 padaryti RS = 1; // padaryti RW = 0 rašymo operacijai en = 1; // siųskite HIGH to LOW impulsą įjungdami (E) kaištį, kad pradėtumėte duomenų įrašymo operacijos vėlavimą (1); lt = 0; }
Šioje kodo dalyje skaitmeninius duomenis paverčiame temperatūra ir rodome 16 * 2 lcd ekrane.
void convert_display (nepasirašyta char reikšmė) {nepasirašyta char x1, x2, x3; cmdwrt (0xc6); // komanda nustatyti žymeklį į 6-ąją 2-osios eilutės padėtį 16 * 2 lcd x1 = (vertė / 10); // padalinkite vertę iš 10 ir išsaugokite koeficientą kintamajame x1 x1 = x1 + (0x30); // konvertuoti kintamąjį x1 į ascii, pridedant 0x30 x2 = reikšmė% 10; // padalinkite vertę iš 10 ir išsaugokite likusią dalį kintamajame x2 x2 = x2 + (0x30); // konvertuoti kintamąjį x2 į ascii, pridedant 0x30 x3 = 0xDF; // laipsnio (°) simbolio ascii reikšmė datawrt (x1); // ekrano temperatūra 16 * 2 lcd ekrane datawrt (x2); datawrt (x3); datawrt („C“); }
Taip pat patikrinkite kitus termometrus naudodami LM35 su skirtingais mikrovaldikliais:
- Skaitmeninis termometras naudojant „Arduino“ ir LM35
- Temperatūros matavimas naudojant LM35 ir AVR mikrovaldiklį
- Kambario temperatūros matavimas naudojant avietę Pi