Разработка микропроцессорной системы для управления объектом. Составление карты распределения адресного пространства, страница 20

Movx    A,@DPTR                          ; считываем N6 и инициализируем обработку Х7

Mov       R4,A                                   ; сохранение N6 в регистре R4

; вычисление функции Q2 = max(N5 - N6, K)

mov       A,R3                                   ; переносим N5 в аккумулятор

sub         A,R4                                   ; сложение N5 - N6 без учета флага переноса

mov       PSW.5,C                             ; сохраняем флаг переноса

cmp       A,K                                     ; сравнение (N5-N6) и K без учета флага переноса

jnae       p2_1                                   ; конец если К меньше или равно (N5-N6)

mov       A,K                                     ; если нет то в А записываем К

p2_1:

orl          C,PSW.5                             ; Формируем признак того, что Q2>FFh

; константа Q0 занимает 1 байт

; т.о. если С=1, Q2>Q0

jc            Y3_SET

; если C=0, проверяем соотношение Q2 и Q0

cjne       A,#Q0,NOT_EQUAL       ; сравниваем Q2 с константой Q0

jmp        Y2_SET                              ; если Q2=Q0, формируем сигнал Y2

NOT_EQUAL:

Jnc         Y3_SET                              ; если Q2<>Q0 и С=0, формируем сигнал Y3

; в противном случае, если Q2<>Q0 и С=1, формируем сигнал Y2                                                                          

; вывод управляющего сигнала Y2

Y2_SET:

Jnb         TR0, $                                 ; перед запуском таймера проверяем, закончено ли

; формирование предыдущих сигналов управления: если

; нет, то ждем окончания

; 20 мс = 2.4 мкс * 8333 - длительность сигнала Y2

; 8333 - число инкрементировании таймера до

; переполнения для формирования задержки 20 мс

; 8333 = 208Dh, FFFFh - 208Dh + 7h = DF79h

; 7h учитывает временные затраты на выполнение команд (7 машинных циклов)   

mov       TH0, #0DFh                      

mov       TL0, #79h                         

setb        P1.2                                     ; устанавливаем вывод P1.2 в единицу (начало управляющего сигнала Y2)

setb        TR0                                     ; запускаем таймер 0 для отсчета времени вывода

jmp        END_OF_PROCESS_2    ; выход

; вывод управляющего сигнала Y3

Y3_SET:

Jnb         TR0, $                                 ; перед запуском таймера проверяем, закончено ли

; формирование предыдущих сигналов управления: если

; нет, то ждем окончания

; 40 мс = 2.4 мкс * 16667 - длительность сигнала Y3

; 16667 - число инкрементировании таймера до

; переполнения для формирования задержки 40 мс

; 16667 = 411Bh, FFFFh - 411Bh + 7h = BEEBh

; 7h учитывает временные затраты на выполнение команд (7 машинных циклов)   

mov       TH0, #0BEh                      

mov       TL0, #0EBh                      

setb        P1.3                                     ; устанавливаем вывод P1.3 в единицу (начало управляющего сигнала Y3)

setb        TR0                                     ; запускаем таймер 0 для отсчета времени вывода

END_OF_PROCESS_2:

ret                                                                     ; конец подпрограммы

;--------------------------------------------------------------------------------------------------------------------; Ввод аналогового сигнала Х7, вычисление функции Q4 и формирование

; аналогового управляющего сигнала Y4               

PROCESS_3:

; ввод аналогового сигнала X7 и преобразование его в цифровое значение N7

mov       DPTR, #8006h                  ; адрес канала AIN2 АЦП  

movx     A, @DPTR                         ; считываем N7

; вычисление функции Q4 = A0 + A1*N7 = 0.17 + 0.25*N7

; умножение двоичного числа на 0.25 - сдвиг на 3 разряда вправо

rr            A                                         ; сдвиг N7 на разряд вправо (бит 0 идет на место 7)