Лабораторна робота № 2
з курсу „Проектування контролерів периферійних пристроїв”
Тема: Ознайомлення з універсальним асинхронним приймачем/передавачем (UART)
Мета: Ознайомлення з режимами роботи Універсального асинхронного приймача/передавача (UART) в мікроконтролера АТ89С51 та його можливостями по зв'язку з персональним комп'ютером.
Короткі теоретичні відомості
Для передачі та прийому даних в послідовному форматі мікроконтролери MCS51 використовують контролер універсального асинхронного приймача/передавача (UART) – послідовний інтерфейс. Він може працювати в чотирьох наступних режимах:
Режим 0. В цьому режимі дані передаються та приймаються через RXD. Приймаються або передаються 8 біт даних. Через вивід ТXD передаються імпульси синхронізації. Частота обміну складає 1/12 частоти кварцового резонатора.
Режим 1. В цьому режимі дані передаються через TXD, а приймаються RXD 10 біт інформації: старт-біт (0), 8 біт даних і стоп-біт (1) Частота обміну — змінна і задається частотою переповнень таймера Т1.
Режим 2. В цьому режимі дані передаються через TXD, а приймаються RXD 11 біт інформації: старт-біт, 8 біт даних, програмований дев'ятий біт і стоп-біт. При передачі дев'ятий біт даних може приймати значення 0 або 1, або, наприклад, для підвищення достовірності передачі шляхом контролю парності в нього може бути поміщено значення признака парності з слова стану програми (PSW.O). Частота обміну задаэться програмно та може складати 1/32, або 1/64 частоти кварцового резонатора залежно від значення біту SMOD/
Режим 3. В цьому режимі дані передаються через TXD, а приймаються RXD 11 біт інформації: старт-біт, 8 біт даних, програмований дев'ятий біт і стоп-біт. Частота обміну — змінна і задається частотою переповнень таймера Т1.
Для управління режимом роботи послідовного інтерфейсу використовується регістр спеціальних функцій SCON:
Біт
Позиція
Призначення

SM0
SCON.7
Біти вибору режиму роботи.

SM1
SCON.6


SM2
SCON.5
Біт блокування прийому повідомлень з нульовим програмованим 9-тим бітом (діє тільки для режимів 2 та 3)

REN
SCON.4
Дозвіл роботи приймача

TB8
SCON.3
9-тий біт даних, який передається в режимах 2 та 3

RB8
SCON.2
9-тий прийнятий бід в режимах 2 та 3

TI
SCON.1
Запит на переривання передавача. Встановлюється апаратно після завершення передачі байту. Повинен скидатися програмно в функції обробки переривання.

RI
SCON.0
Запит на переривання приймача. Встановлюється апаратно після завершення прийому байту. Повинен скидатися програмно в функції обробки переривання.


Для передачі байту необхідно його записати в регістр даних послідовного інтерфейсу – SBUF. Це ініціює передачу в послідовному форматі, при чому першим, серед бітів даних, передається молодший значущий біт, а останнім – старший. Після завершення передачі останнього біту встановлюється біт ТІ, який є запитом на переривання. Після прийому байту він записується також в регістр даних послідовного інтерфейсу – SBUF та встановлюється біт RІ, який також є запитом на переривання. Вектор обробки переривання від послідовного інтерфейсу повинен знаходитися по адресу 23Н. Біти RI та ТІ повинні скидатися в функції обробки переривання.
Для зв'язку мікроконтролерів типу MCS51 з ПК в послідовному форматі може використовуються контролер універсального асинхронного приймача/передавача (UART) мікроконтролера підключений до послідовного комунікаційного порту – Ком-порту, ПК. Синхронізація зв’язку відбудеться у випадку, якщо різниця в швидкості обміну мікроконтролера та ПК призведе до того, що час передачі одного кадру повідомлення (стартовий біт, біти даних та стопові біти) буде відрізнятися від часу прийому цього кадру на величину меншу ніж половина часу передачі одного біту, тобто коли фактичні частоти передавача та приймача відрізняються на величину меншу ніж 4,5%. Також не слід забувати, що напруги логічних рівнів ком-порту та мікроконтролера – не співпадають, тому необхідно використовувати додаткові схеми узгодження рівнів – драйвери. Наприклад типу ST232.
Для задання швидкості обміну мікроконтролера, як правило, використовується , „перший” або „третій” режими роботи контролера універсального асинхронного приймача/передавача.
В цих режимах частота прийому та передачі задається частотою переповнень таймера Т1 або Т2. При чому, якщо використовується режим роботи таймера „автоперезавантаження” мікроконтролер може не реагувати на переповнення таймера і заборонити переривання від нього.
Після завершення передачі одного байту даних по послідовному інтерфейсу встановлюється прапорець ТІ. Після прийому – RI. Ці прапорці викликають переривання процесора (при умові, що воно дозволене) та перехід на вектор обробки переривання розміщений по адресі 23h.
Якщо для задання частоти роботи послідовного порту використовується таймер Т1, який працює в режимі „автоперезавантаження” з забороною переривань. Тоді частота обміну (F1,3) розраховується по формулі:

де: SMOD – старший біт регістра PCON (PCON.7) – “подвоєння частоти обміну”, FТ1 – частота переповнень таймера Т1, FCLK – частота кварцового резонатора, ТН1 – Вміст регістра ТН1.
Послідовний порт ПК працює на визначених частотах. ТВ таблиці 1 вказано настройки таймера для різних швидкостей обміну ком-порту.
Частота обміну
Частота кварцу, МГц
SMOD
Таймер/лічильник 1




C/T
Режим (MODE)
ТН1

19.2 кГц
11.059
1
0
2
0FDH

9.6 кГц
11.059
0
0
2
0FDH

4.8 кГц
11.059
0
0
2
0FAH

2.4 кГц
11.059
0
0
2
0F4H

1.2 кГц
11.059
0
0
2
0E8H

137.5 Гц
11.059
0
0
2
1DH

110 Гц
6
0
0
2
72H


Приклад підпрограми ініціалізації послідовного порту
init_serial:
mov SCON, #050h
;Timer 1 is being used to generate baud rates.
orl PCON, #80H
mov TMOD, #020h
mov TH1, #0FDh
setb TR1 ;TCON.6
setb ES ;IE.4
clr RI ;SCON.0
ret
Якщо для задання частоти роботи послідовного порту використовується таймер Т2, який працює в режимі „автоперезавантаження”. Тоді частота обміну (F1,3) розраховується по формулі:
,
де: - вміст регістрів та в вигляді 16-ти бітної константи.
Приклад підпрограми ініціалізації послідовного порту з заданням частоти обміну з допомогою таймера Т2:
init_serial:
mov SCON, #050h
;Timer 2 is being used to generate baud rates.
mov RCAP2L, #0DCh
mov RCAP2H, #0FFh
mov T2CON, #034h
setb ES ;IE.4
clr RI ;SCON.0
ret
Завдання:
Настроїти UART в заданий режим роботи (частота, формат повідомлення);
Прийняти дані з перемикачів та кнопок підключених до вхідного порту та вивести їх через UART в на дисплей комп'ютера;
Прийняти дані з комп'ютера через UART та вивести їх на світлодіодний індикатор підключений до вихідного порту.
№ варіанту
1
2
3
4
5
6
7
8
9
0

Частота роботи послідовного порту
1200
2400
4800
9600
1200
2400
4800
9600
9600
4800

Таймер, який задає частоту
Т1
Т1
Т1
Т1
Т2
Т2
Т2
Т2
Т2
Т2

Вхідний порт
0
1
2
0
1
2
0
1
2
0

Вихідний порт
1
2
0
1
2
0
1
2
0
1


Порядок виконання роботи
Скласти схему відповідно до номера варіанту.
Написати та відлагодити програму роботи мікроконтролера.
Запрограмувати мікроконтролер.
Перевірити функціонування схеми.
Оформити звіт по лабораторній роботі.
Контрольні запитання
Режими роботи послідовного інтерфейсу мікроконтролера;
Робочі частоти послідовного інтерфейсу ПК;
Формула розрахунку частоти послідовного інтерфейсу мікроконтролера;
Особливості роботи послідовного інтерфейсу мікроконтролера.
Приклад схеми

Приклад програми на асемблері
.CODE
.ABSOLUTE
.ORG 0H
JMP MAIN
.ORG 23H
JMP INT_UART
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.DATA
P_OUT: .REG P1
P_IN: .REG P0
REGIST: .DS 8
STEK: .DS 20H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.CODE
.RELATIVE
MAIN: MOV SP,#STEK
CALL INIT_UART
SETB EA
$M1: MOV A, P_IN
XRL A, R3
JZ $M1
MOV SBUF, P_IN
MOV R3, P_IN
CALL DELAY
JMP $M1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: MOV R0,#04H
MOV R1,#0FFH
MOV R2,#0FFH
$M1: DJNZ R2,$M1
DJNZ R1,$M1
DJNZ R0,$M1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT_UART:
MOV SCON, #050H
ORL PCON, #00H
MOV TMOD, #020H
MOV TH1, #0FDH
SETB TR1 ;TCON.6
SETB ES ;IE.4
CLR RI ;SCON.0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_UART:
JB TI, $M1
CLR RI
MOV A, SBUF
XRL A, #0FFH
MOV P_OUT, A
JMP $M2
$M1: CLR TI
$M2: RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
Приклад програми на С51
#include <reg51.h>
#include <intrins.h>
#define P_OUT P1
#define P_IN P0
void init_UART(void);
void delay(void);
/*---------------------------------*/
void main(void)
{
unsigned char k;
init_UART();
EA=1;
while(1)
{
if(k!=P_IN)
{
SBUF=P_IN;
k=P_IN;
delay();
}
}
}
/*---------------------------------*/
void delay(void)
{
unsigned int i;
for(i=0;i<0xfff0;i++);
}
/*---------------------------------*/
void init_UART(void)
{
SCON=0x50;
PCON=0;
TMOD=0x20;
TH1=0xFD;
TR1=1;
RI=0;
ES=1;
}
/*---------------------------------*/
void int_UART(void) interrupt 4
{
unsigned char k;
if(RI)
{
RI=0;
k=SBUF;
P_OUT=k^0xff;
}
if(TI)TI=0;
}
/*---------------------------------*/
Результат роботи програми
В результаті виконання програми на світлодіодний індикатор виводиться двійкове значення байту посланого програмою управління терміналом. Після кожного посланого байту показ світлодіодного індикатора змінюється. Нове, виставлене з допомогою кнопок та перемикачів значення виводиться на дисплей терміналу.