- Vereiste componenten:
- Schakelschema:
- Temperatuur meten met LM35 met 8051:
- 16x2 LCD:
- ADC0804 IC:
- LM35 temperatuursensor:
- Code uitleg:
Soms vinden mensen het moeilijk om de temperatuur af te lezen van een analoge thermometer vanwege schommelingen. Dus hier gaan we een eenvoudige digitale thermometer bouwen met behulp van een 8051-microcontroller waarin de LM35-sensor wordt gebruikt voor het meten van de temperatuur. We hebben ook LM35 gebruikt om een digitale thermometer te bouwen met Arduino, NodeMCU, PIC, Raspberry Pi en andere microcontrollers.
Dit project zal ook dienen als een goede interface van ADC0804 met 8051 en 16 * 2 LCD met 8051 microcontroller.
Vereiste componenten:
- 8051 ontwikkelbord
- ADC0804-kaart
- 16 * 2 LCD-scherm
- LM35-sensor
- Potentiometer
- Doorverbindingsdraden
Schakelschema:
Het schakelschema voor het digitale thermometerschakeling met LM35 wordt hieronder gegeven:
Temperatuur meten met LM35 met 8051:
8051-microcontroller is een 8-bits microcontroller met 128 bytes op chip RAM, 4K bytes op chip ROM, twee timers, een seriële poort en vier 8-bits poorten. 8052 microcontroller is een uitbreiding van microcontroller. Onderstaande tabel toont de vergelijking van 8051 gezinsleden.
Voorzien zijn van |
8051 |
8052 |
ROM (in bytes) |
4K |
8K |
RAM (bytes) |
128 |
256 |
Timers |
2 |
3 |
I / O-pinnen |
32 |
32 |
Seriële poort |
1 |
1 |
Bronnen onderbreken |
6 |
8 |
16x2 LCD:
16 * 2 LCD is een veelgebruikt beeldscherm voor embedded toepassingen. Hier is de korte uitleg over pinnen en werking van 16 * 2 LCD-scherm. Er zijn twee zeer belangrijke registers in het LCD-scherm. Ze zijn dataregister en commandoregister. Commandoregister wordt gebruikt om commando's te verzenden zoals duidelijke weergave, cursor thuis enz., Dataregister wordt gebruikt om gegevens te verzenden die op 16 * 2 LCD-schermen moeten worden weergegeven. Onderstaande tabel toont de pin beschrijving van 16 * 2 lcd.
Pin |
Symbool |
IO |
Omschrijving |
1 |
VSS |
- |
Grond |
2 |
Vdd |
- |
+ 5V voeding |
3 |
Vee |
- |
Voeding om het contrast te regelen |
4 |
RS |
ik |
RS = 0 voor commandoregister, RS = 1 voor gegevensregister |
5 |
RW |
ik |
R / W = 0 voor schrijven, R / W = 1 voor lezen |
6 |
E. |
IO |
Inschakelen |
7 |
D0 |
IO |
8-bits databus (LSB) |
8 |
D1 |
IO |
8-bits databus |
9 |
D2 |
IO |
8-bits databus |
10 |
D3 |
IO |
8-bits databus |
11 |
D4 |
IO |
8-bits databus |
12 |
D5 |
IO |
8-bits databus |
13 |
D6 |
IO |
8-bits databus |
14 |
D7 |
IO |
8-bits databus (MSB) |
15 |
EEN |
- |
+ 5V voor achtergrondverlichting |
16 |
K |
- |
Grond |
De onderstaande tabel toont veelgebruikte LCD-opdrachtcodes.
Code (hexadecimaal) |
Omschrijving |
01 |
Helder beeldscherm |
06 |
Verhogingscursor (verschuiving naar rechts) |
0A |
Display uit, cursor aan |
0C |
Display aan, cursor uit |
0F |
Scherm aan, cursor knippert |
80 |
Dwing de cursor naar het begin van 1 st lijn |
C0 |
Forceer de cursor naar het begin van de 2 e regel |
38 |
2 regels en 5 * 7 matrix |
ADC0804 IC:
De ADC0804 IC is een 8-bit parallelle ADC in de familie van de ADC0800-serie van National Semiconductor. Het werkt met +5 volt en heeft een resolutie van 8 bits. De stapgrootte en het Vin-bereik variëren voor verschillende waarden van Vref / 2. De onderstaande tabel toont de relatie tussen Vref / 2 en Vin-bereik.
Vref / 2 (V) |
Vin (V) |
Stapgrootte (mV) |
Open |
0 tot 5 |
19.53 |
2.0 |
0 tot 4 |
15,62 |
1.5 |
0 tot 3 |
11,71 |
1,28 |
0 tot 2,56 |
10 |
In ons geval is Vref / 2 aangesloten op 1,28 volt, dus de stapgrootte is 10mV. Voor ADC0804 wordt de stapgrootte berekend als (2 * Vref / 2) / 256.
De volgende formule wordt gebruikt om de uitgangsspanning te berekenen:
Dout = Vin / stapgrootte
Waar Dout digitale gegevensuitvoer in decimalen is, is Vin = analoge ingangsspanning en stapgrootte (resolutie) de kleinste verandering. Lees hier meer over ADC0804, controleer ook de interfacing van ADC0808 met 8051.
LM35 temperatuursensor:
De LM35 is een temperatuursensor waarvan de uitgangsspanning lineair evenredig is met de temperatuur in Celsius. De LM35 is al gekalibreerd en vereist dus geen externe kalibratie. Het geeft 10mV af voor elke graad Celsius-temperatuur.
LM35-sensor produceert een spanning die overeenkomt met de temperatuur. Deze spanning wordt door ADC0804 omgezet naar digitaal (0 tot 256) en naar de 8051 microcontroller gevoerd. 8051 microcontroller zet deze digitale waarde om in temperatuur in graden Celsius. Vervolgens wordt deze temperatuur omgezet in ascii-vorm die geschikt is voor weergave. Deze ascii-waarden worden naar een 16 * 2 lcd-scherm geleid die de temperatuur op het scherm weergeeft. Dit proces wordt herhaald na een gespecificeerd interval.
Hieronder ziet u de installatieafbeelding voor LM35 Digitale Thermometer met 8051:
Hier vindt u alle op LM35 gebaseerde digitale thermometers.
Code uitleg:
Het volledige C-programma voor deze digitale thermometer met LM35 wordt aan het einde van dit project gegeven. De code is opgesplitst in kleine, betekenisvolle brokken en wordt hieronder uitgelegd.
Voor 16 * 2 LCD-interface met 8051-microcontroller, moeten we pinnen definiëren waarop 16 * 2-lcd is aangesloten op 8051-microcontroller. RS-pin van 16 * 2 lcd is verbonden met P2.7, RW-pin van 16 * 2 lcd is verbonden met P2.6 en E-pin van 16 * 2 lcd is verbonden met P2.5. Datapinnen zijn verbonden met poort 0 van 8051 microcontroller.
sbit rs = P2 ^ 7; // Registreer Selecteer (RS) pin van 16 * 2 lcd sbit rw = P2 ^ 6; // Read / Write (RW) pin van 16 * 2 lcd sbit en = P2 ^ 5; // Schakel (E) pin van 16 * 2 lcd in
Evenzo moeten we voor ADC0804-interface met 8051- microcontroller pinnen definiëren waarop ADC0804 is verbonden met 8051-microcontroller. RD-pin van ADC0804 is verbonden met P3.0, WR-pin van ADC0804 is verbonden met P3.1 en INTR-pin van ADC0804 is verbonden met P3.2. Datapinnen zijn verbonden met poort 1 van microcontroller 8051.
sbit rd_adc = P3 ^ 0; // Lees (RD) pin van ADC0804 sbit wr_adc = P3 ^ 1; // Schrijf (WR) pin van ADC0804 sbit intr_adc = P3 ^ 2; // Interrupt (INTR) pin van ADC0804
Vervolgens moeten we enkele functies definiëren die in het programma worden gebruikt. De vertragingsfunctie wordt gebruikt om een gespecificeerde tijdsvertraging te creëren, c mdwrt- functie wordt gebruikt om opdrachten naar een 16 * 2 lcd-scherm te sturen, de datawrt- functie wordt gebruikt om gegevens naar een 16 * 2 lcd-scherm te verzenden en de functie convert_display wordt gebruikt om de ADC-gegevens in temperatuur om te zetten en om het weer te geven op een 16 * 2 lcd-scherm.
ongeldige vertraging (unsigned int); // functie voor het creëren van delay void cmdwrt (unsigned char); // functie voor het verzenden van opdrachten naar 16 * 2 lcd-scherm void datawrt (unsigned char); // functie voor het verzenden van gegevens naar 16 * 2 lcd-scherm ongeldig convert_display (unsigned char); // functie voor het omzetten van ADC-waarde naar temperatuur en weergeven op 16 * 2 lcd-scherm
In het onderstaande deel van de code sturen we opdrachten naar 16 * 2 lcd. Commando's zoals leeg scherm increment cursor dwingen de cursor naar het begin van 1 ste lijn 16 * 2 LCD scherm een voor een na enige gespecificeerde vertraging worden verzonden.
for (i = 0; i <5; i ++) // stuur opdrachten naar 16 * 2 lcd-scherm één opdracht tegelijk {cmdwrt (cmd); // functieaanroep om opdrachten te verzenden naar 16 * 2 lcd-schermvertraging (1); }
In dit deel van de code sturen we gegevens naar 16 * 2 lcd. Gegevens die op een 16 * 2 lcd-scherm moeten worden weergegeven, worden één voor één naar de weergave gestuurd na een bepaalde tijdvertraging.
for (i = 0; i <12; i ++) // stuur gegevens naar 16 * 2 lcd-scherm één teken tegelijk {datawrt (data1); // functieaanroep om gegevens naar 16 * 2 lcd-schermvertraging (1) te verzenden; } In dit deel van de code zetten we de analoge spanning die wordt geproduceerd door de LM35-sensor om in digitale gegevens en vervolgens wordt deze omgezet in temperatuur en weergegeven op een 16 * 2 lcd-scherm. Om ADC0804 de conversie te laten starten, moeten we een lage naar hoge puls sturen op de WR-pin van ADC0804, daarna moeten we wachten op het einde van de conversie. INTR wordt laag aan het einde van de conversie. Zodra INTR laag wordt, wordt RD laag gemaakt om de digitale gegevens naar poort 0 van de 8051-microcontroller te kopiëren. Na een gespecificeerde vertraging begint de volgende cyclus. Dit proces herhaalt zich voor altijd.
while (1) // herhaal voor altijd {wr_adc = 0; // stuur LOW naar HIGH puls op WR pin delay (1); wr_adc = 1; while (intr_adc == 1); // wacht op einde van conversie rd_adc = 0; // maak RD = 0 om de gegevens van ADC0804 waarde = P1 te lezen; // kopieer ADC-gegevens convert_display (waarde); // functieaanroep om ADC-gegevens om te zetten in temperatuur en weer te geven op 16 * 2 lcd-schermvertraging (1000); // interval tussen elke cycli rd_adc = 1; // make RD = 1 voor de volgende cyclus}
In het onderstaande deel van de code sturen we opdrachten naar een 16 * 2 lcd-scherm. De opdracht wordt gekopieerd naar poort 0 van 8051 microcontroller. RS is laag gemaakt voor het schrijven van opdrachten. RW is laag gemaakt voor schrijfbewerking. Hoge naar lage puls wordt toegepast op de inschakel (E) -pin om de opdrachtschrijfbewerking te starten.
void cmdwrt (unsigned char x) {P0 = x; // stuur het commando naar poort 0 waarop 16 * 2 lcd is aangesloten rs = 0; // maak RS = 0 voor commando rw = 0; // make RW = 0 voor schrijfbewerking en = 1; // stuur een HIGH to LOW-puls op de Enable (E) -pin om de vertraging van de commando-schrijfbewerking te starten (1); en = 0; }
In dit deel van de code sturen we gegevens naar een 16 * 2 lcd-scherm. De gegevens worden naar poort 0 van microcontroller 8051 gekopieerd. RS wordt hoog gemaakt voor het schrijven van opdrachten. RW is laag gemaakt voor schrijfbewerking. Hoge naar lage puls wordt toegepast op de inschakel (E) -pin om de gegevensschrijfbewerking te starten.
void datawrt (unsigned char y) {P0 = y; // stuur de gegevens naar poort 0 waarop 16 * 2 lcd is aangesloten rs = 1; // maak RS = 1 voor commando rw = 0; // make RW = 0 voor schrijfbewerking en = 1; // stuur een HIGH to LOW-puls op Enable (E) -pin om de vertraging van de datawrite-bewerking te starten (1); en = 0; }
In dit deel van de code zetten we digitale gegevens om in temperatuur en geven deze weer op een 16 * 2 lcd-scherm.
void convert_display (unsigned char-waarde) {unsigned char x1, x2, x3; cmdwrt (0xc6); // commando om de cursor op de 6e positie van de 2e regel op 16 * 2 lcd x1 = (waarde / 10) te zetten; // deel de waarde door 10 en bewaar quotiënt in variabele x1 x1 = x1 + (0x30); // converteer variabele x1 naar ascii door 0x30 x2 = waarde% 10 toe te voegen; // deel de waarde door 10 en sla de rest op in variabele x2 x2 = x2 + (0x30); // converteer variabele x2 naar ascii door 0x30 x3 = 0xDF toe te voegen; // ascii waarde van graad (°) symbool datawrt (x1); // temperatuur weergeven op 16 * 2 lcd-scherm datawrt (x2); datawrt (x3); datawrt ('C'); }
Controleer ook andere thermometers met LM35 met verschillende microcontrollers:
- Digitale thermometer met Arduino en LM35
- Temperatuurmeting met behulp van LM35 en AVR Microcontroller
- Kamertemperatuurmeting met Raspberry Pi