Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_i_otvety_MPT.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3.94 Mб
Скачать

Формирование временной задержки

В MCS-51 для формирования временной задержки могут быть использованы 2 способа

  1. программный

  2. аппаратурный с применением внутренних таймеров/счетчиков.

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

Временная задержка малой длительности. Процедура реализации временной задержки использует метод программных циклов. При этом в некоторый рабочий регистр банка РОН загружается число, которое затем в каждом проходе цикла уменьшается на 1. Так продолжается до тех пор, пока содержимое рабочего регистра не станет равным нулю, что интерпретируется программой как момент выхода из цикла. Время задержки при этом определяется числом, загруженным в рабочий регистр и временем выполнения команд, образующих программный цикл. Программа имеет символическое имя DELAY (задержка) и в случае вызова ее основной управляющей программой по команде CALL DELAY должна завершаться командой возврата RET.

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

DELAY: MOV R1, # X ; Загрузить в регистр R1 число X

COUNT: DJNZ R1, COUNT ; Декремент R1 и цикл, если (R1)  0

RET

Для получения требуемой временной задержки необходимо определить число X, загружаемое в рабочий регистр. Определение числа X выполняется на основе расчета времени выполнения команд, образующих данную подпрограмму. При этом необходимо учитывать, что команды MOV и RET выполняются однократно, а число повторений команды DJNZ равно числу X. Кроме того, обращение к подпрограмме временной задержки осуществляется по команде CALL DELAY, время исполнения которой также необходимо учитывать при подсчете временной задержки. В описании команд MCS-51 указывается, за сколько машинных циклов (МЦ) исполняется каждая команда. На основании этих данных определяется суммарное число машинных циклов в подпрограмме CALL – 2 МЦ, MOV Rn, #d – 1 МЦ, DJNZ – 2 МЦ, RET – 2 МЦ.

Длительность машинного цикла ТМЦ связана с тактовой частотой fCLK работы MCS-51 соотношением ТМЦ = 12 / fCLK. При fCLK = 12 МГц имеем ТМЦ = 1 мкс.

Таким образом, подпрограмма выполняется за время

(2 + 1 + 2*X + 2) ТМЦ = (5 + 2*X) мкс.

Для реализации временной задержки 100 мкс число

X = (100 – 2) / 2 = 47,5.

Так как в регистр можно загрузить только целое число, то временная задержка будет реализована с погрешностью.

Максимальная длительность задержки, реализуемой подпрограммой DELAY, составляет 515 мкс (при X = 255).

Можно увеличить время задержки за счет включения в тело цикла дополнительных команд. Так, например, если перед командой DJNZ вставить две команды NOP, то максимальная задержка составит 5 + (2 + 2)*X = 5 + 4*255 = 1025 мкс (т.е. почти в 2 раза больше).

Временная задержка большой длительности. Для получения задержек большой длительности используют метод вложенных циклов или многократный вызов подпрограмм задержек малой длительности.

Например, при использовании двух циклов внутренний цикл повторяется Y раз, его обеспечивает счетчик R2, внешний цикл повторяется X раз – счетчик R1. Числа X и Y выбираются из соотношения

tЗД = [2 + 1 + X*(1 + 2*Y + 2) + 2]* ТМЦ.

Максимальный временной интервал, реализуемый таким способом, при X = Y = 255 и fCLK = 12 МГц составляет 130,82 мс.

В качестве примера рассмотрим подпрограмму временной задержки на 100 мс при fCLK = 12 МГц

DEL100MS: MOV R1, #195 ; Счетчик внешних циклов

LOOPEX: MOV R2, #255 ; Счетчик внутренних циклов

LOOPIN: DJNZ R2, LOOPIN ; Декремент R2 и внутренний цикл, если (R2)  0

DJNZ R1, LOOPEX ; Декремент R1 и внешний цикл, если (R1)  0

RET

Задержки еще большей длительности сложно реализовать методом вложенных циклов, поэтому их обычно набирают из точно подстроенных задержек меньшей длительности. Например, задержку на 1 с можно реализовать десятикратным вызовом подпрограммы задержки на 100 мс

DEL1S: MOV R4, #10 ; Загрузка в R4 числа вызовов подпрограммы DEL100MS

LOOP: CALL DEL100MS ; Задержка на 100 мс

DJNZ R4, LOOP ; Декремент R4 и цикл, если (R4)  0

RET

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]