- Erforderliche Komponenten:
- Schaltplan:
- Verwenden des TIMER von 8051 zum Messen der Frequenz:
- 555 Timer als Frequenzquelle:
- Arbeits- und Codeerklärung:
Die Frequenz ist definiert als Anzahl der Zyklen pro Sekunde. Es kann auch als Kehrwert der Gesamtzeit 'T' definiert werden. In diesem Projekt werden wir die Anzahl der Impulse zählen, die in Port 3.5 des 8051-Mikrocontrollers eingehen, und diese auf einem 16 * 2-LCD-Display anzeigen. Grundsätzlich haben wir also die Signalfrequenz an Port 3.5 von 8051 gemessen. Hier haben wir den AT89S52 8051-Chip verwendet, und ein 555-IC wird im Astable-Modus zur Erzeugung des Abtastimpulses zur Demonstration verwendet. Wir haben zuvor einen Frequenzzähler mit Arduino erstellt.
Erforderliche Komponenten:
- 8051 Mikrocontroller (AT89S52)
- 16 * 2 LCD-Anzeige
- Frequenzquelle (555 Timer)
- Potentiometer
- Kabel anschließen
Schaltplan:
Verwenden des TIMER von 8051 zum Messen der Frequenz:
Der 8051-Mikrocontroller ist ein 8-Bit-Mikrocontroller mit 128 Byte On-Chip-RAM, 4 KByte On-Chip-ROM, zwei Timern, einem seriellen Port und vier 8-Bit-Ports. Der 8052-Mikrocontroller ist eine Erweiterung des Mikrocontrollers. Um Port 3.5 als Zähler zu konfigurieren, werden die TMOD-Registerwerte auf 0x51 gesetzt. Die folgende Abbildung zeigt das TMOD-Register.
TOR | C / T. | M1 | M0 | TOR | C / T. | M1 | M2 |
TIMER 1 | TIMER 0 |
GATE - Wenn GATE eingestellt ist, wird der Timer oder Zähler nur aktiviert, wenn der INTx-Pin auf HIGH und der TRx-Steuerpin gesetzt ist. Wenn GATE gelöscht wird, wird der Timer immer dann aktiviert, wenn das TRx-Steuerbit gesetzt ist.
C / T - Wenn C / T = 0 ist, fungiert es als Timer. Wenn C / T = 1 ist, wirkt es als Zähler.
M1 und M0 zeigen den Betriebsmodus an.
Bei TMOD = 0x51 fungiert Timer1 als Zähler und arbeitet im Modus1 (16 Bit).
16 * 2 LCD wird verwendet, um die Frequenz des Signals in Hertz (Hz) anzuzeigen. Wenn Sie mit 16x2 LCD noch nicht vertraut sind, lesen Sie hier mehr über die Pins und Befehle von 16x2 LCD. Überprüfen Sie auch, wie das LCD mit dem 8051 verbunden wird.
555 Timer als Frequenzquelle:
Die Frequenzquelle sollte Rechteckwellen erzeugen und die maximale Amplitude ist auf 5 V begrenzt, da die Ports des 8051-Mikrocontrollers keine Spannung von mehr als 5 V verarbeiten können. Die maximale Frequenz, die gemessen werden kann, beträgt 655,35 kHz aufgrund der Speicherbeschränkung des Registers TH1 und TL1 (jeweils 8 Bit). In 100 Millisekunden können TH1 und TL1 bis zu 65535 Zählungen halten. Daher kann maximal eine Frequenz von 65535 * 10 = 655,35 kHz gemessen werden.
In diesem 8051-Frequenzmesserprojekt verwende ich den 555-Timer im Astable-Modus, um Rechteckwellen mit variabler Frequenz zu erzeugen. Die vom 555 IC erzeugte Signalfrequenz kann durch Einstellen des Potentiometers variiert werden, wie im Video am Ende dieses Projekts gezeigt.
In diesem Projekt zählt der Timer1 (T1) die Anzahl der Impulse, die 100 Millisekunden lang in Port 3.5 von 8051-Mikrocontrollern eingehen. Die Zählwerte werden in den Registern TH1 bzw. TL1 gespeichert. Um die Werte des TH1- und TL1-Registers zu kombinieren, wird die folgende Formel verwendet.
Impulse = TH1 * (0x100) + TL1
Jetzt hat der 'Impuls' eine Anzahl von Zyklen in 100 Millisekunden. Die Frequenz des Signals ist jedoch als Anzahl der Zyklen pro Sekunde definiert. Um es in Frequenz umzuwandeln, wird die folgende Formel verwendet.
Impulse = Impulse * 10
Arbeits- und Codeerklärung:
Das vollständige C-Programm für diesen Frequenzmesser finden Sie am Ende dieses Projekts. Der Code ist in kleine sinnvolle Abschnitte unterteilt und wird unten erläutert.
Für die 16 * 2-LCD-Schnittstelle mit dem 8051-Mikrocontroller müssen Pins definiert werden, an denen 16 * 2-LCD mit dem 8051-Mikrocontroller verbunden sind. Der RS-Pin von 16 * 2 lcd ist mit P2.7 verbunden, der RW-Pin von 16 * 2 lcd ist mit P2.6 verbunden und der E-Pin von 16 * 2 lcd ist mit P2.5 verbunden. Datenpins sind mit Port 0 des 8051-Mikrocontrollers verbunden.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
Als nächstes müssen wir einige Funktionen definieren, die im Programm verwendet werden. Die Verzögerungsfunktion wird verwendet, um eine bestimmte Zeitverzögerung zu erstellen. Mit der Cmdwrt- Funktion werden Befehle an die 16 * 2-LCD-Anzeige gesendet. Mit der Funktion datawrt werden Daten an eine 16 * 2-LCD-Anzeige gesendet.
ungültige Verzögerung (unsigned int); void cmdwrt (vorzeichenloses Zeichen); void datawrt (vorzeichenloses Zeichen);
In diesem Teil des Codes senden wir Befehle an 16 * 2 lcd. Befehle wie klare Anzeige, Cursor - Inkrement, zwingen die Cursor von 1 bis beginnend st Zeile wird durch einen nach einer spezifizierten Zeitverzögerung bis 16 * 2 LCD - Anzeige eines gesendet.
für (i = 0; i <5; i ++) {cmdwrt (cmd); Verzögerung (1); }}
In diesem Teil des Codes ist Timer1 als Zähler konfiguriert und der Betriebsmodus ist auf Modus 1 eingestellt.
Timer0 ist als Timer konfiguriert und der Betriebsmodus ist auf Modus 1 eingestellt. Timer 1 wird zum Zählen der Anzahl von Impulsen verwendet und Timer 0 wird zum Erzeugen einer Zeitverzögerung verwendet. Die Werte für TH1 und TL1 werden auf 0 gesetzt, um sicherzustellen, dass die Zählung bei 0 beginnt.
TMOD = 0x51; TL1 = 0; TH1 = 0;
In diesem Teil des Codes läuft der Timer 100 Millisekunden lang. Mit der Verzögerungsfunktion werden 100 Millisekunden Verzögerung erzeugt. TR1 = 1 dient zum Starten des Timers und TR1 = 0 zum Stoppen des Timers nach 100 Millisekunden.
TR1 = 1; Verzögerung (100); TR1 = 0;
In diesem Teil des Codes werden die in den Registern TH1 und TL1 vorhandenen Zählwerte kombiniert und dann mit 10 multipliziert, um die Gesamtzahl der Zyklen in 1 Sekunde zu erhalten.
Impulse = TH1 * (0x100) + TL1; Impulse = Impulse * 10;
In diesem Teil des Codes wird der Frequenzwert in einzelne Bytes konvertiert, um die Anzeige auf einer 16 * 2-LCD-Anzeige zu vereinfachen.
d1 = Impulse% 10; s1 = Impulse% 100; s2 = Impulse% 1000; s3 = Impulse% 10000; s4 = Impulse% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (Impulse-s4) / 100000;
In diesem Teil des Codes werden einzelne Ziffern des Frequenzwerts in das ASCII- Format konvertiert und auf dem 16 * 2-LCD-Display angezeigt.
If (Impulse> = 100000) datawrt (0x30 + d6); if (Impulse> = 10000) datawrt (0x30 + d5); if (Impulse> = 1000) datawrt (0x30 + d4); if (Impulse> = 100) datawrt (0x30 + d3); if (Impulse> = 10) datawrt (0x30 + d2); Datenschreiben (0x30 + d1);
In diesem Teil des Codes senden wir Befehle an die 16 * 2-LCD-Anzeige. Der Befehl wird auf Port 0 des 8051-Mikrocontrollers kopiert. RS wird für das Schreiben von Befehlen niedrig gemacht. RW wird für den Schreibvorgang auf niedrig gesetzt. Ein hoher bis niedriger Impuls wird an den Aktivierungsstift (E) angelegt, um den Befehlsschreibvorgang zu starten.
void cmdwrt (vorzeichenloses Zeichen x) {P0 = x; rs = 0; rw = 0; en = 1; Verzögerung (1); en = 0; }}
In diesem Teil des Codes senden wir Daten an das 16 * 2-LCD-Display. Die Daten werden auf Port 0 des 8051-Mikrocontrollers kopiert. RS ist für das Schreiben von Befehlen hoch eingestellt. RW wird für den Schreibvorgang auf niedrig gesetzt. Ein hoher bis niedriger Impuls wird an den Freigabepin (E) angelegt, um den Datenschreibvorgang zu starten.
void datawrt (vorzeichenloses Zeichen) {P0 = y; rs = 1; rw = 0; en = 1; Verzögerung (1); en = 0; }}
Auf diese Weise können wir die Frequenz jedes Signals mit dem 8051 Microcontroller messen. Überprüfen Sie den vollständigen Code und das Demo-Video unten.