х
|
X0
|
X1
|
X2
|
X3
|
X4
|
X5
|
X6
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
Данное действие позволяет уменьшить время выполнения
программы, которое будет зависеть от состояний реле. Например, если состояния
реле Х6 и Х2 равны нулю, то цикл программы будет иметь наименьшее время
выполнения.
2.2
Блок-схема 1
Ниже приведена подробная блок-схема алгоритма решения
поставленной задачи.
2.3 Описание
алгоритма реализации программы 1
1. Входные данные загружаются в аккумулятор.
. Для последующего использования данные сохраняются в
регистре В.
. Сдвиг аккумулятора на один разряд вправо, Х1 в нулевом
разряде.
. Сохранение Х1 в регистре D.
5. Сдвиг аккумулятора на один разряд вправо, инвертирование
аккумулятора, в нулевом разряде.
. Происходит логическое сложение аккумулятора и данных в регистре D, результат операции "" записывается в регистр D.
. После загрузки данных из регистра В происходит инвертирование
аккумулятора, в нулевом разряде .
. Происходит логическое умножение аккумулятора и данных в регистре
D, результат операции "" записывается в регистре С.
. После загрузки данных из регистра В происходит сдвиг
аккумулятора вправо на три разряда для установки Х3 в нулевой разряд.
. Происходит логическое сложение аккумулятора и данных в регистре
С, результат операции "" записывается в регистре С.
. После загрузки данных из регистра В происходит сдвиг
аккумулятора вправо на четыре разряда для установки Х4 в нулевой разряд.
. Происходит логическое умножение аккумулятора и данных в регистре
С, результат операции "" записывается в регистре С.
. После загрузки данных из регистра В происходит сдвиг
аккумулятора влево на три разряда и инвертирование аккумулятора для установки в нулевой разряд.
. Происходит логическое умножение аккумулятора и данных регистра
С, результат Y1
операции "" записывается в регистре С.
. После загрузки данных из регистра В происходит сдвиг
аккумулятора вправо на один разряд и инвертирование аккумулятора для установки в нулевом разряде, сохранение в регистре D.
. После загрузки данных из регистра В происходит сдвиг
аккумулятора влево на три разряда для установки Х5 в нулевой разряд.
. Происходит логическое умножение аккумулятора и данных в регистре
D, результат операции "" сохраняется в регистре D.
. После загрузки данных из регистра В происходит сдвиг
аккумулятора вправо на три разряда для установки Х3 в нулевой разряд,
сохранение аккумулятора в регистре L.
. Происходит сдвиг аккумулятора на еще один разряд для установки в
нулевом разряде Х4, сохранение аккумулятора в регистре Н.
. После загрузки в аккумулятор данных из регистра L происходит инвертирование аккумулятора для установки в нулевом разряде.
. Происходит логическое умножение аккумулятора и содержимого
регистра Н, результата операции "" сохраняется в аккумуляторе.
. Происходит логическое сложение аккумулятора и данных регистра D, результат операции "" записывается в регистр D.
. После загрузки данных из регистра В происходит сдвиг
аккумулятора вправо для установки Х2 в нулевой разряд.
. Происходит логическое умножение аккумулятора и данных в регистре
D, результат Y2 операции "" записывается в регистре D.
. Загружается маска в регистр Е.
. После загрузки в аккумулятор данных из регистра D происходит логическое умножение аккумулятора и данных
регистра Е, тем самым обнуляются незначащие биты числа.
. Происходит сдвиг аккумулятора влево на один разряд, для
установки Y2 в первом разряде, сохранение
аккумулятора в регистре D.
. После загрузки в аккумулятор данных из регистра С, происходит
логическое умножение аккумулятора и данных регистра Е, тем самым обнуляются
незначащие биты числа.
. Происходит логическое сложение аккумулятора и данных регистра D.
. Выходные данные Y1 и Y2 выводятся соответственно через нулевой и первый разряды
шины данных.
. После указанных операций происходит безусловный переход к началу
программы, в результате получается бесконечный цикл ввода, преобразования и
вывода данных.
2.4 Программа
1 на языке Ассемблера
Ниже приведена таблица, в которой дано подробное описание
программы 1 на языке Ассемблера в машинных кодах, а также мнемокод, описание и комментарий
к каждой команде.
Таблица 2.
Метки
|
Адрес
|
Данные
|
Мнемокод
|
Описание
команды
|
Комментарий к
команде
|
М1
|
0800 0801
|
DB 01
|
IN 01
|
(A) (01) Ввод в порт по адресу 01h входных
данных
|
|
|
0802
|
47
|
MOV B,A
|
(B) (A) сохранение аккумулятора в регистре
В
|
|
|
0803
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0804
|
57
|
MOV D,A
|
(D) (A) сохранение аккумулятора в регистре
D
|
|
|
0805
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0806
|
2F
|
CMA
|
(A) () Инвертирование аккумулятора
|
|
|
0807
|
B2
|
ORA D
|
(A) (A) (D) логическое сложение аккумулятора и данных в D
|
|
|
0808
|
57
|
MOV D,A
|
(D) (A) сохранение аккумулятора в регистре
D
|
|
|
0809
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
080A
|
2F
|
CMA
|
(A) () Инвертирование аккумулятора
|
|
|
080B
|
A2
|
ANA D
|
(A) (A) (D) логическое умножение аккумулятора и данных в регистре D
|
|
|
080C
|
4F
|
MOV C,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
080D
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
080E
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
080F
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0810
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг аккумулятора
вправо на один разряд
|
|
0811
|
B1
|
ORA C
|
(A) (A) (C) логическое сложение аккумулятора и данных в C
|
|
|
0812
|
4F
|
MOV C,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
0813
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
0814
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0815
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0816
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0817
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0818
|
A1
|
ANA C
|
(A) (A) (C) логическое умножение аккумулятора и данных в регистре C
|
|
|
0819
|
4F
|
MOV C,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
081A
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
081B
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
081C
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
081D
|
2F
|
CMA
|
(A) () инвертирование аккумулятора
|
|
|
081E
|
B1
|
ORA C
|
(A) (A) (C) логическое сложение аккумулятора и данных в C
|
|
|
081F
|
4F
|
MOV C,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
0821
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
0822
|
A1
|
ANA C
|
(A) (A) (C) логическое умножение аккумулятора и данных в регистре C
|
|
|
0823
|
4F
|
MOV C,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
0824
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
0825
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0826
|
2F
|
CMA
|
(A) () инвертирование аккумулятора
|
|
|
0827
|
57
|
MOV D,A
|
(D) (A) сохранение аккумулятора в регистре
D
|
|
|
0828
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
0829
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
082A
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
082B
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
082C
|
A2
|
ANA D
|
(A) (A) (D) логическое умножение аккумулятора и данных в регистре D
|
|
|
082D
|
57
|
MOV D,A
|
(D) (A) сохранение аккумулятора в регистре
D
|
|
|
082E
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
082F
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0830
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0831
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг аккумулятора
вправо на один разряд
|
|
0832
|
6F
|
MOV L,A
|
(L) (A) загрузка данных с аккумулятора в
регистор L
|
|
|
0833
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0834
|
67
|
MOV H,A
|
(H) (A) загрузка данных с аккумулятора в
регистор H
|
|
|
0835
|
7D
|
MOV A,L
|
(A) (L) загрузка данных с регистра L в
аккумулятор
|
|
|
0836
|
2F
|
CMA
|
(A) () инвертирование аккумулятора
|
|
|
0837
|
A4
|
ANA H
|
(A) (A) (H) логическое умножение аккумулятора и данных в регистре H
|
|
|
0838
|
B2
|
ORA D
|
(A) (A) (D) логическое сложение аккумулятора и данных в D
|
|
|
0839
|
57
|
MOV D,A
|
(D) (A) загрузка данных с аккумулятора в
регистор D
|
|
|
083A
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
083B
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
083C
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
083D
|
A2
|
ANA D
|
(A) (A) (D) логическое умножение аккумулятора и данных в регистре D
|
|
|
083E
|
57
|
MOV D,A
|
(D) (A) загрузка данных с аккумулятора в
регистор D
|
|
|
083F 0840
|
1E 01
|
MVI E,01
|
(E) (01) запись данных 01h в регистр E
|
|
|
0841
|
7A
|
MOV A,D
|
(A) (D) загрузка данных с регистра D в
аккумулятор
|
|
|
0842
|
A3
|
ANA E
|
(A) (A) (E) логическое умножение аккумулятора и данных в регистре E
|
|
|
0843
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора на один разряд влево
|
|
0844
|
57
|
MOV D,A
|
(D) (A) загрузка данных с аккумулятора в
регистор D
|
|
|
0845
|
79
|
MOV A,C
|
(A) (C) загрузка данных с регистра C в
аккумулятор
|
|
|
0846
|
A3
|
ANA E
|
(A) (A) (E) логическое умножение аккумулятора и данных в регистре E
|
|
|
0847
|
B2
|
ORA D
|
(A) (A) (D) логическое сложение аккумулятора и данных в D
|
|
|
0848 0849
|
D3 80
|
OUT 80
|
(80) (A) Вывод в порт по адресу 80h выходных
данных
|
|
|
084A 084B 084C
|
C3 00 08
|
JMP M1
|
(PC) (0800) безусловный переход на адрес
0800h
|
|
2.5
Блок-схема 2
2.6
Описание алгоритма реализации программы 2
М1 - 1. Входные данные загружаются в аккумулятор.
. Для последующего использования данные сохраняются в
регистре В.
. Загружается маска 52h в регистор Е, происходит
логическое умножение данных регистра Е на аккумулятор (маскирование).
. Происходит логическое вычитание аккумулятора и данных
регистра Е, результат сохраняется в регистре С.
. Обнуление аккумулятора. Сравнение данных регистра С с
аккумулятором.
. Переход на метку М2 если результат не равен нулю.
. Если в результате действий регистор С равен нулю, то
аккумулятору присваивается значение 01h, что соответствует Y1=1.
. Загрузка данных аккумулятора в регистор Н, после происходит
переход на метку М5.
М2 - 9. После загрузки данных из регистра В в аккумулятор,
загружается маска 50h в регистр Е, происходит логическое умножение данных регистра Е на
аккумулятор (маскирование).
. Происходит логическое вычитание аккумулятора и данных
регистра Е, результат сохраняется в регистре С.
. Обнуление аккумулятора. Сравнение данных регистра С с
аккумулятором.
. Переход на метку М3 если результат не равен нулю.
. Если в результате действий регистор С равен нулю, то
аккумулятору присваивается значение 01h, что соответствует Y1=1.
. Загрузка данных аккумулятора в регистор Н, после происходит
переход на метку М5.
М3 - 15. После загрузки данных из регистра В в аккумулятор,
загружается маска 58h в регистр Е, происходит логическое умножение данных регистра Е на
аккумулятор (маскирование).
. Происходит логическое вычитание аккумулятора и данных
регистра Е, результат сохраняется в регистре С.
. Обнуление аккумулятора. Сравнение данных регистра С с
аккумулятором.
. Переход на метку М4 если результат не равен нулю.
. Если в результате действий регистор С равен нулю, то
аккумулятору присваивается значение 01h, что соответствует Y1=1.
. Загрузка данных аккумулятора в регистор Н, после происходит
переход на метку М5.
М4 - 21. После загрузки данных из регистра В в аккумулятор,
загружается маска 40h в регистр Е, происходит логическое умножение данных регистра Е на
аккумулятор (маскирование).
. Происходит логическое вычитание аккумулятора и данных
регистра Е, результат сохраняется в регистре С.
. Обнуление аккумулятора. Сравнение данных регистра С с
аккумулятором.
. Переход на метку М5 если результат не равен нулю.
. Если в результате действий регистор С равен нулю, то
аккумулятору присваивается значение 01h, что соответствует Y1=1.
. Загрузка данных аккумулятора в регистор Н.
М5 - 27. После загрузки данных из регистра В в аккумулятор,
загружается маска 13h в регистр Е, происходит логическое умножение данных регистра Е на
аккумулятор (маскирование).
. Происходит логическое вычитание аккумулятора и данных
регистра Е, результат сохраняется в регистре С.
. Обнуление аккумулятора. Сравнение данных регистра С с
аккумулятором.
. Переход на метку М6 если результат не равен нулю.
. Если в результате действий регистор С равен нулю, то
аккумулятору присваивается значение 02h, что соответствует Y2=1.
. Происходит логическое сложение аккумулятора и данных
регистра Н, результат сохраняется в аккумуляторе, в нулевом и первом разряде
которого сохраняются состояния Y1 и Y2 соответственно.
. Выходные данные Y1 и Y2 выводятся соответственно через нулевой и первый
разряды шины данных, после чего происходит безусловный переход на начало
программы.
М6 - 34. После загрузки данных из регистра В в аккумулятор,
загружается маска 23h в регистр Е, происходит логическое умножение данных регистра Е на
аккумулятор (маскирование).
. Происходит логическое вычитание аккумулятора и данных
регистра Е, результат сохраняется в регистре С.
. Обнуление аккумулятора. Сравнение данных регистра С с
аккумулятором.
. Переход на метку М7 если результат не равен нулю.
. Если в результате действий регистор С равен нулю, то
аккумулятору присваивается значение 02h, что соответствует Y2=1.
. Происходит логическое сложение аккумулятора и данных
регистра Н, результат сохраняется в аккумуляторе, в нулевом и первом разряде
которого сохраняются состояния Y1 и Y2 соответственно
. Выходные данные Y1 и Y2 выводятся соответственно через нулевой и первый
разряды шины данных, после чего происходит безусловный переход на начало
программы.
М7 - 41. После загрузки данных из регистра Н в аккумулятор,
данные выводятся на шину данных.
. Происходит безусловный переход на начало программы, в
результате получается бесконечный цикл ввода, преобразования и вывода данных.
2.7 Программа
2 на языке Ассемблера
Ниже приведена таблица, в которой дано подробное описание
программы 2 на языке Ассемблера в машинных кодах, а также мнемокод, описание и
комментарий к каждой команде.
Таблица 3.
Метки
|
Адрес
|
Данные
|
Мнемокод
|
Описание
команды
|
Комментарий к
команде
|
М1
|
0800 0801
|
26 00
|
MVI H,01
|
(H) (00) запись данных 00h в регистор Н
|
|
|
0802 0803
|
DB 01
|
IN 01
|
(A) (01) Ввод в порт по адресу 01h входных
данных
|
|
|
0804
|
47
|
MOV B,A
|
(B) (A) сохранение аккумулятора в регистре
В
|
|
|
0805 0806
|
1Е 52
|
MVI E,52
|
(E) 52hзапись данных 52h в регистр E
|
|
|
0807
|
A3
|
ANA Е
|
(A) (A) (Е) логическое умножение аккумулятора и данных в регистре Е
|
|
|
0808
|
93
|
SUB E
|
(A) (A) - (Е) Вычитание из аккумулятора
содержимого регистра Е
|
|
|
0809
|
4F
|
MOV С,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
080A 080B
|
3Е 00
|
MVI A,00
|
(A) 00hзапись данных 00h в аккумулятор
|
|
|
080C
|
В9
|
CMP C
|
If (А) = (С)
then
|
Сравнение
содержимого регистраС с аккумулятором
|
|
080D 080E 080F
|
C2 15 08
|
JNZ M2
|
JMP if Z=0
|
Переход при
выполнении условия Z=0
|
|
0810 0811
|
26 01
|
MVI H,01
|
(H) 01hзапись данных 01h в регистор Н
|
|
|
0812 0813 0814
|
CA 45 08
|
JZ M5
|
JMP if Z=1
|
Переход при
выполнении условия Z=1
|
M2
|
0815
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
0816 0817
|
1Е 50
|
MVI E,50
|
(E) 00hзапись данных 50h в регистр E
|
|
|
0818
|
A3
|
ANA Е
|
(A) (A) (Е) логическое умножение аккумулятора и данных в регистре Е
|
|
|
0819
|
93
|
SUB E
|
(A) (A) - (Е) Вычитание из аккумулятора
содержимого регистра Е
|
|
|
081A
|
4F
|
MOV С,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
081B 081C
|
3Е 00
|
MVI A,00
|
(A) 00hзапись данных 00h в аккумулятор
|
|
|
081D
|
В9
|
CMP C
|
If (А) = (С)
then
|
Сравнение
содержимого регистраС с аккумулятором
|
|
081E 081F 0820
|
C2 26 08
|
JNZ M3
|
JMP if Z=0
|
Переход при
выполнении условия Z=0
|
|
0821 0822
|
26 01
|
MVI Н,01
|
(Н) 01hзапись данных 01h в регистор Н
|
|
|
0823 0824 0825
|
CA 45 08
|
JZ M5
|
JMP if Z=1
|
Переход при
выполнении условия Z=1
|
M3
|
0826
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
0827 0828
|
1Е 58
|
MVI E,58
|
(E) 58hзапись данных 58h в регистр E
|
|
|
0829
|
A3
|
ANA Е
|
(A) (A) (Е) логическое умножение аккумулятора и данных в регистре Е
|
|
|
082A
|
93
|
SUB E
|
(A) (A) - (Е) Вычитание из аккумулятора
содержимого регистра Е
|
|
|
082B
|
4F
|
MOV С,A
|
|
|
082C 082D
|
3Е 00
|
MVI A,00
|
(A) 00hзапись данных 00h в аккумулятор
|
|
|
082E
|
В9
|
CMP C
|
If (А) = (С)
then
|
Сравнение
содержимого регистраС с аккумулятором
|
|
082F 0830 0831
|
C2 37 08
|
JNZ M4
|
JMP if Z=0
|
Переход при
выполнении условия Z=0
|
|
0832 0833
|
26 01
|
MVI Н,01
|
(Н) 01hзапись данных 01h в регистор Н
|
|
|
0834 0835 0836
|
CA 45 08
|
JZ M5
|
JMP if Z=1
|
Переход при
выполнении условия Z=1
|
M4
|
0837
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
0838 0839
|
1Е 40
|
MVI E,40
|
(E) 40hзапись данных 40h в регистр E
|
|
|
083A
|
A3
|
ANA Е
|
(A) (A) (Е) логическое умножение аккумулятора и данных в регистре Е
|
|
|
083B
|
93
|
SUB E
|
(A) (A) - (Е) Вычитание из аккумулятора
содержимого регистра Е
|
|
|
083C
|
4F
|
MOV С,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
083D 083E
|
3Е 00
|
MVI A,00
|
(A) 00hзапись данных 00h в аккумулятор
|
|
|
083F
|
В9
|
CMP C
|
If (А) = (С)
then
|
Сравнение
содержимого регистраС с аккумулятором
|
|
0840 0841 0842
|
C2 4E 08
|
JNZ M5
|
JMP if Z=0
|
Переход при
выполнении условия Z=0
|
|
0843 0844
|
26 01
|
MVI Н,01
|
(Н) 01hзапись данных 01h в регистор Н
|
|
M5
|
0845
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
0846 0847
|
1Е 13
|
MVI E,13
|
(E) 13hзапись данных 13h в регистр E
|
|
|
0848
|
A3
|
ANA Е
|
(A) (A) (Е) логическое умножение аккумулятора и данных в регистре Е
|
|
|
0849
|
93
|
SUB E
|
(A) (A) - (Е) Вычитание из аккумулятора
содержимого регистра Е
|
|
|
084A
|
4F
|
MOV С,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
084B 084C
|
3Е 00
|
MVI A,00
|
(A) 00hзапись данных 00h в аккумулятор
|
|
|
084D
|
В9
|
CMP C
|
If (А) = (С)
then
|
Сравнение
содержимого регистраС с аккумулятором
|
|
084E 084F 0850
|
C2 59 08
|
JNZ M6
|
JMP if Z=0
|
Переход при
выполнении условия Z=0
|
|
0851 0852
|
3E 02
|
MVI A,02
|
(A) 02hзапись данных 02h в аккумулятор
|
|
|
0853
|
В4
|
ORA H
|
(A) (A) (H) логическое сложение аккумулятора и данных в H
|
|
|
0854 0855
|
D3 80
|
OUT 80
|
(80) (A) Вывод в порт по адресу 80h выходных
данных
|
|
|
0856 0857 0858
|
C3 00 08
|
JMP M1
|
JMP
|
Безусловный
переход на метку М1
|
M6
|
0859
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
085A 085B
|
1Е 23
|
MVI E,23
|
(E) (23) запись данных 23h в регистр E
|
|
|
085C
|
A3
|
ANA Е
|
(A) (A) (Е) логическое умножение аккумулятора и данных в регистре Е
|
|
|
085D
|
93
|
SUB E
|
(A) (A) - (Е) Вычитание из аккумулятора
содержимого регистра Е
|
|
|
085E
|
4F
|
MOV С,A
|
(C) (A) сохранение аккумулятора в регистре
C
|
|
|
085F 0860
|
3Е 00
|
MVI A,00
|
(A) 00hзапись данных 00h в аккумулятор
|
|
|
0861
|
В9
|
CMP C
|
If (А) = (С)
then
|
Сравнение
содержимого регистраС с аккумулятором
|
|
0862 0863 0864
|
C2 6D 08
|
JNZ M7
|
JMP if Z=0
|
Переход при
выполнении условия Z=0
|
|
0865 0866
|
3E 02
|
MVI A,02
|
(A) 02hзапись данных 02h в аккумулятор
|
|
|
0867
|
В4
|
ORA H
|
(A) (A) (H) логическое сложение аккумулятора и данных в H
|
|
|
0868 0869
|
D3 80
|
OUT 80
|
(80) (A) Вывод в порт по адресу 80h выходных
данных
|
|
|
086A 086B 086C
|
C3 00 08
|
JMP M1
|
JMP if Z=1
|
Безусловный
переход на начало программы
|
M7
|
086D
|
7C
|
MOV A,H
|
(A) (H) загрузка данных с регистра H в
аккумулятор
|
|
|
086E 086F
|
D3 80
|
OUT 80
|
(80) (A) Вывод в порт по адресу 80h выходных
данных
|
|
|
0870 0871 0872
|
C3 00 08
|
JMP M1
|
JMP
|
Безусловный
переход на начало программы
|
2.9
Блок-схема 3
2.10.
Описание алгоритма реализации программы 3
1. Входные данные загружаются в аккумулятор.
. Для последующего использования данные сохраняются в
регистре В.
. Сдвиг аккумулятора на один разряд вправо, значение бита Х6
сохраняется в регистре признаков С.
. Переход на метку М1 если С=0, иначе сдвиг аккумулятора
вправо на один разряд, значение бита Х5 сохраняется в регистре признаков С.
. Переход на метку М2 если С=0, иначе сдвиг аккумулятора
вправо на один разряд, значение бита Х4 сохраняется в регистре признаков С.
. Переход на метку М1 если С=0, иначе сдвиг аккумулятора
вправо на один разряд, значение бита Х3 сохраняется в регистре признаков С.
. Переход на метку М2 если С=1, иначе сдвиг аккумулятора
вправо на три разряда, значение бита Х0 сохраняется в регистре признаков С.
. Переход на метку М1 если С=1, иначе сдвиг аккумулятора
влево на три разряда, значение бита Х2 сохраняется в регистре признаков С.
. Переход на метку М2 если С=0, иначе сдвиг аккумулятора
вправо на два разряда, значение бита Х1 сохраняется в регистре признаков С.
. Переход на метку М2 если С=1.
М1 - 11. В регистр D загружаются данные 00h (Y1=0).
. Происходит безусловный переход на метку М3.
М2 - 13. В регистр D загружаются данные 01h (Y1=1).
М3 - 14. В аккумулятор загружаются данные из регистра В.
. Происходит сдвиг аккумулятора на 4 разряда влево, значение
бита Х2 сохраняется в регистре признаков С.
. Переход на метку М4 если С=0, иначе сдвиг аккумулятора
влево на один разряд, значение бита Х3 сохраняется в регистре признаков С.
. Переход на метку М5 если С=1, иначе сдвиг аккумулятора
влево на один разряд, значение бита Х4 сохраняется в регистре признаков С.
. Переход на метку М5 если С=0.
. В аккумулятор загружаются данные 02h (Y2=1).
. Происходит логическое сложение данных аккумулятора и данных
регистра D,
результат операции сохраняется в аккумуляторе.
. Данные аккумулятора выводятся на шину данных, происходит
безусловный переход на начало программы.
М5 - 22. В аккумулятор загружаются данные из регистра В.
. Происходит сдвиг аккумулятора на 2 разряда вправо, значение
бита Х5 сохраняется в регистре признаков С.
. Переход на метку М4 если С=0, иначе сдвиг аккумулятора
вправо на четыре разряда, значение бита Х1 сохраняется в регистре признаков С.
. Переход на метку М4 если С=1.
. В аккумулятор загружаются данные 02h (Y2=1).
. Происходит логическое сложение данных аккумулятора и данных
регистра D,
результат операции сохраняется в аккумуляторе.
. Данные аккумулятора выводятся на шину данных, происходит
безусловный переход на начало программы.
. В аккумулятор загружаются данные 00h (Y2=0).
. Происходит логическое сложение данных аккумулятора и данных
регистра D,
результат операции сохраняется в аккумуляторе.
. Данные аккумулятора выводятся на шину данных, происходит
безусловный переход на начало программы. В результате получается бесконечный
цикл ввода, преобразования и вывода данных.
2.11.
Программа 3 на языке Ассемблера
Ниже приведена таблица, в которой дано подробное описание
программы 3 на языке Ассемблера в машинных кодах, а также мнемокод, описание и
комментарий к каждой команде.
Таблица 4.
Метки
|
Адрес
|
Данные
|
Мнемокод
|
Описание
команды
|
Комментарий к
команде
|
М6
|
0800 0801
|
DB 01
|
IN 01
|
(A) (01) Ввод в порт по адресу 01h входных
данных
|
|
|
0802
|
47
|
MOV B,A
|
(B) (A) сохранение аккумулятора в регистре
В
|
|
|
0803
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0804 0805 0806
|
D2 23 08
|
JNС M1
|
JMP if С=0
|
Переход при
выполнении условия С=0
|
|
0807
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0808 0809 080А
|
D2 28 08
|
JNС M2
|
JMP if С=0
|
Переход при
выполнении условия С=0
|
|
080В
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
080С 080D 080E
|
D2 23 08
|
JNС M1
|
JMP if С=0
|
Переход при
выполнении условия С=0
|
|
080F
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0810 0811 0812
|
DA 28 08
|
JС M2
|
JMP if С=1
|
Переход при
выполнении условия С=1
|
|
0813
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0814
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0815
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0816 0817 0818
|
DA 23 08
|
JС M1
|
JMP if С=1
|
Переход при
выполнении условия С=1
|
|
0819
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора влево на один разряд
|
|
081A
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора влево на один разряд
|
|
081B
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора влево на один разряд
|
|
081C 081D 081E
|
D2 28 08
|
JNС M2
|
JMP if С=0
|
Переход при
выполнении условия С=0
|
|
081F
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0820 0821 0822
|
DA 28 08
|
JС M2
|
JMP if С=1
|
Переход при
выполнении условия С=1
|
М1
|
0823 0824
|
16 00
|
MVI D,00h
|
(D) 00hзапись данных 00h в аккумулятор
|
|
|
0825 0826 0827
|
C3 2A 08
|
JMP M3
|
JMP
|
Безусловный
переход на метку М3
|
М2
|
0828 0829
|
16 01
|
MVI D,01h
|
(D) 01hзапись данных 10h в аккумулятор
|
|
M3
|
082A
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
082B
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора влево на один разряд
|
|
082C
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
|
082D
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора влево на один разряд
|
|
082E
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора влево на один разряд
|
|
082F 0830 0831
|
D2 57 08
|
JNС M4
|
JMP if С=0
|
Переход при
выполнении условия С=0
|
|
0832
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора влево на один разряд
|
|
0833 0834 0835
|
DA 42 08
|
JС M5
|
JMP if С=1
|
Переход при
выполнении условия С=1
|
|
0836
|
07
|
RLC
|
СДВИГ ВЛЕВО
|
сдвиг
аккумулятора влево на один разряд
|
|
0837 0838 0839
|
D2 42 08
|
JNС M5
|
JMP if С=0
|
Переход при
выполнении условия С=0
|
|
083A 083B
|
3Е 02
|
MVI A,02h
|
(A) 02hзапись данных 02h в аккумулятор
|
|
|
083C
|
B2
|
ORA D
|
(A) (A) (D) логическое сложение аккумулятора и данных в D
|
|
|
083D 083E
|
D3 80
|
OUT 80
|
(80) (A) Вывод в порт по адресу 80h выходных
данных
|
|
|
083F 0840 0841
|
C3 00 08
|
JMP M6
|
JMP
|
Безусловный
переход на начало программы
|
M5
|
0842
|
78
|
MOV A,B
|
(A) (B) загрузка данных с регистра В в
аккумулятор
|
|
|
0843
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0844
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0845 0846 0847
|
D2 57 08
|
JNС M4
|
JMP if С=0
|
Переход при
выполнении условия С=0
|
|
0848
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
0849
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
084A
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
084B
|
0F
|
RRC
|
СДВИГ ВПРАВО
|
сдвиг
аккумулятора вправо на один разряд
|
|
084C 084D 084E
|
DA 57 08
|
JС M4
|
JMP if С=1
|
Переход при
выполнении условия С=1
|
|
084F 0850
|
3Е 02
|
MVI A,02h
|
(A) 02hзапись данных 02h в аккумулятор
|
|
|
0851
|
B2
|
ORA D
|
(A) (A) (D) логическое сложение аккумулятора и данных в D
|
|
|
0852 0853
|
D3 80
|
OUT 80
|
(80) (A) Вывод в порт по адресу 80h выходных
данных
|
|
|
0854 0855 0856
|
C3 00 08
|
JMP M6
|
JMP
|
Безусловный
переход на начало программы
|
М4
|
0857 0858
|
3Е 00
|
MVI A,00h
|
(A) 00hзапись данных 00h в аккумулятор
|
|
|
0859
|
B2
|
ORA D
|
(A) (A) (D) логическое сложение аккумулятора и данных в D
|
|
|
085A 085B
|
D3 80
|
OUT 80
|
(80) (A) Вывод в порт по адресу 80h выходных
данных
|
|
|
085C 085D 085E
|
C3 00 08
|
JMP M6
|
JMP
|
Безусловный
переход на начало программы
|
2.8 Карта
памяти микропроцессорной системы
УМК содержит ПЗУ объемом 2 кбайт и ОЗУ объемом 1 кбайт.
Первый кбайт ПЗУ использован для хранения программы "системный
монитор", а второй кбайт ПЗУ зарезервирован за пользователем. Третий кбайт
памяти УМК используется для адресации ОЗУ. Необходимо отметить, что последние
54 ячейки памяти ОЗУ используются программой "системный монитор" для
хранения оперативных данных.
Для удобства пользования информация о распределении адресного
поля сводится в карту памяти.
1
|
9
|
17
|
25
|
33
|
41
|
49
|
57
|
2
|
10
|
18
|
26
|
34
|
42
|
50
|
58
|
3
|
11
|
19
|
27
|
35
|
43
|
51
|
59
|
4
|
12
|
20
|
28
|
36
|
44
|
52
|
60
|
5
|
13
|
21
|
29
|
37
|
45
|
53
|
61
|
6
|
14
|
22
|
30
|
38
|
46
|
54
|
62
|
7
|
15
|
23
|
31
|
39
|
47
|
55
|
63
|
8
|
16
|
24
|
32
|
40
|
48
|
56
|
64
|
Рисунок 4. Карта памяти
Пояснения к рисунку 4:
1 - программа "системный монитор" занимает 756 байт
в адресном поле 0000…02FF ПЗУ;
- дополнительная область программы "системный
монитор" занимает 256 байт в адресном поле 0300…03FF ПЗУ;
- программа объемом 52 байт и оставшаяся свободная память ОЗУ
объемом 924 размешены в адресном поле 0800…08С6;
- рабочая область программы "системный монитор"
объемом 57 байт в адресном поле 08С7…08FF ПЗУ
2.9 Анализ
временных характеристик
В данном курсовом проекте были предложены две программы
реализации контакторной схемы на программном уровне. Для выбора наиболее
подходящей программы проведем анализ временных характеристик двух программ.
Необходимо рассчитать время выполнения одного цикла каждой
программы. Расчет будем вести учитывая, что частота микропроцессора 2 МГц.
2.9.1 Расчет
времени выполнения программы 1
Число тактов за которые выполняются команды:
IN port - 10 тактов;port - 10 тактов; d,S - 5 тактов;
RRC - 4 такта;
RRL - 4 такта;
CMA - 4 такта;
ANA S - 4 такта;
ORA S - 4 такта;d,data - 7 тактов;
JMP addr - 10 тактов.
Время одного цикла программы 1:
с.
2.9.2 Расчет
времени выполнения программы 2
Число тактов за которые выполняются команды:
IN port - 10 тактов;port - 10 тактов; d,S - 5 тактов;
SUB S - 7 тактов;
СМР S - 7 тактов;
JNZ,JZ - 10 тактов;
ANA S - 4 такта;d,data - 7 тактов;
JMP addr - 10 тактов.
Время одного цикла программы 2:
с.
2.9.3 Расчет
времени выполнения программы 3
Следует отметить, что в программе 3 будут рассчитаны
минимальное и максимальное время выполнения программы.
Минимальное время программы будет при выполнении следующих
команд:
IN port - 10 тактов;port - 10 тактов; d,S - 5 тактов;
JNС - 10 тактов;
MVI d,data - 7 тактов;
RRC,RLC - 4 такта;
ORA S - 4 такта;
JMP addr - 10 тактов.
с.
Максимальное время программы будет при выполнении следующих команд:
IN port - 10 тактов;port - 10 тактов; d,S - 5 тактов;
JNС - 10 тактов;
JС - 10 тактов;
MVI d,data - 7 тактов;
RRC,RLC - 4 такта;S - 4 такта;
JMP addr - 10 тактов.
3.
Вывод
В данном курсовом проекте была разработана реализация
фрагмента контактной схемы программным методом с использованием учебного
микропроцессорного комплекта и лабораторного стенда с сохранением выходных
данных в память.
В курсовом приведено три программы с помощью которых возможно
реализовать данную схему. Анализируя временные характеристики выполнения
программ можно сделать вывод, что программа 3 максимально подходит для решения
задачи курсового проекта. Время выполнения программы 3 на порядок меньше чем у
программ 1 и 2.
Для упрощения программы 2 рациональным выглядит использование
подпрограммы, но данное действие привело бы к увеличению времени выполнения
программы. Это не соответствует условию, что время между изменением состоянием
реле и изменением состояния должно быть минимальным.
Для реализации программы 3 между шиной данных и портом ввода
ставиться гальваническая развязка. Именно благодаря этой операции удается на
порядок снизить время выполнения программы.
Также следует отметить, что говоря о времени выполнения программы,
имеется ввиду время выполнения одного цикла программы.
В конце цикла каждой программы на шину данных выводится слово, в
котором биты имеют следующее значение:
x
|
x
|
x
|
x
|
x
|
x
|
Y2
|
Y1
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
где х - незначащий бит.
4. Список
литературы
1.
Лукьянов С.И., Панов А.Н., Сидельникова Е.И., Васильев А.Е. Микропроцессоры:
Учебное пособие. - Магнитогорск: МГТУ, 2004.
.
Лукьянов С.И., Панов А.Н., Сидельникова Е.И., Васильев А.Е. Лабораторный
практикум по курсу "Электронные промышленные устройства": Учебное
пособие. - Магнитогорск: МГТУ, 2004.
.
Лукьянов С.И., Швидченко Д.В., Суспицын Е.С. Курсовое проектирование по
дисциплинам "Машинные языки программирования" и "Основы
микропроцессорной техники": Учебное пособие. Магнитогорск: МГТУ, 2005.
.
Токхайм Р. Микропроцессоры: Курс и упражнения. - Москва: Энергоатомизат, 1988.