Светодиодная мигалка на микроконтроллере для радиолюбителя это своего рода «HelloWorld» для программиста. Сделать простую мигалку, конечно можно и на мультивибраторе. Взять пару транзисторов конденсаторов и не выносить себе мозг всякими там прошивками программированием. Но это путь пойдет для начинающих, а если вы уже в этом деле не новичок, то самое время начать изучать микроконтроллеры. К тому же мигалка на микроконтроллере намного интереснее. Так как в ней будет куча разных программно настраиваемых параметров.

В качестве «сердца» нашей мигалки будет выступать всеми известный микроконтроллер ATmega8, о том как программировать на языке под микроконтроллеры подробно будет описано в следующих статьях, здесь же приведем пример готового кода.

Схема светодиодной мигалки на микроконтроллере ATmega8
Принципиальная схема светодиодной мигалки на микроконтроллере ATmega8

Как видно схема очень простая, всего 4 светодиода которые подключаются к PORTD, к ножкам PD0,PD1,PD2,PD3. Значение ограничивающих сопротивлений R1-R4 — 300 Ом. Кнопка SB1 предназначена для установки режима мигания, а кнопка SB2 позволяет настраивать частоту с которой мигают светодиоды.

В бесконечно цикле while мы проверяем нажатие кнопок SB1 и SB2. При условии что нажата кнопка SB1 то мы увеличиваем значение переменной sw. Если данная переменная равна 0, то пишем в нулевой бит единицу, далее выжидаем время-делаем задержку. Далее записываем в нулевой бит ноль, опять выжидаем время, потом увеличиваем переменную j. В случае если кнопка SB1 не нажата то все повторяется до следующего бита и таким образом мы поочередно включаем светодиоды. Если переменная j будет больше 3-х то ей присваиваем ноль и эти операции повторяются вновь.

Исходный код программы мигалка на микроконтроллере


 int main(void)         
   {
  DDRD = 0xff;      /* все выводы порта D сконфигурировать как выходы */
  DDRC = 0x00;      //выводы порта С сконфигурировать как входы
 
  PORTC = 0xff;  // установить "1" на всех выводах порта C,
 // включаем подтягивающие резисторы
 
 int i=0; //для задержек
 int j=0; //для смены битов порта D
 int d=20; //для изменения периода миганий
 int sw=0; //для изменения режимов миганий
 
 while (1)          // Бесконечный цикл
 { 
 if (!(PINC & (1<<PINC4))) //если логический ноль на 4 бите порта С
 { sw++; //преключить режим миганий if(sw>4)sw=0;
 }
 if (!(PINC & (1<<PINC3))) //если логический ноль на 3 бите порта С 
{ d+=20; //увеличить период миганий if(d>260)d=20;
 }
 
 switch(sw)
 {
 case 0:
 DDRD |= 1<<j;
 for(int i=0;i<d;i++)_delay_us(50);
 DDRD &= ~(1<<j);
 for(int i=0;i<d;i++)_delay_us(50); j++; if(j>3)j=0;
 break;
 case 1:
 DDRD |= 1<<j;
 for(i=0;i<d;i++)_delay_us(50);
 DDRD &= ~(1<<j);
 for(i=0;i<d;i++)_delay_us(50);
 j--;
 if(j<0)j=3;
 break;
 case 2:
 DDRD &= ~(1<<j);
 for(i=0;i<d;i++)_delay_us(50);
 DDRD |= 1<<j;
 for(i=0;i<d;i++)_delay_us(50); j++; if(j>3)j=0;
 break;
 case 3:
 DDRD &= ~(1<<j);
 for(i=0;i<d;i++)_delay_us(50);
 DDRD |= 1<<j;
 for(i=0;i<d;i++)_delay_us(50);
 j--;
 if(j<0)j=3;
 break;
 case 4:
 DDRD=0xff;
 for(int i=0;i<d;i++)_delay_us(50);
 DDRD=0x00;
 for(int i=0;i<d;i++)_delay_us(50);
 break;
 }
 }
   } 

Компиляция программы осуществлялась в WinAVR , ну или в любой другой какая нравиться, тут не принципиально) После удачной компиляции полученный файл с расширением .hex можно закачать в микроконтроллера при помощи программы PonyProg, конечно можно использовать и любую понравившуюся программу. О том как прошить микроконтроллер была отдельная статья.

Сам проект в Atmel Studio 7  выложен по ссылке ниже,  там же находится исполняемый hex файл в папке debug.

Список радиодеталей
Обозначание Наименование Номинал Количество
1 DD1 Микроконтроллер Atmega8 Atmega8 1
2 R1-R4 Резистор 300 Ом 4
3 SB1,SB2 Кнопка - 2
Скачать исходники
Видео

Похожие записи

Память микроконтроллера. Виды памяти микроконтроллеров

Практически все современные микроконтроллеры имеют на своем борту 3 вида  памяти: Виды памяти микроконтроллеров память программ FLASH; оперативная память (ОЗУ) SRAM (Static RAM); ...

Светодиодная мигалка на микросхеме NE 555

Это простая схема двойного светодиодного мигающего сигнала. В качестве базовой схемы нестабильного мультивибратора используется таймер NE 555. Светодиоды включаются по очереди, частоту...

Схема полицейской мигалки на микроконтроллере

Представленная схема полицейской мигалки на микроконтроллере и светодиодах может работать в 16 различных режимах. Режим выбирается при помощи одной кнопки, и собрана на микроконтроллере...

Последовательный интерфейс I2C

Последовательный интерфейс I2C (также его обозначается как IIC) довольно популярный последовательный интерфейс. Свою популярность он получил за неплохую скорость передачи информации. В...

Последовательный периферийный интерфейс SPI

Последовательный периферийный интерфейс SPI (Serial Peripheral Interface) — последовательный стандарт передачи данных. Предназначен для сопряжения микроконтроллеров и периферийных устройств. SPI...

Подключение кнопки к микроконтроллеру AVR

В это примере подключим и научимся обрабатывать события нажатия кнопок при помощи микроконтроллера AVR. Другими словами мониторить состояние кнопок, и при каких либо изменениях делать что...

Светодиодная мигалка на микроконтроллере ATmega8
  • 5
  • Staticvoid 11.06.2019 15:55

    Зачем выделять память под int если хватит unsigned char?

    Андрей 04.09.2019 21:31

    Спасибо за понятный пример, и код рабочий скомпилировался без проблем)

    Staticvoid 25.12.2019 07:27

    Да тут особой разницы нет что int что char, ресурсов у камня хватит)

    А можете добавить архив с исходниками?

    Staticvoid 09.04.2020 18:36

    Добавили архив с исхониками в Atmel Studio 7. Там же hex файл. 

Только полноправные пользователи могут оставлять комментарии. Войдите , пожалуйста.