|
Управление частотой мерцания светодиодов
Программные примеры для микроконтроллеров 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); //Бесконечный цикл в ожидании прерываний
}
|
Файлы проекта можно скачать здесь:
|
|
|