-
Разработка блок-схем алгоритмов и программы
ОБРАБОТКИ ДАННЫХ
Разработка прикладного программного обеспечения на языке Ассемблере - творческая задача, требующая от программиста отличного знания программистской модели МК- 51, состава и формата команд, способов адресации операндов и т .д. Однако существуют формальные правила составления программ, соблюдение которых позволяет даже начинающему разработчику составлять работоспособные программы. Подробно эти правила рассмотрены в [1], согласно которым для получения текста исходной программы необходимо выполнить следующую последовательность действий:
-
составить подробное описание исходной задачи;
-
выполнить инженерную интерпретацию задачи, желательно с привлечением того или иного аппарата формализации (сети Петри, графа автомата и т.п.);
-
разработать блок-схемы алгоритма работы МПС;
-
разработать детализированные блок-схемы алгоритмов отдельных процедур, выделенных на основе модульного принципа составления программ;
-
распределить рабочие регистры и память МК-51;
-
составить текст исходной программы.
Блок-схема алгоритма обработки данных представлена на рисунке 1.
В соответствии c блоком 2 алгоритма должна быть произведена предварительная установка микроконтроллера (МК-51), т.е. определены начальный адрес программы, константы, приоритет и источники прерывания, режим работы таймера/счетчика Т/С1 и последовательного порта, должен быть очищен аккумулятор и регистры-счетчики и задан вид сигнала прерывания (по фронту). Блок 3 программы переводит МК-51 в режим
ожидания прихода прерывания. Внешнее прерывание поступает со входа INT1. После прихода прерывания МК-51 читает байт данных (Date) из порта P1 (блок 4) и производит его сравнение с константой (Const) (блок 5). По результатам сравнения МК-51 либо выводит принятый байт через последовательный порт (блок 6), либо формирует на заданной линии порта P3 импульс заданной длительности (блок 7). После этого осуществляется переход в режим ожидания прихода следующего прерывания.
Разобьем блок-схему алгоритма на следующие модули:
-
передача через последовательный порт;
-
формирование импульса заданной длительности;
-
обработка прерываний.
Последовательный порт МК- 51 может использоваться в качестве универсального асинхронного приемо-передатчика с фиксированной или переменной скоростью последовательного обмена и возможностью дуплексного включения. Скорость последовательного обмена в режимах 1 и 3 определяется по формуле (1):
fn1 = fn3 |
= |
2SMOD ⋅ |
fBQ |
|
, |
(1) |
|
32 ⋅12 ⋅[256 |
− (TH )] |
|
|||||
|
|
|
|
|
где SMOD - значение бита SMOD регистра PCON; fBQ - частота синхронизации МК-51;
TH - десятичное значение содержимого регистра TH1.
Для использованияТ/С1 в качестве источника для задания частот Fn1 и Fn3
необходимо:
− запретить прерывания от Т/С1;
10
-
запрограммировать работу Т/С1 в качестве таймера или счетчика, установив при этом для него один из режимов 0, 1 или 2;
-
запустить Т/С1 на счет.
Обычно для установки скорости передачи данных через последовательный порт таймер Т/С1 включается в режим 2 (режим автозагрузки).
Рассчитаем автозагружаемое значение для получения необходимой скорости передачи через УАПП:
F = 2SMOD ⋅ f BQ (32 *12 *[256 − TH ])
где SMOD - значение бита SMOD регистра управления мощностью PCON;
fBQ - частота синхронизации МК-51, TH - десятичное значение содержимого
регистра TH1.
TH = 256 − 2SMOD ⋅ f BQ (32 *12 * F)
TH = 256 −1⋅ 5*106 (32 *12 *300) = 256 − 43 = 213d = D5h
Составим блок-схему алгоритма передачи данных через последовательный порт. Первым делом необходимо остановить Т /С1, после чего загрузить в регистр TH1число, определяющее скорость передачи через последовательный порт.Далее необходимо в регистрах SCON и TMOD установить режимы работы последовательного порта и Т/С1 соответственно. После всех установок производится запуск Т/С1 на счет и запускается цикл ожидания окончания передачи . Если передача оконченавыполняется очистка флага передачи T1. После чего происходит выдача 9 бит данных в последовательный порт.
Блок схема алгоритма передачи через последовательный порт показана на рисунке
5.
Останов Т/С1
TH1← A1H
SCON← Режим работы п/п
TMOD← Режим работы T/C1
Запуск Т\С1
нет Передача
окончена
да
Очистка флага передачи
SBUF← 9 бит данных
Рисунок 5- Блок схема алгоритма передачи через последовательный порт
Для выдачи в порт импульса заданной длительностью установить заданную линию порта P3 в 5. Сформировать импульс заданной длительности можно, используя либо
11
таймер/счетчик, либо регистры РПД. Блок-схема алгоритма формирования временной задержки большой длительности показана на рисунке 6.
Данный алгоритм использует так называемые вложенные циклы. На начальном этапе в регистр R1 загружается число “большого” цикла X (блок 2), а в регистр R2 – число “малого” цикла Y (блок 3). Эти две команды выполняются за один машинный цикл. С помощью блоков 4, 5 подпрограммы содержимое регистра R2 уменьшается до 0 и осуществляется переход к блоку 6 подпрограммы. Этот цикл удобнее организовать с помощью команды DJNZ Rn, rel которая выполняется МК-51 за два машинных цикла. Аналогично организуется и “большой ” цикл (блоки 6, 7). Таким образом, длительность временной задержки , формируемой с помощью этого алгоритма, в машинных циклах можно рассчитать по формуле (2):
tЗЦ = 1+ (1+ 2 ⋅Y + 2) ⋅ X |
(2) |
Время задержки в секундах рассчитывается по формуле (3):
tЗ |
= |
1 |
⋅12 *[1+ (3 + 2 ⋅Y ) ⋅ X ]. |
(3) |
|
|
|
|
f |
|
|
|
|
|
|
|
Начало |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
Загрузка в R1 числа циклов X |
1 |
|
|
|
|
|
|
|
||
|
|
|
|
|
3 |
|
|
|
|
Загрузка в R2 числа циклов Y |
|
|
|
|
|
|
|
|
4 |
|
|
|
|
Декремент R2 |
|
|
|
|
|
|
|
|
Y |
|
Нет |
|
|
(R2) = 0? |
5 |
X |
|
|
|
|
|
|
||
|
|
|
Да |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
Декремент R1 |
|
|
|
Нет |
|
|
(R1) = 0? |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
Да |
8 |
|
|
|
|
|
Выход |
|
|
|
|
|
|
|
|
|
Рисунок 6 - Блок-схема алгоритма формирования временной задержки
Если задана длительность импульса, формируемого с помощью рассмотренного алгоритма, то необходимо подобрать X и Y так, чтобы выполнялось условие (4):
tЗ ≤ tЗАД , |
(4) |
где tЗАД - заданная длительность импульса
Для того чтобы МК - 51 сформировал импульс с точностью плюс/минус 1 цикл в подпрограмму необходимо добавить команду “нет операции” (NOP), число которых можно рассчитать по формуле (5):
N = |
tЗАД − tЗ |
⋅ fBQ . |
(5) |
|
12 |
|
|||
|
12 |
|
|
|
|
|
|
|
Если число команд NOP, необходимых для “подгонки” задержки, получится больше 5, то рекомендуется для этих целей использовать локальный цикл, который вставляется в тело подпрограммы после блока 7.
Рассчитаем необходимые значения для формирования определенной временной задержки:
T = 55 мс = 55*10−3 с.
fBQ = 5 МГц = 5*106 Гц.
T = [1 + X (3 + 2Y )]12 f BQ ⇒T * f BQ 12 = [1 + X (3 + 2Y )]
55*10−3 *5*106 = 55*5*103. 12 = [1+ X (3 + 2Y )]= 22917
Рассчитаем оптимальные значения X и Y: X=68d и Y=167d.
1+ (3 + 2*167)*68 = 22917
Значения X и Y получены методом полного перебора. По X и Y от 1 до 255,
функция[1+ X (3 + 2Y )]− T * fBQ /12→ 0.
Рассчитаем количество операций NOP:
|
55*10−3 − |
1 |
⋅12 *[22917] |
|
|
|
55 *10 |
−3 |
− |
55 ⋅10 |
−3 |
|
|
|
||||
N = |
5*106 |
|
6 |
|
6 |
|
|
|||||||||||
|
|
|
⋅ 5*10 |
= |
|
⋅ 5*10 |
= |
|
||||||||||
|
12 |
|
|
|
|
12 |
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
= 120 ⋅ 5*106 = 0 .
После начальной установки начинается выполнение программы по заданному алгоритму. Вначале в указатель стека загружается адрес вершины стека, затем происходит переход на основную программу.
Программа обработки прерывания производит чтения байта порта P1, содержимое которого пересылается в регистр аккумулятор. Следующим этапом происходит сравнение содержимого аккумулятора и регистра R7, в котором храниться константа. Сравнение выполняется следующим образом: из содержимого аккумулятора вычитается содержимое регистра R7 и если флаг переноса С=0 (Date<Const) выполняется передачаинформациичерез последовательный порт, иначе - выдача в порт импульса заданной длительности.
Блок-схема алгоритма начальной установки и прерывания показана на рисунке 7. Объединив все модули, получим алгоритм программы обработки данных, который
показан на рисунке 8.
13
Начало
Очистка
аккумулятора
Подготовка порта P1 на ввод
Установка банка регистров
Установка приоритета прерывания
Разрешение
прерывания
Очистка Т/С1
Запись в регистр R7 const
Рисунок 7 - Блок-схема алгоритма начальной установки и прерывания
14
Начало
Очистка
аккумулятора
Подготовка порта P1 на ввод
Установка банка регистров
Установка приоритета прерывания
Разрешение
прерывания
Очистка Т/С1
R7 ← const
нет Прерывание пришло
да
A← P1
1 2
Рисунок 8 – Блок-схема алгоритма программы обработки данных (Начало).
15
1 |
|
|
|
|
|
A←A - R7 |
|
|
|
||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
Да C=1 |
|
|
|
|
|
Нет C=0 |
|
|||||
|
|
|
Data < Const |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
P33.0.4←1 |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
||||
Останов Т/С1 |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
R1←8868 |
|
|||
TH1←D5FCH |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
SCON← Режим |
|
|
|
|
|
R2←150167 |
|
||||||||
работы п/п |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
TMOD← Режим |
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
||||||||
работы T/C1 |
|
|
|
|
|
R2←R2 - 1 |
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Запуск Т\С1 |
|
|
|
Нет Z=0 |
|
|
|
||||||||
|
|
|
R2=0 ? |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
Да Z=1
Нет T1=0 |
Передача |
|
|
|
|
|
|
|
||||||||
|
|
|
|
R1←R1 - 1 |
|
|||||||||||
|
|
|
|
|
|
|
||||||||||
|
|
окончена |
|
|
|
|
|
|||||||||
|
|
|
Да T1=1 |
|
|
|
|
|
|
|
||||||
|
|
|
|
Нет Z=0 |
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|||||||||
|
|
Очистка флага |
|
R1=0 ? |
|
|||||||||||
|
|
передачи |
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
Да Z=1
SBUF← 9 бит данных
P33.0.4←0
2
Рисунок 8 – Блок-схема алгоритма программы обработки данных (Продолжение).
В P1 значения попадают c внешнего устройства, и заносится в программном эмуляторе, реализуя получение данных устройств управления МПС.
На основе полученного алгоритма составим программу на языке Ассемблер. Программа обработки данных:
Метки |
Команды в мнемокоде |
Комментарии |
START: |
CLR A; |
ОЧИСТКА АККУМУЛЯТОРА |
|
MOV P1,#255; |
ПОДГОТОВКА ПОРТА P1 НА ВВОД |
|
MOV |
УСТАНОВКА БАНКА 2 |
|
PSW,#00010000B; |
|
|
MOV IP,#00000100B; |
ВЫСШИЙ ПРИОРИТЕТ INT1 |
|
MOV IE,#10000100B; |
РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ INT1 |
|
CLR TR1; |
ОСТАНОВ ТАЙМЕРА Т/С1 |
|
MOV R7,#100; |
ЗАПИСЬ CONST |
|
|
16 |
WAIT: |
NOP; |
ПУСТАЯ ОПЕРАЦИЯ, НЕОБХОДИМА, ЧТОБЫ |
|
|
ОБНАРУЖИТЬ ПОЯВЛЕНИЕ БИТА ПРЕРЫВАНИЯ |
|
SJMP WAIT; |
ОЖИДАНИЕ ПРЕРЫВАНИЯ |
|
MOV P1,#101 |
ЗАПИСЬ DATA |
|
MOV A,P1; |
ЧТЕНИЕ БАЙТА ДАННЫХ ИЗ P1 |
|
SUBB A,R7; |
СРАВНЕНИЕ БАЙТА С CONST |
|
JNC IMPULS; |
ПЕРЕХОД, ЕСЛИ РЕЗУЛЬТАТ МЕНЬШЕ |
OUT: |
CLR TR1; |
ОСТАНОВ Т/С1 |
|
MOV TH1,#213; |
ЗНАЧЕНИЕ ДЛЯ СКОРОСТИ |
|
MOV |
УСТАНОВКА РЕЖИМА 3 ПОРТА |
|
SCON,#11011100B; |
|
|
MOV |
УСТАНОВКА РЕЖИМА 2 Т/С1 |
|
TMOD,#00100000B; |
|
|
SETB TR1; |
ЗАПУСК ТАЙМЕРА |
LABEL: |
JNB T1,LABEL; |
ОЖИДАНИЕ ОКОНЧАНИЯ ПЕРЕДАЧИ |
|
CLR T1; |
ОЧИСТКА ФЛАГА ПЕРЕДАЧИ |
|
MOV SBUF,A; |
ВЫДАЧА ДАННЫХ В ПОРТ |
|
SJMP WAIT; |
ОЖИДАНИЕ ПРЕРЫВАНИЯ |
IMPULS: |
SETB P3.0; |
УСТАНОВКА БИТА P3.0 |
|
MOV R1,#68; |
ЗАПИСЬ В R1 X |
CYCLE2: |
MOV R2,#167; |
ЗАПИСЬ В R2 Y |
CYCLE1: |
DJNZ R2,CYCLE1; |
ДЕКРЕМЕНТ Y И ПЕРЕХОД |
|
DJNZ R1,CYCLE2; |
ДЕКРЕМЕНТ X И ПЕРЕХОД |
|
CLR P3.0; |
СБРОС БИТА P3.0 |
|
SJMP WAIT; |
ОЖИДАНИЕ ПРЕРЫВАНИЯ |
17
Список использованных источников
-
Горелик А.В., Горелик В.Ю., Ермаков А.Е., Ермакова О.П. Микропроцессорные информационно-управляющие системы железнодорожного транспорта. – М.: МИИТ, 2011. – 230 с.
-
Однокристальные микро-ЭВМ / Боборыкин А.В., Липовецкий Г.П. и др. – М.: МИКАП,
1994. – 400 с.
-
Сташин В.В., Урусов А.В., Мологонцева О.Ф. Проектирование цифровых устройств на однокристальных микроконтроллерах. – М.: Энергоатомиздат, 1990. – 224 с.
18
Приложение. Листинг программы
START: CLR A;
MOV P1,#255;
MOV PSW,#00010000B;
MOV IP,#00000100B;
MOV IE,#10000100B;
CLR TR1;
MOV R7,#100;
WAIT: NOP;
SJMP WAIT;
MOV P1,#101
MOV A,P1;
SUBB A,R7;
JNC IMPULS;
OUT: CLR TR1;
MOV TH1,#213;
MOV SCON,#11011100B;
MOV TMOD,#00100000B;
SETB TR1;
LABEL: JNB T1,LABEL;
CLR T1;
MOV SBUF,A;
SJMP WAIT;
IMPULS: SETB P3.0;
MOV R1,#68;
CYCLE2: MOV R2,#167;
CYCLE1: DJNZ R2,CYCLE1;
DJNZ R1,CYCLE2;
CLR P3.0;
SJMP WAIT;
19
20
21
22
23
24
25