Във вградения дизайн има възможности, при които нямате достатъчно I / O щифтове на разположение във вашия микроконтролер. Това може да се дължи на каквато и да е причина, може да е необходимо приложението ви да се нуждае от множество светодиоди или да искате да използвате множество 7-сегментни дисплеи, но нямате необходими I / O щифтове във вашия микроконтролер. Тук идва идеален компонент, регистър за смяна. Shift регистърът приема серийни данни и дава паралелен изход. Необходими са само 3 щифта, за да се свържете с вашия микроконтролер и ще получите повече от 8 изходни щифта от него. Един от популярните регистри за смяна е 74HC595. Той има 8-битов регистър за съхранение и 8-битов регистър за смяна. Научете повече за регистрите за смяна тук.
Ще предоставите серийни данни на регистъра за смяна и той ще бъде фиксиран в регистъра за съхранение и след това регистърът за съхранение ще контролира 8-те изхода. Ако искате повече изход, просто добавете друг регистър за смяна. Като каскадирате два регистъра на смяна, ще получите допълнителни 8 изхода, общо 16-битов изход.
Shift регистър 74HC595:
Ето диаграмата на извода на 74HC595 според листа с данни -
HC595 има 16 пина; ако видим листа с данни, ще разберем функциите на ПИН-
В ГК на QH от ПИН номера от 1 до 7 и 15 се използва като 8-битов изход от регистъра на смяна, където като щифт 14 се използва за получаване на серийни данни. Има и таблица на истината за това как да използвате други щифтове и да се възползвате от други функции на регистъра на смяната.
Когато напишем кода за взаимодействие с 74HC595, ще приложим тази таблица на истината за получаване на желаните изходи.
Сега ще свържем 74HC595 с PIC16F877A и ще управляваме 8 светодиода. Взаимодействахме регистър за смяна 74HC595 с други микроконтролери:
- Взаимодействие със сериен регистър за смяна на 74HC595 с Raspberry Pi
- Как да използвам Shift Register 74HC595 с Arduino Uno?
- Взаимодействие на LCD с NodeMCU с помощта на регистър за смяна
Необходими компоненти:
- PIC16F877A
- 2бр 33pF керамични дискови кондензатори
- 20Mhz кристал
- 4.7k резистор
- 8бр светодиоди
- 1k резистор -1 бр (8 бр. 1k резистори са необходими, ако са необходими отделни резистори на всеки светодиод)
- 74HC595 ic
- 5V адаптер за стена
- Програмна среда за PIC
- Макет и жици
Електрическа схема:
В схемата на веригата сме свързали сериен щифт за данни; часовник и стробоскоп (резе) на щифта на микроконтролера съответно RB0, RB1 и RB2. Тук сме използвали един резистор за 8 светодиода. Според таблицата на истината активирахме изхода, като свързваме щифт 13 на 74HC595 към земята. Най- QH щифт е оставена отворена, тъй като ние няма да се каскада друг 74HC595 с него. Ние забранено ясното вход флага, като се свържете пин 10 от регистъра на смяна с VCC.
Кристалният генератор е свързан към OSC щифтовете на микроконтролера. PIC16F877A нямат никакъв вътрешен генератор. В този проект ние ще осветяваме светодиодите един по един от Q0 до Q7 с помощта на регулатор на смяна.
Изградихме веригата в макет -
Обяснение на кода:
Пълен код за управление на светодиоди с регистър на смяна е даден в края на статията. Както винаги, трябва да зададем конфигурационните битове в микроконтролера PIC.
#pragma config FOSC = HS // Осцилаторни битове за избор (HS осцилатор) #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 // Ниско напрежение (Едно захранване) Вътрешна верига за последователно програмиране Активиране на бит (RB3 / PGM щифт има PGM функция; ниска -програмиране на напрежение) #pragma config CPD = OFF // Бит за защита на кода на паметта на EEPROM (изключена защита на EEPROM код за данни) #pragma config WRT = OFF // Flash Program Memory Активиране на битове (Запис на защитата изключена; цялата памет на програмата може да бъде написано от контрола на EECON) #pragma config CP = OFF // Бит за защита на кода на паметта на Flash програма (защита на кода изключена)
След това декларирахме кристалната честота, която е необходима за забавянето, и декларацията за извеждане за 74HC595.
#include
След това декларирахме функцията system_init () за инициализиране на посоката на щифта.
void system_init (void) { TRISB = 0x00; }
Създадохме импулса на часовника и импулса на ключалката, използвайки две различни функции
/ * * Тази функция ще активира часовника. * / празен часовник (празен) { CLK_595 = 1; __забавяне_us (500); CLK_595 = 0; __забавяне_us (500); }
и
/ * * Тази функция ще стробира и ще активира изходния спусък. * / празен стробоскоп (празен) { STROBE_595 = 1; __забавяне_us (500); STROBE_595 = 0; }
След тези две функции декларирахме функцията data_submit (неподписани int данни), за да изпратим серийни данни на 74HC595.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; часовник(); } стробоскоп (); // Данните са окончателно изпратени }
В тази функция приемаме 8-битови данни и изпращаме всеки бит с помощта на два битови оператора ляв shift и оператор AND. Първо преместваме данните една по една и откриваме точния бит дали е 0 или 1, като използваме оператора AND с 0x01. Всяка информация се съхранява от тактовия импулс и крайните изходни данни, направени с помощта на импулса на резето или строб. В този процес извеждането на данни първо ще бъде MSB (най-значимият бит).
В основната функция изпратихме двоичния файл и направихме изходните щифтове високи един по един.
system_init (); // Системата се подготвя докато (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); } връщане; }
Ето как регистър за смяна може да се използва за получаване на повече свободни I / O щифтове във всеки микроконтролер за свързване на повече сензори.