V vdelani zasnovi obstajajo možnosti, ko v vašem mikrokrmilniku ni na voljo dovolj I / O zatičev. Razlog je lahko iz katerega koli razloga, morda vaša aplikacija potrebuje več LED ali želite uporabiti več 7-segmentnih zaslonov, vendar v mikrokrmilniku nimate zahtevanih I / O zatičev. Prihaja popolna komponenta, register premikov. Shift register sprejema serijske podatke in daje vzporedni izhod. Za povezavo z mikrokrmilnikom potrebujete le 3 nožice in od njega boste dobili več kot 8 izhodnih nožic. Eden izmed priljubljenih registrov menjav je 74HC595. Ima 8-bitni register pomnilnika in 8-bitni register pomika. Več o registrih premikov preberite tukaj.
Posredovali boste serijske podatke v prestavni register, ki bodo pritrjeni na pomnilniški register, nato pa bo shranjevalni register nadzoroval 8 izhodov. Če želite več izhodnih podatkov, dodajte še en register premika. S kaskadiranjem dveh registrov premikov boste dobili dodatnih 8 izhodov, skupno 16-bitni izhod.
Shift Register 74HC595:
Tu je shema pin-a 74HC595 v skladu s podatkovnim listom
HC595 ima 16 zatičev; če bomo videli podatkovni list, bomo razumeli funkcije pin-
QA za QH, od pin številke od 1 do 7 in 15 se uporablja kot 8 bitni izhod iz pomični register, če je kot zatič 14 se uporablja za prejemanje serijskih podatkov. Obstaja tudi tabela resnic o tem, kako uporabiti druge nožice in izkoristiti druge funkcije prestavnega registra.
Ko napišemo kodo za povezovanje 74HC595, bomo uporabili to tabelo resnic za pridobitev želenih izhodov.
Zdaj bomo vmesnik 74HC595 povezali s PIC16F877A in upravljali 8 LED. Prestavni register 74HC595 smo povezali z drugimi mikrokrmilniki:
- Povezovanje registra serijskega premika 74HC595 z Raspberry Pi
- Kako uporabljati Shift Register 74HC595 z Arduino Uno?
- Povezava LCD-ja z NodeMCU z uporabo premičnega registra
Potrebne komponente:
- PIC16F877A
- 2pcs 33pF keramični kondenzatorji
- Kristal 20 MHz
- 4.7k upor
- 8 kosov LED
- 1k upor -1 kos (8 kosov upori 1k, če so potrebni ločeni upori na vsaki LED diodi)
- 74HC595 ic
- 5V stenski adapter
- Programsko okolje PIC
- Breadboard in žice
Shema vezja:
V vezju smo povezali zaporedni podatkovni pin; zatič za uro in zaslon (zapah) na zatiču RB0, RB1 in RB2 mikrokrmilnika. Tu smo uporabili en upor za 8 LED. Glede na tabelo resnic smo omogočili izhod, tako da smo na ozemljitev priključili zatič 13 74HC595. QH pin ostane odprto, saj ne bomo kaskade drugo 74HC595 z njim. Zastavico jasnega vnosa smo onemogočili s povezovanjem nožice 10 prestavnega registra z VCC.
Kristalni oscilator je povezan na OSC nožice mikrokrmilnika. PIC16F877A nima notranjega oscilatorja. V tem projektu bomo z izmeničnim regulatorjem osvetlili enega za drugim od Q0 do Q7.
Vezje smo zgradili v tabli
Razlaga kode:
Popolna koda za upravljanje LED s prestavnim registrom je podana na koncu članka. Kot vedno moramo konfiguracijske bite nastaviti v mikrokrmilniku PIC.
#pragma config FOSC = HS // Oscilator bitov za izbiro (HS oscilator) #pragma config WDTE = OFF // Bit Watchg Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) # pragma config BOREN = ON // Rit-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Nizkonapetostni (enojni napajalnik) Serijski programirni vklopni bit (RB3 / PGM ima funkcijo PGM; nizek -napetostno programiranje omogočeno) #pragma config CPD = OFF // Bit zaščite pomnilniške kode EEPROM podatkov (zaščita kode EEPROM podatkov izključena) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all programski pomnilnik je lahko napisano s strani EECON control) #pragma config CP = OFF // Bit zaščite pomnilniške kode programa Flash (zaščita kode izklopljena)
Po tem smo razglasili kristalno frekvenco, ki je potrebna za zakasnitev, in izjavo o pin-u za 74HC595.
#include
Nato smo razglasili funkcijo system_init () za inicializacijo smeri zatiča.
void system_init (void) { TRISB = 0x00; }
Utrip impulza in impulz zapaha smo ustvarili z dvema različnima funkcijama
/ * * Ta funkcija bo omogočila uro. * / void clock (void) { CLK_595 = 1; __zakasni_us (500); CLK_595 = 0; __zakasni_us (500); }
in
/ * * Ta funkcija bo preklopila in omogočila izhodni sprožilec. * / void strobe (void) { STROBE_595 = 1; __zakasni_us (500); STROBE_595 = 0; }
Po teh dveh funkcijah smo razglasili funkcijo data_submit (nepodpisani int podatki) za pošiljanje serijskih podatkov na 74HC595.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; ura (); } strobo (); // Podatki končno poslani }
V tej funkciji sprejmemo 8-bitne podatke in pošljemo vsak bit z uporabo dveh bitnih operaterjev levi pomik in operatorja AND. Podatke najprej premaknemo enega za drugim in natančno ugotovimo, ali je 0 ali 1 z uporabo operatorja AND z 0x01. Vsak podatek shrani impulz ure in končni izhodni podatki s pomočjo impulza zapaha ali stroba. V tem postopku bo izhod podatkov najprej MSB (najpomembnejši bit).
V glavni funkciji smo oddali binarno datoteko in izhodne zatiče postavili visoko enega za drugim.
sistem_init (); // Sistem se pripravlja, medtem ko (1) { data_submit (0b00000000); __zakasnitev_ms (200); data_submit (0b10000000); __zakasnitev_ms (200); data_submit (0b01000000); __zakasnitev_ms (200); data_submit (0b00100000); __zakasnitev_ms (200); data_submit (0b00010000); __zakasnitev_ms (200); data_submit (0b00001000); __zakasnitev_ms (200); data_submit (0b00000100); __zakasnitev_ms (200); data_submit (0b00000010); __zakasnitev_ms (200); data_submit (0b00000001); __zakasnitev_ms (200); data_submit (0xFF); __zakasnitev_ms (200); } vrnitev; }
Tako lahko z uporabo premičnega registra dobite več prostih V / I zatičev v katerem koli mikrokrmilniku za priključitev več senzorjev.