Организация ввода-вывода при работе с последовательным портом, страница 2

 mov BUFFER_VAL3, SBUF

 clr P2.7

 clr REN

 ret

display_results:

 mov P1, BUFFER_VAL1 ;на защёлки дисплея -

                     ;1 байт пакета

 setb P2.0 ;такт на защёлку 1

 clr P2.0

 mov P1, BUFFER_VAL2

 setb P2.1

 clr P2.1

 mov P1, BUFFER_VAL3

 setb P2.2

 clr P2.2

 ret

initialize_xchange:

 clr EX0 ;запрет на запросы

         ;о считывании операндов

 call read_values ;считать операнды

 call transmit_values ;передать операнды

 call recieve_values ;получить пакет с результатом

 call display_results ;отобразить пакет

 setb EX0

 reti

UART_message_handler:

 reti

ORG 0003h ;вектор прерывания INT0

 jmp initialize_xchange ;начало цикла обмена

ORG 0023h ;вектор прерывания UART

 jmp UART_message_handler ;переход на

                          ;обработчик UART

ORG 0000h

 jmp main

END

Листинг для 2-го устройства (приём-отображение-расчёт-передача)

;Calculating module

BUFFER_VAL1 SET R0 ;буфер данных 1

BUFFER_VAL2 SET R1 ; ... 2

BUFFER_VAL3 SET R2 ; ... 3

ORG 0100h

main:

 call init_devices  ;инициализация модулей и

                    ;регистров

 main_cycle:jmp main_cycle ;ожидание прерывания от

                           ;передатчика

init_devices:

 clr EA ;запрет прерываний во

        ;время инициализации

 mov P3, #0FFh ;альтернативные функции порта

               ;INT0 используется для сигнализации о

               ;готовности передатчика               

 mov P0, #00h

 mov P1, #00h ;порт - выход на защёлки монитора

 mov P2, #00h ;порт управления

              ;P2.0 - CLK для защёлки

              ;позиции 1

              ;P2.1 - ... 2

              ;P2.2 - ... 3

              ;P2.6 - сброс

              ;P2.7 - запрос у передатчика/подтверждение             

 setb P2.6 ;сброс

 clr P2.6

 mov SCON, #01000000b ;установка UART в режим 1

 mov PCON, #10000000b ;без удвоения скорости передачи

 ;настройка частоты передачи UART

 mov TMOD, #00100000b ;установка таймера 1

                      ;в режим 2 (8-битный с перезагрузкой)

 mov TCON, #00000101b ;реагировать на срез

                      ;по внешним линиям

                      ;INT0 и INT1

 mov TH1, #97h ;перезагружаемое значение таймера

 mov TL1,TH1   ;начальная установка счётчика

 setb TR1      ;старт таймера

 mov IE, #00010001b ;разрешить прерывания от UART и

                    ;по линии INT0

 mov IP, #00010000b ;более приоритетно

                    ;прерывание по UART

 setb EA ;глобально разрешить прерывания

 ret

transmit_values:

 setb P2.7 ;запрос на приём

           ;результата

 clr EA

 l_wait_ready_transmit:jb P3.2, l_wait_ready_transmit ;ожидание готовности

 clr IE0

 setb EA

 mov SBUF, BUFFER_VAL1

 l_wait_transmit1:jnb TI, l_wait_transmit1

 clr TI

 mov SBUF, BUFFER_VAL2

 l_wait_transmit2:jnb TI, l_wait_transmit2

 clr TI

 mov SBUF, BUFFER_VAL3

 l_wait_transmit3:jnb TI, l_wait_transmit3

 clr TI

 clr P2.7

 ret

recieve_values:

 setb REN ;разрешить приём по UART

 setb P2.7 ;установить флаг

           ;готовности к приёму

 l_wait_recieve1:jnb RI, l_wait_recieve1 ;ожидание получения

                                         ;операнда 1

 clr RI

 mov BUFFER_VAL1, SBUF                   ;сохранение операнда 1

 l_wait_recieve2:jnb RI, l_wait_recieve2

 clr RI

 mov BUFFER_VAL2, SBUF

 l_wait_recieve3:jnb RI, l_wait_recieve3

 clr RI

 mov BUFFER_VAL3, SBUF

 clr P2.7 ;сброс флага готовности

          ;к приёму

 clr REN ;запрет приёма

 ret

display_values:

 mov P1, BUFFER_VAL1 ;подача на защёлки

                     ;1-го операнда

 setb P2.0 ;генерация такта для защёлки 1

 clr P2.0

 mov P1, BUFFER_VAL2

 setb P2.1

 clr P2.1

 mov P1, BUFFER_VAL3

 setb P2.2

 clr P2.2

 ret

calculate_values:

 ;реализация формулы

 ;BUFFER_VAL2=min(BUFFER_VAL1,BUFFER_VAL2)+BUFFER_VAL3

 ;BUFFER_VAL1=02H

 ;BUFFER_VAL3=BUFFER_VAL1 xor BUFFER_VAL2

 clr C

 mov A, BUFFER_VAL1

 subb A, BUFFER_VAL2

 jc l_val1

  mov A, BUFFER_VAL2

  jmp l_adding

 l_val1:mov A, BUFFER_VAL1

 l_adding:add A, BUFFER_VAL3

 mov BUFFER_VAL1, #02h

 mov BUFFER_VAL2, A

 xrl A, BUFFER_VAL1

 mov BUFFER_VAL3, A

 ret

initialize_xchange:

 clr EX0 ;запрет на запросы

         ;от передатчика

 call recieve_values ;получить операнды

 clr EA ;не прерывать во

        ;время вычислений

 call display_values ;отобразить полученные операнды

 call calculate_values ;вычислить результат

 setb EA

 call transmit_values ;передача пакета

                      ;с результатом

 setb EX0

 reti

UART_message_handler:

 reti

ORG 0003h ;вектор прерывания INT0

 jmp initialize_xchange ;начало цикла обмена

ORG 0023h ;вектор прерывания UART

 jmp UART_message_handler ;переход на

                          ;обработчик UART

ORG 0000h

 jmp main

END

Схема электрическая принципиальная.


Выводы: к достоинствам UART в MCS-51 можно отнести минимальное число линий для дуплексной передачи данных, приём данных в фоновом режиме, возможность настройки частоты передачи, к недостаткам – отсутствие линий запроса и подтверждения готовности, неявная взаимосвязь модулей устройства (для настройки скорости передачи используется таймер 1).