Светодиодная мигалка на микроконтроллере ATmega8

Светодиодная мигалка на микроконтроллере для радиолюбителя это своего рода «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(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 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(i=0;i<d;i++)_delay_us(50);
 DDRD=0x00;
 for(i=0;i<d;i++)_delay_us(50);
 break;
 }
 }
   } 

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

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

Администратор сайта http://www.radiodetector.ru

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

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

Добавить комментарий