Il existe des possibilités dans la conception embarquée où vous n'avez pas assez de broches d'E / S disponibles dans votre microcontrôleur. Cela peut être dû à n'importe quelle raison, peut-être que votre application a besoin de plusieurs LED ou que vous souhaitez utiliser plusieurs affichages à 7 segments, mais vous n'avez pas besoin de broches d'E / S dans votre microcontrôleur. Voici un composant parfait, le registre à décalage. Le registre à décalage accepte les données série et donne une sortie parallèle. Il ne nécessite que 3 broches pour se connecter à votre microcontrôleur et vous obtiendrez plus de 8 broches de sortie. L'un des registres à décalage les plus populaires est le 74HC595. Il a 8 registre de mémorisation de bits et 8 registre à décalage de bits. En savoir plus sur les registres à décalage ici.
Vous fournirez des données série au registre à décalage et elles seront verrouillées sur le registre de stockage, puis le registre de stockage contrôlera les 8 sorties. Si vous voulez plus de sortie, ajoutez simplement un autre registre à décalage. En mettant en cascade deux registres à décalage, vous obtiendrez 8 sorties supplémentaires, une sortie totale de 16 bits.
Registre de décalage 74HC595:
Voici le schéma de brochage du 74HC595 selon la fiche technique-
HC595 a 16 broches; si nous voyons la fiche technique, nous comprendrons les fonctions des broches-
Le QA à QH, des numéros de broches 1 à 7 et 15, est utilisé comme sortie 8 bits du registre à décalage, alors que la broche 14 est utilisée pour recevoir les données série. Il existe également une table de vérité sur la façon d'utiliser d'autres broches et d'utiliser d'autres fonctions du registre à décalage.
Lorsque nous écrivons le code d'interfaçage du 74HC595, nous appliquerons cette table de vérité pour obtenir les sorties souhaitées.
Maintenant, nous allons interfacer 74HC595 avec PIC16F877A et contrôler 8 LED. Nous avons interfacé le registre à décalage 74HC595 avec d'autres microcontrôleurs:
- Interfaçage du registre à décalage série 74HC595 avec Raspberry Pi
- Comment utiliser le registre à décalage 74HC595 avec Arduino Uno?
- Interfaçage de l'écran LCD avec NodeMCU à l'aide du registre à décalage
Composants requis:
- PIC16F877A
- Condensateurs à disque en céramique 2pcs 33pF
- Cristal 20Mhz
- Résistance 4,7k
- 8pcs LED
- Résistance 1k -1 pc (8 résistances 1k nécessaires si des résistances séparées sur chaque led sont nécessaires)
- 74HC595 ic
- Adaptateur mural 5V
- Environnement de programmation PIC
- Planche à pain et fils
Schéma:
Dans le schéma de circuit, nous avons connecté la broche de données série; horloge et broche stroboscopique (verrouillage) sur les broches RB0, RB1 et RB2 du microcontrôleur respectivement. Ici, nous avons utilisé une résistance pour 8 LED. Selon la table de vérité, nous avons activé la sortie en connectant la broche 13 du 74HC595 à la terre. La broche QH est laissée ouverte car nous ne ferons pas en cascade un autre 74HC595 avec elle. Nous avons désactivé l'indicateur d'entrée d'effacement en connectant la broche 10 du registre à décalage avec VCC.
L'oscillateur Crystal est connecté sur les broches OSC du microcontrôleur. PIC16F877A n'ont pas d'oscillateur interne. Dans ce projet, nous allumerons la led une par une de Q0 à Q7 en utilisant shift regitster.
Nous avons construit le circuit dans une maquette -
Explication du code:
Le code complet de contrôle des LED avec registre à décalage est donné en fin d'article. Comme toujours, nous devons définir les bits de configuration dans le microcontrôleur PIC.
#pragma config FOSC = HS // Bits de sélection de l'oscillateur (oscillateur HS) #pragma config WDTE = OFF // Bit d'activation de la minuterie de surveillance (WDT désactivé) #pragma config PWRTE = OFF // Bit d'activation de la minuterie de mise sous tension (PWRT désactivé) # pragma config BOREN = ON // Bit d'activation de réinitialisation de Brown-out (BOR activé) #pragma config LVP = OFF // Bit d'activation de programmation série en circuit basse tension (alimentation simple) (la broche RB3 / PGM a une fonction PGM; bas -voltage programmation activée) #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 (Protection en écriture désactivée; toute la mémoire programme peut être écrit par le contrôle EECON) #pragma config CP = OFF // Bit de protection du code de la mémoire de programme flash (protection du code désactivée)
Après cela, nous avons déclaré la fréquence du cristal requise pour le retard et la déclaration de brochage du 74HC595.
#comprendre
Ensuite, nous avons déclaré la fonction system_init () pour initialiser la direction de la broche.
void system_init (void) { TRISB = 0x00; }
Nous avons créé l'impulsion d'horloge et l'impulsion de verrouillage en utilisant deux fonctions différentes
/ * * Cette fonction activera l'horloge. * / horloge vide (vide) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
et
/ * * Cette fonction clignotera et activera le déclencheur de sortie. * / stroboscope vide (vide) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Après ces deux fonctions, nous avons déclaré la fonction data_submit (unsigned int data) pour soumettre des données série au 74HC595.
void data_submit (données int non signées) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; l'horloge(); } strobe (); // Données finalement soumises }
Dans cette fonction, nous acceptons les données 8 bits et envoyons chaque bit en utilisant deux opérateurs bit à bit shift gauche et opérateur AND. Nous décalons d' abord les données une par une et trouvons le bit exact s'il est 0 ou 1 en utilisant l'opérateur AND avec 0x01. Chaque donnée est stockée par l'impulsion d'horloge et la sortie de données finale effectuée à l'aide du verrou ou de l'impulsion d'échantillonnage. Dans ce processus, la sortie de données sera d'abord MSB (bit le plus significatif).
Dans la fonction principale , nous avons soumis le binaire et rendu les broches de sortie hautes une par une.
system_init (); // Le système se prépare while (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); } retour; }
C'est ainsi qu'un registre à décalage peut être utilisé pour obtenir plus de broches d'E / S libres dans n'importe quel microcontrôleur pour connecter plus de capteurs.