double arrow

Примеры проектирования интерактивных систем

Задача 1. Электронная записная книжка

При включении питания на однострочном индикаторе отображается курсор. Записная книжка готова к вводу новых строк текста. При нажатии кнопки «Enter» происходит запись строки в память и очистка индикатора. Курсор ставится в начальную позицию. При нажатии кнопки «Del» происходит удаление символов справа от курсора. При нажатии кнопок «» и «®» курсор перемещается в соответствующую сторону. При нажатии кнопок «­» и «¯» происходит перелистывание записей книжки. При нажатии остальных кнопок происходит ввод соответствующих символов.

Структурная схема системы управления электронной записной книжкой

 
 


Управляющий автомат электронной записной книжки представляет собой типичный функциональный преобразователь, в котором каждому входному сигналу сопоставлен определенный выходной сигнал. Данная задача не требует автоматного программирования, так как в управляющей структуре отсутствуют сущности со сложным поведением. По структуре можно сразу разработать код программы.

Код программы

void main (void) {

char key; // идентификатор кнопки

char i; // счетчик вх. симв.

char j; // счетчик строк массива

char S[17][3]; // строковый буфер

while(1) { // обр-ка вх. симв.

switch (key) {

case 13: Save_Buf(); Lcd_Clear(); break;

case 46: Lcd_Erase(i); break;

case 36: Lcd_Shift_Left(); break;

case 38: Lcd_Shift_Right(); break;

case 37: if(j>0) j--; Lcd_Put_Str(j); break;

case 40: if(j<2) j++; Lcd_Put_Str(j); break;

default: Put_Buf(key); Lcd_Put_Str(j); break;

}

DelayMs(100);

}

}

Задача 2. Программа управления светофором.

В начальном состоянии горит красный сигнал. На индикаторе отображается слово «красный». Через tк включается желтый сигнал. На индикаторе отображается слово «желтый». Через 2 секунды красный и желтый сигналы гаснут, включается зеленый сигнал на время tз. На индикаторе отображается слово «зеленый». Затем 3 секунды зеленый сигнал мигает с частотой 1 Гц и скважностью 50%. По окончании мигания зеленый сигнал выключается, на 2 секунды включается желтый сигнал, на индикаторе - слово «желтый», затем желтый сигнал выключается и включается красный сигнал, на индикаторе - слово «красный». Далее работа светофора повторяется.

При нажатии на кнопку «Н» в режиме горения красного, желтого или зеленого сигнала светофор входит в режим настройки и все сигналы выключаются. На индикаторе отображается «tк=XXc». После следующего нажатия на кнопку «Н» значение tк сохраняется и на индикаторе отображается «tз=XXc». После следующего нажатия на кнопку «Н» значение tз сохраняется и светофор переходит из режима настройки в состояние горения красного цвета. Значения tк и tз изменяются с помощью кнопок «◄» и «►» в интервале от 5с до 30с с шагом 1с.

Структурная схема системы управления светофором

На базе условия задачи и структурной схемы строим таблицу переходов и выходов.

Таблица переходов и выходов

state Красный Красный-желтый Зеленый Миг. зеленый Желтый Настр. tк Настр. tз
Красный «Красный» (T){Z7(20), Z10} - - - (key=S) Z9 -
Красный-желтый - «Кр.-желтый» (T) {Z7(10tз), Z9, Z11, Z12} - - (key=S) { Z9, Z11} -
Зеленый - - «Зеленый» (T) Z7(3) - (key=S) Z13 -
Миг. зеленый - - - Z12, П(0,5) Z13, П(0,4) (T){Z7(20), Z10} - -
Желтый (T) {Z7(10tк), Z11, Z8} - - - «Желтый» (key=S) Z11 -
Настр. tк - - - - - «tк=XXc» (key=D) Z1 (key=U) Z2 (key=S)
Настр. tз (key=S) {Z7(10tк), Z8} - - - - - «tз=XXc» (key=D) Z3 (key=U) Z4

Код программы

const char R = 1; // Код состояния

const char RY = 2;

const char G = 3;

const char GG = 4;

const char Y = 5;

const char SR = 6;

const char SG = 7;

const char D = 1; // Код нажатой кнопки

const char U = 2;

const char S = 3;

char key; // Идентификатор нажатой кнопки

char state; // Идентификатор управляющего состояния

char t = 5; // Значение счетчика

char tr = 5; // Время красного сигнала, с

char tg = 5; // Время зеленого сигнала, с

bit T = 0; // Сигнал счетчика «время истекло»

bit RED = 1; // Красный цвет

bit YEL = 0; // Желтый цвет

bit GRN = 0; // Зеленый цвет

void main (void) {

t = 10*tr;

state = R;

// Реализация управляющего автомата

while (1) {

switch (state) {

case R: // Красный

printf(“Красный”);

if (T) { state=RY; T = 0; t=20; YEL=1; }

else if (key == S) { state=SR; RED=0; }

break;

case RY: // Красный-желтый

printf(“Красный-желтый”);

if (T) { state=G; T = 0; t=10*tg; RED=0; YEL=0; GRN=1; }

else if (key == S) { state=SR; RED=0; YEL=0; }

break;

case G: // Зеленый

printf(“Зеленый”);

if (T) { state=GG; T = 0; t=3; }

else if (key == S) { state=SR; GRN=0; }

break;

case GG: // Мигающий зеленый

GRN=1; DelayMs(500);

GRN=0; DelayMs(400);

if (T) { state=Y; T = 0; t=20; YEL=1; }

break;

case Y: // Желтый

printf(“Желтый”);

if (T) { state=R; T = 0; t=10*tr; YEL=0; RED=1; }

else if (key == S) { state=SR; YEL=0; }

break;

case SR: // Настройка времени красного сигнала

printf(“tк=%2dc”, tr);

switch(key) {

case D: if (tr>5) tr--; break;

case U: if (tr<30) tr++; break;

case S: state=SG; break;

}

break;

case SG: // Настройка времени зеленого сигнала

printf(“tз=%2dc”, tg);

switch(key) {

case D: if (tg>5) tg--; break;

case U: if (tg<30) tg++; break;

case S: state=R; T = 0; t=10*tr; RED=1; break;

}

break;

}

DelayMs(100); // такт работы автомата

if(t==0) T=1; else t--; // счетчик

}

}

Разработать программу классическим (алгоритмическим) подходом, сравнить с автоматным подходом по времени разработки, объему занимаемых ресурсов, удобочитаемости, структурированности и возможностям отладки.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: