Обеспечить мигание светодиода 1 при включении микроконтроллера, и 5-ти кратное мигание светодиода 2 (сигнализирует о выполнении подпрограммы обработки прерывания) при генерации прерывания от таймера. Таймер должен реализовать задержку времени 5 мс. Номер разрядов для подключения светодиодов 1 и 2 определяется по таблице 2.
Таблица 2
Порт и разряд для подключения светодиода 2 Порт и разряд для подключения светодиода 1
P0_0 P0_1 P0_2 P0_3 P0_4 P0_5 P0_6 P0_7 P1_0 P1_1
P1_2 1 2 3 4 5 6 7 8 9 10
P1_3 11 12 13 14 15 16 17 18 19 20
P1_4 21 22 23 24 25 26 27 28 29 30
P1_5 31 32 33 34 35 36 37 38 39 40
P1_6 41 42 43 44 45 46 47 48 49 50
P1_7 51 52 53 54 55 56 57 58 59 60
P2_0 61 62 63 64 65 66 67 68 69 70
P2_1 71 72 73 74 75 76 77 78 79 80
P2_3 81 82 83 84 85 86 87 88 89 90
P2_4 91 92 93 94 95 96 97 98 99 100
Решение
Используем схему вида:
Определим какое значение следует занести в регистры таймера, если выбран интервал перезагрузки, равный 0,001 с. Мы знаем, что при нулевых значениях в регистрах TH0 и TL0 таймер перезагружается каждые 0,071 с, проходя при этом 65536 циклов инкремента. В данном случае для определения необходимых значений для TH0 и TL0 можно воспользоваться выражением 65536 – (65536 ×0,001 / 0,071).
101=6*16+5=65h;
252=15*16+12=ECh;
После округления получим значение 64613 или, в шестнадцатерич$ ной форме, EC65. Таким образом, в регистр TH0 нужно поместить шестнадцатеричное значение EC, а в TL0 – значение 65. Поскольку интервал перезагрузки изменился с 0,071 на 0,001 с, то значение счетчика перезагрузок в R0 теперь должно стать равным 5 (для 5 мс интервала)
.
Исходный текст
Org 0
AJMP start
t0ISR:
ORG 0Bh;адрес программы обработки прерывания таймера 0
CLR TF0
CPL P0.2;мигание светодиода 1 с интервалом 1 мс
DJNZ R0, skip
MOV R0, #5;восстановление числа 5 в регистре счетчике
CPL P2.4;пятикратное мигание светодиода 2
CPL P2.4
CPL P2.4
CPL P2.4
CPL P2.4
skip: MOV TH0, #0ECh ;восстановление начального состояния таймера 0
MOV TL0, #065h
RETI ;возврат из программы обработки прерывания
start: ;главная программа
CLR P2.4;разряд порта P2 устанавливается на выход
CLR P0.2;разряд порта P2 устанавливается на выход
MOV R0, #5 ;число переполнений счетчика 0 для задержки 5 мс
MOV TH0, #0ECh ;начальное значение таймера 0 для времени переполнения 1 мс
MOV TL0, #065h
MOV TMOD, #1h ;16 разрядный счетчик 0
SETB ET0 ; разрешение прерываний
SETB EA ; разрешение прерывания от счетчика 0
SETB TCON.4;запуск счетчика 0
Loop: AJMP Loop ;бесконечный цикл ожидания прерывании й
END
Компиляция
Отладка в среде SingleMashine
Блок-схема программы
Начало
EA:=1
ET0:=1
Разрешить прерывания от таймера 0
P2.4:=0
P0.2:=0
Порты устанавливаются на выход
T0:=64113
Инициализация таймера 0 для интервала переполнения 1 мс
R0:=5
Cчетчик числа переполнений для задержки 5 мс
TMOD:=1h
Счетчик 0 16 разрядный
TCON.4:=1
Запустить счетчик 0
1
1
Бесконечный цикл ожидания прерывания
Блок-схема обработки прерывания от счетчика 0
Начало
TF0:=0
Обнулить флаг прерывания
CLP P0.2
Мигание 1 светодиода с интервалом 1 мс
R0:=R0-1
Декремент счетчика переполнений
R0=0
Проверка интервала задержки 5 мс
CLP P2.4
CLP P2.4
CLP P2.4
CLP P2.4
CLP P2.4
Пятикратное мигание второго светодиода
1
R0:=5
Восстановление счетчика
T0:=64113
Восстановление начального значения таймера 0
return
Возврат из подпрограммы обработки прерывания