Există posibilități în designul încorporat în care nu aveți suficienți pini I / O disponibili în microcontroler. Acest lucru se poate datora din orice motiv, poate că aplicația dvs. are nevoie de mai multe LED-uri sau doriți să utilizați mai multe afișaje pe 7 segmente, dar nu aveți nevoie de pini I / O în microcontroler. Aici vine o componentă perfectă, registru de schimbare. Registrul Shift acceptă date seriale și oferă ieșiri paralele. Este nevoie de doar 3 pini pentru a vă conecta la microcontrolerul dvs. și veți obține mai mult de 8 pini de ieșire din acesta. Unul dintre registrele de schimburi populare este 74HC595. Are registru de stocare pe 8 biți și registru de schimbare pe 8 biți. Aflați mai multe despre registrele de schimbare aici.
Veți furniza date seriale registrului de schimbare și vor fi blocate pe registrul de stocare și apoi registrul de stocare va controla cele 8 ieșiri. Dacă doriți mai multă ieșire, adăugați un alt registru de schimbare. Prin cascadarea a două registre de schimbare, veți obține 8 ieșiri suplimentare, ieșire totală de 16 biți.
Registrul de schimbare 74HC595:
Iată diagrama pin out a 74HC595 conform fișei tehnice-
HC595 are 16 pini; dacă vedem foaia tehnică, vom înțelege funcțiile pin
QA la QH, de la numere de pini de la 1 la 7 și 15 utilizate ca ieșire de 8 biți din registrul de deplasare, în cazul în care ca PIN - ul 14 este utilizat pentru primirea datelor seriale. Există, de asemenea, un tabel de adevăr despre cum să utilizați alți pini și să utilizați alte funcții ale registrului de schimbare.
Când scriem codul pentru interfața 74HC595, vom aplica acest tabel de adevăr pentru a obține ieșirile dorite.
Acum, vom interfața 74HC595 cu PIC16F877A și vom controla 8 LED-uri. Am interfațat registrul de schimbare 74HC595 cu alte microcontrolere:
- Interfață 74HC595 Serial Shift Register cu Raspberry Pi
- Cum se folosește Shift Register 74HC595 cu Arduino Uno?
- Interfață LCD cu NodeMCU folosind shift Register
Componente necesare:
- PIC16F877A
- 2buc condensatori ceramici de 33pF
- Cristal de 20Mhz
- Rezistor de 4.7k
- 8buc LED-uri
- 1k rezistor -1 buc (8 buc rezistențe 1k necesare dacă sunt necesare rezistențe separate pe fiecare led)
- 74HC595 ic
- Adaptor de perete de 5V
- Mediul de programare PIC
- Pană și fire
Diagrama circuitului:
În schema de circuite, am conectat pinul de date seriale; ceas și pin stroboscopic (zăvor) pe pinul RB0, RB1 și respectiv RB2 al microcontrolerului. Aici am folosit un rezistor pentru 8 LED-uri. Conform tabelului adevărului, am activat ieșirea conectând pinul 13 al 74HC595 la masă. QH PIN - ul este lăsat deschis ca nu vom cascadă un alt 74HC595 cu ea. Am dezactivat semnalizarea de intrare clară conectând pinul 10 al registrului de schimbare cu VCC.
Oscilatorul Crystal este conectat pe pinii OSC ai microcontrolerului. PIC16F877A nu au nici un oscilator intern. În acest proiect vom aprinde ledul unul câte unul de la Q0 la Q7 folosind regitsterul shift.
Am construit circuitul într-o panou
Explicatie cod:
Codul complet pentru controlul LED-urilor cu registru de schimbare este dat la sfârșitul articolului. Ca întotdeauna, trebuie să setăm biții de configurare în microcontrolerul PIC.
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR activate) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 / PGM pin are function PGM; low -programare tensiune activată) #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 (Protecție la scriere dezactivată; toată memoria programului poate fi scris de controlul EECON) #pragma config CP = OFF // Bit program de protecție cod memorie program flash (protecție cod dezactivată)
După aceea, am declarat frecvența cristalului care este necesară pentru întârziere și declarația pin-out pentru 74HC595.
#include
Apoi am declarat funcția system_init () pentru a inițializa direcția pinului.
void system_init (void) { TRISB = 0x00; }
Am creat pulsul de ceas și impulsul de blocare folosind două funcții diferite
/ * * Această funcție va activa Ceasul. * / ceas gol (gol) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
și
/ * * Această funcție va strobe și va activa declanșatorul de ieșire. * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
După aceste două funcții am declarat funcția data_submit (nesemnate int data) pentru a trimite date seriale la 74HC595.
void data_submit (date int nesemnate) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; ceas(); } strobe (); // Date trimise în cele din urmă }
În această funcție acceptăm date pe 8 biți și trimitem fiecare bit folosind doi operatori pe biți shift stânga și operatorul AND. Mai întâi schimbăm datele unul câte unul și aflăm bitul exact dacă este 0 sau 1 folosind operatorul AND cu 0x01. Fiecare date sunt stocate de impulsul ceasului și de ieșirea finală a datelor efectuate utilizând impulsul de blocare sau stroboscop. În acest proces, ieșirea datelor va fi mai întâi MSB (Most Significant Bit).
În funcția principală am trimis binarul și am făcut pinii de ieșire mari unul câte unul.
system_init (); // Sistemul se pregătește în timp ce (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); } întoarcere; }
Acesta este modul în care un registru de schimbare poate fi utilizat pentru a obține mai mulți pini I / O gratuiți în orice microcontroler pentru conectarea mai multor senzori.