Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие по АТ89С51 изд.вариант 2010-54.doc
Скачиваний:
86
Добавлен:
19.11.2019
Размер:
865.22 Кб
Скачать
        1. Подсчет числа импульсов за заданный промежуток времени

При решении задачи преобразования числоимпульсного кода в двоичный код, а также в ряде других задач может потребоваться подсчёт числа импульсов N за заданный интервал времени (t1, t2) (рисунок 4.8).

Рисунок 4.8 – Иллюстрация к задаче подсчета числа импульсов за заданный промежуток времени

Эта процедура может быть реализована четырьмя различными способами:

  • программной реализацией временного интервала и программным подсчетом числа импульсов на входе МК;

  • программной реализацией временного интервала и аппаратным подсчетом числа импульсов (на внутреннем таймере-счетчике);

  • аппаратной реализацией временного интервала и программным подсчетом числа импульсов;

  • аппаратной реализацией временного интервала с аппаратным подсчетом числа импульсов.

Первый способ неэффективен и значительно сложнее других, а потому не рассматривается.

При аппаратной реализации подсчета числа событий импульсный датчик должен быть подключен ко входу одного из таймеров (в приведённом примере программы (листинг 4.10) используется вход T1).

Листинг 4.10 – Программа подсчёта числа импульсов за заданный промежуток времени с использованием аппаратного счётчика импульсов

.ORG 0000h

JMP BEGIN

; Адрес начала программы

; Переход к основной части

; программы

BEGIN

SETB T1

MOV IE, #00h

MOV TMOD, #50h

MOV TL1, #00h

MOV TH1, #00h

SETB TR1

CALL DELAY

CLR TR1

; Инициализация входа T1 на

; ввод сигнала

; Запрет всех прерываний

; Настройка таймера T/C1

; на счёт внешних событий

; Очистка регистров

; счётчика

; Разрешение счёта

; Вызов процедуры,

; реализующей временную

; задержку

; Остановка счёта

Подсчет импульсов производится счетчиком событий, а отсчет заданного временного интервала – процедурой DELAY (см. листинг 4.7). Результат сохраняется в регистровой паре TH1:TH0.

При аппаратной реализации отсчета временного интервала используется один из таймеров микроконтроллера. Счёт импульсов реализуется программно (листинг 4.11):

Листинг 4.11 – Программа подсчёта числа импульсов за заданный промежуток времени с использованием аппаратного счётчика времени

T:

N:

F:

ST:

.EQU 0.025

.EQU 40

.EQU 24000000

.EQU 65536-T*F/12

; Требуемый интервал

; времени от

; момента запуска таймера ; до его переполнения

; Необходимое количество

; прерываний от таймера

; Величина T*N – время

; счёта

;Частота кварцевого

; резонатора (24 МГц),

; подключаемого к

; микроконтроллеру

; Число, загружаемое в

; регистровую пару TH0:TL0

.ORG 0000h

JMP BEGIN

.ORG 000Bh

JMP TIMER

; Адрес начала программы

; Переход к основной

; программе

; Адрес обработчика

; прерываний от таймера

; Переход к процедуре

; обработки прерывания

BEGIN:

C1:

C2:

STOP:

MOV IE, #00h

SETB T1

MOV R0, #00h

MOV A, #N

MOV TMOD, #01h

MOV TL0, #<ST

MOV TH0, #>ST

MOV IE, #82h

SETB TR0

JNB TR0, STOP

JB T1, C1

INC R0

JNB TR0, STOP

JNB T1, C2

JMP C1

; Запрет всех прерываний

; Инициализация входа T1 на

; ввод сигнала

;Обнуление счетчика

; импульсов

; Загрузка счетчика

; прерываний от таймера

; Настройка таймера T/C0

; на счёт по модулю 16

; внутренней частоты

; Загрузка таймера

; Разрешение прерывания,

; генерируемого таймером

; Разрешение счёта

; Проверка флага

; разрешения счёта таймера

; Ожидание заднего фронта

; одного из подсчитываемых

; импульсов

; Увеличение счётчика

; импульсов

; Проверка флага

; разрешения счёта таймера

; Ожидание переднего

; фронта одного из

; подсчитываемых

; импульсов

; Переход к циклу ожидания

; следующего импульса

; Выход из процедуры

; После выхода из процедуры результат будет сохранен в ; регистре R0

; Обработчик прерываний, генерируемых таймер-счетчиком T/C0

TIMER:

TEXIT:

MOV TL0, #<ST

MOV TH0, #>ST

DJNZ A, TEXIT

CLR TR0

MOV IE, #00h

RETI

; Загрузка таймера

; Декрементирование

; счётчика прерываний

; и переход на метку TEXIT,

; если A0

; Сброс флага разрешения

; счета

; Запрет прерываний

; Выход из прерывания

В приведённой программе время счёта (t2–t1) составляет 1 секунду. Значения T и N выбирались из следующих соображений: для отсчёта 1 с необходимо, чтобы произведение Т×N=1. При частоте кварцевого резонатора 24 МГц таймер ведет счет импульсов внутреннего генератора, частота которых 2 МГц. Время отсчёта (с) 65536 периодов внутреннего генератора составляет:

.

Целого числа, умножение которого на 0,032768 составит 1, не существует, поэтому из интервала выбирается максимальное число, умножение которого на целое число составит 1. Очевидно, что одним из вариантов будет комбинация: T = 0,025, N=40.

Четвертый способ подсчета числа импульсов может быть реализован двумя способами:

– с использованием двух таймеров-счётчиков (один для генерации интервала времени, другой – для счёта внешних импульсов);

– с использованием таймера-счётчика (для генерации интервала времени) и контроллера прерываний (для регистрации импульсов). При использовании этого способа подсчитываемые импульсы должны подаваться на один из входов контроллера прерываний, INT0 или INT1.

Первый способ позволяет полностью «разгрузить» процессор микроконтроллера. Этот способ является сочетанием двух предыдущих (листинг 4.10 и 4.11).

Второй способ аппаратной регистрации импульсов представлен листингом 4.12.

Листинг 4.12 – Программа подсчёта импульсов за заданный интервал времени с использованием внутреннего контроллера прерываний

T:

N:

F:

ST:

.EQU 0.025

.EQU 40

.EQU 24000000

.EQU 65536-T*F/12

; Интервал времени от

; момента запуска таймера ; до его переполнения

; Необходимое количество

; прерываний от таймера

; Величина T*N – время

; счёта

;Частота кварцевого

; резонатора (24 МГц),

; подключаемого к

; микроконтроллеру

; Число, загружаемое в

; регистровую пару TH0:TL0

.ORG 0000h

JMP BEGIN

.ORG 0003h

INC DPTR

RETI

.ORG 000Bh

JMP TIMER

; Адрес начала программы

; Переход к основной

; программе

; Адрес обработчика

; прерываний по входу INT0

; Увеличение счётчика

; импульсов

; Выход из обработчика

; Адрес обработчика

; прерываний от таймера

; Переход к процедуре

; обработки прерывания

BEGIN:

MOV IE, #00h

SETB INT0

MOV DPTR, #0000h

MOV A, #N

MOV TMOD, #01h

MOV TL0, #<ST

MOV TH0, #>ST

SETB TR0

MOV TCON, #01h

MOV IE, #83h

JB TR0, $

; Запрет всех прерываний

; Инициализация входа INT0

; на ввод сигнала

;Обнуление счетчика

; импульсов

; Загрузка счетчика

; прерываний от таймера

; Настройка таймера T/C0

; на счёт по модулю 16

; внутренней частоты

; Загрузка регистров

; счётчика

; Разрешение счёта

; Настройка контроллера

; прерываний на режим

; срабатывания по спаду

; сигнала на входе INT0

; Разрешение прерываний,

; генерируемых таймером и

; внешним источником

; Проверка флага

; разрешения счёта таймера

; Выход из подпрограммы

; счета

; Обработчик прерываний, генерируемых таймером-счетчиком T/C0

; приведен в листинге 4.11

В данной программе счетчик внешних импульсов представлен регистром DPTR. Подсчитываемые импульсы должны подаваться на вход INT0.