Im Embedded-Design gibt es Möglichkeiten, bei denen nicht genügend E / A-Pins in Ihrem Mikrocontroller verfügbar sind. Dies kann aus irgendeinem Grund geschehen. Möglicherweise benötigt Ihre Anwendung mehrere LEDs oder Sie möchten mehrere 7-Segment-Anzeigen verwenden, aber Sie haben keine E / A-Pins in Ihrem Mikrocontroller benötigt. Hier kommt eine perfekte Komponente, Schieberegister. Das Schieberegister akzeptiert serielle Daten und gibt eine parallele Ausgabe. Für die Verbindung mit Ihrem Mikrocontroller sind nur 3 Pins erforderlich, und Sie erhalten mehr als 8 Ausgangspins. Eines der beliebtesten Schieberegister ist 74HC595. Es hat ein 8-Bit-Speicherregister und ein 8-Bit-Schieberegister. Erfahren Sie hier mehr über Schieberegister.
Sie werden serielle Daten an das Schieberegister zur Verfügung stellen und es wird eingeklinkt auf dem Speicherregister und dann das Speicherregister steuern die 8 Ausgänge. Wenn Sie mehr Ausgabe wünschen, fügen Sie einfach ein weiteres Schieberegister hinzu. Durch Kaskadieren von zwei Schieberegistern erhalten Sie zusätzliche 8 Ausgänge, insgesamt 16-Bit-Ausgang.
Schieberegister 74HC595:
Hier ist das Pin-Out-Diagramm des 74HC595 gemäß Datenblatt.
HC595 hat 16 Pins; Wenn wir das Datenblatt sehen, werden wir die Pin-Funktionen verstehen.
Die QA bis QH von Pin Nummer 1 bis 7 und 15 werden als 8-Bit-Ausgabe vom Schieberegister verwendet, wobei Pin 14 zum Empfangen der seriellen Daten verwendet wird. Es gibt auch eine Wahrheitstabelle darüber, wie andere Pins verwendet und andere Funktionen des Schieberegisters genutzt werden können.
Wenn wir den Code für die Schnittstelle zum 74HC595 schreiben, wenden wir diese Wahrheitstabelle an, um die gewünschten Ausgaben zu erhalten.
Jetzt werden wir 74HC595 mit PIC16F877A verbinden und 8 LEDs steuern. Wir haben das 74HC595-Schieberegister mit anderen Mikrocontrollern verbunden:
- Schnittstelle 74HC595 Serial Shift Register mit Raspberry Pi
- Wie verwende ich das Schieberegister 74HC595 mit Arduino Uno?
- Verbindung des LCD mit der NodeMCU über das Schieberegister
Erforderliche Komponenten:
- PIC16F877A
- 2 Stück 33pF Keramikscheibenkondensatoren
- 20 MHz Kristall
- 4,7k Widerstand
- 8 Stück LEDs
- 1k Widerstand -1 Stk. (8 Stk. 1k Widerstände erforderlich, wenn separate Widerstände an jeder LED erforderlich sind)
- 74HC595 ic
- 5V Wandadapter
- PIC-Programmierumgebung
- Steckbrett und Drähte
Schaltplan:
Im Schaltplan haben wir den seriellen Daten-Pin angeschlossen; Clock- und Strobe-Pin (Latch-Pin) am RB0-, RB1- und RB2- Pin des Mikrocontrollers. Hier haben wir einen Widerstand für 8 LEDs verwendet. Gemäß der Wahrheitstabelle haben wir die Ausgabe aktiviert, indem wir den Pin 13 des 74HC595 mit Masse verbunden haben. Der QH- Pin bleibt offen, da wir keinen weiteren 74HC595 damit kaskadieren werden. Wir haben das Lösch-Eingangsflag deaktiviert, indem wir Pin 10 des Schieberegisters mit VCC verbunden haben.
Der Quarzoszillator ist an den OSC-Pins des Mikrocontrollers angeschlossen. PIC16F877A haben keinen internen Oszillator. In diesem Projekt werden wir die LED einzeln von Q0 bis Q7 mit Shift Regitster beleuchten.
Wir haben die Schaltung in einem Steckbrett gebaut.
Code Erläuterung:
Der vollständige Code zur Steuerung der LEDs mit Schieberegister ist am Ende des Artikels angegeben. Wie immer müssen wir die Konfigurationsbits im PIC-Mikrocontroller setzen.
#pragma config FOSC = HS // Oszillatorauswahlbits (HS-Oszillator) #pragma config WDTE = OFF // Watchdog-Timer-Aktivierungsbit (WDT deaktiviert) #pragma config PWRTE = OFF // Einschalt-Timer-Aktivierungsbit (PWRT deaktiviert) # Pragma-Konfiguration BOREN = EIN // Brown-Out-Reset-Aktivierungsbit (BOR aktiviert) # Pragma-Konfiguration LVP = AUS // Niederspannungs-Einzelprogrammierung (Einzelversorgung) Serielle Programmierung Aktivierungsbit (RB3 / PGM-Pin hat PGM-Funktion; niedrig -Spannungsprogrammierung aktiviert) #pragma config CPD = OFF // Daten-EEPROM-Speichercode- Schutzbit (Daten-EEPROM-Code-Schutz aus) #pragma config WRT = OFF // Flash-Programmspeicher Schreibaktivierungsbits (Schreibschutz aus; der gesamte Programmspeicher ist möglicherweise vorhanden geschrieben von EECON control) #pragma config CP = OFF // Code-Schutzbit für Flash-Programmspeicher (Codeschutz aus)
Danach haben wir die für die Verzögerung erforderliche Kristallfrequenz und die Pinbelegungsdeklaration für 74HC595 deklariert.
#einschließen
Als nächstes haben wir die Funktion system_init () deklariert, um die Pin-Richtung zu initialisieren.
void system_init (void) { TRISB = 0x00; }}
Wir haben den Takt und den Latch-Impuls mit zwei verschiedenen Funktionen erstellt
/ * * Diese Funktion aktiviert die Uhr. * / void clock (void) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }}
und
/ * * Diese Funktion blinkt und aktiviert den Ausgabetrigger. * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }}
Nach diesen beiden Funktionen haben wir die Funktion data_submit (unsigned int data) deklariert, um serielle Daten an den 74HC595 zu senden.
void data_submit (vorzeichenlose int-Daten) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; Uhr(); } strobe (); // Daten endlich übermittelt }
In dieser Funktion akzeptieren wir 8-Bit-Daten und senden jedes Bit mit zwei bitweisen Operatoren Linksverschiebung und UND- Operator. Wir verschieben zuerst die Daten nacheinander und ermitteln mit dem AND-Operator mit 0x01 das genaue Bit, ob es 0 oder 1 ist. Alle Daten werden durch den Taktimpuls gespeichert und die endgültige Datenausgabe erfolgt über den Latch- oder Strobe-Impuls. In diesem Prozess ist die Datenausgabe zuerst MSB (Most Significant Bit).
In der Hauptfunktion reichten wir die binäre und machte die Ausgangs - Pins hoch eins nach dem anderen.
system_init (); // System bereitet sich vor, während (1) { data_submit (0b00000000); __delay_ms (200); data_submit (0b10000000); __delay_ms (200); data_submit (0b01000000); __delay_ms (200); data_submit (0b00100000); __delay_ms (200); data_submit (0b00010000); __delay_ms (200); data_submit (0b00001000); __delay_ms (200); data_submit (0b00000100); __delay_ms (200); data_submit (0b00000010); __delay_ms (200); data_submit (0b00000001); __delay_ms (200); data_submit (0xFF); __delay_ms (200); } return; }}
Auf diese Weise kann ein Schieberegister verwendet werden, um mehr freie E / A-Pins in jedem Mikrocontroller zum Anschließen weiterer Sensoren zu erhalten.