Подсчет числа импульсов
Часто в управляющих программах возникает необходимость ожидания цепочки событий, представляемой последовательностью импульсных сигналов от датчиков. Рассмотрим две типовые процедуры: подсчет числа импульсов между двумя событиями и подсчет числа импульсов в заданный интервал времени.
Подсчет числа импульсов между двумя событиями. Один из возможных вариантов процедуры подсчёта может быть реализован, если использовать вход T1 как вход счетчика событий. В аккумуляторе фиксируется число импульсов, представленное в двоичном коде (максимальное количество 255).
MOV TMOD, #0100000B;настройка счетчика 1
MOV TH1, #0 ;сброс счетчика импульсов
WAIT0: JB P3.4, WAIT0 ;ожидание включения счёта
SETB TCON.6 ;пуск счетчика 1
WAIT1: JNB P3.4, WAIT1 ;ожидание выключения счёта
CLR TCON.6 ;останов счетчика 1
MOV A, TH1 ;(аккумулятор) число импульсов
EXIT: ... ;выход из процедуры
Подсчет числа импульсов за заданный промежуток времени. При решении задачи преобразования число-импульсного кода в двоичный код, а также в ряде других задач может возникнуть необходимость подсчёта числа импульсов за заданный интервал времени. Эта процедура может быть реализована различными способами:
1) программной реализацией временного интервала и программным подсчетом числа импульсов на входе;
2) программной реализацией временного интервала и аппаратным подсчетом числа импульсов (на внутреннем таймере/счетчике);
3) аппаратной реализацией временного интервала и программным подсчетом числа импульсов;
4) аппаратная реализация временного интервала с аппаратным подсчетом числа импульсов.
Четвертый способ подсчета импульсов требует использования двух счётчиков. На T/C1 можно выполнять подсчёт числа импульсов, а на T/C0 - отсчёт заданного интервала. Датчик импульсов должен быть подключен к входу T1:
TIME EQU NOT(10000)+1 ;определение константы TIME для
;отсчета интервала 10 мс
MOV TMOD, #0l0l0001B ;настройка T/C, 16 бит
;1 – счетчик, 0 – таймер
CLR A ;сброс аккумулятора
MOV ТН1, А ;сброс Т/С1
MOV TL1, A
MOV TH0, #HIGH(TIME) ;загрузка в Т/С0
MOV TL0, #LOW(TIME) ;константы TIME
ORL TCON, #50H ;пуск Т/С1 и Т/С0
WAIT: JBC TCON.5, EXIT ;проверка переполнения Т/С0
SJMP WAIT ;цикл, если TF=0
EXIT: MOV B, TH1 ;(B)(A) число импульсов
MOV A, TL1
... ;выход из процедуры