Реализация последовательного обмена данными для МК80C31

Страницы работы

Содержание работы

Лабораторная работа №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

Похожие материалы

Информация о работе