- Wymagane składniki:
- Schemat obwodu:
- Korzystanie z TIMERA 8051 do pomiaru częstotliwości:
- 555 Timer jako źródło częstotliwości:
- Objaśnienie działania i kodu:
Częstotliwość definiuje się jako liczbę cykli na sekundę. Można go również zdefiniować jako odwrotność całkowitego czasu „T”. W tym projekcie policzymy liczbę impulsów wchodzących do portu 3.5 mikrokontrolera 8051 i wyświetlimy ją na wyświetlaczu LCD 16 * 2. Więc w zasadzie mamy pomiar częstotliwości sygnału na porcie 3.5 8051. Tutaj użyliśmy chipa AT89S52 8051, a układ scalony 555 jest używany w trybie Astable do generowania impulsu próbki do demonstracji. Wcześniej zbudowaliśmy licznik częstotliwości przy użyciu Arduino.
Wymagane składniki:
- Mikrokontroler 8051 (AT89S52)
- Wyświetlacz LCD 16 * 2
- Źródło częstotliwości (zegar 555)
- Potencjometr
- Przewody łączące
Schemat obwodu:
Korzystanie z TIMERA 8051 do pomiaru częstotliwości:
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. Aby skonfigurować port 3.5 jako licznik, wartości rejestru TMOD są ustawiane na 0x51. Poniższy rysunek przedstawia rejestr TMOD.
BRAMA | C / T | M1 | M0 | BRAMA | C / T | M1 | M2 |
TIMER 1 | TIMER 0 |
GATE - gdy ustawiona jest GATE, timer lub licznik jest włączony tylko wtedy, gdy pin INTx jest w pozycji HIGH i ustawiony jest pin sterujący TRx. Kiedy GATE jest wyczyszczone, zegar jest włączony, gdy bit kontrolny TRx jest ustawiony.
C / T - gdy C / T = 0, działa jako Timer. Gdy C / T = 1, działa jako licznik.
M1 i M0 wskazują tryb pracy.
Dla TMOD = 0x51, timer1 działa jako licznik i działa w trybie 1 (16 bitów).
16 * 2 LCD służy do wyświetlania częstotliwości sygnału w hercach (Hz). Jeśli jesteś nowy w 16x2 LCD, sprawdź więcej na temat pinów 16x2 LCD i jego poleceń tutaj. Sprawdź również, jak połączyć wyświetlacz LCD z 8051.
555 Timer jako źródło częstotliwości:
Źródło częstotliwości powinno wytwarzać fale prostokątne, a maksymalna amplituda jest ograniczona do 5 V, ponieważ porty mikrokontrolera 8051 nie obsługują napięcia większego niż 5 V. Maksymalna częstotliwość może mierzyć jest 655,35 kHz, ponieważ ograniczenia pamięci TH1 i TL1 rejestru (8-bitowej każdego). W ciągu 100 milisekund TH1 i TL1 mogą pomieścić do 65535 zliczeń. Stąd maksymalna częstotliwość, którą można zmierzyć, to 65535 * 10 = 655,35 kHz.
W tym projekcie miernika częstotliwości 8051 używam timera 555 w trybie astabilnym do wytwarzania fal prostokątnych o zmiennej częstotliwości. Częstotliwość sygnału generowanego przez układ scalony 555 może być zmieniana przez regulację potencjometru, jak pokazano na filmie wideo podanym na końcu tego projektu.
W tym projekcie Timer1 (T1) zlicza impulsy wchodzące do portu 3.5 mikrokontrolerów 8051 przez 100 milisekund. Wartości zliczeń będą przechowywane odpowiednio w rejestrach TH1 i TL1. Aby połączyć wartości rejestrów TH1 i TL1, stosuje się poniższy wzór.
Impulsy = TH1 * (0x100) + TL1
Teraz „puls” będzie miał liczbę cykli w 100 milisekundach. Ale częstotliwość sygnału jest definiowana jako liczba cykli na sekundę. Aby zamienić to na częstotliwość, stosuje się poniższy wzór.
Impulsy = Impulsy * 10
Objaśnienie działania i kodu:
Kompletny program C dla tej częstotliwości Miernik 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; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
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 Cmdwrt 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.
void delay (unsigned int); void cmdwrt (znak bez znaku); void datawrt (unsigned char);
W tej 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 ++) {cmdwrt (cmd); opóźnienie (1); }
W tej części kodu timer1 jest skonfigurowany jako licznik, a tryb pracy jest ustawiony na tryb 1.
Timer0 jest skonfigurowany jako timer, a tryb pracy jest ustawiony na tryb 1. Timer 1 służy do zliczania liczby impulsów, a zegar 0 do generowania opóźnienia czasowego. Wartości TH1 i TL1 są ustawione na 0, aby zapewnić, że liczenie rozpocznie się od 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
W tej części kodu czasomierz działa przez 100 milisekund. Funkcja opóźnienia generuje 100 milisekund opóźnienia. TR1 = 1 służy do uruchamiania timera, a TR1 = 0 do zatrzymywania timera po 100 milisekundach.
TR1 = 1; opóźnienie (100); TR1 = 0;
W tej części kodu wartości zliczeń obecne w rejestrach TH1 i TL1 są łączone, a następnie mnożone przez 10, aby uzyskać całkowitą liczbę cykli w ciągu 1 sekundy.
Impulsy = TH1 * (0x100) + TL1; Impulsy = impulsy * 10;
W tej części kodu wartość częstotliwości jest konwertowana na pojedyncze bajty, aby ułatwić wyświetlanie na wyświetlaczu LCD 16 * 2.
d1 = impulsy% 10; s1 = impulsy% 100; s2 = impulsy% 1000; s3 = impulsy% 10000; s4 = impulsy% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (impulsy-s4) / 100000;
W tej części kodu poszczególne cyfry wartości częstotliwości są konwertowane do formatu ASCII i wyświetlane na wyświetlaczu LCD 16 * 2.
Jeśli (impulsy> = 100000) datawrt (0x30 + d6); if (impulsy> = 10000) datawrt (0x30 + d5); if (impulsy> = 1000) datawrt (0x30 + d4); if (impulsy> = 100) datawrt (0x30 + d3); if (impulsy> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
W tej 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; rs = 0; rw = 0; en = 1; opóźnienie (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; rs = 1; rw = 0; en = 1; opóźnienie (1); en = 0; }
W ten sposób możemy zmierzyć częstotliwość dowolnego sygnału za pomocą mikrokontrolera 8051. Sprawdź pełny kod i film demonstracyjny poniżej.