|
Секундомер
Программные примеры для микроконтроллеров PIC - MPLab IDE
(Секундомер)
В рассмотренной ниже программе время отслеживается с помощью прерывания
от таймера TMR1 через каждую миллисекунду. Запуск секундомера реализуем
по нарастающему фронту сигнала на выводе INTO, а останов — по ниспадающему
фронту сигнала на том же выводе. Текущее значение секунды выводится
через порт D и отображается с помощью светодиодов.
С помощью функции setup_timer_1 устанавливается коэффициент деления
частоты системной синхронизации для тактирования таймера. Переполнение счетчика
должно возникать через каждые 0,001 с (то есть, 1 мс). Если коэффициент
деления выбрать равным 1, то в случае рабочей частоты микроконтроллера в 10
МГц периоду 1 мс соответствует 0,001 x 10000000 = 10000 отсчетам. Поскольку с
помощью 16 разрядов счетчика можно получить максимальное значение 65535
(OxFFFF), то он должен инициализироваться значением 65536 - 10000 = 55536.
Примечание: при компиляции проекта требуется добавить в проект следующие библиотеки: "16F877.h", "stdio.h".
#use delay(clock=10000000)
#fuses HS, NOWDT
int16 msecs;
int secs;
unsigned char is_output;
#int_timer1
void timer1_isr(void)
{
if (is_output)
{
if (++msecs == 1000)
{
if (++secs == 60) secs = 0;
msecs = 0;
output_D(~secs);
}
}
}
#int_ext
void ext_isr(void)
{
delay_ms(100);
if (is_output & 1)
ext_int_edge(0, L_TO_H);
else
{
set_timer1(55536);
msecs = 0;
secs = 0;
ext_int_edge(0, H_TO_L);
}
is_output ^= is_output;
}
void main()
{
port_b_pullups(TRUE);
ext_int_edge(0, L_TO_H);
is_output = 0;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts(INT_EXT);
enable_interrupts(INT_TIMER1);
enable_interrupts(global);
while(1);
}
|
Файлы проекта можно скачать здесь:
|
|
|