- Komponenter som krävs:
- Kretsschema:
- Mät temperatur med LM35 med 8051:
- 16x2 LCD:
- ADC0804 IC:
- LM35 temperatursensor:
- Kodförklaring:
Ibland har människor svårt att läsa temperaturen från den analoga termometern på grund av fluktuationer. Så här ska vi bygga en enkel digital termometer med 8051 mikrokontroller där LM35-sensorn används för att mäta temperaturen. Vi har också använt LM35 för att bygga digital termometer med Arduino, NodeMCU, PIC, Raspberry Pi och andra mikrokontroller.
Detta projekt kommer också att fungera som ett korrekt gränssnitt mellan ADC0804 och 8051 och 16 * 2 LCD med 8051 mikrokontroller.
Komponenter som krävs:
- 8051 utvecklingskort
- ADC0804-kort
- 16 * 2 LCD-skärm
- LM35-sensor
- Potentiometer
- Bygeltrådar
Kretsschema:
Kretsschema för Digital termometerkrets med LM35 ges nedan:
Mät temperatur med LM35 med 8051:
8051 mikrokontroller är en 8-bitars mikrokontroller som har 128 byte på chip-RAM, 4K byte på chip-ROM, två timers, en seriell port och fyra 8bit-portar. 8052 mikrokontroller är en förlängning av mikrokontroller. Tabellen nedan visar jämförelsen mellan 8051 familjemedlemmar.
Funktion |
8051 |
8052 |
ROM (i byte) |
4K |
8 K |
RAM (byte) |
128 |
256 |
Timers |
2 |
3 |
I / O-stift |
32 |
32 |
Serieport |
1 |
1 |
Avbryt källor |
6 |
8 |
16x2 LCD:
16 * 2 LCD är en mycket använd skärm för inbäddade applikationer. Här är den korta förklaringen om stift och bearbetning av 16 * 2 LCD-display. Det finns två mycket viktiga register inuti LCD-skärmen. De är dataregister och kommandoregister. Kommandoregister används för att skicka kommandon som tydlig visning, markör hemma etc., dataregister används för att skicka data som ska visas på 16 * 2 LCD. Nedanstående tabell visar stiftbeskrivningen på 16 * 2 lcd.
Stift |
Symbol |
I / O |
Beskrivning |
1 |
Vss |
- |
Jord |
2 |
Vdd |
- |
+ 5V strömförsörjning |
3 |
Vee |
- |
Strömförsörjning för att kontrollera kontrasten |
4 |
RS |
Jag |
RS = 0 för kommandoregister, RS = 1 för dataregister |
5 |
RW |
Jag |
R / W = 0 för skriv, R / W = 1 för läsning |
6 |
E |
I / O |
Gör det möjligt |
7 |
D0 |
I / O |
8-bitars databuss (LSB) |
8 |
D1 |
I / O |
8-bitars databuss |
9 |
D2 |
I / O |
8-bitars databuss |
10 |
D3 |
I / O |
8-bitars databuss |
11 |
D4 |
I / O |
8-bitars databuss |
12 |
D5 |
I / O |
8-bitars databuss |
13 |
D6 |
I / O |
8-bitars databuss |
14 |
D7 |
I / O |
8-bitars databuss (MSB) |
15 |
A |
- |
+ 5V för bakgrundsbelysning |
16 |
K |
- |
Jord |
Tabellen nedan visar ofta använda LCD-kommandokoder.
Kod (hex) |
Beskrivning |
01 |
Rensa skärmen |
06 |
Stegmarkör (höger skift) |
0A |
Display av, markör på |
0C |
Display på, markör av |
0F |
Display på, markören blinkar |
80 |
Tvinga markören till början av en st line |
C0 |
Tvinga markören till början av andra raden |
38 |
2 rader och 5 * 7 matris |
ADC0804 IC:
Den ADC0804 IC är en 8-bitars parallell ADC i familjen av ADC0800 serien från National Semiconductor. Den fungerar med +5 volt och har en upplösning på 8 bitar. Stegstorleken och Vin-intervallet varierar för olika värden för Vref / 2. Tabellen nedan visar förhållandet mellan Vref / 2 och Vin-intervallet.
Vref / 2 (V) |
Vin (V) |
Stegstorlek (mV) |
öppet |
0 till 5 |
19.53 |
2,0 |
0 till 4 |
15,62 |
1.5 |
0 till 3 |
11,71 |
1.28 |
0 till 2,56 |
10 |
I vårt fall är Vref / 2 ansluten till 1,28 volt, så stegstorleken är 10mV. För ADC0804 beräknas stegstorleken som (2 * Vref / 2) / 256.
Följande formel används för att beräkna utspänningen:
Dout = Vin / stegstorlek
Där Dout är digital datautgång i decimal är Vin = analog ingångsspänning och stegstorlek (upplösning) den minsta förändringen. Läs mer om ADC0804 här, kontrollera även gränssnittet mellan ADC0808 och 8051.
LM35 temperatursensor:
LM35 är en temperatursensor vars utspänning är linjärt proportionell mot Celsius temperatur. LM35 är redan kalibrerad och kräver därför ingen extern kalibrering. Den matar ut 10 mV för varje grad av Celsius temperatur.
LM35-sensorn producerar spänning som motsvarar temperaturen. Denna spänning omvandlas till digital (0 till 256) av ADC0804 och matas till 8051 mikrokontroller. 8051 mikrokontroller omvandlar detta digitala värde till temperatur i grader Celsius. Därefter omvandlas denna temperatur till ascii-form som är lämplig för visning. Dessa ascii-värden matas till 16 * 2 lcd som visar temperaturen på skärmen. Denna process upprepas efter angivet intervall.
Nedan är installationsbilden för LM35 Digital Thermometer med 8051:
Du hittar alla LM35-baserade digitala termometrar här.
Kodförklaring:
Det kompletta C-programmet för denna digitala termometer med LM35 ges i slutet av detta projekt. Koden är uppdelad i små meningsfulla bitar och förklaras nedan.
För 16 * 2 LCD-gränssnitt med 8051 mikrokontroller måste vi definiera stift på vilka 16 * 2 LCD är ansluten till 8051 mikrokontroller. RS-stift på 16 * 2 lcd är ansluten till P2.7, RW-stift på 16 * 2 lcd är ansluten till P2.6 och E-stift på 16 * 2 lcd är ansluten till P2.5. Datapinnar är anslutna till port 0 på 8051 mikrokontroller.
sbit rs = P2 ^ 7; // Register Välj (RS) stift med 16 * 2 lcd sbit rw = P2 ^ 6; // Läs / skriv (RW) stift på 16 * 2 lcd sbit en = P2 ^ 5; // Aktivera (E) stift på 16 * 2 lcd
På samma sätt måste vi för ADC0804-gränssnitt med 8051- mikrokontroller definiera stift på vilka ADC0804 är ansluten till 8051-mikrokontroller. RD-stift på ADC0804 är anslutet till P3.0, WR-stift på ADC0804 är anslutet till P3.1 och INTR-stift på ADC0804 är anslutet till P3.2. Datapinnar är anslutna till port 1 på 8051 mikrokontroller.
sbit rd_adc = P3 ^ 0; // Läs (RD) stift av ADC0804 sbit wr_adc = P3 ^ 1; // Skriv (WR) stift av ADC0804 sbit intr_adc = P3 ^ 2; // Interrupt (INTR) -stift på ADC0804
Därefter måste vi definiera några funktioner som används i programmet. Fördröjningsfunktion används för att skapa specificerad tidsfördröjning, c mdwrt- funktion används för att skicka kommandon till 16 * 2 LCD-skärm, datawrt- funktion används för att skicka data till 16 * 2 LCD-display och convert_display- funktionen används för att konvertera ADC-data till temperatur och för att visa den på 16 * 2 LCD-skärmar.
ogiltig fördröjning (osignerad int); // funktion för att skapa fördröjning tomrum cmdwrt (osignerad char); // funktion för att skicka kommandon till 16 * 2 lcd display void datawrt (osignerad char); // funktion för att skicka data till 16 * 2 LCD-skärm ogiltigt convert_display (osignerad char); // funktion för att konvertera ADC-värde till temperatur och visa det på 16 * 2 LCD-skärm
Nedanför en del av koden skickar vi kommandon till 16 * 2 lcd. Kommandon såsom tydlig display, inkrement markören, tvinga markören till början av en st linje sänds till 16 * 2 LCD display en efter en efter en viss specificerad tidsfördröjning.
för (i = 0; i <5; i ++) // skicka kommandon till 16 * 2 lcd visa ett kommando i taget {cmdwrt (cmd); // funktionsanrop för att skicka kommandon till 16 * 2 LCD-displayfördröjning (1); }
I den här delen av koden skickar vi data till 16 * 2 lcd. Data som ska visas på 16 * 2 LCD-skärmar skickas för att visas en efter en efter en viss tidsfördröjning.
för (i = 0; i <12; i ++) // skicka data till 16 * 2 LCD visa ett tecken i taget {datawrt (data1); // funktionsanrop för att skicka data till 16 * 2 LCD-displayfördröjning (1); } I denna del av koden konverterar vi den analoga spänningen som produceras av LM35-sensorn till digitala data och sedan omvandlas den till temperatur och visas på 16 * 2 LCD-skärm. För att ADC0804 ska starta omvandlingen måste vi skicka en låg till hög puls på WR-stift av ADC0804, då måste vi vänta på att konverteringen är slut. INTR blir låg i slutet av konverteringen. När INTR blir låg, görs RD låg för att kopiera digitala data till port 0 på 8051 mikrokontroller. Efter en viss tidsfördröjning startar nästa cykel. Denna process upprepas för alltid.
medan (1) // upprepas för alltid {wr_adc = 0; // skicka LÅG till HÖG puls på WR-stiftfördröjning (1); wr_adc = 1; medan (intr_adc == 1); // vänta på slutet av omvandlingen rd_adc = 0; // gör RD = 0 för att läsa data från ADC0804-värde = P1; // kopiera ADC-data convert_display (värde); // funktionsanrop för att konvertera ADC-data till temperatur och visa den vid 16 * 2 LCD-displayfördröjning (1000); // intervall mellan varje cykel rd_adc = 1; // gör RD = 1 för nästa cykel}
Nedanför en del av koden skickar vi kommandon till 16 * 2 LCD-skärm. Kommandot kopieras till port 0 på 8051 mikrokontroller. RS är låg för kommandoskrivning. RW görs lågt för skrivoperation. Hög till låg puls appliceras på aktiveringsstift (E) för att starta kommandoskrivning.
ogiltig cmdwrt (osignerad char x) {P0 = x; // skicka kommandot till Port 0 där 16 * 2 lcd är ansluten rs = 0; // gör RS = 0 för kommando rw = 0; // gör RW = 0 för skrivoperation en = 1; // skicka en HÖG till LÅG puls på Aktivera (E) stift för att starta fördröjning av kommandoskrivning (1); en = 0; }
I den här delen av koden skickar vi data till 16 * 2 LCD-skärm. Uppgifterna kopieras till port 0 på 8051 mikrokontroller. RS görs högt för kommandoskrivning. RW görs lågt för skrivoperation. Hög till låg puls appliceras på aktiveringsstift (E) för att starta dataskrivning.
ogiltig datawrt (osignerad char y) {P0 = y; // skicka data till Port 0 där 16 * 2 lcd är ansluten rs = 1; // gör RS = 1 för kommando rw = 0; // gör RW = 0 för skrivoperation en = 1; // skicka en HÖG till LÅG puls på Aktivera (E) stift för att starta fördröjning av dataskrivning (1); en = 0; }
I denna del av koden konverterar vi digitala data till temperatur och visar den på 16 * 2 LCD-skärm.
ogiltig convert_display (osignerat char värde) {unsigned char x1, x2, x3; cmdwrt (0xc6); // kommando för att ställa in markören till 6: e position på andra raden på 16 * 2 lcd x1 = (värde / 10); // dela värdet med 10 och lagra kvoten i variabeln x1 x1 = x1 + (0x30); // konvertera variabel x1 till ascii genom att lägga till 0x30 x2 = värde% 10; // dela värdet med 10 och lagra resten i variabeln x2 x2 = x2 + (0x30); // konvertera variabel x2 till ascii genom att lägga till 0x30 x3 = 0xDF; // ascii-värde för grad (°) symbol datawrt (x1); // displaytemperatur på 16 * 2 lcd-displaydatawrt (x2); datawrt (x3); datawrt ('C'); }
Kontrollera även andra termometrar med LM35 med olika mikrokontroller:
- Digital termometer med Arduino och LM35
- Temperaturmätning med LM35 och AVR Microcontroller
- Rumstemperaturmätning med Raspberry Pi