Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_all_PCPP.doc
Скачиваний:
11
Добавлен:
20.07.2019
Размер:
1.67 Mб
Скачать

Приклад програми на с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;

}

/*---------------------------------*/

Результат роботи програми

В результаті виконання програми на світлодіодний індикатор виводиться двійкове значення байту посланого програмою управління терміналом. Після кожного посланого байту показ світлодіодного індикатора змінюється. Нове, виставлене з допомогою кнопок та перемикачів значення виводиться на дисплей терміналу.

Лабораторна робота № 3

Тема: Формування дискретних сигналів з заданими параметрами

Мета: Ознайомлення з режимами роботи таймерів/лічильників в мікроконтролера АТ89С51 та його можливостями по зв'язку з персональним комп'ютером.

Короткі теоретичні відомості

Мікро контролери MCS51 містять два програмованих 16-бітних таймери/лічильники (TCNT0 й TCNT1), які можуть використовуватися як таймери або лічильники зовнішніх сигналів. При роботі в режимі таймеру вміст TCNT інкрементується в кожному машинному циклі, тобто через кожні 12 періодів резонатора. При роботі в режимі лічильника вміст TCNT інкрементується під впливом переходу з 1 в 0 зовнішнього вхідного сигналу, що подається на відповідний (Т0, Т1) вивід порту Р3. Опитування значення зовнішнього вхідного сигналу виконується в момент часу S5P2 кожного машинного циклу. Вміст лічильника буде збільшене на 1 у тому випадку, якщо в попередньому циклі був зчитаний вхідний сигнал високого рівня (1), а в наступному - сигнал низького рівня (0). Нове (інкрементоване) значення лічильника буде сформовано в момент S3P1 у циклі, наступному після виявленя переходу сигналу з 1 в 0. Оскільки на розпізнавання переходу потрібно два машинних цикли, то максимальна частота підрахунку вхідних сигналів рівна 1/24 частоти резонатора. На тривалість періоду вхідних сигналів обмежень зверху немає. Для гарантованого прочитання вхідного рахованого сигналу він повинен утримувати значення 1 як мінімум протягом одного машинного циклу.

Для керування режимами роботи TCNT і для організації взаємодії таймерів із системою переривання використовуються два регістри спеціальних функцій - TMOD і TCON, опис яких приводиться в табл. 1 і 2 відповідно. Як видно з опису керуючих біт TMOD, для обох TCNT режими роботи 0, 1 й 2 однакові. Режими 3 для TCNT0 й TCNT1 різні. Розглянемо коротко роботу TCNT у всіх чотирьох режимах.

Режим 0. Перевід будь-якого TCNT в режим 0 робить його схожим на таймер MCS48 (8-бітний лічильник), на вхід якого підключений 5-бітний дільник частоти на 32. Роботу TCNT в режимі 0 на прикладі TCNT1 ілюструє рис. 1 а. У цьому режимі таймерний регістр має розрядність 13 біт. При переході зі стану "всі одиниці" в стан "всі нулі" установлюється прапорець переривання від таймера TF1. Вхідний синхросигнал таймера 1 дозволений (надходить на вхід TCNT), коли керуючий біт TR1 встановлений в 1 і або керуючий біт GATE (блокування) дорівнює 0, або на зовнішній вивід запиту переривання INT1 поступає логічна 1.

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

Режим 1. Робота будь-якого TCNT у режимі 1 така ж, як і в режимі 0, за винятком того, що таймерний регістр має розрядність 16 біт.

Режим 2. В режимі 2 робота організована таким чином, що переповнення (перехід зі стану "всі одиниці" в стан "всі нулі") 8-бітного лічильника TL1 приводить не тільки до встановлення прапорця TF1 (рис. 1 б), але і переписує в TL1 вміст старшого байта (ТН1) таймерного регістра (вміст якого було попередньо програмно задано). Процес переписування не змінює вмісту ТН1.

Режим 3. В режимі 3 TCNT0 й TCNT1 працюють по-різному. TCNT1 зберігає незмінним свій поточний вміст. Іншими словами, ефект такої ж, як і при скиданні керуючого біта TR1 у нуль.

Роботу TCNT0 у режимі 3 ілюструє рис. 1 в. У режимі 3 TL0 і ТН0 функціонують як два незалежних 8-бітних лічильники. Роботу TL0 визначають керуючі біти TCNT0 (Л/Т, GATE, TR0), вхідний сигнал INT0 і прапорець переповнення TF0. Роботу ТН0, що може виконувати тільки функцію таймера, визначає керуючий біт TR1. При цьому ТН0 використовує прапорець переповнення TF1.

Режим 3 використається в тих випадках, коли потрібна наявність додаткового 8-бітного таймера або лічильника подій. Можна вважати, що в режимі 3 мікроконтролер має у своєму складі три таймери/лічильники. Якщо TCNT0 використається в режимі 3, TCNT1 може бути включений, виключений, переведений у свій власний режим 3, може використовуватися послідовним портом як генератор частоти передачі, або, може бути використаний для виконання завдань, які не вимагають переривання.

Табл. 1 - Регістр режиму роботи таймера/лічильника

Символ

Позиція

Призначення

GATE

TMOD.7 для TCNT1 и TMOD.3 для TCNT0

Управління блокуванням. Якщо біт встановлений, то таймер/лічильник "x" працює до тих пір, поки на вході "INTx" високий рівень і біт управління "TRx" встановлений. Якщо біт скинутий, то TCNT працює, коли лише біт управління "TRx" встановлюється.

С/Т

TMOD.6 для TCNT1 и TMOD.2 для TCNT0

Вибір режиму таймера або лічильника. Якщо С/Т = 0, то таймер з синхронізацією від внутрішнього генератора. Якщо С/Т = 1, то лічильник зовнішніх сигналів, які поступають на вхід "Тх"

M1

TMOD.5 для TCNT1 и TMOD.1 для TCNT0

Вибір режиму роботи ***

М0

TMOD.4 для TCNT1 и TMOD 0 для TCNT0

***

М1

М0

Режим роботи

0

0

Таймер MCS48. "TLx" працює як 5-битний дільник

0

1

16-битный таймер/лічильник. "ТНх" і "TLx" включені послідовно

1

0

8-бітний таймер/лічильник. "ТНx" зберігає значення, яке переписується в "TLx" кажен раз по переповненню

1

1

Таймер/лічильник 1 зупиняється. Таймер/лічильник 0: TL0 працює як 8-бітний таймер/лічильник, і його режим визначається бітами керування таймера 0. ТН0 працює як 8-бітний таймер, і його режим визначається бітами керування таймера 1

Табл. 2 - Регістр управління/статусу таймера

Символ

Позиція

Призначення

TF1

TCON.7

Переповнення таймера 1, Встановлюється апаратно при переповненні таймера/лічильника. Скидається апаратно при обслуговуванні переривання.

TR1

TCON.6

Запуск таймера 1. Встановлюється/скидається програмно для запуску/зупинки таймера.

TF0

TCON.5

Переповнення таймера 0, Встановлюється апаратно при переповненні таймера/лічильника. Скидається апаратно при обслуговуванні переривання.

TR0

TCON.4

Запуск таймера 0. Встановлюється/скидається програмно для запуску/зупинки таймера.

IE1

TCON.3

Прапорець фронту переривання 1. Встановлюється апаратно, коли детектується спад зовнішнього сигналу INT1. Скидається при обслуговуванні переривання.

IT1

TCON.2

Біт управління типом переривання 1. Встановлюється/скидається програмно для специфікації запиту INT1 (фронт/низький рівень).

IE0

TCON.1

Прапорець фронту переривання 0. Встановлюється апаратно, коли детектується спад зовнішнього сигналу INT0. Скидається при обслуговуванні переривання.

IT0

TCON.0

Біт управління типом переривання 0. Встановлюється/скидається програмно для специфікації запиту INT0 (фронт/низький рівень).

Завдання:

  1. Настроїти UART на задану частоту;

  2. Прийняти дані з UART

  3. Сформувати вихідний сигнал з шпарністю згідно варіанту та частотою (періодом) прийнятою через 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

Частота, Гц

Частота, кГц

Частота, МГц

Період, с.

Період, мс.

Період, мкс.

Частота, кГц

Частота, МГц

Період, с.

Період, мс.

Порядок виконання роботи

  1. Скласти схему відповідно до номера варіанту.

  2. Написати та відлагодити програму роботи мікроконтролера.

  3. Запрограмувати мікроконтролер.

  4. Перевірити функціонування схеми.

  5. Оформити звіт по лабораторній роботі.

Приклад схеми

Приклад програми на С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;

}

/*---------------------------------*/

Результат роботи програми

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]