Det finns möjligheter i inbäddad design där du inte har tillräckligt med I / O-stift tillgängliga i din mikrokontroller. Det kan bero på någon anledning, kan vara att din applikation behöver flera lysdioder eller att du vill använda flera 7-segment skärmar, men du behöver inte ha I / O-stift i din mikrokontroller. Här kommer en perfekt komponent, skiftregister. Skiftregister accepterar seriell data och ger parallell utdata. Det krävs bara 3 stift för att ansluta till din mikrokontroller och du får mer än 8 utgångsstift från den. Ett av de populära skiftregistret är 74HC595. Den har 8 bitars lagringsregister och 8 bitars skiftregister. Läs mer om skiftregister här.
Du kommer att tillhandahålla seriell data till skiftregistret och det kommer att spärras i lagringsregistret och sedan kommer lagringsregistret att styra de 8 utgångarna. Om du vill ha mer utdata, lägg bara till ett nytt skiftregister. Genom att kaskadera två skiftregister får du ytterligare 8 utgångar, totalt 16 bitars utgång.
Skiftregister 74HC595:
Här är uttagsdiagrammet för 74HC595 enligt databladet-
HC595 har 16 nålar; om vi ser databladet förstår vi stiftfunktionerna-
Den QA till QH, från stiftnummer 1 till 7 och 15 användes som 8 bitars utsignal från skiftregistret, där som stiftet 14 används för mottagning av seriedata. Det finns också sanningstabell om hur man använder andra stift och använder andra funktioner i skiftregistret.
När vi skriver koden för gränssnitt mellan 74HC595 kommer vi att använda denna sanningstabell för att få önskade utgångar.
Nu kommer vi att gränssnitt 74HC595 med PIC16F877A och styra 8 lysdioder. Vi har kopplat 74HC595 skiftregister med andra mikrokontroller:
- Gränssnitt 74HC595 Serial Shift Register med Raspberry Pi
- Hur använder jag Shift Register 74HC595 med Arduino Uno?
- Gränssnitt LCD med NodeMCU med hjälp av skiftregister
Komponenter som krävs:
- PIC16F877A
- 2st 33pF keramiska skivkondensatorer
- 20Mhz kristall
- 4,7 k motstånd
- 8st LED
- 1k motstånd -1 st (8 st 1k motstånd krävs om separata motstånd på varje lysdiod behövs)
- 74HC595 ic
- 5V väggadapter
- PIC-programmeringsmiljö
- Brödbräda och trådar
Kretsschema:
I kretsschemat har vi anslutit den seriella datapinnen; klocka och strobe (spärr) på mikrokontrollers RB0-, RB1- och RB2- stift. Här har vi använt ett motstånd för 8 lysdioder. Enligt sanningstabellen aktiverade vi utdata genom att ansluta stift 13 på 74HC595 till jord. Den QH stiftet lämnas öppen eftersom vi inte kommer att kaskad ytterligare 74HC595 med det. Vi inaktiverade den tydliga inmatningsflaggan genom att ansluta stift 10 i skiftregistret till VCC.
Crystaloscillatorn är ansluten till OSC-stiften på mikrokontrollern. PIC16F877A har ingen intern oscillator. I detta projekt kommer vi att lysa upp ledningen en efter en från Q0 till Q7 med hjälp av shift regitster.
Vi har konstruerat kretsen i en brädbräda-
Kodförklaring:
Komplett kod för styrning av lysdioder med skiftregister ges i slutet av artikeln. Som alltid måste vi ställa in konfigurationsbitarna i PIC-mikrokontrollern.
#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 enabled ) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 / PGM pin has PGM function; low -spänningsprogrammering aktiverad) #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; all programm memory may be skriven till av EECON-kontrollen) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
Därefter förklarade vi den kristallfrekvens som krävs för fördröjningen och uttagsdeklarationen för 74HC595.
#omfatta
Därefter förklarade vi system_init () -funktionen för att initialisera stiftriktningen.
ogiltigt system_init (ogiltigt) { TRISB = 0x00; }
Vi skapade klockpulsen och låspulsen med två olika funktioner
/ * * Denna funktion aktiverar klockan. * / ogiltig klocka (ogiltig) { CLK_595 = 1; __fördröjning (500); CLK_595 = 0; __fördröjning (500); }
och
/ * * Denna funktion kommer att stroba och aktivera utgångsutlösaren. * / void strobe (void) { STROBE_595 = 1; __fördröjning (500); STROBE_595 = 0; }
Efter dessa två funktioner förklarade vi data_submit-funktionen (osignerad int-data) för att skicka seriell data till 74HC595.
ogiltig data_sänd in (osignerad int-data) { för (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; klocka(); } strobe (); // Uppgifterna slutligen inlämnade }
I den här funktionen accepterar vi 8-bitars data och skickar varje bit med två bitvisa operatörer left shift och AND- operator. Vi flyttar först data en efter en och får reda på den exakta biten om det är 0 eller 1 med AND-operator med 0x01. Varje data lagras av klockpulsen och den slutliga datautmatningen som görs med hjälp av spärr- eller strobpulsen. I denna process kommer datautmatningen att vara MSB (Most Significant Bit) först.
I huvudfunktionen lämnade vi det binära och gjorde utgångsstift hög en efter en.
system_init (); // System redo medan (1) { data_submit (0b00000000); __fördröja_ms (200); data_submit (0b10000000); __fördröja_ms (200); data_submit (0b01000000); __fördröja_ms (200); data_submit (0b00100000); __fördröja_ms (200); data_submit (0b00010000); __fördröja_ms (200); data_submit (0b00001000); __fördröja_ms (200); data_submit (0b00000100); __fördröja_ms (200); data_submit (0b00000010); __fördröja_ms (200); data_submit (0b00000001); __fördröja_ms (200); data_submit (0xFF); __fördröja_ms (200); } returnera; }
Således kan ett skiftregister användas för att få fler gratis I / O-stift i vilken mikrokontroller som helst för att ansluta fler sensorer.