- Регистр сдвига 74HC595:
- Необходимые компоненты:
- Принципиальная электрическая схема:
- Пояснение к коду:
Есть возможности во встроенном дизайне, когда у вас недостаточно контактов ввода / вывода в вашем микроконтроллере. Это может быть связано с любой причиной, может быть, вашему приложению требуется несколько светодиодов или вы хотите использовать несколько 7-сегментных дисплеев, но у вас нет необходимых контактов ввода / вывода в вашем микроконтроллере. А вот и идеальный компонент - сдвиговый регистр. Регистр сдвига принимает последовательные данные и выдает параллельный вывод. Для подключения к микроконтроллеру требуется всего 3 контакта, и вы получите от него более 8 выходных контактов. Один из популярных регистров сдвига - 74HC595. Он имеет 8-битный регистр хранения и 8-битный регистр сдвига. Узнайте больше о регистрах сдвига здесь.
Вы подадите последовательные данные в регистр сдвига, и они будут зафиксированы в регистре хранения, а затем регистр хранения будет управлять 8 выходами. Если вы хотите больше вывода, просто добавьте еще один регистр сдвига. Посредством каскадного соединения двух регистров сдвига вы получите 8 дополнительных выходов, всего 16-битный выход.
Регистр сдвига 74HC595:
Вот схема выводов 74HC595 в соответствии с таблицей данных:
HC595 имеет 16 контактов; если мы увидим таблицу, мы поймем функции контактов -
От QA до QH от 1 до 7 и 15 выводов используется как 8-битный вывод из регистра сдвига, а вывод 14 используется для приема последовательных данных. Также есть таблица истинности о том, как использовать другие выводы и другие функции сдвигового регистра.
Когда мы пишем код для взаимодействия с 74HC595, мы будем применять эту таблицу истинности для получения желаемых результатов.
Теперь мы соединим 74HC595 с PIC16F877A и будем управлять 8 светодиодами. Сдвиговый регистр 74HC595 сопряжен с другими микроконтроллерами:
- Подключение последовательного регистра сдвига 74HC595 к Raspberry Pi
- Как использовать регистр сдвига 74HC595 с Arduino Uno?
- Взаимодействие ЖК-дисплея с NodeMCU с помощью регистра сдвига
Необходимые компоненты:
- PIC16F877A
- 2шт 33пФ керамические дисковые конденсаторы
- Кристалл 20 МГц
- Резистор 4,7 кОм
- 8шт светодиоды
- Резистор 1 кОм -1 шт. (Требуется 8 шт. Резисторов 1 кОм, если нужны отдельные резисторы на каждый светодиод)
- 74HC595 микросхема
- Настенный адаптер 5 В
- Среда программирования 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 // Бит включения сторожевого таймера (WDT отключен) #pragma config PWRTE = OFF // Бит включения таймера включения (PWRT отключен) # pragma config BOREN = ON // Бит разрешения сброса пониженного напряжения (BOR включен) #pragma config LVP = OFF // Бит разрешения последовательного программирования низкого напряжения (однополярный) (вывод RB3 / PGM имеет функцию PGM; низкий -программирование напряжения включено) #pragma config CPD = OFF // Бит защиты кода памяти EEPROM данных (защита кода EEPROM данных выключена) #pragma config WRT = OFF // Биты разрешения записи в память программы Flash (защита от записи отключена; вся программная память может быть написано управлением EECON) #pragma config CP = OFF // Бит защиты кода флеш-памяти программы (защита кода выключена)
После этого мы объявили кварцевую частоту, необходимую для задержки, и распиновку 74HC595.
#включают
Затем мы объявили функцию system_init () для инициализации направления вывода.
void system_init (недействительно) { TRISB = 0x00; }
Мы создали тактовый импульс и импульс защелки, используя две разные функции.
/ * * Эта функция включает Часы. * / void clock (недействительно) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
и
/ * * Эта функция будет стробировать и активировать триггер выхода. * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
После этих двух функций мы объявили функцию data_submit (unsigned int data) для отправки последовательных данных в 74HC595.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (данные >> i) & 0x01; Часы(); } строб (); // Данные наконец отправлены }
В этой функции мы принимаем 8-битные данные и отправляем каждый бит с помощью двух побитовых операторов сдвига влево и оператора AND. Сначала мы сдвигаем данные один за другим и выясняем, какой именно бит равен 0 или 1, используя оператор AND с 0x01. Каждые данные сохраняются с помощью тактового импульса, а окончательный вывод данных осуществляется с помощью импульса защелки или строба. В этом процессе вывод данных будет первым в MSB (наиболее значимый бит).
В основной функции мы отправили двоичный файл и один за другим сделали выходные выводы высокими.
system_init (); // Система готовится 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); } возврат; }
Вот как можно использовать сдвиговый регистр, чтобы получить больше свободных выводов ввода / вывода в любом микроконтроллере для подключения большего количества датчиков.