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

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

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

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

Код программы мигания светодиодами

 
 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, конечно можно использовать и любую понравившуюся программу. О том как прошить микронтроллер была отдельная статья.

Комментарии   

0
Подскажите, а как рассчитать значение резистора? Откуда взялось значение в 300 Ом.

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


Защитный код
Обновить