Wie erreicht man eine Ultraschalldistanzmessung mit 51 Mikrocontrollern?
Globaler Lieferant elektronischer Komponenten AMPHEO PTY LTD: Umfangreiches Inventar für One-Stop-Shopping. Einfache Anfragen, schnelle, individuelle Lösungen und Angebote.
Hier ist eine praxisnahe Anleitung, wie du mit einem klassischen 8051 (z. B. AT89C51) die Ultraschall-Entfernungsmessung mit einem gängigen 5-V-Modul wie HC-SR04 (oder US-015) umsetzt.
1) Was du benötigst
-
MCU: Beliebiger 8051 (AT89C51/52 oder kompatibel) @ 11,0592 MHz (die Beispiele unten gehen von diesem Takt aus).
-
Sensor: HC-SR04 (5-V-Logik, ein TRIG-Eingang, ein ECHO-Ausgang).
-
Versorgung: 5 V (MCU und Sensor müssen gemeinsame Masse haben).
-
Verdrahtung:
-
TRIG → beliebiger 8051-GPIO-Ausgang (Beispiel:
P2.0
) -
ECHO → beliebiger 8051-GPIO-Eingang (Beispiel:
P2.1
für einfaches Polling, oderP3.2/INT0
wenn du per Interrupt stoppen willst) -
VCC → 5 V
-
GND → GND
-
-
(Optional): UART oder LCD zur Anzeige der gemessenen Distanz.
2) So funktioniert die Messung (Physik + Timing)
-
Du sendest einen ≥ 10 µs langen HIGH-Impuls auf TRIG.
-
Der Sensor sendet Ultraschall aus und setzt ECHO auf HIGH. Die HIGH-Zeit von ECHO entspricht der Laufzeit des Schalls für Hin- und Rückweg.
-
Umrechnung Pulsbreite → Distanz:
-
Schallgeschwindigkeit bei ~20 °C: ≈ 343 m/s = 0,0343 cm/µs
-
Entfernung (cm) ≈ (Puls_µs × 0,0343) / 2 ≈ Puls_µs / 58
-
-
Bei 11,0592 MHz 8051 gilt im Timer-Mode 1 (16-Bit):
Timer-Tick = 12 / Fosc ≈ 1,085 µs.
⇒ Entfernung (cm) ≈ (Timercounts × 1,085) / 58 ≈ Timercounts × 0,01871
3) Strategie auf dem 8051
Zwei einfache Vorgehensweisen:
A. Polling (am simpelsten, ausreichend genau)
-
Auf HIGH von
ECHO
warten → Timer0 starten. -
Auf LOW von
ECHO
warten → Timer0 stoppen. -
Zähler auslesen → in cm umrechnen.
-
Timeout vorsehen, damit du nicht ewig blockierst, wenn kein Echo kommt.
B. Hybrid (präziseres Ende-Timing)
-
Rising Edge per Polling erkennen, Timer0 starten.
-
ECHO
an INT0 (P3.2) legen, auf fallende Flanke triggern; im ISR den Timer stoppen. -
Zähler im Main auswerten.
Unten steht Option A (Polling) der Klarheit halber.
4) Minimale Schaltungstipps
-
Leitungen zum Sensor kurz halten; keine „fliegenden“ langen Kabel.
-
0,1 µF Stützkondensator nah am Sensor-VCC.
-
Zwischen Messungen ≥ 60 ms pausieren (Klingeln/Mehrfach-Echos vermeiden).
-
Bei wasserdichten Modulen (z. B. JSN-SR04T) auf etwas längere Mindestdistanz und leicht andere Timing-Charakteristik achten.
5) „Getestet-Style“ 8051-Beispiel (Keil C) — Polling-Version
Annahme: AT89C51 @ 11,0592 MHz, TRIG an P2.0, ECHO an P2.1.
Gibt die Distanz per UART 9600 bps aus (optional — UART-Teil kann entfernt werden).
Hinweise
-
Wenn dein Quarz nicht 11,0592 MHz hat, passe die Umrechnung an:
tick_us = 12 / Fosc_MHz
→dist_cm = (counts * tick_us) / 58
. -
Du kannst float vermeiden, z. B. rein integerbasiert:
distance_mm ≈ counts * 187 / 10
(entspricht 0,0187 cm → 0,187 mm pro Count).
6) Genauigkeit & Robustheit verbessern
-
Temperaturkompensation (optional):
Schallgeschwindigkeit c m/s (T in °C).
Dann Distanz (cm)=(Pulsμs×(c×0,1))/2
Implementiere das mit einem Temperatursensor oder einer festen Korrektur, wenn die Umgebung stabil ist. -
Median-/Mittelwert-Filterung: 3–5 Messungen, Ausreißer verwerfen, Rest mitteln.
-
Mindestdistanz & Öffnungswinkel: HC-SR04 min. ~2 cm, FOV ~15°. Schlecht reflektierende, weiche Oberflächen vermeiden; auf Achse messen.
-
Mechanik: Gegen Vibration entkoppeln; nicht knapp an Kanten messen (Mehrwege-Echos).
-
Versorgung: Saubere Masseführung; 0,1 µF + 10 µF nahe am Sensor-VCC; während der Messung starke Schaltspitzen vermeiden.
7) Option B: Timer mit INT0 stoppen (präzisere fallende Flanke)
Wenn du das Ende genauer erfassen willst, ECHO → P3.2 (INT0):
-
Rising Edge per Polling erkennen → Timer0 starten.
-
IT0=1
(Flankenmodus) setzen,EX0=1
aktivieren. -
Bei fallender Flanke stoppt das INT0-ISR den Timer und setzt ein „captured“-Flag.
-
Umrechnung wie oben.
(Hinweis: Beide Flanken rein per Interrupt am selben Pin sauber zu trennen ist beim klassischen 8051 nicht vorgesehen; meist nimmt man eine Flanke per INT0 und die andere per Polling oder mit externer Logik.)
8) Häufige Stolperfallen
-
< 60 ms zwischen Trigger-Pulsen (führt zu Geistermessungen).
-
Lange Kabel / fehlende Stützkondensatoren → jitterige Werte.
-
Falsche Umrechnung, wenn Fosc ≠ 11,0592 MHz.
-
Enge Gehäuse → Mehrfachreflexionen; Dämpfung/Orientierung anpassen.
Fertig! Verdrahten, flashen, seriellen Monitor auf 9600 bps öffnen — dann solltest du stabile cm-Werte sehen.
Verwandte Artikel
- ·Wie erkenne ich Objekte mit Kamera im 8051 Mikrocontroller?
- ·Erstellen Sie eine Wetterstation mit Raspberry Pi und DHT22
- ·Wie erstelle ich ein physisches Mikrocontrollerprojekt mit nuller Grundlage?
- ·Warum sind 4-Bit-Mikrocontroller noch nicht abgeschafft?
- ·Wie benutzt man Beschleunigungsmesser mit Arduino?
- ·Was sind die am häufigsten verwendeten Sensoren in Embedded-Systemen?
- ·Wie wählen Sie den richtigen Sensor für ein Projekt?
- ·Was sind einige gemeinsame Arduino-Projekte für Anfänger?
- ·DS18B20 Temperatursensor Detaillierte Erklärung und Anwendungsfälle