Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prn_ 51_pr1.doc
Скачиваний:
17
Добавлен:
19.02.2016
Размер:
370.18 Кб
Скачать

3. Считывание текущего состояния таймера без нарушения процесса синхронизации.

Все регистры таймеров/счетчиков микроЭВМ могут читаться или записываться в процессе работы, однако для этого надо соблюдать меры предосторожности.

Предположим, что подпрограмма RDTIME должна возвращать 16-разрядное значение в регистры R1 и R0, отражающее содержимое таймера 0. Существует опасность, что при считывании двух половин числа переполнение младшего регистра может перейти на одержимое старшего регистра, так что две возвращаемых половины слова окажутся "не в фазе". Решение этой проблемы заключается в том, чтобы читать сначала старший байт, а затем - младший, после чего выдать подтверждение того, что старший байт не изменился. Если изменение имело место, то следует повторить процесс сначала.

RDTIME: MOV А,ТН0 ; Выборка содержимого таймера Т0

MOV R0,TL0

CJNE A,TH0,RDTIME

MOV R1,A

RET

4. Измерение длительности сигнала.

Подпрограмма для измерения длительности «положительного» сигнала будет выглядеть так:

MOV TMOD,#00001001B ; Настройка Т/С0

MOV TH0,#0 ; Сброс таймера

MOV TL0,#0

SETB TCON.4 ; Старт Т/С0

WAIT0: JNB P3.2,WAIT0 ; Ожидание “1”

WAITC: JB P3.2,WAITC ; Ожидание “0”

CLR TCON.4 ; Стоп Т/С0

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

  1. Подпрограмма обслуживания 8-и разрядного семисегментного индикатора.

Подпрограмма работает от прерывания таймера 0 и выводит на индикатор содержимое ячеек РПД по адресам 31h-38h. Ячейка 39h используется подпрограммой

ORG 030H

MAS DS 9

NUMB DS 1

ORG 0C00BH

JMP TIMERENT

ORG 0C100H

MOV NUMB,#8

ORL TMOD,#00000010B ;Установка режим 2 таймера 0

MOV TL0,#0 ; Загрузка таймера

MOV TH0,#0

SETB TR0 ; Старт Т/С0

SETB IE.1 ; Разрешение прерывания от Т/С0

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

JMP $

TIMERENT: PUSH ACC ; Запоминание в стеке необх. регистров

PUSH 0

PUSH DPH

PUSH DPL

PUSH PSW

MOV DPTR,#8000H

MOV A,#0

MOVX @DPTR,A ; Гашение сегментов

DEC P1

DJNZ NUMB,NEXT

MOV NUMB,#8

MOV P1,#0F7H

NEXT: MOV A,#MAS ; Вычисление адреса символа

ADD A,NUMB

MOV R0,A

MOV A,@R0

MOVX @DPTR,A ; Вывод следующего знакоместа

POP PSW

POP DPL

POP DPH

POP 0

POP ACC

RETI

END

Задания.

При выполнении заданий используйте Таймер 0.

1. Мигать левым светодиодом, а по переполнению таймера вывести информацию с двух правых переключателей на остальные светодиоды.

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

  2. Используя прерывания таймера организовать «тики» с периодом 20 мс. На их основе мигать светодиодами с чостотой 2 Гц.

  3. При каждом четвертом переполнении таймера инвертировать состояние светодиодов.

  4. Подсчитать количество нажатий на кнопку INTR1 за 5 сек. Отобразить на светодиодах.

  5. Программу генерации звука заданой частоты (тумблерами).

  6. Программу, которая фиксирует время нажатия и отпускания кнопки INTR1 в ячейках ОЗУ. Время должно быть выражнно в переполнениях таймера.После 20 отметок программа заканчивает работу.

  7. Программа точно 1 раз в секунду увеличивает содержимое светодиодов.

  1. Напишите программу, которая каждые 0,5 секунды увеличивает значение трех младших разрядов регистра R0 на 1 и выводит на светодиоды.

  2. Напишите программу, которая через секунду после запуска программы увеличивает значение регистра трех младших разрядов R0 на 1, через 2 секунды – на 2, через 3 – на 3 и т.д. и выводит на светодиоды.

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

  4. Напишите программу, которая последовательно считывает 16-ти разрядное значение содержимого таймера 0 и заполняет ими внешнюю память данных.

  5. Напишите программу, подсчитывающую время в секундах с начала работы программы. Учтите переполнение.

  6. Напишите программу, которая каждые 500мс циклически сдвигает содержимое трех старших разрядов регистра R0 на один разряд вправо и выводит на светдиоды.

  7. Напишите программу, которая каждые 500мс циклически сдвигает содержимое регистровой пары (R2) (A) влево и младшие три разряда выводит на светодиоды.

18. Написать подпрограмму, определяющую количество единичных бит в байтах РПД по адресу 20Н  23Н. Полученный результат выставить на линиях порта 0, сопроводив его стробом на линии РЗ.6 и длительностью в одну секунду.

19. Написать программу, сканирующую линии порта 2. При наличии единицы на какой-либо линии записать в регистр с соответствующим номером текущее состояние младшего байта TL0 таймера Т0, предварительно запустив таймер на счет.

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