Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kharakhnin / ПОСОБИЕ_Харахнин.doc
Скачиваний:
281
Добавлен:
08.03.2016
Размер:
17.89 Mб
Скачать

4.2. Ожидание импульсного сигнала

Ожидание импульсного сигнала можно организовать тремя способами. Первый способ - это программный опрос разряда порта, к которому подключен импульсный датчик. Второй вариант использует таймер-счетчик в качестве счетчика внешних импульсов. В регистр счетчика загружается число FFFFH, разрешаются прерывания по переполнению счетчика. Прямоугольный импульс, поступающий на вход Т0 или Т1, переполняет регистр счетчика, наступает прерывание, после чего выполняется подпрограмма обслуживания прерывания, в которой вновь необходимо загрузить регистр счетчика числом FFFFH. Третий вариант связан с использованием входов запросов на прерывание INT0 и INT1. Импульсный сигнал формы 1-0-1 поступает на один из входов, и в момент перепада из 1 в 0 наступает прерывание. Второй и третий способы рассмотрим позже.

Особенностью процедуры программного ожидания импульсного сигнала является то, что однокристальный МК должен зафиксировать не только момент появления, но и момент окончания сигнала. Если этим пренебречь, то МК, имеющий намного большее быстродействие, чем быстродействие импульсного датчика, зафиксирует множество поступивших импульсов, что будет являться ошибкой.

Рассмотрим процедуру ожидания и подсчета количества импульсных сигналов, подаваемых в разряд Р1.0. Максимальное число 99, после чего счет начинается сначала.

<1>WAIT_SIGNAL: CLR A ; Очистка аккумулятора

<2>WAIT_0: JB P1.0, WAIT_0;Программное ожидание сигнала 1-0-1

<3>WAIT_1: JNB P1.0, WAIT_1; Если импульс поступил, то

<4> CLR C

<5> INC A ; инкрементировать А

<6> DA A ; Десятичная коррекция результата А

<7> CJNE A,#99H,WAIT_0; Проверка на число 99H, если равно, то

<8> JMP WAIT_SIGNAL ; начать счет сначала

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

З а д а н и я д л я с а м о с т о я т е л ь н о й р а б о т ы

  1. Разработайте процедуру для ожидания и подсчета импульсных сигналов 0-1-0 формы, максимальное число 255.

  2. Разработайте процедуру для ожидания и подсчета импульсных сигналов 1-0-1 формы, максимальное число 999.

4.3. Программирование таймеров/счетчиков и формирование дискретных управляющих сигналов

В современных однокристальных МК имеется 2 (К1830ВЕ51) и 3 (AT89S8252) таймера/счетчика / 5,11/. Они предназначены для подсчета числа внешних событий (счетчик) и для формирования времязадающих функций и задержек (таймер). Таймеры - счетчики содержат регистры, которые заполняются или внешними импульсами по входам Т0, Т1, Т2 ( Т2 только для AT89S8252, разряд Р1.0), или от внутреннего генератора в режиме таймера. Частота заполнения регистра зависит от собственной частоты кварцевого резонатора. Так, например, максимальная частота счета составляет fКВ/24 в режиме счетчика и fКВ/12 в режиме таймера. Каждый таймер/счетчик может работать в 4 режимах работы.

Рассмотрим примеры программирования таймеров/счетчиков.

Пример 1. Пусть на движущемся конвейере установлены детали. Необходимо подсчитывать, сколько деталей проходит в 1 секунду (рис. 20). В данном случае удобно настроить один таймер/счетчик как счетчик внешних импульсов по входу Т0, а второй настроить как таймер. Он должен обеспечить временной интервал в 1 секунду.

Рис. 20. Функциональная схема подсчета числа деталей за 1 секунду

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

<1>COUNT_IMP:MOV TMOD,#00010101B; T/C0–счетчик,T/C1- таймер

<2> MOV R7,#15; Загрузка счетчика переполнений таймера

<3> SETB TR0 ; Включение счетчика

<4> SETB TR1 ; Включение таймера

<5>WAIT_OV: JNB TF1,WAIT_OV ; Ожидание переполнения таймера

<6> CLR TF1 ; Очистка флага переполнения

<7> DJNZ R7,WAIT_OV ; Контроль 15 переполнений

<8> CLR TR0 ; Выключение счетчика

<9> CLR TR1 ; Выключение таймера

<10 MOV R0,#20H ; Запись количества деталей

<11> MOV @R0,TL0 ; из младшего и старшего байтов

<12> INC R0 ; счетчика в 20Н и 21Н ячейки ОЗУ

<13> MOV @R0,TH0 ;

В начале фрагмента осуществляется настройка T/C0 в режим счетчика и T/C1 в режим таймера, при этом выбран режим 1. В этом случае регистр таймера и счетчика является шестнадцатиразрядным. Второй шаг выполняет загрузку счетчика переполнений таймера числом 15. При частоте кварцевого резонатора, равной 12МГц, регистр таймера заполняется импульсами с частотой 1МГц, следовательно, до переполнения регистра таймера пройдет ровно 65535 мкС (если счет начался с 0). Таким образом, чтобы сформировать 1 секунду, потребуется приблизительно 15 переполнений регистра таймера. 3 и 4 шаги включают счетчик и таймер. Теперь необходимо дождаться, пока не настанет переполнения регистра (шаг 5). Признаком переполнения является установка TF1=1. После окончания 1 секунды произойдет выход из цикла WAIT_OV, теперь нужно выключить и таймер, и счетчик (шаги 8 и 9). Осталось только сохранить состояние счетчика в ячейках внутреннего ОЗУ (шаги с 10 по 13).

Пример 2. Разработать подпрограмму для формирования на выходе разряда Р1.0 серии из 10 симметричных прямоугольных импульсов, ширина импульса и паузы равна 1,5 мС.

Перед решением задачи необходимо определить число, которое нужно загрузить в регистр таймера, чтобы обеспечить временную задержку. Если начать счет с числа 64035 = FA23H (65535 – 1500 = 64035), то до переполнения регистра таймера пройдет ровно 1,5 мС.

<1>MEANDR : MOV TMOD,#00000001B;Настройка T/C0 в таймер

<2> MOV R5,#10 ; Загрузка количества импульсов

<3> MOV P1,#00 ; Обнуление порта

<4>GENERATE: SETB P1.0 ; Формирование фронта импульса

<5> CALL DELAY_1.5MS; Формирование ширины импульса

<6> CLR P1.0 ; Формирование спада импульса

<7> CALL DELAY_1.5MS; Формирование паузы

<8> DJNZ R5,GENERATE; Если не все сформированы, то про-

<9> RET ; должить

<10>DELAY_1.5MS: MOV TL0,#23H; Загрузка регистра таймера

<11> MOV TH0,#0FAH; числом 64035 = FA23H

<12> SETB TR0 ; Включение таймера

<13>WAIT: JNB TF0, WAIT ; Дождаться переполнения регистра

<14> CLR TF0; Сбросить флаг

<15> CLR TR0; Выключить таймер

<16> RET ;

З а д а н и я д л я с а м о с т о я т е л ь н о й р а б о т ы

Описание объекта. На конвейере установлены детали, которые контролируются фотодатчиком. Посредством диска с постоянным магнитом и геркона измеряется скорость конвейера.

1. Разработайте программу, обеспечивающую зажигание светодиода VD1 на каждую деталь на конвейере (рис. 21), если текущая скорость транcпортера меньше номинальной VТЕК < VНОМ, и зажигание светодиода VD2, если VТЕК > VНОМ. Номинальной считается скорость при поступлении 10 импульсов геркона за 1 секунду.

Рис. 21. Функциональная схема к задаче

  1. Разработайте программу, которая обеспечивает подсчет импульсов, поступающих на входы Р3.4 и Р3.2 за одну минуту, при этом на каждый из поступающих импульсов должны зажигаться и гаснуть соответствующие светодиоды VD1 (от Р3.4) и VD2 (от Р3.2 ).