Esistono possibilità nella progettazione incorporata in cui non si hanno abbastanza pin I / O disponibili nel microcontrollore. Ciò può essere dovuto a qualsiasi motivo, potrebbe essere la tua applicazione che necessita di più LED o se desideri utilizzare più display a 7 segmenti, ma non hai i pin I / O richiesti nel tuo microcontrollore. Ecco un componente perfetto, registro a scorrimento. Il registro a scorrimento accetta dati seriali e fornisce un output parallelo. Richiede solo 3 pin per connettersi al microcontrollore e otterrai più di 8 pin di uscita da esso. Uno dei più diffusi registri a turni è 74HC595. Ha un registro di memoria a 8 bit e un registro a scorrimento a 8 bit. Ulteriori informazioni sui registri di turno qui.
Fornirai i dati seriali al registro a scorrimento e questo verrà bloccato sul registro di archiviazione e quindi il registro di archiviazione controllerà le 8 uscite. Se vuoi più output, aggiungi un altro registro a scorrimento. Collegando in cascata due registri a scorrimento, si ottengono 8 uscite aggiuntive, per un totale di 16 bit.
Registro a scorrimento 74HC595:
Ecco il diagramma dei pin del 74HC595 come da datasheet-
HC595 ha 16 pin; se vediamo il datasheet capiremo le funzioni dei pin-
Da QA a QH, dai numeri pin da 1 a 7 e 15 usati come uscita a 8 bit dal registro a scorrimento, dove come pin 14 è usato per ricevere i dati seriali. C'è anche una tabella della verità su come utilizzare altri pin e usufruire di altre funzioni del registro a scorrimento.
Quando scriviamo il codice per interfacciare il 74HC595, applicheremo questa tabella di verità per ottenere gli output desiderati.
Ora interfacciamo 74HC595 con PIC16F877A e controlleremo 8 LED. Abbiamo interfacciato il registro a scorrimento 74HC595 con altri microcontrollori:
- Interfacciamento del registro a scorrimento seriale 74HC595 con Raspberry Pi
- Come utilizzare il registro a scorrimento 74HC595 con Arduino Uno?
- Interfacciamento LCD con NodeMCU utilizzando il registro a scorrimento
Componenti richiesti:
- PIC16F877A
- Condensatori a disco ceramico da 2 pezzi 33pF
- Cristallo da 20 Mhz
- Resistenza da 4.7k
- 8 LED
- 1k resistore -1 pc (8 resistori 1k richiesti se sono necessari resistori separati su ciascun led)
- 74HC595 ic
- Adattatore da parete 5V
- Ambiente di programmazione PIC
- Breadboard e fili
Schema elettrico:
Nello schema elettrico, abbiamo collegato il pin dei dati seriali; pin clock e strobo (latch) rispettivamente sui pin RB0, RB1 e RB2 del microcontrollore. Qui abbiamo usato una resistenza per 8 LED. Secondo la tabella della verità, abbiamo abilitato l'uscita collegando il pin 13 di 74HC595 a massa. Il pin QH è lasciato aperto poiché non ne metteremo a cascata un altro 74HC595. Abbiamo disabilitato il flag di input chiaro collegando il pin 10 del registro a scorrimento con VCC.
L'oscillatore Crystal è collegato ai pin OSC del microcontrollore. PIC16F877A non ha alcun oscillatore interno. In questo progetto accenderemo i led uno ad uno da Q0 a Q7 utilizzando lo shift regitster.
Abbiamo costruito il circuito in una breadboard-
Spiegazione del codice:
Il codice completo per il controllo dei LED con registro a scorrimento è fornito alla fine dell'articolo. Come sempre, dobbiamo impostare i bit di configurazione nel microcontrollore PIC.
#pragma config FOSC = HS // Bit di selezione dell'oscillatore (oscillatore HS) #pragma config WDTE = OFF // Bit di abilitazione del timer watchdog (WDT disabilitato) #pragma config PWRTE = OFF // Bit di abilitazione del timer di accensione (PWRT disabilitato) # pragma config BOREN = ON // Bit di abilitazione reset brown-out (BOR abilitato) #pragma config LVP = OFF // Bit di abilitazione programmazione seriale in-circuit a bassa tensione (alimentazione singola) (il pin RB3 / PGM ha la funzione PGM; basso -voltage programming enabled) #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 (Write protection off; tutta la memoria del programma può essere scritto dal controllo EECON) #pragma config CP = OFF // Bit di protezione del codice della memoria del programma Flash (protezione del codice disattivata)
Successivamente abbiamo dichiarato la frequenza del cristallo richiesta per il ritardo e la dichiarazione di pin-out per 74HC595.
#includere
Successivamente abbiamo dichiarato la funzione system_init () per inizializzare la direzione del pin.
void system_init (void) { TRISB = 0x00; }
Abbiamo creato l'impulso di clock e l'impulso di latch utilizzando due diverse funzioni
/ * * Questa funzione abiliterà l'orologio. * / void clock (void) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
e
/ * * Questa funzione lampeggerà e abiliterà il trigger di uscita. * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Dopo queste due funzioni abbiamo dichiarato la funzione data_submit (unsigned int data) per inviare i dati seriali al 74HC595.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; orologio(); } strobo (); // Dati finalmente inviati }
In questa funzione accettiamo dati a 8 bit e inviamo ogni bit utilizzando due operatori bit per bit shift sinistro e operatore AND. Per prima cosa spostiamo i dati uno per uno e scopriamo il bit esatto se è 0 o 1 usando l'operatore AND con 0x01. Ciascun dato viene memorizzato dall'impulso di clock e dall'uscita dati finale eseguita utilizzando l'impulso di blocco o strobo. In questo processo l'output dei dati sarà prima MSB (Most Significant Bit).
Nella funzione principale abbiamo inviato il binario e reso alti i pin di uscita uno per uno.
system_init (); // Il sistema si prepara mentre (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); } ritorno; }
In questo modo è possibile utilizzare un registro a scorrimento per ottenere più pin I / O liberi in qualsiasi microcontrollore per il collegamento di più sensori.