- Wymagane składniki:
- Schemat obwodu:
- Pomiar temperatury za pomocą LM35 przy użyciu 8051:
- Wyświetlacz LCD 16x2:
- Układ scalony ADC0804:
- Czujnik temperatury LM35:
- Objaśnienie kodu:
Czasami ludzie mają trudności z odczytem temperatury z termometru analogowego z powodu wahań. Więc tutaj zbudujemy prosty termometr cyfrowy z mikrokontrolerem 8051, w którym do pomiaru temperatury używany jest czujnik LM35. Wykorzystaliśmy również LM35 do budowy termometru cyfrowego z wykorzystaniem Arduino, NodeMCU, PIC, Raspberry Pi i innych mikrokontrolerów.
Projekt ten posłuży również jako właściwe połączenie ADC0804 z wyświetlaczem LCD 8051 i 16 * 2 z mikrokontrolerem 8051.
Wymagane składniki:
- Płytka rozwojowa 8051
- Płyta ADC0804
- Wyświetlacz LCD 16 * 2
- Czujnik LM35
- Potencjometr
- Przewody połączeniowe
Schemat obwodu:
Schemat obwodu dla obwodu termometru cyfrowego wykorzystującego LM35 przedstawiono poniżej:
Pomiar temperatury za pomocą LM35 przy użyciu 8051:
Mikrokontroler 8051 to 8-bitowy mikrokontroler, który ma 128 bajtów pamięci RAM w chipie, 4 bajty pamięci ROM chipa, dwa timery, jeden port szeregowy i cztery porty 8-bitowe. Mikrokontroler 8052 jest rozszerzeniem mikrokontrolera. Poniższa tabela przedstawia porównanie 8051 członków rodziny.
Funkcja |
8051 |
8052 |
ROM (w bajtach) |
4K |
8K |
RAM (bajty) |
128 |
256 |
Timery |
2 |
3 |
Piny I / O |
32 |
32 |
Port szeregowy |
1 |
1 |
Źródła przerwań |
6 |
8 |
Wyświetlacz LCD 16x2:
16 * 2 LCD to wyświetlacz szeroko stosowany w aplikacjach wbudowanych. Oto krótkie wyjaśnienie dotyczące pinów i działania wyświetlacza LCD 16 * 2. Wewnątrz LCD znajdują się dwa bardzo ważne rejestry. Są to rejestr danych i rejestr poleceń. Rejestr poleceń służy do wysyłania poleceń, takich jak czytelny wyświetlacz, kursor w domu itp., Rejestr danych służy do wysyłania danych, które mają być wyświetlane na wyświetlaczu LCD 16 * 2. Poniższa tabela przedstawia opis pinów 16 * 2 lcd.
Kołek |
Symbol |
I / O |
Opis |
1 |
Vss |
- |
Ziemia |
2 |
Vdd |
- |
Zasilanie + 5V |
3 |
Vee |
- |
Zasilacz do kontroli kontrastu |
4 |
RS |
ja |
RS = 0 dla rejestru poleceń, RS = 1 dla rejestru danych |
5 |
RW |
ja |
R / W = 0 do zapisu, R / W = 1 do odczytu |
6 |
mi |
I / O |
Włączyć |
7 |
D0 |
I / O |
8-bitowa magistrala danych (LSB) |
8 |
D1 |
I / O |
8-bitowa magistrala danych |
9 |
D2 |
I / O |
8-bitowa magistrala danych |
10 |
D3 |
I / O |
8-bitowa magistrala danych |
11 |
D4 |
I / O |
8-bitowa magistrala danych |
12 |
D5 |
I / O |
8-bitowa magistrala danych |
13 |
D6 |
I / O |
8-bitowa magistrala danych |
14 |
D7 |
I / O |
8-bitowa magistrala danych (MSB) |
15 |
ZA |
- |
+ 5V dla podświetlenia |
16 |
K. |
- |
Ziemia |
W poniższej tabeli przedstawiono często używane kody poleceń na wyświetlaczu LCD.
Kod (szesnastkowo) |
Opis |
01 |
Czytelny ekran wyświetlacza |
06 |
Kursor przyrostowy (przesunięcie w prawo) |
0A |
Wyświetlacz wyłączony, kursor włączony |
0C |
Wyświetlacz włączony, kursor wyłączony |
0F |
Wyświetlacz włączony, kursor miga |
80 |
Wymusić kursor począwszy od 1 st linii |
C0 |
Wymusić kursor na początek 2 nd linii |
38 |
2 linie i matryca 5 * 7 |
Układ scalony ADC0804:
Układ scalony ADC0804 to 8-bitowy równoległy przetwornik ADC z rodziny serii ADC0800 firmy National Semiconductor. Działa przy napięciu +5 V i rozdzielczości 8 bitów. Wielkość kroku i zakres Vin są różne dla różnych wartości Vref / 2. Poniższa tabela przedstawia zależność między Vref / 2 a zakresem Vin.
Vref / 2 (V) |
Vin (V) |
Rozmiar stopnia (mV) |
otwarty |
Od 0 do 5 |
19,53 |
2.0 |
Od 0 do 4 |
15.62 |
1.5 |
Od 0 do 3 |
11,71 |
1.28 |
Od 0 do 2,56 |
10 |
W naszym przypadku Vref / 2 jest podłączony do 1,28 V, więc wielkość kroku wynosi 10 mV. Dla ADC0804 wielkość kroku jest obliczana jako (2 * Vref / 2) / 256.
Do obliczenia napięcia wyjściowego służy następujący wzór:
Dout = Vin / rozmiar kroku
Gdzie Dout jest cyfrowym wyjściem danych w postaci dziesiętnej, Vin = analogowe napięcie wejściowe i wielkość kroku (rozdzielczość) to najmniejsza zmiana. Dowiedz się więcej o ADC0804 tutaj, sprawdź także połączenie ADC0808 z 8051.
Czujnik temperatury LM35:
LM35 to czujnik temperatury, którego napięcie wyjściowe jest liniowo proporcjonalne do temperatury Celsjusza. LM35 jest już skalibrowany, dlatego nie wymaga zewnętrznej kalibracji. Wyprowadza 10mV na każdy stopień Celsjusza.
Czujnik LM35 wytwarza napięcie odpowiadające temperaturze. Napięcie to jest przetwarzane na cyfrowe (od 0 do 256) przez ADC0804 i podawane do mikrokontrolera 8051. Mikrokontroler 8051 przetwarza tę cyfrową wartość na temperaturę w stopniach Celsjusza. Następnie ta temperatura jest konwertowana na postać ascii, która jest odpowiednia do wyświetlania. Te wartości ascii są podawane na 16 * 2 lcd, który wyświetla temperaturę na ekranie. Ten proces jest powtarzany po określonym czasie.
Poniżej znajduje się obraz konfiguracji termometru cyfrowego LM35 przy użyciu 8051:
Tutaj można znaleźć wszystkie termometry cyfrowe na bazie LM35.
Objaśnienie kodu:
Kompletny program C dla tego termometru cyfrowego wykorzystującego LM35 jest podany na końcu tego projektu. Kod jest podzielony na małe znaczące fragmenty i wyjaśniony poniżej.
Dla interfejsu 16 * 2 LCD z mikrokontrolerem 8051, musimy zdefiniować piny, na których 16 * 2 lcd jest podłączony do mikrokontrolera 8051. Pin RS 16 * 2 lcd jest podłączony do P2.7, pin RW 16 * 2 lcd jest podłączony do P2.6, a pin E wyświetlacza 16 * 2 jest podłączony do P2.5. Piny danych są podłączone do portu 0 mikrokontrolera 8051.
sbit rs = P2 ^ 7; // Zarejestruj Wybierz (RS) pin 16 * 2 lcd sbit rw = P2 ^ 6; // Odczyt / zapis (RW) pin 16 * 2 lcd sbit en = P2 ^ 5; // Włącz pin (E) 16 * 2 lcd
Podobnie, dla współpracy ADC0804 z mikrokontrolerem 8051, musimy zdefiniować piny, na których ADC0804 jest podłączony do mikrokontrolera 8051. Pin RD ADC0804 jest podłączony do P3.0, pin WR ADC0804 jest podłączony do P3.1, a pin INTR ADC0804 jest podłączony do P3.2. Piny danych są podłączone do portu 1 mikrokontrolera 8051.
sbit rd_adc = P3 ^ 0; // Odczytaj (RD) pin ADC0804 sbit wr_adc = P3 ^ 1; // Zapis (WR) pin ADC0804 sbit intr_adc = P3 ^ 2; // Pin przerwania (INTR) w ADC0804
Następnie musimy zdefiniować funkcje, które są używane w programie. Funkcja opóźnienia służy do tworzenia określonego opóźnienia czasowego, funkcja c mdwrt służy do wysyłania poleceń do wyświetlacza LCD 16 * 2, funkcja datawrt służy do wysyłania danych do wyświetlacza LCD 16 * 2, a funkcja convert_display służy do konwersji danych ADC na temperaturę i wyświetlić go na wyświetlaczu lcd 16 * 2.
void delay (unsigned int); // funkcja do tworzenia opóźnienia void cmdwrt (unsigned char); // funkcja do wysyłania poleceń do wyświetlacza LCD 16 * 2 void datawrt (znak bez znaku); // funkcja wysyłania danych do wyświetlacza LCD 16 * 2 void convert_display (znak bez znaku); // funkcja konwersji wartości ADC na temperaturę i wyświetlenie jej na wyświetlaczu LCD 16 * 2
W poniższej części kodu wysyłamy komendy na 16 * 2 lcd. Polecenia takie jak przejrzysty wyświetlacz, przyrost kursora wymusić kursor począwszy od 1 st linii są wysyłane do jednego wyświetlacza lcd 16 * 2 jeden po pewnym określonym opóźnieniem.
for (i = 0; i <5; i ++) // wysyłanie poleceń do 16 * 2 lcd wyświetla jedno polecenie na raz {cmdwrt (cmd); // wywołanie funkcji do wysyłania poleceń do 16 * 2 opóźnienia wyświetlacza lcd (1); }
W tej części kodu wysyłamy dane do lcd 16 * 2. Dane do wyświetlenia na wyświetlaczu LCD 16 * 2 są wysyłane do wyświetlenia jeden po drugim po pewnym określonym czasie.
for (i = 0; i <12; i ++) // wysyłanie danych do 16 * 2 lcd wyświetla jeden znak na raz {datawrt (data1); // wywołanie funkcji wysyłającej dane do 16 * 2 opóźnienia wyświetlacza lcd (1); } W tej części kodu konwertujemy napięcie analogowe wytwarzane przez czujnik LM35 na dane cyfrowe, a następnie jest ono konwertowane na temperaturę i wyświetlane na wyświetlaczu LCD 16 * 2. Aby ADC0804 rozpoczął konwersję, musimy wysłać impuls od niskiego do wysokiego na pin WR ADC0804, a następnie musimy poczekać na zakończenie konwersji. INTR staje się niski pod koniec konwersji. Gdy INTR staje się niski, RD jest ustawiane na niskim poziomie, aby skopiować dane cyfrowe do portu 0 mikrokontrolera 8051. Po określonym czasie rozpoczyna się kolejny cykl. Ten proces jest powtarzany w nieskończoność.
while (1) // powtarzaj w nieskończoność {wr_adc = 0; // wysłanie impulsu od LOW do HIGH na pin opóźnienia WR (1); wr_adc = 1; while (intr_adc == 1); // czekaj na koniec konwersji rd_adc = 0; // ustaw RD = 0, aby odczytać dane z ADC0804 value = P1; // kopiuj dane ADC convert_display (wartość); // wywołanie funkcji konwertującej dane ADC na temperaturę i wyświetlającej ją na 16 * 2 opóźnieniu wyświetlacza lcd (1000); // przerwa między cyklami rd_adc = 1; // spraw, aby RD = 1 dla następnego cyklu}
W poniższej części kodu wysyłamy komendy na wyświetlacz LCD 16 * 2. Polecenie jest kopiowane do portu 0 mikrokontrolera 8051. RS jest niski do zapisu poleceń. RW ma niski poziom dla operacji zapisu. Impuls od wysokiego do niskiego poziomu jest stosowany na pinie włączania (E) w celu rozpoczęcia operacji zapisu poleceń.
void cmdwrt (unsigned char x) {P0 = x; // wyślij polecenie do portu 0, do którego podłączony jest 16 * 2 lcd rs = 0; // uczyń RS = 0 dla polecenia rw = 0; // uczyń RW = 0 dla operacji zapisu en = 1; // wyślij impuls od HIGH do LOW na pinie Enable (E), aby rozpocząć opóźnienie operacji zapisu polecenia (1); en = 0; }
W tej części kodu wysyłamy dane do wyświetlacza LCD 16 * 2. Dane są kopiowane do portu 0 mikrokontrolera 8051. RS jest ustawione na wysokim poziomie do zapisu poleceń. RW ma niski poziom dla operacji zapisu. Impuls od wysokiego do niskiego jest stosowany na pinie włączania (E) w celu rozpoczęcia operacji zapisu danych.
void datawrt (unsigned char y) {P0 = y; // wyślij dane do portu 0, do którego podłączony jest 16 * 2 lcd rs = 1; // uczyń RS = 1 dla polecenia rw = 0; // uczyń RW = 0 dla operacji zapisu en = 1; // wyślij impuls od HIGH do LOW na pin Enable (E), aby rozpocząć opóźnienie operacji zapisu danych (1); en = 0; }
W tej części kodu konwertujemy dane cyfrowe na temperaturę i wyświetlamy je na wyświetlaczu LCD 16 * 2.
void convert_display (wartość bez znaku) {znak bez znaku x1, x2, x3; cmdwrt (0xc6); // komenda ustawiania kursora na 6 pozycji drugiej linii na 16 * 2 lcd x1 = (wartość / 10); // podziel wartość przez 10 i zapisz iloraz w zmiennej x1 x1 = x1 + (0x30); // przekonwertuj zmienną x1 na ascii, dodając 0x30 x2 = wartość% 10; // podziel wartość przez 10 i zapisz resztę w zmiennej x2 x2 = x2 + (0x30); // przekonwertuj zmienną x2 na ascii, dodając 0x30 x3 = 0xDF; // wartość ascii symbolu stopnia (°) datawrt (x1); // wyświetlanie temperatury na wyświetlaczu LCD 16 * 2 datawrt (x2); datawrt (x3); datawrt („C”); }
Sprawdź również inne termometry wykorzystujące LM35 z różnymi mikrokontrolerami:
- Cyfrowy termometr wykorzystujący Arduino i LM35
- Pomiar temperatury za pomocą mikrokontrolera LM35 i AVR
- Pomiar temperatury w pomieszczeniu za pomocą Raspberry Pi