Добавил:
Кафедра ВТ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
07.04.2023
Размер:
86.59 Кб
Скачать

Описания алгоритмов и листинги программ

Программа к заданию 1 устанавливает флаги разрешения прерывания, устанавливает режим таймера (режим 1) и запускает таймер, после чего в бесконечном цикле с меткой DIVIDER проверяет значение счетчика вызовов процедуры обработки прерывания от T/C0, если оно равно ограничению (об этом ниже), то циклически сдвигает инициализированный формой «бегущего огня» аккумулятор, подает значение аккумулятора на порт P1, и сбрасывает R0. Желаемую частоту обновления индикаторов в (1/0.5 c) = 2 Гц можно получить делением тактовой частоты в 6МГц сначала на 2^16 посредством T/C0, а затем на ~46 посредством программного делителя, отсюда ограничение на число вызовов - 46.

За разрешение прерываний отвечает строка mov IE, #10000011b - Разpешает пpеpывания от таймеpа/счетчика 0 от флага TF0 и внешнего пpеpывания от входа INT0 а также общее разрешение пpеpываний. Внешний же сигнал прерывания INT0 вызывает программу вывода в порт Р1 "решетки" – код 55h, в то время как прерывание от T/C0 просто вызывает процедуру обработки прерывания занимающуюся инкрементированием регистра R0.

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

Если замаскировать прерывание INT0 , а затем и прерывание от TF0, то сначала мы потеряем возможность вызова обработчика прерывания от сигнала INT0, а затем и от TF0, что в первом случае лишит нас возможности вывода в порт “решетки”, а во втором – бегущего огня.

Программа к заданию 2 позволяет изучить режимы обработки запросов прерываний с различными приоритетами. Сначала сигналу INT0 присваивается высший приоритет, а сигналу прерывания TF0 от T/C0 – низший, что позволит нам прерывать обработчик прерывания от сигнала TF0 (который занимается выполнением бесконечного цикла) сигналом INT0. Затем убедимся, что программа, запускаемая от таймера/счетчика 0, не прерывается, если назначить сигналу INT0 приоритет, равный или меньше приоритета сигнала прерывания TF0 от T/C0.

Листинг программы к заданию 1

$mod52

ORG 000h

JMP MAIN

ORG 0003h

JMP INTRO

ORG 000Bh

JMP DELAY

ORG 0100h

MAIN:

MOV A, #0F0h ;Форма "бегущего огня"

MOV R0, #0

MOV TL0, #0F8h ;Для наблюдения в режиме симуляции, закомментить

MOV TH0, #0FFh ;Для наблюдения в режиме симуляции, закомментить

mov IE, #10000011b;

SETB TMOD.7 ;Установка режима таймера

SETB TCON.4 ;Запуск таймера

;Желаемой частоты (1/0.5 c.) = 2 Гц можно добиться делением тактовой частоты в 6МГц

;сначала на 2^16 посредством T/C0, а затем на ~46 посредством программного делителя.

DIVIDER: ;Программный делитель

CJNE R0, #46, DIVIDER ;Раскомментить

MOV P1, A ;Выводим наш "огонь" в порт

RR A ;Циклически сдвигаем наш "огонь"

MOV R0, #0

JMP DIVIDER

DELAY: ;обработка прерывания 00BH

MOV TL0, #0F8h ;Закомментить

MOV TH0, #0FFh ;Закомментить

INC R0

RETI

INTRO: ;обработка прерывания 003h

MOV P1, #55h ;вывод "решетки" в порт

RETI

END

Соседние файлы в папке Первый чел