
- •Введение
- •Постановка задачи
- •1 Выбор и обоснование структурной схемы
- •Разработка алгоритма функционирования мк
- •Окончание работы? (10)
- •Разработка принципиальных электрических схем блоков
- •3.1 Микропроцессорный блок
- •3.2 Блок памяти
- •3.3 Блок ввода аналоговых данных
- •3.4 Интерфейсный блок
- •3.5 Блок отображения и вывода информации
- •4 Разработка принципиальной электрической схемы мк
- •Разработка программного обеспечения
- •Заключение
- •Список литературы
- •Приложение a.
- •Ввод данных с ацп
- •Mvi a, 00000000b запуск ацп;
- •Mvi a, 00000001b остановить преобразование в ацп;
- •Арифметические вычисления
- •Деление аккумулятора а на значение в l
- •Преобразование к семиразрядному числу
- •Вывод результата на цап и индикаторы
- •Преобразование в двоично-десятичный код
- •Вывод на индикаторы
- •Подпрограмма деления
Приложение a.
Листинг программы
di запретить прерывания;
lxi sp, 0fffH установить область стека на вершину ОЗУ
Ввод данных с ацп
Mvi a, 00000001b
Out 22D остановить АЦП;
Mvi a, 91h формат регистра режима;
Out 23D загрузить режимы ППИ;
Begin:
Mvi b, 1h счетчик каналов установить в 1;
Lxi h, 801h адрес блока данных;
Mvi C, 0 установить нулевой канал;
Continue:
Mvi a, C отослать на коммутатор номер канала;
Out 21D адрес В;
Mvi a, 00000000b запуск ацп;
Out 22D
Wait: ожидание готовности данных
in 22D
ani 16D
jnz Wait
Mvi a, 00000001b остановить преобразование в ацп;
Out 22D
In 20D считывание с АЦП через А;
Mov m, a запись числа в память;
Inx h увеличение адресов яч. памяти на 1 бит;
Inr b увеличение счетчика каналов на 1;
Inr C увелич. номера коммутируемого канала;
Mov a, b проверка последний ли канал?
Cpi 13D
Jm Continue переход если нет;
lxi h, Vars загрузить адрес первой переменной;
xra a обнулить аккумулятор;
sta Result обнулить результат вычислений (мл байт)
sta Result+1 обнулить результат вычислений (ст байт);
Арифметические вычисления
Arifm:
mov a, m прочитать переменную в аккумулятор;
ani 01111111B обнулить старший бит;
Деление аккумулятора а на значение в l
mov e, a занести делимое в регистр Е;
mov d, l занести делитель в D;
push h сохранить HL в стеке;
call Div вызвать подпрограмму деления;
pop h восстановить HL из стека;
mov c, a запомнить результат деления в С;
lda Result загрузить результат вычислений (мл) в А;
add c сложить результаты;
sta Result сохранить результат вычислений (мл) в А;
jnc NoAdd переход если не было переноса;
lda Result+1 загрузить результат вычислений (ст) в А;
inr a добавить перенос к ст. байту результата;
sta Result+1 сохранить результат вычислений (ст) в А;
NoAdd:
inx h адрес следующей переменной;
mov a, l поместить адрес переменной L в A;
cpi 12D последняя ли переменная;
jm Arifm если нет – продолжить вычисления;
Преобразование к семиразрядному числу
lda Result прочитать мл. байт результата;
mov c, a сохранить его в С;
lda Result+1 прочитать ст. байт результата;
Continue:
rrc сдвиг аккумулятора вправо;
jnc NoShift если не было переноса – перейти на NoShift
mov d, a сохранить ст. байт в D;
mov a, c загрузить мл. байт;
rrc сдвиг мл. байта;
ori 10000000B установить старший бит;
mov c, a вернуть в С;
mov a, d восстановить ст. байт в А;
NoShift:
cpi 0 проверить А на 0;
jnz Continue если А 0 перейти на Continue;
Exit:
mov a, c записать в А мл. байт результата;
rrc сдвинуть вправо;