3.2.3 Алгоритм вывода результата на индикатор
Рисунок 8 – Блок – схема части алгоритма вывода результата на индикаторы
Рисунок 9 – Блок – схема части алгоритма вывода результата на индикаторы
3.3 Листинг программы
ORG 00h ; Начало программы.
SJMP TIMER ; Переход на установку таймера.
ORG 1Bh ; Переход на обработку
JMP SELECTOR ; прерывания от таймера.
ORG 30h
TIMER: MOV TMOD, #00010000b ; 1-ый режим работы таймера (16 разрядов).
MOV TCON, #01000000b ; Включение таймера 1.
MOV IE, #10001000b ; Разрешение прерывания от таймера.
MOV TH1, #0FFh ; Задаются старшие и младшие
MOV TL1, #0FFh ; 8 разрядов таймера 1.
MOV R3, #0h ; Значение регистра необходимое для
; перехода к метке START.
V1: SJMP V1 ; Бесконечный цикл.
; Работа с АЦП
START: CLR P1.2 ; Сигнал подается на первый АЦП -
SETB P1.2 ; начало преобразования аналогового
NOP ; сигнала в цифровой.
CLR P1.2
NOP ; Задержка на время преобразования 4,5мкс.
NOP
NOP
NOP
NOP
NOP
CLR P1.3 ; Сигналы /CS и /RD
CLR P1.4 ; (разрешения работы и чтения)
SETB P1.4 ; служат для передачи данных
SETB P1.3 ; с АЦП на порт 3.
MOV 53h, P3 ; Данные с порта (скорость) записываются
; в ячейку памяти.
CLR P1.5 ; Аналогично, сигнал начала преобразования
SETB P1.5 ; для второго АЦП.
NOP
CLR P1.5
NOP
NOP
NOP
NOP
NOP
NOP
CLR P1.6 ; Аналогичные сигналы для передачи
CLR P1.7 ; данных со второго АЦП на 3-ий порт.
SETB P1.7 ;
SETB P1.6
MOV 52h, P3 ; Данные с порта в ячейку (расход топлива).
MOV 50h, #10110100b ; Коэффициент 180 в формуле (4).
MOV A, 53h ; Проверка скорости на равенство нулю и
JZ NULL ; переход в метку NULL при его истинности.
MOV A, 52h ; Реализация по формуле (4)
MOV B, 50h
SJMP ALGORITM ; Переход к реализации формулы.
NULL: MOV 53h, #64h ; Реализация по формуле (6) .
MOV A, 52h
MOV B, #0Eh
; Реализация формул (4) и (6)
ALGORITM: MUL AB ; Произведение или .
MOV 50h, A ; Младший байт произведения.
MOV 51h, B ; Старший байт произведения.
MOV A, B ; Деление старшего байта произведения
MOV B, 53h ; на значение скорости или на 100.
DIV AB
MOV 54h, A ; Целая часть от деления.
MOV 55h, B ; Остаток от деления.
MOV A, 53h ; Деление делителя (значение скорости
MOV B, #0Ah ; или 100) на 10.
DIV AB
MOV 56h, A ; Целая часть от деления делителя на 10.
MOV 57h, B ; Остаток от деления делителя на 10.
JZ HELP ; Если целая часть от деления делителя на 10
; равна нулю, то переход в метку HELP.
MOV A, 57h
MOV B, #4h ; Если остаток от деления делителя на 10 равен
SUBB A, B ; 4, то переход в метку B5.
JZ B5
MOV A, 57h
MOV B, #6h ; Если остаток от деления делителя на 10 равен
SUBB A, B ; 6, то переход в метку B5.
JZ B5
MOV A, #4h ; Если остаток от деления делителя на 10
CJNE A, 57h, C1 ; больше 4, то переход в метку B1.
C1: JC B1
JNC B3 ; Если меньше 4, то в метку B3.
B1: MOV A, #6h ; Если остаток от деления делителя на 10
CJNE A, 57h, C ; больше 6, то переход в метку B7.
C2: JC B7
JNC B2 ; Если равен 5, то в метку B2.
B2: MOV A, 56h ; Получено, что остаток от деления делителя
MOV B, #2h ; на 10 равен 5, тогда целая часть от деления
MUL AB ; делителя на 10 умножается на 2.
MOV 52h, A
INC 52h ; Увеличение результата на 1. (новый делитель)
MOV A, 55h ; Остаток от деления числителя формул
MOV B, 52h ; (4) или (6) делится на новый делитель.
DIV AB
MOV 41h, B ; Остаток от деления на новый делитель.
MOV B, #2h ; Умножение целой части от деления на
MUL AB ; новый делитель на 2.
MOV 57h, A ; В результате получены десятые доли
; деления старшего байта произведения.
MOV A, 41h ; Умножение остатка от деления на новый
MOV B, #2h ; делитель на 2.
MUL AB
MOV B, 52h ; Результат этого умножения снова делится
DIV AB ; на новый делитель и целая часть этого
ADD A, 57h ; деления складывается с десятыми долями
MOV 57h, A ; деления старшего байта произведения.
MOV 56h, 52h
MOV 42h, B ; Остаток последнего деления фиксируется.
SJMP VPERED ; Переход к нахождения сотых долей.
B3: MOV A, #1h ; Если остаток от деления делителя на 10
CJNE A, 57h, C3 ; 0 или 1, то переход в метку HELP_1.
C3: JNC HELP_1
JC B4 ; Если больше 1, то в метку B4.
B4: MOV A, #2h ; Если остаток от деления делителя на 10
CJNE A, 57h, C4 ; равен 2, то переход в метку B5.
C4: JNC B5
JC B6 ; Если равен 3, то в метку B6.
HELP: JMP D_0 ; Переход в метку D_0.
B5: MOV A, 56h ; Если остаток от деления делителя на 10
MOV B, #5h ; равен 2, 4, 6 или 8, тогда целая часть от
MUL AB ; деления делителя на 10 умножается на 5.
MOV 52h, A
MOV A, 57h ; Остаток от деления делителя на 10
MOV B, #2h ; делится на 2 и складывается с предыдущим
DIV AB ; результатом. Получен новый делитель.
ADD A, 52h
MOV 52h, A
MOV A, 55h ; Остаток от деления числителя формул
MOV B, 52h ; (4) или (6) делится на новый делитель.
DIV AB
MOV 41h, B ; Остаток от деления на новый делитель.
MOV B, #5h ; Умножение целой части от деления на
MUL AB ; новый делитель на 5.
MOV 57h, A ; В результате получены десятые доли
; деление старшего байта произведения.
MOV A, 41h ; Умножение остатка от деления на новый
MOV B, #5h ; делитель на 5.
MUL AB
MOV B, 52h ; Результат этого умножения снова делится
DIV AB ; на новый делитель и целая часть этого
ADD A, 57h ; деления складывается с десятыми долями
MOV 57h, A ; деления старшего байта произведения.
MOV 56h, 52h
MOV 42h, B ; Остаток последнего деления фиксируется.
JMP VPERED ; Переход к нахождения сотых долей.
B7: MOV A, #8h ; Если остаток от деления делителя на 10
CJNE A, 57h, C5 ; равен 9, то переход в метку HELP_1.
C5: JC DALEE
JNC B8 ; Если меньше или равен 8, то в метку B8.
B8: MOV A, #7h ; Если остаток от деления делителя на 10
CJNE A, 57h, C6 ; равен 8, то переход в метку B5.
C6: JC B5
JNC B6 ; Если равен 7, то переход в метку B6.
HELP_1: SJMP DALEE ; Переход в метку DALEE.
B6: MOV A, 56h ; Если остаток от деления делителя на 10
MOV B, #3h ; равен 3 или 7, тогда целая часть от
MUL AB ; деления делителя на 10 умножается на 3.
MOV 52h, A
MOV A, #5h ; Полученный результат в случае, если
CJNE A, 57h, RAZD ; остаток от деления делителя на 10 равен 7
RAZD: JC DEL1 ; увеличивается на 2. А если остаток равен
JNC DEL2 ; 3, то - на 1. Получен новый делитель.
DEL1: INC 52h
INC 52h
SJMP RETURN ; Переход в метку RETURN.
DEL2: INC 52h
RETURN: MOV A, 55h ; Остаток от деления числителя формул
MOV B, 52h ; (4) или (6) делится на новый делитель.
DIV AB
MOV 41h, B ; Остаток от деления на новый делитель.
MOV B, #3h ; Умножение целой части от деления на
MUL AB ; новый делитель на 3.
MOV 57h, A ; В результате получены десятые доли
; деление старшего байта произведения.
MOV A, 41h ; Умножение остатка от деления на новый
MOV B, #3h ; делитель на 3.
MUL AB
MOV B, 52h ; Результат этого умножения снова делится
DIV AB ; на новый делитель и целая часть этого
ADD A, 57h ; деления складывается с десятыми долями
MOV 57h, A ; деления старшего байта произведения.
MOV 56h, 52h
MOV 42h, B ; Остаток последнего деления фиксируется.
SJMP VPERED ; Переход к нахождения сотых долей.
D_0: MOV A, 55h ; Если целая часть от деления делителя на
MOV B, #0Ah ; 10 равна нулю, то остаток от деления
MUL AB ; числителя формул (4) или (6) умножается
MOV B, 53h ; на 10 и делится на значение скорости.
DIV AB
MOV 56h, 53h ; Делитель не меняется(значение скорости).
MOV 57h, A ; В результате получены десятые доли
; деления старшего байта произведения.
MOV 42h, B ; Остаток последнего деления фиксируется.
SJMP VPERED ; Переход к нахождения сотых долей.
DALEE: MOV A, #5h ; Остаток от деления делителя на 10
CJNE A, 57h, RAZD2 ; равен 0, 1 или 9. В случае если остаток
RAZD2: JC DEL3 ; равен 9, то целая часть от деления
SJMP RETURN1 ; увеличивается на 1. В противном случае
DEL3: INC 56h ; она не меняется.
RETURN1: MOV A, 55h ; Остаток от деления числителя формул
MOV B, 56h ; (4) или (6) делится на новый делитель.
DIV AB
MOV 57h, A ; В результате получены десятые доли
; деления старшего байта произведения.
MOV 42h, B ; Остаток последнего деления фиксируется.
VPERED: MOV A, #0Ah ; Для нахождения сотых долей деления
MOV B, 42h ; старшего байта произведения, остаток
MUL AB ; предыдущего деления умножается на 10.
MOV 42h, A
MOV A, #0h ; Если данное произведение выходит за
CJNE A, B, OSH ; рамки одного байта, то в целях
OSH: JC OSH1 ; уменьшения погрешности конечного
MOV 58h, #0h ; результата, этот факт учитывается как
SJMP DALSE ; 5 сотых долей.
OSH1: MOV 58h, #5h
DALSE: MOV A, 42h ; Полученное произведение делится на
MOV B, 56h ; делитель.
DIV AB
ADD A, 58h ; Учет 5 сотых (если они есть).
MOV 58h, A ; В результате получены сотые доли
; деления старшего байта произведения.
MOV A, #0Ah ; Для нахождения тысячных долей деления
MUL AB ; старшего байта произведения, остаток
MOV 42h, A ; от деления снова умножается на 10.
MOV A, #0h
CJNE A, B, OSH2 ; Аналогичный способ уменьшения
OSH2: JC OSH4 ; погрешности в результате.
MOV 58h, #0h
SJMP DALSE2
OSH4: MOV 59h, #5h
DALSE2: MOV A, 42h ; Полученное произведение делится на
MOV B, 56h ; делитель.
DIV AB
ADD A, 59h ; Учет 5 тысячных (если они есть).
MOV 59h, A ; В результате получены тысячные доли
; деления старшего байта произведения.
MOV A, 54h ; Умножение полученного частного от
; деления старшего байта произведения
MOV B, #0FFh ; на 256 (т.к. старший байт).
MUL AB ; Сначала умножается, целая часть от
ADD A, 54h ; деления старшего байта произведения.
JC PER
SJMP NPER
PER: INC B
NPER: MOV 60h, B ; Старший байт конечного результата.
MOV 61h, A ; Младший байт конечного результата.
MOV A, 57h ; Умножаются десятые доли на 25,6 и
MOV B, #19h ; результат суммируется с младшим байтом
MUL AB ; конечного результата.
ADD A, 61h
MOV 61h, A
MOV A, 57h
MOV B, #6h
MUL AB
MOV B, #0Ah
DIV AB
ADD A, 61h
MOV 61h, A
MOV A, #4h ; Округление результата. Если остаток
CJNE A, B, OKR1 ; больше 4, то значение увеличивается на 1.
OKR1: JC OKR2
SJMP DALEE1
OKR2: INC 61h
DALEE1: MOV A, 58h ; Умножаются сотые доли на 2,6 и
MOV B, #2h ; результат суммируется с младшим
MUL AB ; байтом конечного результата.
ADD A, 61h
MOV 61h, A
MOV A, 58h
MOV B, #6h
MUL AB
MOV B, #0Ah
DIV AB
ADD A, 61h
MOV 61h, A
MOV A, #4h ; Округление результата.
CJNE A, B, OKR3
OKR3: JC OKR4
SJMP DALEE2
OKR4: INC 61h
DALEE2: MOV A, 59h ; Умножаются тысячные доли на 0,2 и
MOV B, #3h ; результат суммируется с младшим
MUL AB ; байтом конечного результата.
MOV B, #0Ah
DIV AB
ADD A, 61h
JC PER1
SJMP NPER1
PER1: INC 60h
NPER1: MOV 61h, A
MOV A, #4h ; Округление результата.
CJNE A, B, OKR5
OKR5 JC OKR6
SJMP DALE
OKR6: INC 61h
DALE: MOV A, 50h ; Деление младшего байта произведения
MOV B, 53h ; на значение скорости или на 100.
DIV AB
ADD A, 61h ; Результат суммируется с младшим
; байтом конечного результата.
JC PER2
SJMP NPER2
PER2: INC 60h
NPER2: MOV 61h, A ; Для уменьшения погрешности
MOV A, B ; конечного результата остаток от
MOV B, #2h ; деления младшего байта участвует
MUL AB ; в округлении.
MOV B, 53h
DIV AB
MOV B, A
MOV A, #0h
CJNE A, B, OK
OK: JC OK1
SJMP DALEE3
OK1: INC 61h
; Преобразование в десятичную форму записи
DALEE3: MOV A, 61h ; Разбиваем наше 16-разрядное значение
CLR ACC.7 ; на 3 4-разрядных.
CLR ACC.6
CLR ACC.5
CLR ACC.4
MOV 42h, A ; Младшее 4-разрядное значение.
MOV A, 61h
CLR ACC.3
CLR ACC.2
CLR ACC.1
CLR ACC.0
SWAP A
MOV 41h, A ; Среднее 4-разрядное значение.
MOV 40h, 60h ; Старшее 4-разрядное значение.
MOV A, 41h ; Среднее 4-разрядное значение
MOV B, #06h ; умножается на 6.
MUL AB
MOV B, #0Ah ; Затем делится на 10. Целая часть - число
DIV AB ; десятков, остаток - число единиц.
MOV 45h, A ; Число десятков.
MOV 46h, B ; Число единиц.
MOV A, 40h ; Старшее 4-разрядное значение
MOV B, #06h ; умножается на 6.
MUL AB
ADD A, 46h ; Результат складывается с числом единиц.
ADD A, 42h
MOV B, #0Ah ; Потом делится на 10.
DIV AB
ADD A, 45h ; Целая часть от деления складывается с
MOV 45h, A ; числом десятков.
MOV 46h, B ; Остаток - окончательное число единиц.
MOV A, 40h ; Старшее 4-разрядное значение
MOV B, #5h ; умножается на 5.
MUL AB
ADD A, 41h ; Результат складывается с числом десятков
ADD A, 45h
MOV B, #0Ah ; Потом делится на 10.
DIV AB
MOV 44h, A ; Число сотен.
MOV 45h, B ; Окончательное число десятков.
MOV A, 40h ; Старшее 4-разрядное значение
MOV B, #2h ; умножается на 2.
MUL AB
ADD A, 44h ; Результат складывается с числом сотен
MOV 44h, A ; Окончательное число сотен.
; Вывод результата на трехразрядный семисегментный индикатор
MOV 60h, #11000000b ; Цифра 0.
MOV 61h, #11111001b ; Цифра 1.
MOV 62h, #10100100b ; Цифра 2.
MOV 63h, #10110000b ; Цифра 3.
MOV 64h, #10011001b ; Цифра 4.
MOV 65h, #10010010b ; Цифра 5.
MOV 66h, #10000010b ; Цифра 6.
MOV 67h, #11111000b ; Цифра 7.
MOV 68h, #10000000b ; Цифра 8.
MOV 69h, #10010000b ; Цифра 9.
; Определение выводимых на индикатор цифр (т.е. двоичных комбинаций)
MOV R0, #60h ; Номер ячейки памяти с цифрой 0.
MOV A, 44h ; Число сотен записывается в аккумулятор
OPRED: MOV 5Ah, @R0 ; Текущая цифра.
JZ OPRED1 ; Если аккумулятор равен 0, то переход на
; следующий этап с сохранением текущей
; цифры, показывающей число сотен.
DEC A ; Уменьшение числа сотен на 1.
INC R0 ; Изменение текущей цифры (следующая).
SJMP OPRED ; Переход в начало (метку OPRED).
OPRED1: MOV R0, #60h ; Номер ячейки памяти с цифрой 0.
MOV A, 45h ; Число десятков пишется в аккумулятор
OPR: MOV 5Bh, @R0 ; Текущая цифра.
JZ OPRED2 ; Если аккумулятор равен 0, то переход на
; следующий этап с сохранением текущей
; цифры, показывающей число десятков.
DEC A ; Уменьшение числа десятков на 1.
INC R0 ; Изменение текущей цифры (следующая).
SJMP OPR ; Переход в начало (метку OPR).
OPRED2: MOV R0, #60h ; Номер ячейки памяти с цифрой 0.
MOV A, 46h ; Число единиц пишется в аккумулятор.
OPR1: MOV 5Ch, @R0 ; Текущая цифра.
JZ INDIC ; Если аккумулятор равен 0, то переход на
; следующий этап с сохранением текущей
; цифры, показывающей число единиц.
DEC A ; Уменьшение числа единиц на 1.
INC R0 ; Изменение текущей цифры (следующая).
SJMP OPR1 ; Переход в начало (метку OPR1).
; Вывод цифр на индикатор
INDIC: MOV R0, #5Ah ; Номер ячейки памяти с нужной цифрой.
MOV R1, #0h ; Значение регистра 1 необходимое для
; перехода к нужной метке c выводом.
MOV R2, #32h ; Число повторений вывода на индикаторы
; равно 50 (около 120Гц).
MOV R3, #1h ; Значение регистра необходимое для
; перехода к метке START.
; Обработчик прерываний
SELECTOR: MOV A, R3 ; Если R3 равен 0, то переход к метке
JZ ST ; ST.
MOV B, R1 ; Если R1 равен 0, то переход к выводу
MOV A, B ; третьего разряда (числа сотен).
JZ VUVOD_1
DEC B ; Если R1 равен 1, то переход к выводу
MOV A, B ; второго разряда (числа десятков).
JZ VUVOD_2
DEC B ; Если R1 равен 2, то переход к выводу
MOV A, B ; первого разряда (числа единиц).
JZ VUVOD_3
DEC B ; Если R1 равен 3, то переход к метке
MOV A, B ; BIG_ZADERG.
JZ BIG_ZADERG
ST: JMP START ; Переход к метке START.
VUVOD_1: MOV P2, @R0 ; Передача цифры на порт 2 (число сотен).
SETB P0.4 ; Разрешение работы дешифратора.
CLR P0.2 ; Вывод на первый индикатор.
CLR P0.5
SETB P0.3 ; Строб записи в регистр.
CLR P0.3
INC R0 ; Переход к следующей нужной цифре.
INC R1 ; Увеличение регистра перехода к
; следующей метке вывода.
MOV TH1, #0F8h ; Задается значение таймера для задержки
MOV TL1, #02Fh ; на 2мс.
RETI ; Возврат из прерывания.
VUVOD_2: MOV P2, @R0 ; Вывод на второй индикатор числа
SETB P0.4 ; десятков.
SETB P0.2
CLR P0.5
SETB P0.3 ; Строб записи
CLR P0.3
INC R0 ; Переход к следующей нужной цифре.
INC R1 ; Увеличение регистра перехода к
; следующей метке вывода.
MOV TH1, #0F8h ; Задается значение таймера для задержки
MOV TL1, #02Fh ; на 2мс.
RETI ; Возврат из прерывания.
VUVOD_3: MOV P2, @R0 ; Вывод на третий индикатор числа
SETB P0.4 ; единиц.
CLR P0.2
SETB P0.5
SETB P0.3 ; Строб записи.
CLR P0.3
INC R0
INC R1 ; Увеличение регистра перехода к
; следующей метке вывода.
MOV TH1, #0F8h ; Задается значение таймера для задержки
MOV TL1, #02Fh ; на 2мс.
RETI ; Возврат из прерывания.
BIG_ZADERG: DEC R2 ; Уменьшение числа повторений вывода
; на индикаторы на 1.
MOV A, #0h ; Проверка числа повторений на
MOV B, R2 ; равенство 0.
CJNE A, B, D1
D1: MOV R0, #5Ah ; Возврат регистра 0 к первоначальному
; значению 5А.
MOV R1, #0h ; Возврат регистра 1 к первоначальному
; значению 0.
JC D2 ; Если число повторений не равно 0, то
JNC D3 ; вывод на индикатор повторяется.
; В противном случае переход в
D2: MOV TH1, #0FFh ; бесконечный цикл и ожидание
MOV TL1, #0FFh ; прерывания (все повторяется заново).
RETI ; Возврат из прерывания.
D3: MOV R3, #0h
MOV TH1, #0FFh
MOV TL1, #0FFh
RETI ; Возврат из прерывания.
END
... и выходными характеристиками. Это позволит избежать перечисленных выше недостатков и открыть возможности для дальнейшего расширения функциональных возможностей и повышения надёжности системы. Для определения уровня топлива используется емкостной датчик (например, Е 25ХИ) в комплекте со вторичным преобразователем ИСУ100И. Указанное оборудование имеет разрешение Ростехнадзора на применение и может ...
... , пассажиров, багажа и почты. Планирование эксплуатационных расходов железных дорог производится по однородным видам затрат, т.е. по экономическим элементам. Наибольший удельный вес в эксплуатационных расходах железнодорожного транспорта занимают расходы по оплате труда. Фонд оплаты труда планируется, исходя из лимита численности персонала, занятого в перёвозках, и среднемесячной заработной ...
... регулировании вязкости уменьшаются на 3–5 %. Таким образом, для подготовки топлива перед подачей в двигатель необходим автоматический регулятор вязкости. При этом во всех без исключения современных системах предусматривается астатическая характеристика регулирования вязкости топлива, чтобы её значение перед форсунками двигателя оставалось постоянным на всех нагрузках. Исходные данные Объектом ...
... тепловой нагрузки. Для перехода на дистанционное управление служит блок 14 (БРУ-У), соединенный через пускатель 75 (ПРБ-74) с двигателем 16 (МЭО 25/100), перемещающим P.O. III. Теплота сгорания топлива контролируется датчиком 17 (КГ-7093.01), корректирующий импульс формируется во вторичном приборе 18 (КГ-7093.02). Коррекция задания при изменении тепловой нагрузки осуществляется с помощью блока ...
0 комментариев