Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kharakhnin / ПОСОБИЕ_Харахнин.doc
Скачиваний:
278
Добавлен:
08.03.2016
Размер:
17.89 Mб
Скачать

4.5. Программирование последовательного порта

Применение последовательного порта оправдано в случае, когда необходимо передавать информацию на значительные расстояния (больше 5 м). Эта ситуация возникает в случае передачи из локальных микропроцессорных контроллеров в ЭВМ верхнего уровня собирающую и обрабатывающую информацию о параметрах исследуемого объекта. Однокристальный МК имеет выводы RxD и TxD приемника и передатчика информации в последовательном формате. Однако этого недостаточно, чтобы передавать и принимать информацию от удаленного источника. Для передачи/приема последовательной информации на удаленное расстояние необходимы специальные преобразователи уровня. Существуют стандартные интерфейсы RS232 и RS485. RS232 следует применять на расстояниях не более 15м, RS485 (промышленный) позволяет передавать/принимать информацию на расстояние до 1.2 км, при этом на один передатчик могут работать 32 приемника.

В данном разделе рассмотрим несколько примеров программирования последовательного порта, не касаясь схемотехники преобразователей уровня.

Пример 1. Разработать подпрограмму, обеспечивающую режим “бегущий огонь” (рис.26), использовать нулевой режим последовательного порта.

<1>TRANSMIT: MOV SCON,#00H; Настройка PS в режим 0

<2> MOV A,#01H ;

<3>AGAIN: MOV SBUF, A ; Посылка кода в сдвигающий регистр

<4>WAIT_OUT:JNB TI,WAIT_OUT ; Ожидание конца передачи байта

<5> CLR TI ; Сброс флага передатчика

<6> RL A ; Сдвиг единицы влево в байте

<7> CALL DELAY ; Вызов задержки, определяющей скорость

<8> JMP AGAIN ; “бегущего огня”

<9>DELAY: RET ; Подпрограмму DELAY выполните самостоя-

<10> ;тельно

В схеме использован восьмиразрядный сдвигающий регистр K555ИР8 с последовательным входом DS (DATA SERIAL) и параллельными выходами Q. Регистр предназначен для преобразования последовательного кода в параллельный. Вход С является стробирующим. Выход МК R x D подключен на вход DS регистра, выход T x D - на вход стробирования. На выходах Q получается параллельный код введенного по входу DS последовательного байта.

Рис. 26. Функциональная схема к примеру 1

Пример 2. Разработать подпрограмму, обеспечивающую передачу данных из 15 ячеек внутреннего ОЗУ МК в линию связи, режим работы последовательного порта 3, скорость передачи 9,6 кБод.

<1> ORG 0000H

<2>OUT_INF: MOV TMOD,#20H;Установка 2 режима работы таймера 1

<3> MOV TH1,#0FDH; Загрузка в TH1 таймера числа для 9,6 кБод

<4> MOV TL1,#0FDH; Загрузка в TL1 (только в первый раз)

<5> MOV SCON,#0C0H; Установка 3 режима работы PS

<6> SETB TR1; Включение таймера

<7> MOV R0,#20H; Загрузка указателя начала массива данных

<8> MOV R1,#0FH; Загрузка счетчика байтов в массиве

<9>AGAIN:MOV A,@R0; Посылка очередного байта

<10> MOV SBUF,A; в линию связи

<11>WAIT_OUT:JNB TI,WAIT_OUT; Ожидание завершения передачи

<12> CLR TI ; Сброс флага передатчика

<13> INC R0 ; Продвижение по массиву

<14> DJNZ R1,AGAIN ; Если не все байты высланы, то продолжить

<15> RET

Пример 3. Разработать подпрограмму, обеспечивающую получение 15 байт из последовательной линии связи и размещение их в ячейках внутреннего ОЗУ, скорость приема 9,6 кБод, 3 режим работы PS.

<1>PRIEM_INF:MOV TMOD,#20H; Установка 2 режима работы Т1

<2> MOV TH1,#0FDH ; Загрузка в регистр числа для 9,6 кБод

<3> MOV TL1,#0FDH ; Загрузка в TL1 (только в первый раз)

<4> MOV SCON,#0D0H; Установка 3 режима PS, REN=1

<5> SETB TR1; Запуск таймера 1

<6> MOV R0,#30H ; Загрузка указателя начала массива в ОЗУ

<7> MOV R1,#15 ; Загрузка счетчика байтов в массиве

<8>WAIT_IN:JNB RI,WAIT_IN ; Ожидание завершения приема

<9> CLR RI ; Сброс флага прерывания приемника

<10> MOV A,SBUF ; Получение байта и пересылка

<11> MOV @R0,A ; его во внутреннее ОЗУ

<12> INC R0 ; Продвижение по массиву

<13> DJNZ R1,WAIT_IN; Если не все байты получены, то продолжить

<14> RET

Пример 4. Разработать программу, обеспечивающую передачу 10 байт данных с контролем ошибок, передатчик записывает PSW.0 в бит TB8.

<1> N_BYTE EQU 10; Число байт передаваемого массива

<2> MOV TMOD,#00100000B; Настройка таймера 1 в режим 2

<3> MOV TH1,#0FDH; Загрузка кодов для получения скорости

<4> MOV TL1,#0FDH; 9,6 кБод

<5> MOV SCON,#11000000B; Настройка PS в режим 3

<6> MOV R7,#N_BYTE; Загрузка счетчика числа байтов в массиве

<7> MOV R0,#20H ; Загрузка указателя

<8> SETB TR1 ; Запуск таймера 1

<9>OUT_PS: MOV A,@R0 ; Получение байта из ОЗУ

<10> MOV C,PSW.0 ; Пересылка бита паритета Р в бит ТВ8

<11> MOV TB8,C ;

<12> MOV SBUF,A ; Высылка байта в линию связи

<13>WAIT_OUT: JNB TI,WAIT_OUT ;Ожидание окончания передачи

<14> CLR TI

<15> INC R0 ; Продвижение по массиву данных

<16> DJNZ R7,OUT_PS ;Если не все байты переданы, то продолжить

Пример 5. Разработать фрагмент программы, обеспечивающей прием 20 байт из линии связи с контролем правильности переданной информации, должен контролироваться бит RB8.

<1> MASS EQU 30H ; Начало массива с 30Н

<2>PRIEM_RB8: MOV TMOD,#00100000B;Настройка T/C1 в режим 2

<3> MOV TH1,#0FDH ;Загрузка регистров для получения

<4> MOV TL1,#0FDH ;скорости приема 9,6 кБод

<5>MOV SCON,#11010000B;Настройка PS в 3 режим работы, REN=1

<6> MOV R0,#MASS ;Загрузка указателя начала массива

<7> MOV 20H,#00H ;Обнуление 20Н

<8> MOV R7,#20 ; Загрузка счетчика числа байтов в массиве

<9> SETB TR1 ; Запуск таймера 1

<9>WAIT_PRIEM:JNB RI,WAIT_PRIEM ;Ожидание прихода очередного байта

<10> CLR RI ; Сброс флага приемника

<11> MOV A,SBUF ;Запись полученного байта в А из буфера

<12> PUSH ACC ; Сохранение в стеке полученного байта

<13> MOV C,RB8 ; Запись пришедшего с байтом бита RB8

<14> MOV 20H.0,C ;в нулевой бит 20Н ячейки

<15> MOV C,PSW.0 ;Получение бита паритета и сохранение

<16> MOV ACC.0,C ;в нулевом бите аккумулятора

<17> ANL A,#01 ; Выделение нулевого бита аккумулятора

<18> CJNE A,20H,ERROR; Сравнение А и 20Н, если не равны, то ошибка

<19> POP ACC ; Восстановление из стека содержимого А

<20> MOV @R0,A ; Запись полученного из линии связи байта в ОЗУ

<21> INC R0 ; Продвижение по массиву

<22> CLR C ; Сброс бита переноса

<23> CLR 20H.0 ; Сброс нулевого бита 20Н

<24> DJNZ R7,WAIT_PRIEM ;Если не все байты получены, то продолжить

<25> RET ;

<26>ERROR: ; Сообщение об ошибке принятого байта

Особенностью фрагмента является то, что при принятии информации содержимое бита RB8 контролируется и далее сравнивается с содержимым бита паритета Р. Если содержимое битов не равно (число единиц в аккумуляторе изменилось), это означает, что при передаче информации возникла ошибка. Если RB8 = P, то это значит, что число единиц в принятом байте равно числу единиц в посланном передатчиком байте. Таким образом, с определенной вероятностью можно сказать, что информация передана и получена без ошибок.

З а д а н и я д л я с а м о с т о я т е л ь н о й р а б о т ы

1. Разработать программу, обеспечивающую получение 10 байт из последовательной линии связи и размещение их в ячейках внутреннего ОЗУ (с ячейки 50Н), скорость приема 9,6 кБод, 3 режим работы PS.

2. Разработать программу, обеспечивающую передачу данных из 10 ячеек внутреннего ОЗУ ( с ячейки 50Н) МК в линию связи, режим работы последовательного порта 3, скорость передачи 9,6 кБод.