Лабораторная работа №7 (Вариант №2)
Реализация последовательного обмена данными для МК80C31
Цельработы: Изучение функционирования последовательного порта МК80С31, получение практических навыков программирования МК для реализации последовательного обмена данными.
Задание: Написать программу, осуществляющую периодические посылки байтов с интервалом в Δt, заданным преподавателем. Новый байт данных формируется инкрементированием предыдущего значения. Параметры передачи: скорость: 9600 бод, формат посылки: 8 бит данных + стоповый бит, тактовая частота: 11,059 Мгц.
Задание для варианта №2:
Δt = 1.2мс
Листинг программы
Sec12 EQU 17 ;константа перезагрузки программного таймера для формирования
;временного интервала в 1,2 сек.
Stimer EQU 30h ;ячейка, используемая как регистр данных программного таймера
Tdata EQU 31h ;ячейка для хранения значения передаваемого байта
ORG 00h ;стартовый адрес после инициализации
ajmp Start ;переход к основной части программы
ORG 0Bh ;адрес вектора прерывания нулевого таймера
ljmp IntT0 ;переход к процедуре обслуживания прерывания
ORG 23h ;адрес вектора прерывания последовательного порта
ljmp IntRS ;переход к процедуре обслуживания прерывания
ORG 30h
;тело программы
Start:
mov IE, #92h ;разрешаем прерывания нулевого таймера и последовательного
;порта
mov SCON, #50h ;устанавливаем режим №1 последовательного порта
mov TMOD, #21h ;0-й таймер: 16-разрядный, 1-й таймер: 8-разрядный с
;автоперезагрузкой
mov SP, #5Fh ;установка вершины стека
mov TData, #65 ;установка начального значения байта данных
mov STimer, #Sec12 ;перезагрузка программного таймера для установки интервала
;между пересылками в 1,2 сек.
mov TH1, #0FDh ;устанавливаем скорость последовательного
mov TL1, #0FDh ;обмена в 9600 бод
setb TR1 ;запуск 1-го таймера
setb TR0 ;запуск 0-го таймера
setb F0 ;устанавливаем пользовательский флаг ("нужно передать байт")
setb TI ;запрашиваем прерывание от последовательного порта
jmp $ ;"зацикливаемся"
;процедура прерывания по переполнению нулевого таймера
IntT0:
djnz STimer, NoTR ;если 1,2 секунды ещё не "натикали", возвращаемся
mov STimer, #Sec12 ;перезагружаем программный таймер
inc TData ;инкрементируем передаваемый байт
setb F0 ;устанавливаем пользовательский флаг ("нужно передать байт")
setb TI ;запрашиваем прерывание от последовательного порта
NoTR:
reti ;возвращаемся из прерывания
;процедура прерывания по запросу последовательного порта
IntRS:
jnb RI, BTransmit ;если нет запроса на чтение, идём передавать
clr RI ;сборос запроса на чтение
push ACC ;сохраняем аккумулятор в стеке
mov A, SBUF ;записываем принятый байт в аккумулятор
jb TI, $ ;ждём завершения передачи предыдущего байта
mov SBUF, A ;организуем эхо-режим (возвращаем принятый байт)
pop ACC ;восстанавливаем аккумулятор из стека
reti ;возвращаемся из прерывания
BTransmit:
clr TI ;сбрасываем запрос на передачу
jnb F0, Skip ;проверяем, нужно ли передавать данные
clr F0 ;сбрасываем пользовательский флаг
mov SBUF, TData ;передаём байт
Skip:
reti ;возвращаемся из прерывания
end
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.