Лабораторна робота № 3
з курсу „Проектування контролерів периферійних пристроїв”
Тема: Формування дискретних сигналів з заданими параметрами
Мета: Ознайомлення з режимами роботи таймерів/лічильників в мікроконтролера АТ89С51 та його можливостями по зв'язку з персональним комп'ютером.
Короткі теоретичні відомості
Завдання:
Настроїти UART на задану частоту;
Прийняти дані з UART
Сформувати вихідний сигнал з шпарністю згідно варіанту та частотою (періодом) прийнятою через UART;
№ варіанту
1
2
3
4
5
6
7
8
9
0

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

Парність імпульсів
1/2
1/3
2/3
¼
3/4
1/2
1/3
2/3
1/4
3/4

Вихідний порт
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P3.6
P3.7

Параметр, прийнятий по UART
Частота, Гц
Частота, кГц
Частота, МГц
Період, с.
Період, мс.
Період, мкс.
Частота, кГц
Частота, МГц
Період, с.
Період, мс.


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

Приклад програми на С51
#include <REGX51.H>
#define Fclk 11059000
#define P_OUT P1_0
unsigned char freq=1;
unsigned int Time_nul;
unsigned int Time_one;
void init_UART(void);
void init_T0(void);
void comp_THTL(unsigned char f);
/*---------------------------------*/
void main(void)
{
init_UART();
init_T0();
EA=1;
while(1);
}
/*---------------------------------*/
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;
if((k>='0')&&(k<='9'))
{
freq=k-'0';
comp_THTL(freq);
}
}
if(TI)TI=0;
}
/*---------------------------------*/
void init_T0(void)
{
unsigned int k;
ET0=1;
TMOD &= 0XF0; /* clear Timer 0 */
TMOD |= 0X1;
comp_THTL(freq);
P_OUT=0;
k=Time_nul;
TL0=k;
k=(k&0xFF00);
k>>=8;
TH0=k;
TR0=1;
}
/*---------------------------------*/
void int_T0(void) interrupt 1
{
unsigned int k;
TR0=0;
if(P_OUT)
{
P_OUT=0;
k=Time_nul;
}
else
{
P_OUT=1;
k=Time_one;
}
TL0=k;
k=(k&0xFF00);
k>>=8;
TH0=k;
TR0=1;
}
/*---------------------------------*/
void comp_THTL(unsigned char f)
{
float Period,Timer_tic;
Period=1/(f*1e3);
Timer_tic=Period*Fclk/12-0x3C; //0x3C***
Time_one=0xFFFF-Timer_tic/3; //signal 1/3: _ _-_ _-
Time_nul=0xFFFF-Timer_tic*2/3;
}
/*---------------------------------*/
Результат роботи програми