Команды
|
Флаги
|
|
Команды
|
Флаги
|
ADD
|
C, OV, AC
|
CLR C
|
C = 0
|
ADDC
|
C, OV, AC
|
CPL C
|
C = ¬C
|
SUBB
|
C, OV, AC
|
ANL C, b
|
C
|
MUL
|
C = 0, OV
|
ANL C, /b
|
C
|
DIV
|
C = 0, OV
|
ORL C, b
|
C
|
DA
|
C
|
ORL C, /b
|
C
|
RRC
|
C
|
MOV C, b
|
C
|
RLC
|
C
|
CJNE
|
C
|
SETB C
|
C = 1
|
|
|
Символическая адресация.
При использовании ассемблера ASM51 для получения объектных
кодов программ допускается применение в программах символических имен регистров
специальных функций (РСФ), портов и их отдельных бит рис. 3.4., рис 3.5.
Для адресации отдельных бит РСФ и портов (такая возможность
имеется не у всех РСФ) можно использовать символическое имя бита следующей
структуры:
< имя РСФ или порта > . <номер бита>
Например, символическое имя пятого бита аккумулятора будет
следующим: АСС.5. Символические имена РСФ, портов и их бит являются
зарезервированными словами для Intel87C51FB, и их не надо определять с помощью директив ассемблера.
Рис 3.4.
Рис 3.5.
Выбор
Инструментальных средств
При выборе инструментальных средств разработки было
необходимо обеспечить удобство и быстроту создания и отладки программного
обеспечения микроконтроллера. Программа отлаживалась в интегрированной среде PICE-51, которую можно охарактеризовать следующим образом. PICE под Windows основная интегрирующая среда разработки для
технологии микрокристалла включающей INTEL87C51FB семейств микроконтроллера. PICE позволяет пользователю писать, отлаживать, и
оптимизировать многие процессоры для разработки микропрограмм. PICE включает текстовый редактор, имитатор, и руководитель
проекта. PICE также имеет внутрисхемный эмулятор,
программирующие устройства, и другие системы разработки инструментальных средств
микрокристалла. Инструментальные средства PICE
реализуют для пользователя следующие функции:
Отладка его исходной программы;
Эмуляция процессоров:
Intel: 80C31/32,
8XC51/52/54/58, 8XL/C51FA/FB/FC, 8XC51RA/RB/RC;
Philips:
80C31/32, 8XC51/52/54/58, 8XC51FA/FB/FC; 8XC51RA+/RB+/RC+/RD+, 8XC524, 8XC528,
8XC550, 8XC652, 8XC654, 8XC575, 8XC576, 8XC851, 89C535,89C536, 89C538;
Atmel:
89C51, 89C52, 89C55, 89C4051, 89C2051, 89C1051;
Siemens:
SAB501;
MHS: 80C31,
8XC51, 80C32, 8XC52, 8XC154;
Oki: 80C31,
8XC51, 8XC154;
AMD: 80C31,
8XC51, 8XC52;
Автоматически располагает ошибки в
исходных файлах для редактирования;
Отладка с контрольными точками, базировавшимися на
внутренних величинах регистра;
· Часы ход программы с имитатором или часами в реальном
времени с внутрисхемным эмулятором POD51-RX.
· Делать синхронизацию размеров со стоповыми часами;
· Видеть переменные в специальных окнах;
· Находить быстрые ответы на вопросы с PICE
онлайновой подсказки;
Встроенная разработка среды Project-51
позволяет пользователю быстро перемещаться между другими способами
разработки/отладки.
Встроенная разработка среды Project-51
включает инструментальные средства следующей разработки:
Руководитель проекта позволяет пользователю создавать
проект, и работать со специфическими файлами связанными с проектом. Project-51 руководитель проекта также позволяет пользователю
формировать приложение и загружать программный код в эмулятор или имитатор с
нажатием мыши.
Project-51 это:
редактор позволяет программисту писать и редактировать
исходные файлы микропрограмм или другие текстовые файлы для INTEL87C51FB
микроконтроллеров;
универсальный ассемблер микроконтроллеров позволяет
пользователю получать программный код;
программный имитатор имитирует выполнение инструкции и I/O
микроконтроллеров.
Внутрисхемный эмулятор POD51-RX использует аппаратные средства, чтобы эмулировать
INTEL87C51FB микроконтроллеров в реальном времени. Аппаратные средства POD51-RX эмулятора продаются
отдельно.
После установки и компиляции проектов в Project-51,
программист захочет увидеть как сделаны его кодовые прогоны. Если у вас есть
программатор устройства, вы можете запрограммировать устройство
микроконтроллера и подключите программируемое устройство в вашем фактическом
приложении, чтобы проверить, что приложение работает как ожидается. Обычно,
приложение не будет выполняться правильно сначала, и программист должен
отладить код. Отладчик может использовать Project-51,
чтобы с имитировать программный код или может использовать эмулятор POD51-RX, чтобы выполнять созданные
микропрограммы в фактическом приложении пока программист производит отлаживание
созданной программы. Во время отладки, пользователь может использовать
прерывание и точки останова, когда выполняется код его программы. Можно
наблюдать величины регистра в окне регистра или в специальном функциональном
окне регистра, чтобы увидеть состояние процессора и следовательно выполняемый
код и пошаговый режим.
Внутрисхемный эмулятор POD51-RX выполняет код в фактической скорости выполнения (реальное
время) в разрабатываемых целевых аппаратных средствах, останавливаясь только в
определенных контрольных точках. Project-51 имитирует
выполнение любого процессора и имитирует условия I/O в скоростях, которые
зависят от скорости вашего PC.
Все эти функции используют информацию из Project-51
проекта. Строка помечается в исходной программе, символических позициях в
памяти, и функциональные имена из кода могут использоваться, чтобы установить
прерывание и точки останова и изучать и модифицировать регистры.
Исходя из всего выше сказанного, выбор элементной базы был
остановлен на уже перечисленных микросхемах. Выбор инструментальных средств
разработки обоснован необходимостью применения интегрированной среды Project-51 для отладки ассемблерных программ контроллеров.
Разработка
структуры программного обеспечения подсистемы.
В процессе дипломного проектирования необходимо разработать
подсистему контроля вскрытия персонального компьютера обеспечивающую постоянный
контроль поставленных на охрану объектов и выдачу информации о их состоянии на
АРМ СБ.
Программа контроллера УСВИЦ-250 должна выполнять следующие
основные функции:
Осуществлять считывание с масок кодов скоростей;
Осуществлять перевод этих кодов в двоичный код;
Осуществлять формирование 32х-разрядного слова по
ARING-427;
Осуществлять вывод в магистраль выходного слова;
Осуществлять вывод аналогового сигнала о приборной скорости.
Результатом анализа и осмысления, поставленных при
разработке данной подсистемы требований явилась следующая структура подпрограмм
в основной программе, обеспечивающей выполнения поставленных требований:
1. Подпрограмма, взаимодействующая масок с МК должна
выполнять следующие возложенные на нее функции:
- принимать коды грея;
2. Подрограмма, осуществляющая перевод кодов по формуле:
Код_Двоичный4=Код_Грея4;
Код_Двоичный3=Код_Грея3 Å Код_Двоичный4;
Код_Двоичный2=Код_Грея2 Å Код_Двоичный3;
Код_Двоичный1=Код_Грея1 Å Код_Двоичный2;
Код_Двоичный0=Код_Грея0 Å Код_Двоичный1;
3. Подрограмма, формирование 32х-разрядного слова
по ARING-427 должна выполнять следующие функции:
- привести значение скорости к цене младшего разряда;
занести по адресам 8-9 в слове индификатор от УСВИЦ-250;
занести по адресам 30-29 в слове о достоверности слова;
подсчитать четность слова и занести по адресу 31 в слове.
Занести по адресам 0-8 в слове адрес слова;
4. Подпрограмма, осуществляющая выдачу слова в магистраль с
частотой 12.5КГц, должна выполнять следующие возложенные на нее функции:
- обеспечивать частоту вывода 12.5КГц;
обеспечивать выдачу последовательно 206, 207 и 271 слова;
Подпрограмма, осуществляющая выдачу приборной скорости в
аналоговом виде и должна выполнять следующие возложенные на нее функции:
записи в регистр ЦАП приборной скорости;
сделать паузу для записи в регистр;
установить флаг в ЦАП о записи в регистр.
Файловая структура подсистемы представляет собой
совокупность шести файлов, один из которых содержит основной текст программы SPEED.C , со всеми вышеперечисленными
основными и вспомогательными подпрограммами. Другие файлы - содержат
подпрограммы написаны на ассемблере используемых в основной программе. При
помощи интегрированной среды Project-51 программа
компилируется и, в случае, успешного результата обработки, создает файл SPEED.HEX, содержащий исходный код программы в
шестнадцатиричном виде. Полученный исполняемый программный код при помощи
программатора, подключенного к компьютеру, заносится в микроконтроллер для
последующего выполнения и тестирования, обнаружения возможных допущенных при
программировании ошибок.
Для отладки созданного программного кода, внутрисхемный
эмулятор устанавливался на опытный образец печатной платы с напаянными на ней
всеми необходимыми для корректной работы микросхемами и навесными элементами
(резисторы, конденсаторы). Все микросхемы, установленные на плате, в
совокупности с микроконтроллером и его программным обеспечением, составляют
разрабатываемый контроллер. Подобная отладка, с применением осциллографа,
контрольного пульта ПК-10, дает вполне ясную картину программно генерируемых
сигналов с микроконтроллера. Осциллограф позволяет в удобной форме проследить
периодичность генерации сигналов и длительность процессов, которые они вызывают
в схеме, а ПК-10 достоверность выходного слова. Также довольно легко наблюдать
принимаемые микроконтроллером на обработку сигналы, поступающие с других
микросхем. Применение осциллографа и ПК-10, при отладке программы на реальной
аппаратуре, необходимо, и безусловно, значительно облегчает отладку и доработку
исходного текста программы.
Описание
структуры полей программы
Переменные
для временных обработак и константы с их адресами
const int speed=172 - служит для добавления при наземном
контролле контроллера;
const int test_speed=2 - служит для добавления при проверки
масок приборной и максимальной скорости;
static int a @ 0x18 - временная преременная;
static int flag @ 0x18 - временная преременная;
static int flag1 @ 0x1a - временная преременная;
Переменные
для выходного слова адрес 206 по РТМ с их адресами
static unsigned long SlVmd @ 0x10;
static unsigned char SlVmd_1 @ 0x10;
static unsigned char SlVmd_2 @ 0x11;
static unsigned char SlVmd_3 @ 0x12;
static unsigned char SlVmd_4 @ 0x13;
Переменные
для выходного слова адрес 207 по РТМ с их адресами
static unsigned long SlVpr @ 0x3c;
static unsigned char SlVpr_1 @ 0x3c;
static unsigned char SlVpr_2 @ 0x3d;
static unsigned char SlVpr_3 @ 0x3e;
static unsigned char SlVpr_4 @ 0x3f;
Переменные
для выходного слова адрес 271 по РТМ с их адресами
static unsigned long SlDs @ 0x38;
static unsigned char SlDs_1 @ 0x38;
static unsigned char SlDs_2 @ 0x39;
static unsigned char SlDs_3 @ 0x3a;
static unsigned char SlDs_4 @ 0x3b;
Переменная
для выдачи на ЦАП с его адресом
static unsigned int CapSlowo @ 0x14;
Переменные
для рабочих областей стеков с их адресами
static unsigned long Stec @ 0x28;
static unsigned int Stec1 @ 0x28;
static unsigned int Stec2 @ 0x2a;
Переменные
для сохранение переведенных скоростей с их адресами
static unsigned int StecVprd @ 0x30;
static unsigned int StecVmdd @ 0x32;
Переменные
вводимых скорости с приборной скорости маски с их адресами
static unsigned int Vprg @ 0x20;
static unsigned int Vmdg @ 0x24;
Переменные
вводимых скорости с максимальной скорости маски с их адресами
static unsigned int Vprd @ 0x22;
static unsigned int Vmdd @ 0x26;
Переменные
рабочее слово SlRab расписаны в битовой резидентной памяти по битам и словам с
их адресами
static unsigned long SlRab @ 0x2c;
static unsigned char SlRab_4 @ 0x2c;
static unsigned char SlRab_3 @ 0x2d;
static unsigned char SlRab_2 @ 0x2e;
static unsigned char SlRab_1 @ 0x2f;
static unsigned char Adress @ 0x2f
- по этому адресу находится адрес выходного слова;
static bit unsigned char SlRab_bit31 @
0x67;
static bit unsigned char SlRab_bit30 @
0x66;
static bit unsigned char SlRab_bit29 @
0x65;
static bit unsigned char SlRab_bit28 @
0x64;
static bit unsigned char SlRab_bit27 @
0x63;
static bit unsigned char SlRab_bit26 @
0x62;
static bit unsigned char SlRab_bit25 @
0x61;
static bit unsigned char SlRab_bit24 @
0x60;
static bit unsigned char SlRab_bit23 @
0x6f;
static bit unsigned char SlRab_bit22 @
0x6e;
static bit unsigned char SlRab_bit21 @
0x6d;
static bit unsigned char SlRab_bit20 @
0x6c;
static bit unsigned char SlRab_bit19 @
0x6b;
static bit unsigned char SlRab_bit18 @
0x6a;
static bit unsigned char SlRab_bit17 @
0x69;
static bit unsigned char SlRab_bit16 @
0x68;
static bit unsigned char SlRab_bit15 @
0x77;
static bit unsigned char SlRab_bit14 @
0x76;
static bit unsigned char SlRab_bit13 @
0x75;
static bit unsigned char SlRab_bit12 @
0x74;
static bit unsigned char SlRab_bit11 @
0x73;
static bit unsigned char SlRab_bit10 @
0x72;
static bit unsigned char SlRab_bit9 @
0x71;
static bit unsigned char SlRab_bit8 @
0x70;
static bit unsigned char SlRab_bit7 @
0x7f;
static bit unsigned char SlRab_bit6 @
0x7e;
static bit unsigned char SlRab_bit5 @
0x7d;
static bit unsigned char SlRab_bit4 @
0x7c;
static bit unsigned char SlRab_bit3 @
0x7b;
static bit unsigned char SlRab_bit2 @
0x7a;
static bit unsigned char SlRab_bit1 @
0x79;
static bit unsigned char SlRab_bit0 @
0x78;
Переменные
приборной скорости в коде Грея расписаны в битовой резидентной памяти по битам
с их адресами
static bit unsigned char Vprg_bit9 @ 0x01;
static bit unsigned char Vprg_bit8 @ 0x00;
static bit unsigned char Vprg_bit7 @ 0x0f;
static bit unsigned char Vprg_bit6 @ 0x0e;
static bit unsigned char Vprg_bit5 @ 0x0d;
static bit unsigned char Vprg_bit4 @ 0x0c;
static bit unsigned char Vprg_bit3 @ 0x0b;
static bit unsigned char Vprg_bit2 @ 0x0a;
static bit unsigned char Vprg_bit1 @ 0x09;
static bit unsigned char Vprg_bit0 @ 0x08;
Переменные
приборной скорости в двоичном коде расписаны в битовой резидентной памяти по
битам с их адресами
static bit unsigned char Vprd_bit9 @ 0x11;
static bit unsigned char Vprd_bit8 @ 0x10;
static bit unsigned char Vprd_bit7 @ 0x1f;
static bit unsigned char Vprd_bit6 @ 0x1e;
static bit unsigned char Vprd_bit5 @ 0x1d;
static bit unsigned char Vprd_bit4 @ 0x1c;
static bit unsigned char Vprd_bit3 @ 0x1b;
static bit unsigned char Vprd_bit2 @ 0x1a;
static bit unsigned char Vprd_bit1 @ 0x19;
static bit unsigned char Vprd_bit0 @ 0x18;
Переменные
максимальной скорости в коде Грея расписаны в битовой резидентной памяти по
битам с их адресами
static bit unsigned char Vmdg_bit9 @ 0x21;
static bit unsigned char Vmdg_bit8 @ 0x20;
static bit unsigned char Vmdg_bit7 @ 0x2f;
static bit unsigned char Vmdg_bit6 @ 0x2e;
static bit unsigned char Vmdg_bit5 @ 0x2d;
static bit unsigned char Vmdg_bit4 @ 0x2c;
static bit unsigned char Vmdg_bit3 @ 0x2b;
static bit unsigned char Vmdg_bit2 @ 0x2a;
static bit unsigned char Vmdg_bit1 @ 0x29;
static bit unsigned char Vmdg_bit0 @ 0x28;
Переменные
максимальной скорости в двоичном коде расписаны в битовой резидентной памяти по
битам с их адресами
static bit unsigned char Vmdd_bit9 @ 0x31;
static bit unsigned char Vmdd_bit8 @ 0x30;
static bit unsigned char Vmdd_bit7 @ 0x3f;
static bit unsigned char Vmdd_bit6 @ 0x3e;
static bit unsigned char Vmdd_bit5 @ 0x3d;
static bit unsigned char Vmdd_bit4 @ 0x3c;
static bit unsigned char Vmdd_bit3 @ 0x3b;
static bit unsigned char Vmdd_bit2 @ 0x3a;
static bit unsigned char Vmdd_bit1 @ 0x39;
static bit unsigned char Vmdd_bit0 @ 0x38;
Формат
слова 206 и 207.
Форматы 206, 207 слова состоят из 32 разрядов который
показан в таблице 2.2 .
Таблица 2.2
31
|
30
|
29
|
28
|
27-11
|
10
|
9
|
8
|
7-0
|
CRC
|
состояние
|
Знак
|
данные
|
Точность
|
Идентификатор
|
адрес
|
Матрица
состояния информации параметров.
Разряды в слове
|
Наименование функции
|
31
|
30
|
0
|
0
|
Предупреждение об отказе
|
0
|
1
|
Нет вычисленных данных
|
1
|
0
|
Функциональный тест
|
1
|
1
|
Нормальная работа
|
Алгоритм
функционирования контроллера
Контроллер включает в себя следующие функции :
- Сброс сторожевого таймера;
- Очстка всех областей переменных;
- Подготовка вывода слова 206 с признаком "нет
вычисленных данных";
- Подготовка вывода слова 207 с признаком "нет
вычисленных данных";
- Заполнение сохраненного значения приборной скорости;
- Заполнение сохраненного значения максимальной скорости;
- Цикл проверки на отказ маски приборной скорости;
- Цикл проверки на отказ маски максимальной скорости;
- Проверка на наличие разовой команды тест контроля;
- Маштабирование приборной скорости для выдачи в ЦАП;
- Тестирование ПО;
- Формирование слова адрес 271 в соответствии с признаками
об тестирования ПО;
- Формирование выходного слова адрес 206 в соответствии с
РТМ, изм,3;
- Формирование выходного слова адрес 207 в соответствии с
РТМ, изм,3;
- Сброс сторожевого таймера.
Выводы
В настоящем разделе выпускной работы были проведены
следующие работы:
- был проведен анализ структуры программы контроллера;
- был рассмотрен алгоритм функционирования контроллера.
Реализация
Описание
функций основных модулей системы.
Основной файл системы является проэктный файл - SPEED.PRJ, в которой: указывается
путь к файлам системы, установка адресов ПЗУ, ОЗУ, стека, векторов прерывания и
параметров контроллера, список компилируемых файлов.
Основная
программа
void main(void)
{
/*---------- Запуск таймера на вывод
--------------------------------------*/
set_vector(TIMER0,Timer);
Zapusk();
/*-------- Сброс сторожевого таймера
--------------------------------------*/
TXD=0;
TXD=1;
/*----------------- Обнуление данных
--------------------------------------*/
Clear();
/*------------------------ Вывод на ЦАП -----------------------------------*/
Machtab(StecVprd);
VivodCapSl();
/*--------- Подготовка вывода 206 слова
-----------------------------------*/
SlRab=0;
Adress=0x61;
Priznak_Usvic();/* признак от
УСВИЦ-250 */
Priznak_Work(0,1);/* признак нет вычисленных данных */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*--------- Подготовка вывода 207 слова
-----------------------------------*/
SlRab=0;
Adress=0xe1;
Priznak_Usvic();/* признак от
УСВИЦ-250 */
Priznak_Work(0,1);/* признак нет вычисленных данных */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*--------- Заполнение начальными данными Vpr и Vmd
-----------------------*/
a=3;
do {
/* vvodvmd(); */
ImVxodMd(); /* имитация входа Vmd
*/
Perevod_Md(); /* перевод из грея в двоичную */
StecVmdd=Vmdd; /* Сохранение Vmd.*/
/* vvodvpr();*/
ImVxodPr(); /* имитация входа Vpr */
Perevod_Pr(); /* перевод из грея в двоичную */
StecVprd=Vprd; /*Сохранение Vpr */
a--; }
while (a>0);
Nach: {
/*-------- Сброс сторожевого таймера
--------------------------------------*/
TXD=0;
TXD=1;
/*-------------------- Обновление данных Vpr и Vmd
-----------------------*/
/* vvodvmd();*/
ImVxodMd(); /* имитация входа Vmd */
Perevod_Md(); /* перевод из грея в двоичную */
StecVmdd=Vmdd; /*Сохранение Vм.д.*/
/* vvodvpr();*/
ImVxodPr(); /* имитация входа Vpr */
Perevod_Pr(); /* перевод из грея в двоичную */
StecVprd=Vprd; /*Сохранение Vпр.д.*/
/*----------------- Цикл проверки на отказ Vmd
----------------------------*/
Cikl_Otkaz_Vmd();
/*----------------- Цикл проверки на отказ Vpr
----------------------------*/
Cikl_Otkaz_Vpr();
/*----------------- Тест на наличие РК "ТК"
-------------------------------*/
{
if(INT0==1) Test_Kontrol();
}
while(INT0==1)
/*----------------- Тест на наличие Vmd >= Vpr
----------------------------*/
if(Vprd>=Vmdd) { RXD=0; PK_Vpr=1; }
else { RXD=1; PK_Vpr=0; }
/*----------------- Маштабирование Vprd -----------------------------------*/
Machtab(StecVprd);
VivodCapSl();
/*------------- копируем в поле 271 функциональный тест
------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------------- копируем в поле 206 функциональный тест
------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------------- копируем в поле 207 функциональный тест
------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*----------------- Тест Контроль программы
-------------------------------*/
TestControlPO();
/*-------- Формирование дискретного 271 слова
----------------------------*/
SlRab=0;
Adress=0x9d;/* адрес слова 271 */
Priznak_Test();/* растановка признаков тестирования в слове
*/
Priznak_Usvic();/* признак от УСВИЦ-250 */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------ Формирование 206 слова в соответствии с РТМ, изм,3
для Vpr ------*/
SlRab=0;
FormPTM(StecVprd);
Adress=0x61;/* адрес слова 206 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vprd);/* проверка на < 50км */
if ((Vpr_Ok==1)||(PO_Ok==1))
Priznak_Work(0,0);/* отказ */
CalcChetSl();/* подсчет четности */
/*------------- Копирование параметров в область вывода
-------------------*/
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*----- Формирование 207 слова в соответствии с РТМ, изм,3
для Vmd -------*/
SlRab=0;
FormPTM(StecVmdd);
Adress=0xe1;/* адрес слова 207 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vmdd); /* проверка на < 50км */
if ((Vmd_Ok==1)||(PO_Ok==1))
Priznak_Work(0,0);/* отказ */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
SlRab=0;
/*-------------------- G O T O -> N A C
H ---------------------------*/
}
goto Nach;
}
Процедура
установки приоритетов прерываний.
void Zapusk(void){
/*------------- Запуск таймера --------------------------*/
asm(" mov TCON,#1 ");
asm(" anl IP,#0 ");
asm(" orl IP,#2 ");
asm(" mov TMOD,#01 ");
asm(" mov a,#0eah "); /*
число для загрузки таймера */
asm(" mov TH0,a "); /* 65536-20*36-685+67, где
старшая часть */
asm(" mov a,#0d3h "); /* равна eah, а младшая - d3h */
asm(" mov TL0,a ");
asm(" setb TCON.4 ");
asm(" anl IE,#0 ");
asm(" orl IE,#82h ");
}
Назначение: запуск таймера с установки приоритетов
прерываний.
Вход: нет.
Выход: установленный счетчик таймера.
Процедура
обнуления переменных.
void Clear(void){
StecVmdd=StecVprd=0;
Vprd=Vmdd=Vprg=Vmdg=0;
SlRab=SlVmd=SlVpr=SlDs=CapSlowo=0;
SlRab=0;
}
Назначение: обнуление областей переменных в начале работы
программы от мусора при включения питания.
Вход: нет.
Выход: нет.
Процедура
считывания с кодов грея с максимальной допустимой маски.
_vvodvmd:
push 0e0h
push 1
push 2
push 3
clr tcon.4
orl p0,#1 ;запрещение работы D1
anl p0,#1 ;запрещение работы D1
orl p1,#14h ;запрещение D2 и разрешение D4
anl p1,#14h ;запрещение D2 и разрешение D4
;считываем для Vmd
call Read_P_1_5
mov bitvmd0,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd1,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd2,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd3,c
и т.д.
Назначение: считывание кодов с максимальной маски
Вход: нет.
Выход: заполнены биты максимальной маски.
Процедура
считывания с кодов грея с приборной маски.
_vvodvpr:
push 0e0h
push 1
push 2
push 3
clr tcon.4
orl p0,#1 ;запрещение работы D1
anl p0,#1 ;запрещение работы D1
orl p1,#1 ;запрещение D4 и разрешение D2
anl p1,#1 ;запрещение D4 и разрешение D2
;считываем для Vpr
call Read_P_1_5
mov bitvpr0,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr1,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr2,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr3,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr4,c
и т.д.
Назначение: считывание кодов с приборной маски
Вход: нет.
Выход: заполнены биты приборной маски.
Процедура
вывода в магистраль 32х-разрядного слова с частотой 12.5 КГц.
Vivod206:
PUSH 0D0H
PUSH 0E0H
PUSH 0
PUSH 1
PUSH 2
PUSH 3
CLR PSW.3
CLR PSW.4
ORL P0,#0C0H
MOV R3,#4
MOV R0,#Sl206
Bait206:
MOV A,@R0
MOV R2,#7
Bit206:
RRC A
ORL P0,#0ffh
MOV Bit6V,C
MOV Bit7V,C
CPL Bit7V
MOV R1,#15
Pauza206_0: DJNZ R1,Pauza206_0
NOP
NOP
MOV P0,BaitV
MOV R1,#18
Pauza206_1: DJNZ R1,Pauza206_1
DJNZ R2,Bit206
RRC A
ORL P0,#0ffh
MOV Bit6V,C
MOV Bit7V,C
CPL Bit7V
MOV R1,#16
Pauza206_2: DJNZ R1,Pauza206_2
MOV P0,BaitV
MOV R1,#15
Pauza206_3: DJNZ R1,Pauza206_3
INC R0
DJNZ R3,Bait206
NOP
NOP
NOP
ORL P0,#0C0H
POP 3
POP 2
POP 1
POP 0
POP 0E0H
POP 0D0H
RET
Назначение: выдача побитно в магистраль 32х-разрядного
слова с частотой 12.5 КГц.
Вход: номер выводимого слова (номера 0 соответствует
выводимому слову 206, и соответственно 2=207,3=271).
Выход: нет.
Процедура
аналогового вывода приборной скорости на ЦАП.
_VivodCapSl:
push 0e0h
push 1
push 2
push 3
clr tcon.4
mov a,CapSlowo0
mov p0,a
mov a,CapSlowo1
mov p2,a
setb p0.3
nop ;задержка чтобы ЦАП успел
принять данные
nop
nop
nop
nop
clr p0.3
setb tcon.4
pop 3
pop 2
pop 1
pop 0e0h
ret
Назначение: аналоговый вывод на ЦАП приборной скорости .
Вход: приборная скорость.
Выход: на шине данных ЦАП высота с приведенным
коэффициентом.
Процедура
установки признака от УСВИЦ-250.
void Priznak_Usvic(viod){
SlRab_bit8=0;/* Признак */
SlRab_bit9=1;/* от УСВИЦ-250 */
}
Назначение: в биты 8, 9 выходного слова ставится 0 и 1
соответственно для обозначения, что слово исходит от УСВИЦ-250.
Вход: нет.
Выход: SlRab_bit8=0; SlRab_bit9=1;
Процедура
установки признаков работоспособности УСВИЦ-250.
void Priznak_Work(bit unsigned char a, bit
unsigned char b){
SlRab_bit30=a;
SlRab_bit29=b;
}
Назначение: в 30 и 29 биты ставятся признаки
работоспособность УСВИЦ-250.
Вход: bit unsigned
char a, bit unsigned char b.
Выход: SlRab_bit30=a;
SlRab_bit29=b;
Процедура
наземного контроля.
void Test_Kontrol(void){
int V=0;
vvodvmd();
Perevod_Md(); /* перевод из грея в
двоичную */
vvodvpr();
Perevod_Pr(); /* перевод из грея в двоичную */
/*----------------- Сохраняем тестовое значение
---------------------------*/
V=Vprd;
/*----------------- Прабавляем тестовое значение
--------------------------*/
Vprd+=166*4;
/*----------------- Тест на наличие Vmd >= Vpr
----------------------------*/
if(Vprd>=Vmdd) { RXD=0; PK_Vpr=1; }
else { RXD=1; PK_Vpr=0; }
/*----------------- Отнимаем тестовое значение
----------------------------*/
Vprd-=166*4;
/*----------------- Востанавливаем тестовое значение
----------------------*/
Vprd=V;
/*----------------- Маштабирование Vprd
-----------------------------------*/
Machtab(StecVprd);
/*------------- копируем в поле 271 функциональный тест
------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------------- копируем в поле 206 функциональный тест
------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------------- копируем в поле 207 функциональный тест
------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*----------------- Тест Контроль программы
-------------------------------*/
TestControlPO();
/*-------- Формирование дискретного 271 слова
----------------------------*/
SlRab=0;
Adress=0x9d;/* адрес слова 271 */
Priznak_Test();/* растановка признаков тестирования в слове
*/
Priznak_Usvic();/* признак от УСВИЦ-250 */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------ Формирование 206 слова в соответствии с РТМ, изм,3
для Vpr ------*/
SlRab=0;
FormPTM(StecVprd);
Adress=0x61;/* адрес слова 206 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vprd);/* проверка на < 50км */
if ((Vpr_Ok==1)||(PO_Ok==1))
Priznak_Work(0,0);/* отказе */
CalcChetSl();/* подсчет четности */
/*------------- Копирование параметров в область вывода
-------------------*/
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*----- Формирование 207 слова в соответствии с РТМ, изм,3
для Vmd -------*/
SlRab=0;
FormPTM(StecVmdd);
Adress=0xe1;/* адрес слова 207 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vmdd); /* проверка на < 50км */
if ((Vmd_Ok==1)||(PO_Ok==1))
Priznak_Work(0,0);/* отказе */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
SlRab=0;
/*-------- Сброс сторожевого таймера
--------------------------------------*/
TXD=0;
TXD=1;
}
Назначение: Пилотом на земле включает тумблер тест контроля
состояния прибора. Максимальная скорость индексом устанавливается на
максимальную скорость (250) и к приборной скорости прибавляем тестовое значение
скорости. При не совпадении скоростей выводим на индикацию световую и звуковую,
сигнализируя о неисправности прибора. После чего проходит весь цикл программы
функционирования прибора.
Вход: тестовое значение.
Выход: индикация.
Процедура
подсчета и записи бита четности 32х-разрядного рабочего слова.
void CalcChetSl(void){
SlRab_bit31=1;
SlRab_bit31=SlRab_bit31ÅSlRab_bit0ÅSlRab_bit1ÅSlRab_bit2;
SlRab_bit31=SlRab_bit31ÅSlRab_bit3ÅSlRab_bit4ÅSlRab_bit5;
SlRab_bit31=SlRab_bit31ÅSlRab_bit6ÅSlRab_bit7ÅSlRab_bit8;
SlRab_bit31=SlRab_bit31ÅSlRab_bit9ÅSlRab_bit10ÅSlRab_bit11;
SlRab_bit31=SlRab_bit31ÅSlRab_bit12ÅSlRab_bit13ÅSlRab_bit14;
SlRab_bit31=SlRab_bit31ÅSlRab_bit15ÅSlRab_bit16ÅSlRab_bit17;
SlRab_bit31=SlRab_bit31ÅSlRab_bit18ÅSlRab_bit19ÅSlRab_bit20;
SlRab_bit31=SlRab_bit31ÅSlRab_bit21ÅSlRab_bit22ÅSlRab_bit23;
SlRab_bit31=SlRab_bit31ÅSlRab_bit24ÅSlRab_bit25ÅSlRab_bit26;
SlRab_bit31=SlRab_bit31ÅSlRab_bit27ÅSlRab_bit28ÅSlRab_bit29;
SlRab_bit31=SlRab_bit31ÅSlRab_bit30;
}
Назначение: подсчет четности слова и выставления знака
четности в 31 разряде подсчет четности производиться по модулю 2.
Вход: нет.
Выход: SlRab_bit31-
знак четности.
Процедура
перевода из кодов грея в двоичный код максимально допустимую скорость.
void Perevod_Md(void){
Vmdd=0;
Vmdd_bit9=Vmdg_bit9;
Vmdd_bit8=Vmdg_bit8ÅVmdd_bit9;
Vmdd_bit7=Vmdg_bit7ÅVmdd_bit8;
Vmdd_bit6=Vmdg_bit6ÅVmdd_bit7;
Vmdd_bit5=Vmdg_bit5ÅVmdd_bit6;
Vmdd_bit4=Vmdg_bit4ÅVmdd_bit5;
Vmdd_bit3=Vmdg_bit3ÅVmdd_bit4;
Vmdd_bit2=Vmdg_bit2ÅVmdd_bit3;
Vmdd_bit1=Vmdg_bit1ÅVmdd_bit2;
Vmdd_bit0=Vmdg_bit0ÅVmdd_bit1;
}
Назначение: перевод кодов грея в двоичный код.
Вход: Коды грея.
Выход: двоичный код.
Процедура
перевода из кодов грея в двоичный код приборную скорость.
void Perevod_Pr(void){
Vprd=0;
Vprd_bit9=Vprg_bit9;
Vprd_bit8=Vprg_bit8ÅVprd_bit9;
Vprd_bit7=Vprg_bit7ÅVprd_bit8;
Vprd_bit6=Vprg_bit6ÅVprd_bit7;
Vprd_bit5=Vprg_bit5ÅVprd_bit6;
Vprd_bit4=Vprg_bit4ÅVprd_bit5;
Vprd_bit3=Vprg_bit3ÅVprd_bit4;
Vprd_bit2=Vprg_bit2ÅVprd_bit3;
Vprd_bit1=Vprg_bit1ÅVprd_bit2;
Vprd_bit0=Vprg_bit0ÅVprd_bit1;
}
Назначение: перевод кодов грея в двоичный код.
Вход: Коды грея.
Выход: двоичный код.
Процедура
проверки на отказ маски максимальной скорости.
void Cikl_Otkaz_Vmd(void){
int c=3,St;
Vmd_Ok=0;
T1=0;
do
{
vvodvmd();
Perevod_Md();/* перевод из грея в двоичную */
St=StecVmdd;
if
((St+test_speed>Vmdd)&&(St-test_speed<Vmdd))
{
StecVmdd=Vmdd;
break;
}
if (c==0)
{
Vmd_Ok=1;
T1=1;
break;
}
c--;
}
while(c>(-1));
}
Назначение: проверка маски максимальной скорости путем
проверки предыдущих значений с полученными значениями и допуск не должен
превышать тестовой единицы. Если превышение возникло, то проверка проходит еще
3 раза, но если после этого превышение не исчезло. Выдается световая
сигнализация на борт панель пилоту и записывается в ячейку служебного слова
(271).
Вход: нет.
Выход: нет.
Процедура
проверки на отказ маски приборной скорости.
void Cikl_Otkaz_Vpr(void){
int b=3,St;
Vpr_Ok=0;
RXD=0;
do
{
vvodvpr();
Perevod_Pr();/* перевод из грея в двоичную */
St=StecVprd;
if
((St+test_speed>Vprd)&&(St-test_speed<Vprd))
{
StecVprd=Vprd;
break;
}
if (b==0)
{
Vpr_Ok=1;
RXD=1;
break;
}
b--;
}
while(b>(-1));
}
Назначение: проверка маски приборной скорости путем проверки
предыдущих значений с полученными значениями и допуск не должен превышать
тестовой единицы. Если превышение возникло, то проверка проходит еще 3 раза, но
если после этого превышение не исчезло. Выдается световая сигнализация на борт
панель пилоту и записывается в ячейку служебного слова (271).
Вход: нет.
Выход: нет.
Процедура
масштабирование для вывода на ЦАП.
void Machtab(unsigned int V1){
double rab1;
rab1=(double)V1;
rab1*=0.63;
CapSlowo=0;
CapSlowo=(unsigned int)rab1;
CapSlowo0<<=6;
}
Назначение: масштабирование необходимо потому, что по ТУ
выдача аналогового сигнала должна соответветствовать всем единицам на входе
ЦАП, на аналоговом выходе 0.63 В.
Вход: приборная скорость.
Выход: нет.
Процедура
формирование 32х-разрядного слова с соответствием с РТМ
void FormPTM(unsigned int V1){
double rab2;
SlRab=0;
rab2=(double)V1;
rab2/=0.11575;
SlRab=(unsigned long)rab2;
rab2-=(double)SlRab;
SlRab<<=12;
}
Назначение: для формирование 32х-разрядного слова
с соответствием с РТМ необходима данные поместить с 11 по 27 разряд с ценой
младшего разряда.
Вход: приборная скорость.
Выход: данные помещены в слове на свое место.
Процедура
тест контроля программного обеспечения
void TestControlPO(void){
int Vprd1=0,Vmdd1=0,Vprg1=0,Vmdg1=0;
PO_Ok=Vmd_Ok=Vpr_Ok=0;
Vprg1=Vprg;
Vmdg1=Vmdg;
Vprd1=Vprd;
Vmdd1=Vmdd;
Vmdg=Vprg=speed;
Perevod_Md();
Perevod_Pr();
if (Vmdd!=200) { PO_Ok=1; Vmd_Ok=1; }
if (Vprd!=200) { PO_Ok=1; Vpr_Ok=1; }
/*----------------------------- 206
--------------------------------------*/
SlRab=0;
FormPTM(Vprd);
Adress=0x61;
Priznak_Usvic();
Priznak_Work(1,0);
CalcChetSl();
if(SlRab!=0) { PO_Ok=1; Vpr_Ok=1; }
/*----------------------------- 207
--------------------------------------*/
SlRab=0;
FormPTM(Vmdd);
Adress=0xe1;
Priznak_Usvic();
Priznak_Work(1,0);
CalcChetSl();
if(SlRab!=0) { PO_Ok=1; Vmd_Ok=1; }
SlRab=0;
Vprg=Vprg1;
Vmdg=Vmdg1;
Vprd=Vprd1;
Vmdd=Vmdd1;
}
Назначение: проверка программы. Это осуществляется путем
записи тестовых значений в максимальную и приборную скорость кодов грея. После
чего производится проверка на правильности перевода из кодов грея в двоичный
код, формирования слова и расстановки признаков.
Вход: тестовое значение кодов грея.
Выход: нет.
Процедура
проверки скорости, на меньше 50км.
void If_Speed(unsigned int V){
if(V<200) Priznak_Work(0,1);
}
Назначение: при полеченной скорости меньше чем 50 км
необходимо по ТУ выдавать в выходном слове признак нет вычисленных данных.
Вход: приборная скорость.
Выход: расстановка признаков нет вычисленных данных.
Описание
аппаратных функций
Основные
функции системы
Программа начинает выполнение при подачи питания на
контроллер, независимо от других контроллеров. Программа сначало сбрасывает
сторожевой таймер предназначенный от зацикливаниии программы, который
необходимо сбрасывать в конце программы. После чего очищает все переменные и
подготавливает слова с указанием в них о том, что нет вычисленных данных, т.к.
процедура вывода слов работает независимо от основной программы по прерыванию
от таймера. Далее программы заполняет ячейки скорости. для последующего
использавании и проверки на выход из строя сведодиодов или фотодиодов. После
чего выполняет ввод с масок данных, перевод их, проверку на отказ маскок
предельной и максимальной скорости, проверка на наличии тест контроля,
маштабирования л\для вывода на ЦАП, выполняем тест контроль программного
обеспечения с занесением результатов в служебное слово и копирование полученных
данных в слова.
Технология
инсталляции программы
Данный программный продукт поставляется на
предприятие-заказчик для конечного использования в борт компьютерах вертолетах
или самолетах с максимальной скоростью не более 250км.
При использовании данной версии программы, программа записывается
во внутреннью память процессора, т.к. процессор имеет встроенную постоянную
память.
Инструкция
пользователю
Данная программа разрабатывалсь на ПЭВМ класса PENTIUM c процессором фирмы INTEL с тактовой
частотой 100 МГц и с использование внутрисхемного эмулятора фирмы Phyton PICE-51.
На этой же машине, но с эксперементальным образцом контроллера проводились
испытания. Операционная система Windows'98.
Оценка
качества проекта
Качество настоящего проекта будем оценивать по следующим
критериям:- полезность (исходная и общая);- удобство эксплуатации;-
эффективность;- модифицируемость;- машинонезависимость;
-завершенность;
- согласованность;
- рациональность;
- доступность;
- коммуникативность;
- информативность;
- расширяемость.
Попробуем проанализировать каждый из вышеперечисленных
критериев, и дать по нему оценку контроллера. Полезность:
Продукт проектирования обладает свойством ПОЛЕЗНОСТИ, если он
отвечает поставленным целям. Это свойство имеет две стороны:
1) исходная полезность - насколько просто, надежно,
эффективно можно использовать основной результат обработки;
2) общая полезность - возможность продолжать использование
продукта проектирования при изменении условий его применения.
Исходя из данного определения полезности можно сказать, что
предлагаемый проект обладает исходной, но не общей полезностью, так как
требования простоты, надежности и эффективности закладывались в его основу как
одни из главных, но в случае изменения условий его применения эффективность его
использования снизится.
Удобство эксплуатации
Продукт проектирования УДОБЕН в ЭКСПЛУАТАЦИИ, если
рассматривается возможность его обновления в соответствии с новыми
требованиями.
На основе вышесказанного можно определить контроллер удобен
в эксплуатации, покрайней мере, в течение 1 года после внедрения.
Эффективность
Проект проектирования обладает свойством эффективности, если
он выполняет требуемые функции без лишних затрат ресурсов.
Так как результат проектирования установлен и
удовлетворительно функционирует на процессоре INTEL
8051 широко используемый в самолетостроении в наше время, то можно определить
проект эффективным.
Модифицируемость
Продукт проектирования необладает свойством
МОДИФИЦИРУЕМОСТИ, т.к. он имеет закрытую структуру, не позволяющую легко
вносить требуемые изменения.
Так как под модифицируемостью, видимо подразумевается
степень открытости архитектуры, то проект не обладает этим свойством.
Машинонезависимость
Продукт проектирования обладает свойством
МАШИНОНЕЗАВИСИМОСТИ, если входящие в него функциональные компоненты могут быть
реализованы на иных технических средствах. Машинонезависимость проекта целиком
и полностью зависит от машинонезависимости контроллера, версии которой работают
на довольно многих типах процессоров. Таким образом, свойство
машинонезависимости НЕПРИСУЩЕ.
Завершенность
Продукт проектирования обладает свойством ЗАВЕРШЕННОСТИ,
если в нем присутствуют все необходимые компоненты, каждый из которых
разработан всесторонне.
Согласованность
Продукт проектирования обладает свойством ВНУТРЕННЕЙ
СОГЛАСОВАННОСТИ, если он всюду содержит единую нотацию, терминологию и
символику. Он также обладает свойством ВНЕШНЕЙ СОГЛАСОВАННОСТИ, если можно
проследить его соответствие конкретным требованиям.
Рациональность
Продукт проектирования обладает свойством РАЦИОНАЛЬНОСТИ,
если он использует все возможности (языка программирования, численных методов,
технических и других средств) для минимизации расхода ресурсов.
На основе анализа исходных текстов можно сделать вывод о том
что он не обладает указанным свойством.
Доступность
Продукт проектирования обладает свойством ДОСТУПНОСТИ, если
он не допускает селективное использование его компонентов. На основании информации
из раздела 2 можно сказать, что проект НЕ ДОСТУПЕН.
Коммуникативность
Продукт проектирования обладает свойством КОММУНИКАТИВНОСТИ,
если он дает возможность легко описывать входные данные и выдает информацию,
форма и содержание которой просты для понимания и несут полезные сведения.
Расширяемость
Продукт проектирования не обладает свойством РАСШИРЯЕМОСТИ,
если он позволяет при необходимости увеличить объем обрабатываемых данных или
расширить функции отдельных модулей.
Выводы
В данном разделе выпускной работы были проведены следующие
работы:
-
описание фнкций основных модулей программы;
-
описана технология инсталяции программы;
-
дана инструкция пользователю;
-
проведена оценка качества проекта;
Организационно-техническая
часть
Расчет
затрат на разработку программы
Затраты на разработку программного продукта рассчитываются
по формуле:
Zрпп = Zзп + Zзпд + Остр + Оам + Zээ + Rкосв , (1)
где
Zзп - затраты на заработную плату программисту, руб.;
Zзпд - затраты на дополнительную заработную плату, руб.;
Остр - отчисление на социальное страхование, руб.;
Оам - амортизационные отчисления, руб.;
Zээ - затраты на электроэнергию во время разработки
программы, руб.;
Rкосв - косвенные расходы, руб.
Разработка программы производилась инженером-программистом,
с заработанной платой 600 рублей в месяц. На разработку программы ушло 5
месяца, поэтому затраты на зарплату составляют:
Zзп = 600 * 5 = 3000 (руб.)
Дополнительная заработная плата составляет 30% от основной
заработной платы, тогда затраты на дополнительную заработную плату:
Zзпд = Zзп * 0.3 = 3000 * 0.3 = 900 (руб.)
Отчисления на социальное страхование составляют 37% от общей
заработной платы, то есть
Остр = ( Zзп + Zзпд ) * 0.37 = ( 3000 + 900 ) * 0.37 = 1443
(руб.)
Стоимость ПЭВМ, используемой для разработки программы
составляет 15 500 руб. Срок службы персонального компьютера составляет 8 лет.
Тогда на данный момент амортизационные отчисления за месяц составляют:
Оам1 = 15500 / ( 8 * 12 ) = 161.45 (руб.)
За 5 месяца:
Оам = 161.45 * 5 = 807.25 (руб.)
На отладку и тестирование программы с использованием ПЭВМ
затрачено 120 рабочих дней, из них, в среднем каждый день по 5 часа. Стоимость
электроэнергии 0.14 руб. за киловатт. Мощность, потребляемая ПЭВМ 300 Вт.
Посчитаем затраты на электроэнергию во время разработки программы, руб.;
Zээ = ( 120 * 5 ) * 0.14 * 0.300 = 25.2 (руб.)
Косвенные расходы составляют 110% от основной заработанной
платы программиста:
Rкосв = 3000 * 1.1 = 3300 (руб.)
Таким образом, подставляя вычисленные значения затрат в
формулу (1), получим стоимость затрат на разработку программы:
Zрпп = 3000 + 900 + 1443 + 807.25 + 25.2 +3300= 9475,45
(руб.)
Расчет
экономической эффективности от внедрения программного продукта
Рассчитаем экономическую эффективность от внедрения
разработанного программного продукта на примере сравнения годовых затрат на
содержание отдела рефератированния (5 человек) и содержание ПЭВМ,
обслуживающего персонала (1 человек) и консультанта по работе с технической
информацией, заменяющих вышеназванный отдел.
Экономическую эффективность рассчитаем по формуле:
Eэ = Zдв - Zпв, (2)
где
Zдв - затраты до внедрения;
Zпв - затраты после внедрения.
Затраты до внедрения программного продукта рассчитаем по
формуле:Zдв = Zзп + Zзпд + Oстр, (3)гдеZзп - затраты на заработную плату
работнику, руб.;Zзпд - затраты на дополнительную заработную плату, руб.;
Остр - отчисление на социальное страхование, руб.;
Средняя заработанная плата работников отдела технической
информации составляет 800 руб., тогда:
Zзп = 800 * 5*12 = 48 000 (руб.)
Дополнительная заработная плата составляет 30% от основной
заработной платы, тогда затраты на дополнительную заработную плату:
Zзпд = Zзп * 0.3 = 48 000 * 0.3 = 14400 (руб.)
Отчисления на социальное страхование составляют 37% от общей
заработной платы, тогда:
Oстр =(Zзп + Zзпд)* 0.37 , то есть
Остр = (48000 + 14400) * 0.37 = 23088 (руб.),
Таким образом, подставляя вычисленные значения затрат в
формулу (3), получим стоимость затрат до внедрения программы:
Zдв = 48 000 + 14400 + 23088 = 85488 (руб.).
Затраты
после внедрения
Затраты после внедрения программного продукта рассчитаем по
формуле:
Zпв = Zзп + Zзпд + Oстр + Zээ + Oам + Sпо + Zвпп, (4)
где
Zзп - затраты на заработную плату программисту, руб.;
Zзпд - затраты на дополнительную заработную плату, руб.;
Остр - отчисление на социальное страхование, руб.;
Zээ - затраты на электроэнергию для ПЭВМ, руб.;Оам -
амортизационные отчисления, руб.;
Zвпп - затраты на внедрение программного продукта, руб.
Заработанная плата программисту равна 600 тыс. руб., тогда:
Zзп = 600 * 12 + 400 * 12 = 12 000 (руб.).
Дополнительная заработная плата составляет 30% от основной
заработной платы, тогда затраты на дополнительную заработную плату:
Zзпд = Zзп * 0.3 = 12 000 * 0.3 = 3600 (руб.).
Отчисления на социальное страхование составляют 37% от общей
заработной платы, тогда:
Oстр = ( Zзп + Zзпд ) * 0.37 , то есть
Oстр = (12000+3600)*0.37= 5772 (руб.).
ПЭВМ на рабочем месте работает 8 часов в день. Количество рабочих
дней в году 264. Стоимость электроэнергии 0.14 руб. за киловатт. Мощность,
потребляемая ПЭВМ 300 Вт. Посчитаем годовые затраты на электроэнергию,
потребляемую ПЭВМ, руб.;
Zээ = (8 * 264) * 0.14 * 0.300 = 88 (руб.).
Стоимость ПЭВМ, используемой при эксплуатации разработанной
программы составляет 15 500 руб. Срок службы персонального компьютера
составляет 8 лет. Тогда амортизационные отчисления за год составляют:
Oам = 15 500 / 8 = 1937.5 (руб.).
Стоимость программного обеспечения равняется себестоимости
программного продукта, посчитанной в предыдущем пункте данной главы.
Следовательно:
Sпо = 9475.45(руб.).
В затраты на внедрение программного продукта входят затраты
на изготовление сопроводительной документации, на заработную плату службы
сопровождения программного продукта, затраты на обучение пользователя работе с
программой, на установку программного продукта, на адаптацию программного
продукта к условиям пользователя и т.д. Так как размер данных затрат зависит от
конкретных условий, то стоимость затрат на этапе внедрения можно оценить только
качественно, и можно сказать что она будет соизмерима со стоимостью затрат на
этапе разработки. Затраты на внедрение программного продукта составляют 110% от
затрат на этапе разработки программного обеспечения:
Zвпп = 9475.45 * 1.1 = 10423 (руб.)
Таким образом, подставляя вычисленные значения затрат в
формулу (4), получим стоимость затрат после внедрения программы:
Zпв = 12000 + 3600 + 5772 + 88 + 1937.5 + 9475.45 + 10423 =
43295,95 (руб.)
Подставляя рассчитанные затраты до и после внедрения
программы в формулу (2), получим значение экономической эффективности от
внедрения разработанного программного продукта:
Eэ = Zдв - Zпв = 85488 - 43295,95 = 42192.05 (руб.)
Выводы
Полученные результаты говорят об эффективности внедрения
разработанного программного продукта в процессы, требующие обработки большого
объема принятия и выдача с всевозможных датчиков. Что существенно уменьшает
затраты на разработку схем на вентильной логики.
Приложение 1. Основная программа.
#include <8051.h>
#include <intrpt.h>
#include <float.h>
/* 206 => 0x61 207 => 0xE1 271=>9D
*/
const int speed=172; /* это должно
быть 200 */
const int test_speed=2; /* 0.5==2 */
static int a @ 0x18;
/* static int flag @ 0x18;*/
/* static int flag1 @ 0x1a;*/
static bit unsigned char Usvic_Ok @ 0x50;
static bit unsigned char PK_Vpr @ 0x51;
static bit unsigned char Vpr_Ok @ 0x52;
static bit unsigned char Vmd_Ok @ 0x53;
static bit unsigned char PO_Ok @ 0x54;
/*--- номер выводимого параметра 0=Sl206,1=Sl207,2=Sl271 -*/
static unsigned char NomParam @ 0x1c;
static unsigned char BaitV @ 0x2a;
/*------------Выходное слово SlVmd 206 ------------------*/
static unsigned long SlVmd @ 0x10;
static unsigned char SlVmd_1 @ 0x10;
static unsigned char SlVmd_2 @ 0x11;
static unsigned char SlVmd_3 @ 0x12;
static unsigned char SlVmd_4 @ 0x13;
/*------------Выходное слово SlVpr 207 -------------------*/
static unsigned long SlVpr @ 0x3c;
static unsigned char SlVpr_1 @ 0x3c;
static unsigned char SlVpr_2 @ 0x3d;
static unsigned char SlVpr_3 @ 0x3e;
static unsigned char SlVpr_4 @ 0x3f;
/*------------Выходное слово SlDs 271 --------------------*/
static unsigned long SlDs @ 0x38;
static unsigned char SlDs_1 @ 0x38;
static unsigned char SlDs_2 @ 0x39;
static unsigned char SlDs_3 @ 0x3a;
static unsigned char SlDs_4 @ 0x3b;
/*------------Выходное слово для ЦАП CapSlowo
-------------*/
static unsigned int CapSlowo @ 0x28;
static unsigned char CapSlowo0 @ 0x28;
static unsigned char CapSlowo1 @ 0x29;
/*------- Рабочая область стеков ------------------*/
/* static unsigned long Stec @ 0x28;*/
static bit unsigned char Test_Pr @ 0x40;
/*--------- Сохранение переведенных скоростей ----------------*/
static unsigned int StecVprd @ 0x30;
static unsigned int StecVmdd @ 0x32;
/*--------- Int вводимых скорости
----------------------------*/
static unsigned int Vprg @ 0x20;
static unsigned int Vmdg @ 0x24;
/*--------- Int переведенных скорости
------------------------*/
static unsigned int Vprd @ 0x22;
static unsigned int Vmdd @ 0x26;
/*------- Рабочее слово SlRab -------------------------*/
static unsigned long SlRab @ 0x2c;
static unsigned char SlRab_4 @ 0x2c;
static unsigned char SlRab_3 @ 0x2d;
static unsigned char SlRab_2 @ 0x2e;
static unsigned char SlRab_1 @ 0x2f;
static unsigned char Adress @ 0x2f;/* адреса (206/207/271)*/
static bit unsigned char SlRab_bit31 @
0x67;
static bit unsigned char SlRab_bit30 @
0x66;
static bit unsigned char SlRab_bit29 @
0x65;
static bit unsigned char SlRab_bit28 @
0x64;
static bit unsigned char SlRab_bit27 @
0x63;
static bit unsigned char SlRab_bit26 @
0x62;
static bit unsigned char SlRab_bit25 @
0x61;
static bit unsigned char SlRab_bit24 @ 0x60;
static bit unsigned char SlRab_bit23 @
0x6f;
static bit unsigned char SlRab_bit22 @
0x6e;
static bit unsigned char SlRab_bit21 @
0x6d;
static bit unsigned char SlRab_bit20 @
0x6c;
static bit unsigned char SlRab_bit19 @
0x6b;
static bit unsigned char SlRab_bit18 @
0x6a;
static bit unsigned char SlRab_bit17 @
0x69;
static bit unsigned char SlRab_bit16 @
0x68;
static bit unsigned char SlRab_bit15 @
0x77;
static bit unsigned char SlRab_bit14 @
0x76;
static bit unsigned char SlRab_bit13 @
0x75;
static bit unsigned char SlRab_bit12 @
0x74;
static bit unsigned char SlRab_bit11 @
0x73;
static bit unsigned char SlRab_bit10 @
0x72;
static bit unsigned char SlRab_bit9 @
0x71;
static bit unsigned char SlRab_bit8 @
0x70;
static bit unsigned char SlRab_bit7 @
0x7f;
static bit unsigned char SlRab_bit6 @
0x7e;
static bit unsigned char SlRab_bit5 @
0x7d;
static bit unsigned char SlRab_bit4 @
0x7c;
static bit unsigned char SlRab_bit3 @
0x7b;
static bit unsigned char SlRab_bit2 @
0x7a;
static bit unsigned char SlRab_bit1 @
0x79;
static bit unsigned char SlRab_bit0 @
0x78;
/*-- Входные битовые Скорость Vpr Grey
-----------------------*/
static bit unsigned char Vprg_bit9 @ 0x01;
static bit unsigned char Vprg_bit8 @ 0x00;
static bit unsigned char Vprg_bit7 @ 0x0f;
static bit unsigned char Vprg_bit6 @ 0x0e;
static bit unsigned char Vprg_bit5 @ 0x0d;
static bit unsigned char Vprg_bit4 @ 0x0c;
static bit unsigned char Vprg_bit3 @ 0x0b;
static bit unsigned char Vprg_bit2 @ 0x0a;
static bit unsigned char Vprg_bit1 @ 0x09;
static bit unsigned char Vprg_bit0 @ 0x08;
/*-- Выходные битовые Скорость Vpr Din
-----------------------*/
static bit unsigned char Vprd_bit9 @ 0x11;
static bit unsigned char Vprd_bit8 @ 0x10;
static bit unsigned char Vprd_bit7 @ 0x1f;
static bit unsigned char Vprd_bit6 @ 0x1e;
static bit unsigned char Vprd_bit5 @ 0x1d;
static bit unsigned char Vprd_bit4 @ 0x1c;
static bit unsigned char Vprd_bit3 @ 0x1b;
static bit unsigned char Vprd_bit2 @ 0x1a;
static bit unsigned char Vprd_bit1 @ 0x19;
static bit unsigned char Vprd_bit0 @ 0x18;
/*-- Входные битовые Скорость Vmd Grey
-----------------------*/
static bit unsigned char Vmdg_bit9 @ 0x21;
static bit unsigned char Vmdg_bit8 @ 0x20;
static bit unsigned char Vmdg_bit7 @ 0x2f;
static bit unsigned char Vmdg_bit6 @ 0x2e;
static bit unsigned char Vmdg_bit5 @ 0x2d;
static bit unsigned char Vmdg_bit4 @ 0x2c;
static bit unsigned char Vmdg_bit3 @ 0x2b;
static bit unsigned char Vmdg_bit2 @ 0x2a;
static bit unsigned char Vmdg_bit1 @ 0x29;
static bit unsigned char Vmdg_bit0 @ 0x28;
/*-- Выходные битовые Скорость Vmd Din
-----------------------*/
static bit unsigned char Vmdd_bit9 @ 0x31;
static bit unsigned char Vmdd_bit8 @ 0x30;
static bit unsigned char Vmdd_bit7 @ 0x3f;
static bit unsigned char Vmdd_bit6 @ 0x3e;
static bit unsigned char Vmdd_bit5 @ 0x3d;
static bit unsigned char Vmdd_bit4 @ 0x3c;
static bit unsigned char Vmdd_bit3 @ 0x3b;
static bit unsigned char Vmdd_bit2 @ 0x3a;
static bit unsigned char Vmdd_bit1 @ 0x39;
static bit unsigned char Vmdd_bit0 @ 0x38;
/*------------------------------------------------------------------------*/
/* Процедура записи бита четности для SlRab */
/*------------------------------------------------------------------------*/
void CalcChetSl(void){
SlRab_bit31=1;
SlRab_bit31=SlRab_bit31^SlRab_bit0^SlRab_bit1^SlRab_bit2;
SlRab_bit31=SlRab_bit31^SlRab_bit3^SlRab_bit4^SlRab_bit5;
SlRab_bit31=SlRab_bit31^SlRab_bit6^SlRab_bit7^SlRab_bit8;
SlRab_bit31=SlRab_bit31^SlRab_bit9^SlRab_bit10^SlRab_bit11;
SlRab_bit31=SlRab_bit31^SlRab_bit12^SlRab_bit13^SlRab_bit14;
SlRab_bit31=SlRab_bit31^SlRab_bit15^SlRab_bit16^SlRab_bit17;
SlRab_bit31=SlRab_bit31^SlRab_bit18^SlRab_bit19^SlRab_bit20;
SlRab_bit31=SlRab_bit31^SlRab_bit21^SlRab_bit22^SlRab_bit23;
SlRab_bit31=SlRab_bit31^SlRab_bit24^SlRab_bit25^SlRab_bit26;
SlRab_bit31=SlRab_bit31^SlRab_bit27^SlRab_bit28^SlRab_bit29;
SlRab_bit31=SlRab_bit31^SlRab_bit30;
}
/*------------------------------------------------------------------------*/
/* Процедура перевода из грея в двоичную допустимую скорость
*/
/*------------------------------------------------------------------------*/
void Perevod_Md(void){
Vmdd=0;
Vmdd_bit9=Vmdg_bit9;
Vmdd_bit8=Vmdg_bit8^Vmdd_bit9;
Vmdd_bit7=Vmdg_bit7^Vmdd_bit8;
Vmdd_bit6=Vmdg_bit6^Vmdd_bit7;
Vmdd_bit5=Vmdg_bit5^Vmdd_bit6;
Vmdd_bit4=Vmdg_bit4^Vmdd_bit5;
Vmdd_bit3=Vmdg_bit3^Vmdd_bit4;
Vmdd_bit2=Vmdg_bit2^Vmdd_bit3;
Vmdd_bit1=Vmdg_bit1^Vmdd_bit2;
Vmdd_bit0=Vmdg_bit0^Vmdd_bit1;
}
/*------------------------------------------------------------------------*/
/* Процедура перевода из грея в двоичную предельную скорость
*/
/*------------------------------------------------------------------------*/
void Perevod_Pr(void){
Vprd=0;
Vprd_bit9=Vprg_bit9;
Vprd_bit8=Vprg_bit8^Vprd_bit9;
Vprd_bit7=Vprg_bit7^Vprd_bit8;
Vprd_bit6=Vprg_bit6^Vprd_bit7;
Vprd_bit5=Vprg_bit5^Vprd_bit6;
Vprd_bit4=Vprg_bit4^Vprd_bit5;
Vprd_bit3=Vprg_bit3^Vprd_bit4;
Vprd_bit2=Vprg_bit2^Vprd_bit3;
Vprd_bit1=Vprg_bit1^Vprd_bit2;
Vprd_bit0=Vprg_bit0^Vprd_bit1;
}
/*------------------------------------------------------------------------*/
/* Процедура расстановки состояний */
/*------------------------------------------------------------------------*/
void Priznak_Work(bit unsigned char a,bit
unsigned char b){
SlRab_bit30=a;
SlRab_bit29=b;
}
/*------------------------------------------------------------------------*/
/* Процедура расстановки идентифткатора */
/*------------------------------------------------------------------------*/
void Priznak_Usvic(viod){
SlRab_bit8=0;/* Признак */
SlRab_bit9=1;/* от УСВИЦ-250 */
}
/*------------------------------------------------------------------------*/
/* Процедура имтация входных данных */
/*------------------------------------------------------------------------*/
void ImVxodMd(void){
Vmdg=344;
}
/*------------------------------------------------------------------------*/
/* Процедура имтация входных данных */
/*------------------------------------------------------------------------*/
void ImVxodPr(void){
Vprg=172;
}
/*------------------------------------------------------------------------*/
/* Процедура проверки на отказ Vmd */
/*------------------------------------------------------------------------*/
void Cikl_Otkaz_Vmd(void){
int c=3,St;
Vmd_Ok=0;
T1=0;
do
{
/* vvodvmd();*/
ImVxodMd(); /* имитация входа */
Perevod_Md();/* перевод из грея в
двоичную */
St=StecVmdd;
if
((St+test_speed>Vmdd)&&(St-test_speed<Vmdd))
{
StecVmdd=Vmdd;
break;
}
if (c==0)
{
Vmd_Ok=1;
T1=1;
break;
}
c--;
}
while(c>(-1));
}
/*------------------------------------------------------------------------*/
/* Процедура проверки на отказ Vpr */
/*------------------------------------------------------------------------*/
void Cikl_Otkaz_Vpr(void){
int b=3,St;
Vpr_Ok=0;
RXD=0;
do
{
/* vvodvpr(); */
ImVxodPr(); /* имитация входа */
Perevod_Pr();/* перевод из грея в
двоичную */
St=StecVprd;
if
((St+test_speed>Vprd)&&(St-test_speed<Vprd))
{
StecVprd=Vprd;
break;
}
if (b==0)
{
Vpr_Ok=1;
RXD=1;
break;
}
b--;
}
while(b>(-1));
}
/*------------------------------------------------------------------------*/
/* Процедура маштабирование для ЦАП с соответствием 1==0.63
*/
/*------------------------------------------------------------------------*/
void Machtab(unsigned int V1){
double rab1;
rab1=(double)V1;
rab1*=0.63;
CapSlowo=0;
CapSlowo=(unsigned int)rab1;
CapSlowo0<<=6;
}
/*------------------------------------------------------------------------*/
/* Процедура формирование слова с соответствием с РТМ */
/*------------------------------------------------------------------------*/
void FormPTM(unsigned int V1){
double rab2;
SlRab=0;
rab2=(double)V1;
rab2/=0.11575;
SlRab=(unsigned long)rab2;
rab2-=(double)SlRab;
if (rab2>0.5) SlRab++;
SlRab<<=12;
}
/*------------------------------------------------------------------------*/
/* Процедура тест контроля ПО */
/*------------------------------------------------------------------------*/
void TestControlPO(void){
int Vprd1=0,Vmdd1=0,Vprg1=0,Vmdg1=0;
PO_Ok=Vmd_Ok=Vpr_Ok=0;
Vprg1=Vprg; /* сохраняем Vprg */
Vmdg1=Vmdg; /* сохраняем Vmdg */
Vprd1=Vprd; /* сохраняем Vprd */
Vmdd1=Vmdd; /* сохраняем Vmdd */
Vmdg=Vprg=speed;
Perevod_Md();
Perevod_Pr();
if (Vmdd!=200) { PO_Ok=1; Vmd_Ok=1; }
if (Vprd!=200) { PO_Ok=1; Vpr_Ok=1; }
/*----------------------------- 206
--------------------------------------*/
SlRab=0;
FormPTM(Vprd);
Adress=0x61;
Priznak_Work(1,0);/* признак тест */
CalcChetSl();/* Подсчет четности */
if(SlRab!=1080820321) { PO_Ok=1; Vpr_Ok=1;
}
/*----------------------------- 207
--------------------------------------*/
SlRab=0;
FormPTM(Vmdd);
Adress=0xe1;
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,0);/* признак тест
*/
CalcChetSl();/* Подсчет четности */
if(SlRab!=3228304097) { PO_Ok=1; Vmd_Ok=1;
}
SlRab=0;
/*------------------- востанавливаем состояния
--------------------------*/
Vprg=Vprg1; /* востанавливаем Vprg */
Vmdg=Vmdg1; /* востанавливаем Vmdg */
Vprd=Vprd1; /* востанавливаем Vprd */
Vmdd=Vmdd1; /* востанавливаем Vmdd */
}
/*------------------------------------------------------------------------*/
/* Процедура проверки скорости < 50км(200), => - нет
вычисленных данных */
/*------------------------------------------------------------------------*/
void If_Speed(unsigned int V){
if(V<200) Priznak_Work(0,1); /*
признак нет вычисленных данных */
}
/*------------------------------------------------------------------------*/
/* Запуск таймера */
/*------------------------------------------------------------------------*/
void Zapusk(void){
/*---------- Чистка рабочих областей
параметров--------------*/
SlRab=0;NomParam=0;
/*------------- Запуск таймера --------------------------*/
asm(" mov TCON,#1 ");
asm(" anl IP,#0 ");
asm(" orl IP,#2 ");
asm(" mov TMOD,#01 ");
asm(" mov a,#0eah "); /*
число для загрузки таймера */
asm(" mov TH0,a "); /* 65536-20*36-685+67, где
старшая часть */
asm(" mov a,#0d3h "); /* равна eah, а младшая - d3h */
asm(" mov TL0,a ");
asm(" setb TCON.4 ");
asm(" anl IE,#0 ");
asm(" orl IE,#82h ");
}
/*------------------------------------------------------------------------*/
/* Процедура растановки признаков проверок */
/*------------------------------------------------------------------------*/
void Priznak_Test(void){
if((PK_Vpr==0) && (Vpr_Ok==0)
&& (Vmd_Ok==0) && (PO_Ok==0))
SlRab_bit28=0;
else SlRab_bit28=1;
SlRab_bit27=PK_Vpr;
SlRab_bit26=Vpr_Ok;
SlRab_bit25=Vmd_Ok;
SlRab_bit24=PO_Ok;
}
/*------------------------------------------------------------------------*/
/* Процедура разовой команды ТЕСТ КОНТРОЛЬ */
/*------------------------------------------------------------------------*/
void Test_Kontrol(void){
int V=0;
/* vvodvmd(); */
ImVxodMd(); /* имитация входа Vmd
*/
Perevod_Md(); /* перевод из грея в двоичную */
/* vvodvpr();*/
ImVxodPr(); /* имитация входа Vmd */
Perevod_Pr(); /* перевод из грея в двоичную */
/*----------------- Сохраняем тестовое значение
--------------------------*/
V=Vprd;
/*----------------- Прабавляем тестовое значение
-------------------------*/
Vprd+=166*4;
/*----------------- Тест на наличие Vmd >= Vpr
---------------------------*/
if(Vprd>=Vmdd) { RXD=0; PK_Vpr=1; }
else { RXD=1; PK_Vpr=0; }
/*----------------- Отнимаем тестовое значение
---------------------------*/
Vprd-=166*4;
/*----------------- Востанавливаем тестовое значение
---------------------*/
Vprd=V;
/*----------------- Маштабирование Vprd
----------------------------------*/
Machtab(StecVprd);
VivodCapSl();
/*------------- копируем в поле 271 функциональный тест
-----------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------------- копируем в поле 206 функциональный тест
-----------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------------- копируем в поле 207 функциональный тест
-----------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*----------------- Тест Контроль программы
------------------------------*/
TestControlPO();
/*-------- Формирование дискретного 271 слова
----------------------------*/
SlRab=0;
Adress=0x9d;/* адрес слова 271 */
Priznak_Test();/* растановка признаков тестирования в слове
*/
Priznak_Usvic();/* признак от УСВИЦ-250 */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------ Формирование 206 слова в соответствии с РТМ, изм,3
для Vpr ------*/
SlRab=0;
FormPTM(StecVprd);
Adress=0x61;/* адрес слова 206 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vprd);/* проверка на < 50км */
if ((Vpr_Ok==1)||(PO_Ok==1))
Priznak_Work(0,0);/* отказе */
CalcChetSl();/* подсчет четности */
/*------------- Копирование параметров в область вывода
------------------*/
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*----- Формирование 207 слова в соответствии с РТМ, изм,3
для Vmd ------*/
SlRab=0;
FormPTM(StecVmdd);
Adress=0xe1;/* адрес слова 207 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vmdd); /* проверка на < 50км */
if ((Vmd_Ok==1)||(PO_Ok==1))
Priznak_Work(0,0);/* отказе */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
SlRab=0;
/*-------- Сброс сторожевого таймера
-------------------------------------*/
TXD=0;
TXD=1;
}
/*------------------------------------------------------------------------*/
/* Процедура очистки переменных */
/*------------------------------------------------------------------------*/
void Clear(void){
StecVmdd=StecVprd=0;
Vprd=Vmdd=Vprg=Vmdg=0;
SlRab=SlVmd=SlVpr=SlDs=CapSlowo=0;
SlRab=0;
}
/*************************************************************************/
/* Н А Ч А Л О П Р О Г Р А М М Ы /
/*************************************************************************/
void main(void)
{
/*---------- Запуск таймера на вывод
-------------------------------------*/
set_vector(TIMER0,Timer);
Zapusk();
/*-------- Сброс сторожевого таймера
-------------------------------------*/
TXD=0;
TXD=1;
/*----------------- Обнуление данных
-------------------------------------*/
Clear();
/*------------------------ Вывод на ЦАП
----------------------------------*/
Machtab(StecVprd);
VivodCapSl();
/*--------- Подготовка вывода 206 слова
----------------------------------*/
SlRab=0;
Adress=0x61;
Priznak_Usvic();/* признак от
УСВИЦ-250 */
Priznak_Work(0,1);/* признак нет вычисленных данных */
CalcChetSl();/* Подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*--------- Подготовка вывода 207 слова
----------------------------------*/
SlRab=0;
Adress=0xe1;
Priznak_Usvic();/* признак от
УСВИЦ-250 */
Priznak_Work(0,1);/* признак нет вычисленных данных */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*--------- Заполнение начальными данными Vpr и Vmd
----------------------*/
a=3;
do {
/* vvodvmd(); */
ImVxodMd(); /* имитация входа Vmd
*/
Perevod_Md(); /* перевод из грея в двоичную */
StecVmdd=Vmdd; /* Сохранение Vmd.*/
/* vvodvpr();*/
ImVxodPr(); /* имитация входа Vpr */
Perevod_Pr(); /* перевод из грея в двоичную */
StecVprd=Vprd; /*Сохранение Vpr */
a--; }
while (a>0);
Nach: {
/*-------- Сброс сторожевого таймера -------------------------------------*/
TXD=0;
TXD=1;
/*-------------------- Обновление данных Vpr и Vmd
-----------------------*/
/* vvodvmd();*/
ImVxodMd(); /* имитация входа Vmd */
Perevod_Md(); /* перевод из грея в двоичную */
StecVmdd=Vmdd; /*Сохранение Vм.д.*/
/* vvodvpr();*/
ImVxodPr(); /* имитация входа Vpr */
Perevod_Pr(); /* перевод из грея в двоичную */
StecVprd=Vprd; /*Сохранение Vпр.д.*/
/*----------------- Цикл проверки на отказ Vmd
---------------------------*/
Cikl_Otkaz_Vmd();
/*----------------- Цикл проверки на отказ Vpr
---------------------------*/
Cikl_Otkaz_Vpr();
/*----------------- Тест на наличие РК "ТК"
------------------------------*/
/* {*/
/* if(INT0==1) Test_Kontrol();*/
/* }*/
/* while(INT0==1)*/
/*----------------- Тест на наличие Vmd >= Vpr
--------------------------*/
if(Vprd>=Vmdd) { RXD=0; PK_Vpr=1; }
else { RXD=1; PK_Vpr=0; }
/*----------------- Маштабирование Vprd ---------------------------------*/
Machtab(StecVprd);
VivodCapSl();
/*------------- копируем в поле 271 функциональный тест
----------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------------- копируем в поле 206 функциональный тест
----------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------------- копируем в поле 207 функциональный тест
----------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*----------------- Тест Контроль программы -----------------------------*/
TestControlPO();
/*-------- Формирование дискретного 271 слова
----------------------------*/
SlRab=0;
Adress=0x9d;/* адрес слова 271 */
Priznak_Test();/* растановка признаков тестирования в слове
*/
Priznak_Usvic();/* признак от УСВИЦ-250 */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*------ Формирование 206 слова в соответствии с РТМ, изм,3
для Vpr ------*/
SlRab=0;
FormPTM(StecVprd);
Adress=0x61;/* адрес слова 206 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vprd);/* проверка на < 50км */
if ((Vpr_Ok==1)||(PO_Ok==1))
Priznak_Work(0,0);/* отказ */
CalcChetSl();/* подсчет четности */
/*------------- Копирование параметров в область вывода
-----------------*/
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
/*----- Формирование 207 слова в соответствии с РТМ, изм,3
для Vmd -----*/
SlRab=0;
FormPTM(StecVmdd);
Adress=0xe1;/* адрес слова 207 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vmdd); /* проверка на < 50км */
if ((Vmd_Ok==1)||(PO_Ok==1))
Priznak_Work(0,0);/* отказ */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск
таймера */
SlRab=0;
/*-------------------- G O T O -> N A C
H ---------------------------*/
}
goto Nach;
}
Приложение 2. Программы вывода слов в магистраль.
defseg c_text,class=code
seg c_text
int38T equ 65535-80*36-80*32-67+33+54
BaitV equ 2ah ; адрес выводного байта 28
Bit6V equ 51h ; Bit6V прямой вывод бита 80
Bit7V equ 52h ; Bit7V инверсной вывод бита 81
Sl206 equ 10h ; адрес слова 206
Sl207 equ 3ch ; адрес слова 207
Sl271 equ 38h ; адрес слова 271
NomParam equ 1bh ; Номер выводимого параметра 0=Sl206
global
_Timer,_Vivod206,_Vivod207;,_Vivod271
_Timer:
PUSH PSW ; время от начала прерывания ___11
CLR TCON.4 ; Останов таймеpа 1
CLR TCON.5 ; Сбpос флага пеpеполнения 1
PUSH 0E0h ; 2
MOV A,#low(int38T) ; Выбоp младшего байта INT_38T 1
MOV TL0,A ; запись в TL0 1
MOV A,#high(int38T) ; Выбоp стаpшего байта
INT_38T 1
SETB TCON.4 ; Запуск таймеpа Т0 1 ___20
MOV BaitV,#0ffh ; 2
MOV A,NomParam ; 1
;---------------------------------------------------------------------
23
CJNE A,#0,GoPp ; 2
NOP ; 1
NOP ; 1
CALL _Vivod206 ; 2___33
INC NomParam ; 1
JMP GoEnd ; 2
GoPp: CJNE A,#1,GoSl ; 2
CALL _Vivod207 ; 2
INC NomParam ; 1
JMP GoEnd ; 2
GoSl: CALL _Vivod271 ; 2
MOV NomParam,#0 ; 2
NOP ; 1
GoEnd: MOV BaitV,#0h ; 2
POP 0E0h ; 2
POP PSW ; 2
RETI ; 2
;************************************************************************
_Vivod206:
PUSH 0D0H ; 2 mkc
PUSH 0E0H ; 2 mkc
PUSH 0 ; 2 mkc
PUSH 1 ; 2 mkc
PUSH 2 ; 2 mkc
PUSH 3 ; 2 mkc
CLR PSW.3 ; 1 mkc
CLR PSW.4 ; 1 mkc
ORL P0,#0C0H ; 2 mkc
MOV R3,#4 ; 1 mkс Количество
пеpесылаемых байт #4
MOV R0,#Sl206 ; 1 mkс
;--------------------------------------------------------------------
18
Bait206:
MOV A,@R0 ; 1 mkc
MOV R2,#7 ; 1 mkс
Bit206:
RRC A ; 1 mkс
ORL P0,#0ffh ; 2 mkc
;--------------------------------------------------------------------
0
MOV Bit6V,C ; 2 mkc
MOV Bit7V,C ; 2 mkс
CPL Bit7V ; 1 mkс
MOV R1,#15 ; 1 mkс
Pauza206_0: DJNZ R1,Pauza206_0 ; 2*15=30
mkc 36
NOP ; 1 mkc
NOP ; 1 mkc
MOV P0,BaitV ; 2 mkс 40 63
;--------------------------------------------------------------------
40
;--------------------------------------------------------------------
0
MOV R1,#18 ; 1 mkс
Pauza206_1: DJNZ R1,Pauza206_1 ; 2*17=34
mkc
DJNZ R2,Bit206 ; 2 mkс 37
RRC A ; 1 mkс
ORL P0,#0ffh ; 2 mkc
;--------------------------------------------------------------------
40
;--------------------------------------------------------------------
0
MOV Bit6V,C ; 2 mkс
MOV Bit7V,C ; 2 mkс
CPL Bit7V ; 1 mkс
MOV R1,#16 ; 1 mkс
6
Pauza206_2: DJNZ R1,Pauza206_2 ; 2*16=32
mkc 38
MOV P0,BaitV ; 2 mkс
;--------------------------------------------------------------------
40
;--------------------------------------------------------------------
0
MOV R1,#15 ; 1 mkс
00
Pauza206_3: DJNZ R1,Pauza206_3 ; 2*15=30
mkc 31
INC R0 ; 2 mkc 33
DJNZ R3,Bait206 ; 2 mkс 35
;--------------------------------------------------------------------
35
NOP ; 1 mkс
NOP ; 1 mkс
NOP ; 1 mkс
ORL P0,#0C0H ; 2 mkc 40
;--------------------------------------------------------------------
40
;--------------------------------------------------------------------
0
POP 3 ; 2 mkc
POP 2 ; 2 mkc
POP 1 ; 2 mkc
POP 0 ; 2 mkc
POP 0E0H ; 2 mkc
POP 0D0H ; 2 mkc
RET ; 2 mkc
;--------------------------------------------------------------------
14
;***************************************************************************
_Vivod207:
PUSH 0D0H ; 2 mkc
PUSH 0E0H ; 2 mkc
PUSH 0 ; 2 mkc
PUSH 1 ; 2 mkc
PUSH 2 ; 2 mkc
PUSH 3 ; 2 mkc
CLR PSW.3 ; 1 mkc
CLR PSW.4 ; 1 mkc
ORL P0,#0C0H ; 2 mkc
;-----------------------------------------------------------------------
MOV R3,#4 ; 1 mkс Количество пеpесылаемых байт #4
MOV R0,#Sl207 ; 1 mkс 18
;-----------------------------------------------------------------------
Bait207:
MOV A,@R0 ; 1 mkc
MOV R2,#7 ; 1 mkс
Bit207:
RRC A ; 1 mkс
ORL P0,#0ffh ; 2 mkc //0
;-----------------------------------------------------------------------
MOV Bit6V,C ; 2 mkc
MOV Bit7V,C ; 2 mkс
CPL Bit7V ; 1 mkс
MOV R1,#15 ; 1 mkс
Pauza207_0: DJNZ R1,Pauza207_0 ; 2*15=30
mkc 36
NOP ; 1 mkc
NOP ; 1 mkc
MOV P0,BaitV ; 2 mkс 40 63
MOV R1,#18 ; 1 mkс
00
Pauza207_1: DJNZ R1,Pauza207_1 ; 2*17=34
mkc
DJNZ R2,Bit207 ; 2 mkс 37
RRC A ; 1 mkс
ORL P0,#0ffh ; 2 mkc 40
;------------------------------------------------------------------------
MOV Bit6V,C ; 2 mkс 00
MOV Bit7V,C ; 2 mkс
CPL Bit7V ; 1 mkс
MOV R1,#16 ; 1 mkс
6
Pauza207_2: DJNZ R1,Pauza207_2 ; 2*16=32
mkc 38
MOV P0,BaitV ; 2 mkс 40
MOV R1,#15 ; 1 mkс
00
Pauza207_3: DJNZ R1,Pauza207_3 ; 2*15=30
mkc 31
;---------------------------------------------------------------------
INC R0 ; 2 mkc 33
DJNZ R3,Bait207 ; 2 mkс 35
NOP
NOP
NOP
ORL P0,#0C0H ; 2 mkc 40
;-------------------------------------------------------------------------
POP 3 ; 2 mkc
POP 2 ; 2 mkc
POP 1 ; 2 mkc
POP 0 ; 2 mkc
POP 0E0H ; 2 mkc
POP 0D0H ; 2 mkc
RET ; 2 mkc
;***************************************************************************
_Vivod271:
PUSH 0D0H ; 2 mkc
PUSH 0E0H ; 2 mkc
PUSH 0 ; 2 mkc
PUSH 1 ; 2 mkc
PUSH 2 ; 2 mkc
PUSH 3 ; 2 mkc
CLR PSW.3 ; 1 mkc
CLR PSW.4 ; 1 mkc
ORL P0,#0C0H ; 2 mkc
MOV R3,#4 ; 1 mkс Количество
пеpесылаемых байт #4
MOV R0,#Sl271 ; 1 mkс 18
;-----------------------------------------------------------------------
Bait271:
MOV A,@R0 ; 1 mkc
MOV R2,#7 ; 1 mkс
Bit271:
RRC A ; 1 mkс
ORL P0,#0ffh ; 2 mkc //0
;-----------------------------------------------------------------------
MOV Bit6V,C ; 2 mkc
MOV Bit7V,C ; 2 mkс
CPL Bit7V ; 1 mkс
MOV R1,#15 ; 1 mkс
Pauza271_0: DJNZ R1,Pauza271_0 ; 2*15=30
mkc 36
NOP ; 1 mkc
NOP ; 1 mkc
MOV P0,BaitV ; 2 mkс 40 63
MOV R1,#18 ; 1 mkс
00
Pauza271_1: DJNZ R1,Pauza271_1 ; 2*17=34
mkc
DJNZ R2,Bit271 ; 2 mkс 37
RRC A ; 1 mkс
ORL P0,#0ffh ; 2 mkc 40
;------------------------------------------------------------------------
MOV Bit6V,C ; 2 mkс 00
MOV Bit7V,C ; 2 mkс
CPL Bit7V ; 1 mkс
MOV R1,#16 ; 1 mkс
6
Pauza271_2: DJNZ R1,Pauza271_2 ; 2*16=32
mkc 38
MOV P0,BaitV ; 2 mkс 40
MOV R1,#15 ; 1 mkс
00
Pauza271_3: DJNZ R1,Pauza271_3 ; 2*15=30
mkc 31
;---------------------------------------------------------------------
INC R0 ; 2 mkc 33
DJNZ R3,Bait271 ; 2 mkс 35
NOP
NOP
NOP
ORL P0,#0C0H ; 2 mkc 40
;-------------------------------------------------------------------------
POP 3 ; 2 mkc
POP 2 ; 2 mkc
POP 1 ; 2 mkc
POP 0 ; 2 mkc
POP 0E0H ; 2 mkc
POP 0D0H ; 2 mkc
RET ; 2 mkc
;***************************************************************************
END
Приложени 3. Программа вывода приборной скорости на ЦАП.
defseg c_text,class=code
seg c_text
CapSlowo0 equ 28h;
CapSlowo1 equ 29h;
global _VivodCapSl
_VivodCapSl:
push 0e0h
push 1
push 2
push 3
clr tcon.4
mov a,CapSlowo0
mov p0,a
mov a,CapSlowo1
mov p2,a
setb p0.3
nop
nop
nop
nop
nop
clr p0.3
setb tcon.4
pop 3
pop 2
pop 1
pop 0e0h
ret
End
Приложение 4. Программа считывания приборной скорости с
маски.
defseg c_text,class=code
seg c_text
;адреса битов на Vmd
bitvmd0 equ 28h
bitvmd1 equ 29h
bitvmd2 equ 2ah
bitvmd3 equ 2bh
bitvmd4 equ 2ch
bitvmd5 equ 2dh
bitvmd6 equ 2eh
bitvmd7 equ 2fh
bitvmd8 equ 20h
bitvmd9 equ 21h
global _vvodvmd
_vvodvmd:
push 0e0h
push 1
push 2
push 3
clr tcon.4
orl p0,#1 ;запрещение работы D1
anl p0,#1 ;запрещение работы D1
orl p1,#14h ;запрещение D2 и разрешение D4
anl p1,#14h ;запрещение D2 и разрешение D4
;считываем для Vmd
call Read_P_1_5
mov bitvmd0,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd1,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd2,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd3,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd4,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd5,c
orl p1,#11h ;запрет d2 и разрешение d4
anl p1,#11h ;запрет d2 и разрешение d4
anl p0,#0 ;запрет d5
call Read_P_1_5
mov bitvmd6,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd7,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd8,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd9,c
setb tcon.4
pop 3
pop 2
pop 1
pop 0e0h
ret
Read_P_1_5:
setb p1.5
mov r3,#30 ;250
Pause_P_1_5:
nop
nop
djnz r3,Pause_P_1_5
mov c,p1.5
ret
end
Приложение 5. Программа считывания максимальной допустимой
скорости с маски.
defseg c_text,class=code
seg c_text
;адреса битов на Vpr
bitvpr0 equ 08h
bitvpr1 equ 09h
bitvpr2 equ 0ah
bitvpr3 equ 0bh
bitvpr4 equ 0ch
bitvpr5 equ 0dh
bitvpr6 equ 0eh
bitvpr7 equ 0fh
bitvpr8 equ 00h
bitvpr9 equ 01h
global _vvodvpr
_vvodvpr:
push 0e0h
push 1
push 2
push 3
clr tcon.4
orl p0,#1 ;запрещение работы D1
anl p0,#1 ;запрещение работы D1
orl p1,#1 ;запрещение D4 и разрешение D2
anl p1,#1 ;запрещение D4 и разрешение D2
;считываем для Vpr
call Read_P_1_5
mov bitvpr0,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr1,c
inc p1
call Read_P_1_5
mov bitvpr2,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr3,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr4,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr5,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr6,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr7,c
orl p1,#10h ;запрещение D2 и разрешение D4
anl p1,#10h ;запрещение D2 и разрешение D4
call Read_P_1_5
mov bitvpr8,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr9,c
setb tcon.4
pop 3
pop 2
pop 1
pop 0e0h
ret
Read_P_1_5:
setb p1.5
mov r3,#30 ;250
Pause_P_1_5:
nop
nop
djnz r3,Pause_P_1_5
mov c,p1.5
ret
end