Вы вошли на сайт, как Гость
Регистрация

Управление частотой мерцания светодиодов

Программные примеры для микроконтроллеров PIC - MPLab IDE
(Управление частотой мерцания светодиодов с помощью различных таймеров)

К выводам 0 — 2 порта D подключены светодиоды. Частотой мерцания светодиода на выводе 0 управляет TMR0, светодиода на выводе 1 — TMR1, а светодиода на выводе 2 — управляет TMR2.

Примечание: при компиляции проекта требуется добавить в проект следующие библиотеки: "16F877.h", "stdio.h".


#fuses HS, WDT
#use delay(clock=10000000)

int c0, c1, c2;            //Переменные, используемые для замедления мерцания

#int_timer0                //Обработчик прерывания при переполнении TMR0
void timer0_isr(void)
{
  if (c0++ & 8)  //Увеличиваем с0, и если 3-й разряд = 1,...
    output_bit(PIN_D0, 1); //включаем светодиод на выводе 0
  else
    output_bit(PIN_D0, 0); //иначе выключаем светодиод на выводе 0
}

#int_timer1                //Обработчик прерывания при переполнении TMR1
void timer1_isr(void)
{
  if (c1++ & 8)            //Увеличиваем с1, и если 3-й разряд = 1,...
    output_bit(PIN_D1, 1); //включаем светодиод на выводе 1
  else
    output_bit(PIN_D1, 0); //иначе выключаем светодиод на выводе 1
}

#int_timer2    //Обработчик прерывания при переполнении TMR2
void timer2_isr(void)
{
  if (c2++ & 8)  //Увеличиваем с2, и если 3-й разряд = 1,...
    output_bit(PIN_D2, 1); //включаем светодиод на выводе 2
  else
    output_bit(PIN_D2, 0); //иначе выключаем светодиод на выводе 2
}

void main() 
{
  /* Инициализируем таймер TMR0 (функция setup_counters 
     также используется для инициализации сторожевого таймера).
     Первый параметр указывает на тактирование внутренним 
     сигналом, второй задает коэффициент деления частоты.
     Можно также было бы воспользоваться функцией 
     setup_timer0(RTCC_INTERNAL | RTCC_DIV_2) */
  setup_counters(RTCC_INTERNAL, RTCC_DIV_2);
  //Инициализируем таймер TMR1. Коэффициент деления = 4
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
  /*Инициализируем TMR2. Коэффициент деления = 16; сброс значения
    счетчика – по 255 импульсу; один сброс перед прерыванием */
  setup_timer_2(T2_DIV_BY_16, 255, 1);
  //Разрешаем прерывания при переполнении счетчиков
  enable_interrupts(int_timer0);
  enable_interrupts(int_timer1);
  enable_interrupts(int_timer2);
  enable_interrupts(global);  //Общее разрешение прерываний
  while(1);  //Бесконечный цикл в ожидании прерываний
}

Файлы проекта можно скачать здесь: