Er zijn mogelijkheden in embedded design waarbij je niet genoeg I / O-pinnen in je microcontroller hebt. Dat kan om welke reden dan ook zijn, het kan zijn dat uw applicatie meerdere LED's nodig heeft of dat u meerdere 7-segment-displays wilt gebruiken, maar dat u geen I / O-pinnen in uw microcontroller nodig heeft. Hier komt een perfect onderdeel, schuifregister. Het schuifregister accepteert seriële gegevens en geeft parallelle uitvoer. Er zijn slechts 3 pinnen nodig om verbinding te maken met uw microcontroller en u krijgt er meer dan 8 uitgangspennen van. Een van de populaire schuifregisters is 74HC595. Het heeft 8 bit opslagregister en 8 bit schuifregister. Lees hier meer over schuifregisters.
U levert seriële gegevens aan het schuifregister en deze wordt vergrendeld op het opslagregister en vervolgens bestuurt het opslagregister de 8 uitgangen. Als u meer output wilt, voegt u gewoon een ander schuifregister toe. Door twee schuifregisters in cascade te plaatsen, krijgt u 8 extra uitgangen, een totale uitvoer van 16 bits.
Schuifregister 74HC595:
Hier is het pin-out diagram van de 74HC595 volgens het gegevensblad-
HC595 heeft 16 pinnen; als we de datasheet zien, zullen we de pin-functies begrijpen-
De QA tot QH, van pin nummers 1 tot 7 en 15 gebruikt als 8 bit output van het schuifregister, waar als pin 14 wordt gebruikt voor het ontvangen van de seriële data. Er is ook een waarheidstabel over het gebruik van andere pinnen en andere functies van het schuifregister.
Wanneer we de code schrijven voor de interfacing van de 74HC595, zullen we deze waarheidstabel toepassen om de gewenste outputs te krijgen.
Nu zullen we 74HC595 verbinden met PIC16F877A en 8 LED's besturen. We hebben het 74HC595-schuifregister gekoppeld aan andere microcontrollers:
- Koppeling 74HC595 Serial Shift Register met Raspberry Pi
- Hoe gebruik je Shift Register 74HC595 met Arduino Uno?
- Interfacing LCD met NodeMCU met behulp van shift Register
Vereiste componenten:
- PIC16F877A
- 2 stuks 33pF keramische schijfcondensatoren
- 20Mhz kristal
- 4.7k weerstand
- 8 stuks leds
- 1k weerstand -1 pc (8 stuks 1k weerstanden vereist als afzonderlijke weerstanden op elke led nodig zijn)
- 74HC595 ic
- 5V muuradapter
- PIC-programmeeromgeving
- Breadboard en draden
Schakelschema:
In het schakelschema hebben we de seriële datapin aangesloten ; klok en stroboscoop (latch) pin op de microcontroller's RB0, RB1 en RB2 pin respectievelijk. Hier hebben we één weerstand gebruikt voor 8 leds. Volgens de waarheidstabel hebben we uitvoer ingeschakeld door pin 13 van 74HC595 met aarde te verbinden. De QH- pin wordt opengelaten omdat we er geen andere 74HC595 mee zullen cascaderen. We hebben de duidelijke ingangsvlag uitgeschakeld door pin 10 van het schuifregister te verbinden met VCC.
De kristaloscillator is aangesloten op de OSC-pinnen van de microcontroller. PIC16F877A hebben geen interne oscillator. In dit project zullen we de led één voor één verlichten van Q0 naar Q7 met behulp van shift regitster.
We hebben het circuit geconstrueerd in een breadboard-
Code Verklaring:
De volledige code voor het aansturen van LED's met schuifregister vindt u aan het einde van het artikel. Zoals altijd moeten we de configuratiebits instellen in de PIC-microcontroller.
#pragma config FOSC = HS // Oscillator Selectie bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT uitgeschakeld) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT uitgeschakeld) # pragma config BOREN = AAN // Brown-out reset inschakelen bit (BOR ingeschakeld) #pragma config LVP = UIT // Laagspanning (enkele voeding) In-circuit seriële programmering inschakelen bit (RB3 / PGM-pin heeft PGM-functie; laag -voltage-programmering ingeschakeld) #pragma config CPD = OFF // Data EEPROM-geheugencodebeschermingsbit (Data EEPROM- codebescherming uit) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (schrijfbeveiliging uit; al het programmageheugen kan geschreven door EECON controle) #pragma config CP = OFF // Flash-programma Geheugencodebeschermingsbit (codebescherming uit)
Daarna hebben we de kristalfrequentie aangegeven die nodig is voor de vertraging en de pin-out-declaratie voor 74HC595.
# omvatten
Vervolgens hebben we de functie system_init () gedeclareerd om de pin-richting te initialiseren.
void system_init (void) { TRISB = 0x00; }
We hebben de klokpuls en latchpuls gemaakt met behulp van twee verschillende functies
/ * * Met deze functie wordt de klok ingeschakeld. * / ongeldige klok (ongeldig) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
en
/ * * Met deze functie wordt de output-trigger geactiveerd. * / void stroboscoop (ongeldig) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Na deze twee functies hebben we de data_submit (unsigned int data) functie gedeclareerd om seriële data naar de 74HC595 te sturen.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; klok(); } stroboscoop (); // Gegevens eindelijk ingediend }
In deze functie accepteren we 8-bits gegevens en verzenden we elke bit met behulp van twee bitsgewijze operatoren left shift en AND operator. We verschuiven eerst de gegevens een voor een en ontdekken het exacte bit of het 0 of 1 is met de AND-operator met 0x01. Elke gegevens worden opgeslagen door de klokpuls en de uiteindelijke gegevensuitvoer gebeurt met behulp van de latch- of stroboscooppuls. In dit proces is de gegevensuitvoer eerst MSB (Most Significant Bit).
In de hoofdfunctie hebben we het binaire bestand ingediend en de outputpinnen één voor één hoog gemaakt.
system_init (); // Systeem maakt zich klaar terwijl (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); } terugkeer; }
Dat is hoe een schuifregister kan worden gebruikt om meer vrije I / O-pinnen in elke microcontroller te krijgen voor het aansluiten van meer sensoren.