Последовательный порт МК51
Программный доступ к регистрам приемника и передатчика последовательного интерфейса МК51 осуществляется обращением к регистру SBUF. При записи в SBUF байт загружается в регистр передатчика, при чтении SBUF байт читается из регистра приемника.
Управление работой последовательного порта осуществляется с помощью регистра SCON, все разряды которого программно доступны по записи и чтению (рис. 7.1):
Порт может работать в следующих четырех режимах.
Режим 0. Информация передается (младшими битами вперед) и принимается через вход приемника RxD (P3.0). Через выход передатчика TxD (P3.1) выдаются импульсы синхронизации, стробирующие каждый передаваемый или принимаемый бит информации. Формат посылки — 8 бит. Частота приема и передачи — fBQ/12. Передача начинается любой командой, которая использует регистр SBUF в качестве регистра назначения, прием — при сбросе флага RI (если REN=1).
Режим 1. Информация передается через выход передатчика, а принимается через вход приемника. Формат посылки — 10 бит: старт-бит (ноль), восемь бит данных и стоп-бит (единица). Частота приема и передачи задается таймером-счетчиком Т/С1.
Режим 2. Формат посылки — 11 бит (рис. 7.2): старт-бит, восемь бит данных, программируемый девятый бит и стоп-бит. Передаваемый девятый бит данных принимает значение бита ТВ8. Бит ТВ8 регистра SCON может быть программно установлен в 1 или 0, или в него можно поместить значение бита Р из регистра PSW для повышения достоверности принимаемой информации (контроль по паритету). При приеме девятый бит принятой посылки поступает в бит RB8 регистра SCON. Частота приема и передачи задается программно и может быть равна fBQ/32 (SMOD=1) или fBQ/64 (SMOD=0). Бит SMOD регистра PCON можно установить в 1 командой MOV PCON,#80H.
Режим 3. Полностью идентичен режиму 2, только частота приема и передачи задается (как и в режиме 1) таймером Т/С1 и равна (2SMOD/32)fOV, где fOV — частота переполнения Т/С1. Обычно для синхронизации последовательного порта Т/С1 включается в режим перезагрузки (режим 2). В этом случае fOV=fBQ/{12 [256 – – (TH1)]}. Прерывания от Т/С1 запрещаются.
Передача инициируется любой командой, использующей регистр SBUF в качестве регистра назначения. На выход TxD выдается девять бит данных: D0-D7 и ТВ8. По окончании передачи устанавливается флаг прерывания передатчика TI. Прием начинается при обнаружении перехода сигнала на входе RxD из 1 в 0. В фазах 7, 8 и 9 специальное устройство МК бит-детектор считывает со входа RxD значения принимаемого бита и по мажоритарному принципу выбирает одно из них. По окончании приема устанавливается флаг прерывания приемника RI.
Назначение остальных битов регистра SCON:
REN — разрешение приема последовательных данных;
TI — флаг прерывания передатчика. Устанавливается аппаратно в конце выдачи 8-го бита в режиме 0 или в начале стоп-бита в других режимах. Сбрасывается программно;
RI — флаг прерывания приемника. Устанавливается аппаратно в конце времени приема 8-го бита в режиме 0 или через половину интервала стоп-бита в других режимах при SM2=0;
SM2 в режиме 0 должен быть равен 0. При SM2=1 в режиме 1 флаг RI не активизируется, если не принят стоп-бит, а в режимах 2 и 3 — если 9-й принятый бит данных равен 0.
Пример 18.Разработать программу инициализации последовательного порта для работы со скоростью 110 бод (бит/с) при частоте кварца 6 МГц, программы приема и выдачи символа.
; Программирование режимов таймера и последовательного порта
CLR TR1 ; Останов таймера 1
MOV TH1,#72H ; Установка скорости пересылки
MOV SCON,#11011100B ; Режим 9-разрядной посылки
MOV TMOD,#00100000B ; Режим автозагрузки Т/С1
SETB TR1 ; Запуск таймера 1
; Прием символа из внешнего устройства в аккумулятор
JNB RI,$ ; Ожидание завершения приема
MOV A,SBUF ; Чтение символа в аккумулятор
CLR RI ; Очистка флага приема
; Передача символа из аккумулятора внешнему устройству
JNB TI,$ ; Ожидание окончания передачи
CLR TI ; Очистка флага передачи
MOV SBUF,A ; Выдача символа
Пример 19. Организовать асинхронный программный обмен данными в последовательном формате (строки символов) между двумя микроконтроллерами со скоростью 2400 бод (бит в секунду). Каждый символ передается последовательностью семи информационных бит и бита контроля четности. Разработать подпрограммы передачи и приема символа. Режим прерываний не использовать.
Последовательный порт настраиваем на режим 1 (SM0=0, SM1=1) с возможностью принимать все сообщения (SM2=0, REN=1). Флаг TI искусственно установим в единицу, обеспечивая начальную готовность регистра SBUF для вывода. Таким образом, в регистр SCON следует загрузить управляющее слово 01010010В.
Таймер 1 будем использовать в режиме 2 (8 бит с автоперезагрузкой) в качестве генератора скорости передачи данных. Для получения частоты 2400 бод в старший регистр таймера необходимо загрузить число 0F4H (дополнительный код числа минус 12) при частоте кварца 11059 кГц.
Требуемый режим работы таймера задаем записью в регистр TMOD управляющего слова 00100000В. Программный запуск таймера осуществим командой SETB TR1.
Таким образом, инициализацию (выбор необходимой конфигурации) таймера и последовательного порта реализуем с помощью следующей последовательности команд:
CLR TR1
MOV TMOD,#00100000B
MOV SCON,#01010010B
MOV TH1,#0F4H
SETB TR1
Передачу символа реализует подпрограмма TBYTE. Она добавляет разряд четности к находящемуся в аккумуляторе 7-раз-рядному коду символа (код ASCII) и осуществляет передачу байта при наличии готовности последовательного порта.
TBYTE: MOV C,P ; Добавление разряда
CPL C ; четности в старший
MOV ACC.7,C ; бит аккумулятора
JNB TI,$ ; Ожидание разрешения
CLR TI ; передачи очередного байта
MOV SBUF,A ; Передача байта
RET
Прием символа реализует подпрограмма RBYTE. Она вводит очередной символ в аккумулятор из последовательного порта и устанавливает перенос в случае ошибки четности.
RBYTE: JNB RI,$ ; Ожидание готовности
CLR RI ; приемника
MOV A,SBUF ; Прием байта в аккумулятор
MOV C,P ; Установка С=1 в случае
CPL C ; ошибки передачи
ANL A,#7FH ; Выделение символа
RET
Дата добавления: 2016-01-09; просмотров: 1687;