Напрямую к портам микроконтроллера мы не можем подключать большую нагрузку, так как выйдут из строя порты микроконтроллера, для этого будем использовать транзисторный ключ структуры n-p-n, если в схеме нужно будет подключать не минус к зуммеру как в нашем случае, а плюс источника напряжения, то там будем использовать транзисторы структуры p-n-p - эти знания нам пригодятся в дальнейшем когда будем подключать семисегментные индикаторы с общим катодом и анодом соответственно.
Начнем с алгоритма работы нашей программы!
1. Если нажать кнопку КН1 подключенную к порту PB1, то на ножке микроконтроллера №15 появится минус источника питания.
2. На ножке №3 порт PD1 появится напряжение и через токоограничительный резистор пойдет на базу транзистора VT1.
3. Ключ срабатывает и подает минус на ножку зуммера ВА1.
Перейдем к написанию программы и рисованию электрической схемы!
1. Создаем новый проект в Atmel Studio 7 по пути File > New > Projec..., выбираем C/C++ и тип проекта GCC C Executable Project, вводим название проекта (Name: и Solution name:).
2. Выбираем тип микроконтроллера с которым будем работать, в нашем случае Atmega8.
Программа нам выдает код в файле main.c*
Приводим его к читабельному виду, удаляем лишние комментарии.
Рисуем электрическую схему подключения зуммера к микроконтроллеру:
И так схема у нас есть, на ней обозначены микроконтроллер, источник напряжения 5В, к порту PD1 ножки микроконтроллера №3 подключен транзистор базой к микроконтроллеру, через токоограничительный резистор, зуммер ВА1, к порту PB1 ножки микроконтроллера №15 подключена кнопка КН1, а также обозначены выводы для подключения программатора, вернемся к программе.
Ключ подключен к порту РD, настроим в программе ножки порта РD на выход, допишем в программе DDRD = 0b11111111;, так как кнопка подключена к порту В настроим его ножки на вход DDRB = 0b00000000;, по алгоритму микроконтроллер должен понимать, что когда мы подали минус - замкнув кнопку, для этого подтянем ножки порта В к +5в через внутренние резисторы микроконтроллера PORTB = 0b11111111;.
Добавим в программу библиотеку задержек #include <util/delay.h>, для задержки - чтобы исключить дребезг контактов кнопки будем использовать функцию _delay_ms(), далее с помощью оператора #define укажем программе, что наш микроконтроллер будет работать от внутреннего генератора с частой 8МГц допишем в код #define F_CPU 8000000UL.
Вот такой получился код:
Запишем в бесконечный цикл while код опроса порта на котором подключена кнопка:
Для опроса кнопки воспользуемся операторами if и else, строка if (PINB == 0b11111101) означает, если ножка порта PB1 равна минусу, то выполним код выделенный красным на рисунке ниже, иными словами подадим +5в на базу транзистора VT1, после задержки 50ms для устранения дребезга контактов:
В противном случае else, выключим порт D:
Теперь мы знаем как подключить транзистор к микроконтроллеру и управлять более мощной нагрузкой.