Смекни!
smekni.com

1 линия антикоррозионного защитного покрытия труб как объект автоматизации (стр. 5 из 6)

ПРИЛОЖЕНИЕ 5

Программа.

Метка Команда Комментарий
MVI A, 90h Настройка ППИ (датчики, управление).
OUT F3h
MVI A, FFh Выключаем всю сигнализацию и управление.
OUT F2h
MVI A, 82h Настройка ППИ (индикация, клавиатура).
OUT FBh
LXI SP, F400h Инициализация стека.
LDA 06FEh Перенос адресов подпрограмм из ПЗУ в ОЗУ.
STA F70Eh
LDA 06FFh
STA F71Eh
LDA 0700h
STA F72Eh
LDA 0701h
STA F73Eh
LDA 0702h
STA F70Dh
LDA 0703h
STA F71Dh
LDA 0704h
STA F72Dh
LDA 0705h
STA F73Dh
LDA 0706h
STA F70Bh
LDA 0707h
STA F71Bh
LDA 0708h
STA F72Bh
LDA 0709h
STA F73Bh
LDA 070Ah
STA F707h
LDA 070Bh
STA F717h
LDA 070Ch
STA F727h
LDA 070Bh
STA F737h
MVI A, 30h Настройка таймера.
OUT 03h
MVI A, 30h
OUT 00h
MVI A, 75h
OUT 00h
JMP OPR2 Переход к основной программе.
M1 PUSH PSW Подпрограмма обработки прерывания.
PUSH B
PUSH D
PUSH H
LDA F701h Начало ввода с клавиатуры
RLC
RLC
RLC
RLC
OUT FAh Сканирование
MOV E,A
MVI D, F7h
IN F9h Ввод с клавиатуры
XRI F0h Обнуление старших битов
ADD E
MOV E, A
LDAX D
MVI H, 07h
MOV L, A
PCHL Вызов подпрограммы конкретной клавиши
M2 LDA F701h Начало индикации
MVI D,F7h
MVI E, FCh
ADD E
MOV E, A
LDAX D Чтение символа для индикации
MVI D, 06h
MVI E, F0h
ADD E
LDAX D Чтение кода символа из ПЗУ
OUT F8 Вывод на индикаторы
LDA F701h Изменяем значение счетчика сканирования
INR A
STA F701h
XRI 04h
JNZ M4
STA F701h Изменили
M4 MVI A, 30h Настройка таймера.
OUT 03h
MVI A, 30h
OUT 00h
MVI A, 75h
OUT 00h
POP H
POP D
POP B
POP PSW
RET Выход из подпрограммы обработки прерывания
Подпрограммы клавиш
MVI A, 00h «0»
JMP M3
MVI A, 01h «1»
JMP M3
MVI A, 02h «2»
JMP M3
MVI A, 03h «3»
JMP M3
MVI A, 04h «4»
JMP M3
MVI A, 05h «5»
JMP M3
MVI A, 06h «6»
JMP M3
MVI A, 07h «7»
JMP M3
MVI A, 08h «8»
JMP M3
MVI A, 09h «9»
JMP M3
M3 STA F702h Сохранение данных из аккумулятора
LDA F703h Проверка режима ввода
XRI 00h
JZ M2 Проверка окончена
LDA F705h Проверка: сброшена ли ячейка ввода.
XRI 00h
JNZ M2 Проверили.
LDA F7FDh
STA F7FEh Переписали со второй позиции в третью
LDA F7FCh
STA F7FDh Переписали с первой позиции во вторую
LDA F702h
STA F7FCh Записали в первую позицию новое число
JMP M2 Индикация
«С»
LDA F703h Проверка режима ввода
XRI 00h
JZ M2 Проверили
MVI A,00h Обнуляем: аккумулятор,
STA F7FCh первую позицию,
STA F7FDh вторую,
STA F7FEh третью,
STA F705h индикатор сброса.
JMP M2 Индикация
«Ent»
JMP ENT
ENT LDA F703h Проверка режима ввода
XRI 00h
JZ M2 Проверили
LDA F703h Идентификация адреса ввода.
RLC
RLC
MOV E, A
LDA F7FFh
RLC
RLC
RLC
RLC
ADD E
MOV E, A
MVI D, F6h Идентификация завершена.
LDA F7FCh Пересылка данных с индикаторов в память.
STAX D
INR E
LDA F7FDh
STAX D
INR E
LDA F7FEh
STAX D Пересылка окончена.
MVI A, 01h
STA F705h Установка индикатора сброса в [1]
JMP M2 Индикация.
«A»
JMP A
A MVI A, 0Ah Фиксируем датчик
STA F7FFh в памяти.
CALL REPEAT Проверка повторного выбора.
JMP M2 Индикация.
«B»
JMP B
B MVI A, 0Bh Фиксируем датчик
STA F7FFh в памяти.
CALL REPEAT Проверка повторного выбора.
JMP M2 Индикация.
«C»
JMP C
C MVI A, 0Ch Фиксируем датчик
STA F7FFh в памяти.
CALL REPEAT Проверка повторного выбора.
JMP M2 Индикация.
«D»
JMP D
D MVI A, 0Dh Фиксируем датчик
STA F7FFh в памяти.
CALL REPEAT Проверка повторного выбора.
JMP M2 Индикация.
REPEAT LDA F706h Проверяем повторный выбор датчика.
MOV C, A
LDA F701h
XRA C
JZ M5 Проверили.
LDA F701h
STA F706h
MVI A, 00h
STA F703h Обнуляем индикатор изменения информации
M5 LDA F703h
INR A Увеличиваем на единицу
MOV C, A индикатор изменения информации
XRI 03h и проверяем
JNZ M6 на переполнение.
MVI A, 00h
STA F703h
JMP IDEN
M6 MOV A, C
STA F703h
IDEN RLC Идентификация адреса вывода информации.
RLC
MOV E, A
LDA F7FFh
RLC
RLC
RLC
RLC
ADD E
MOV E, A
MVI D, F6h Идентификация завершена.
LDAX D Пересылка данных из памяти на индикаторы.
STA F7FCh
INR E
LDAX D
STA F7FDh
INR E
LDAX D
STA F7FEh Пересылка окончена.
RET Конец подпрограммы.
Основная программа.
OPR2 MVI A, F0h Опрос датчиков.
STA F500h
OPR1 LDA F500h Читаем порядковый номер датчика
RLC Сдвигаем для передачи в порт
RLC
RLC
RLC
OUT F1h Отправляем в порт
XRI 01h
OUT F1h
NOP
NOP
NOP
NOP
XRI 02h
OUT F1h
IN F0h Ввод информации с датчика.
SUI 33h
JNC WREM
При обрыве датчика выводим на индикаторы [- - -].
LDA F500h Идентификация адреса ввода.
ADI 0Ah
SUI F0h
RLC
RLC
RLC
RLC
MOV E, A
MVI D, F6h Идентификация завершена.
MVI A, BFh Код символа [-].
STAX D
INX D
STAX D
INX D
STAX D
JMP WR1 Переход к следующему датчику.
WREM STA F4FFh Временно сохраняем результат в ячейке памяти.
CALL SRAVN
WR1 LDA F500h
INR A Увеличиваем порядковый номер опрашиваемого датчика.
STA F500h
XRI F4h Проверяем счетчик на переполнение.
JNZ OPR1 Продолжаем опрос.
JMP OPR2 Возобновляем опрос.
SRAVN MVI D, 00h Преобразование, сохранение и сравнение данных.
LDA F4FFh
MOV E, A
LDA F500h
INR A
MOV C, A
MVI B, 00h
XRA A Программа перевода числа из 16-тиричной в 10-тичную систему.
MVI D, F4h
MVI E, FCh
STAX D
DCX D
STAX D
DCX D
STAX D
BEG DCX B
LDAX D
INR A
STAX D
XRI 0Ah
JNZ B
MVI A, 00h
STAX D
INX D
LDAX D
INR A
STAX D
XRI 0Ah
JNZ B1
MVI A, 00h
STAX D
INX D
LDAX D
INR A
STAX D
XRI 0Ah
JNZ B2
MVI A, 86h Символ [E] выводится на индикаторы, если число больше 999.
STAX D
DCX D
STAX D
DCX D
STAX D
JMP ENDE
B2 DCX D
B1 DCX D
B MOV A, B
XRI 00h
JNZ BEG
MOV A, C
XRI 00h
JNZ BEG
Запись в соответствующую ячейку памяти
ENDE LDA F500h Идентификация адреса ввода.
ADI 0Ah
SUI F0h
RLC
RLC
RLC
RLC
MOV E, A
MVI D, F6h Идентификация завершена.
LDA F4FAh
STAX D
INX D
LDA F4FBh
STAX D
INX D
LDA F4FCh
STAX D Запись окончена.
Сравнение.
SR LDAX D
MOV H, A
MVI B, F6h
MVI A, 04h
ADD E
MOV C, A
LDAX B Загрузка “минимума”.
SUB H Вычитаем текущее значение из “минимума”.
JNC ALARM1 Если нет переноса, значит текущее значение меньше “минимума”.
MVI A, 08h
ADD E
MOV C, A
LDAX B Загрузка “максимума”.
SUB H Вычитаем текущее значение из “максимума”.
JC ALARM2 Если есть перенос, то текущее значение больше “максимума”.
MOV A, E
ANI 0Fh
JNZ PER Если проверили все разряды и все в порядке, то отменяем сигнализацию.
LDA F500h Поиск сигнала для отмены и формирование управляющих слов.
ANI 0Fh
JNZ S1
MVI A, 01h
JMP SIG
S1 MOV B, A
XRI 01h
JNZ S2
MVI A, 03h
JMP SIG
S2 MOV A, B
XRI 02h
JNZ S3
MVI A, 05h
JMP SIG
S3 MVI A, 07
PER DCX D Переходим к меньшему разряду.
JMP SR
ALARM1 LDA F500h
ANI 0Fh
JZ A11
MOV B, A
XRI 01h
JZ A12
MOV A, B
XRI 02h
JZ A13
MOV A, B
XRI 03h
JZ A14
ALARM2 LDA F500h
ANI 0Fh
JZ A11
MOV B, A
XRI 01h
JZ A12
MOV A, B
XRI 02h
JZ A23
MOV A, B
XRI 03h
JZ A14
A11 MVI A, 00h
JMP SIG
A12 MVI A, 02h
JMP SIG
A13 MVI A, 0Bh
OUT F3h
MVI A, 08h
OUT F3h
MVI A, 04h
JMP SIG
A23 MVI A, 09h
OUT F3h
MVI A, 0Ah
OUT F3h
MVI A, 04h
JMP SIG
A14 MVI A, 06h
JMP SIG
SIG OUT F3h Посылаем команду управления (сигнализации).
JMP ENDSR
ENDSR RET Выход из подпрограммы преобразования, сохранения и сравнения.