Istnieją możliwości w projektach wbudowanych, w których nie ma wystarczającej liczby pinów I / O dostępnych w mikrokontrolerze. Może to wynikać z dowolnego powodu, może być to, że Twoja aplikacja wymaga wielu diod LED lub chcesz używać wielu 7-segmentowych wyświetlaczy, ale nie masz wymaganych pinów I / O w mikrokontrolerze. Oto doskonały komponent, rejestr przesuwny. Rejestr przesuwny akceptuje dane szeregowe i daje wyjście równoległe. Do połączenia z mikrokontrolerem potrzeba tylko 3 pinów, a otrzymasz z niego więcej niż 8 pinów wyjściowych. Jednym z popularnych rejestrów przesuwnych jest 74HC595. Posiada 8-bitowy rejestr pamięci i 8-bitowy rejestr przesuwny. Dowiedz się więcej o rejestrach zmian tutaj.
Dostarczysz dane szeregowe do rejestru przesuwnego i zostaną one zatrzaśnięte w rejestrze pamięci, a następnie rejestr pamięci będzie sterował 8 wyjściami. Jeśli chcesz uzyskać więcej wyników, po prostu dodaj kolejny rejestr przesuwny. Łącząc kaskadowo dwa rejestry przesuwne, otrzymasz dodatkowe 8 wyjść, łącznie 16-bitowe wyjście.
Rejestr przesuwny 74HC595:
Oto schemat pinów 74HC595 zgodnie z arkuszem danych-
HC595 ma 16 pinów; jeśli zobaczymy arkusz danych, zrozumiemy funkcje pinów
QA QH od liczby styków 1 do 7 i 15 stosuje jako 8 bitowej z rejestru przesuwnego, w którym, gdy kołek 14 jest wykorzystywany do odbioru danych szeregowych. Istnieje również tabela prawdy o tym, jak używać innych pinów i korzystać z innych funkcji rejestru przesuwnego.
Kiedy piszemy kod do połączenia 74HC595, zastosujemy tę tablicę prawdy, aby uzyskać pożądane wyniki.
Teraz połączymy 74HC595 z PIC16F877A i sterujemy 8 diodami LED. Połączyliśmy rejestr przesuwny 74HC595 z innymi mikrokontrolerami:
- Połączenie rejestru szeregowego 74HC595 z Raspberry Pi
- Jak korzystać z rejestru Shift 74HC595 z Arduino Uno?
- Łączenie LCD z NodeMCU za pomocą rejestru przesuwnego
Wymagane składniki:
- PIC16F877A
- 2szt 33pF ceramicznych kondensatorów dyskowych
- Kryształ 20 Mhz
- Rezystor 4,7 k
- 8 sztuk diod LED
- Rezystor 1k - 1 szt. (Wymagane 8 szt. Rezystorów 1k, jeśli potrzebne są oddzielne rezystory na każdej diodzie LED)
- 74HC595 ic
- Adapter ścienny 5V
- Środowisko programistyczne PIC
- Płytka prototypowa i przewody
Schemat obwodu:
Na schemacie obwodu podłączyliśmy pin danych szeregowych; zegar i styk stroboskopowy (zatrzask) odpowiednio na pinach RB0, RB1 i RB2 mikrokontrolera. Tutaj użyliśmy jednego rezystora na 8 diod LED. Zgodnie z tabelą prawdy, włączyliśmy wyjście, podłączając pin 13 74HC595 do masy. QH pin pozostaje otwarta, jako że nie będzie kaskadowo innym 74HC595 z nim. Mamy wyłączył jasne flagi wejściowego podłączając pin 10 rejestru przesuwnego z VCC.
Oscylator kwarcowy jest podłączony do pinów OSC mikrokontrolera. PIC16F877A nie mają żadnego wewnętrznego oscylatora. W tym projekcie będziemy zapalać prowadzące jeden po drugim od Q0 do Q7 za pomocą shift regitster.
Zbudowaliśmy obwód w płytce stykowej
Objaśnienie kodu:
Kompletny kod do sterowania diodami z rejestrem przesuwnym podany jest na końcu artykułu. Jak zawsze musimy ustawić bity konfiguracyjne w mikrokontrolerze PIC.
#pragma config FOSC = HS // Bity wyboru oscylatora (oscylator HS) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT wyłączony) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT wyłączony) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR włączony) #pragma config LVP = OFF // Niskonapięciowe (pojedyncze zasilanie) In-Circuit Serial Programming Bit Enable (pin RB3 / PGM ma funkcję PGM; niski -pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (ochrona przed zapisem wyłączona; cała pamięć programu może być napisane przez kontrolę EECON) #pragma config CP = OFF // Bit ochrony kodu pamięci programu Flash (ochrona kodu wyłączona)
Następnie zadeklarowaliśmy częstotliwość kryształu, która jest wymagana dla opóźnienia i deklarację pinów dla 74HC595.
#zawierać
Następnie zadeklarowaliśmy funkcję system_init (), aby zainicjować kierunek pinów.
void system_init (void) { TRISB = 0x00; }
Stworzyliśmy impuls zegarowy i impuls podtrzymujący przy użyciu dwóch różnych funkcji
/ * * Ta funkcja włącza Zegar. * / void clock (void) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
i
/ * * Ta funkcja włącza strobowanie i wyzwalanie wyjścia. * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Po tych dwóch funkcjach zadeklarowaliśmy funkcję data_submit (unsigned int data) w celu przesłania danych szeregowych do 74HC595.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (dane >> i) & 0x01; zegar(); } strobe (); // Dane ostatecznie przesłane }
W tej funkcji akceptujemy dane 8-bitowe i wysyłamy każdy bit za pomocą dwóch operatorów bitowych, przesunięcia w lewo i operatora AND. Najpierw przesuwamy dane jeden po drugim i sprawdzamy dokładny bit, czy jest to 0, czy 1, używając operatora AND z 0x01. Każde dane są przechowywane przez impuls zegarowy, a końcowe dane są wysyłane za pomocą impulsu zatrzaskowego lub strobującego. W tym procesie dane wyjściowe będą najpierw MSB (najbardziej znaczący bit).
W funkcji głównej podaliśmy binarny i po kolei ustawiliśmy wysokie styki wyjściowe.
system_init (); // System przygotowuje się while (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); } powrót; }
W ten sposób można użyć rejestru przesuwnego, aby uzyskać więcej wolnych pinów I / O w dowolnym mikrokontrolerze do podłączenia większej liczby czujników.