MOV R1,A
MOV A,#0H
MOV DPTR,#0FFFH ;Адрес в ПЗУ младшего байта Q0
MOVC A,@A+DPTR
MOV R2,A
;В R1 и R2 ст. и мл. байты Q0
;Сравнение организуем с помощью вычитания: Q2-Q0
CLR C ;Вычитание осуществляем с заемом
MOV A, R5
SUBB A, R2
MOV R2,A
MOV A, R6
SUBB A, R1
MOV R1,A
MOV C, ACC.7 ;По результатам вычитания анализируем ;получившееся значение на знак
JC MAKE_Y3 ;Если C равно 1 (Q2<Q0),то переход
MAKE_Y2:
MOV DPTR,#D300Н ;Адрес упр. слова ВИ53
MOVX @DPTR,#B ;Канал 0, режим 1, мл. байт
MOV DPTR,#D000H ;Адрес 0ого канала
MOVX @DPTR,#C8H ;Загружаем n=60 (чтобы получить Y2
SETB CE0 ;длительностью 30 мс)
MAKE_Y3: ;В случае, если Q2>=Q0, пачка Y3 со ;скважностью 2, периодом 1 мс
;и длительностью пачки 60 мс
MOV DPTR,#D300Н ;Адрес упр. слова ВИ53
MOVX @DPTR,#B ;Канал 1, режим 3, мл. байт
MOV DPTR,#D001H ;Адрес 1ого канала
MOVX @DPTR,#C8H ;Загружаем n=2 (чтобы получить пачку Y3
SETB CE1 ;длительностью 60 мс)
MOV TH0,#high() ;2 раза загружаем по 50000,
MOV TL0,#low() ;чтобы в результате таймер
SETB TR0 ;отсчитал 60 мс
Y22: JNB TF0,Y22
CLR TF0
CLR CE1 ;сбросили разрешение счета
;конец пачки Y3
RET
;Расчет Q4
ENTER_X7:
C_BUSY3:
MOV C, BUSY ;Проверка готовности АЦП для считывания ;данных
JC C_BUSY3 ;Если С=1, то переход
;Если С=0, значит АЦП готово
MOV DPTR,#8200H ;Выбор микросхемы АЦП и мультиплексора и ;установка мультиплексора на 3 канал
MOVX A,@DPTR
MOV DPTR,#В000H ;Считывание старшего байта
MOVX A,@DPTR ;в аккумулятор из формирователя
ANL A,#B ;Накладываем маску на 2 мл. бита (т. к. у ;нас 10-разрядное АЦП и неизвестно, что в ;остальных битах)
MOV R6,A ;Старший байт N7 записываем в R6
MOV DPTR,#С000Н ;Считывание младшего байта
MOV A,@DPTR ;в аккумулятор из регистра
MOV R7,A ;Младший байт N7 записываем в R7
;Считываем константы А0 и А1 из ПЗУ
;A1=4
;A0=0.5
MOV DPTR,#0FFEH ;Адрес в ПЗУ где хранится старший байт А0
MOV A,#0H
MOVC A,@A+DPTR ;Считываем и записываем в регистр R1
MOV R1,A
MOV DPTR,#0FFDH ;Адрес в ПЗУ где хранится младший байт А0
MOV A,#0H
MOVC A,@A+DPTR ;Считываем и записываем в регистр R2
MOV R2,A
;Получили в R1 и R2 значение A0
MOV DPTR,#0FFCH ;Адрес в ПЗУ для значения А1
MOV A,#0H
MOVC A,@A+DPTR ;Считываем и записываем в регистр R3
MOV R3,A
;Получили в R3 значение A1
;Расcчитаем функцию Q4
;Для начала поделим N7 на A1=4. Деление произведем обычным сдвигом ;вправо
MOV R5,#02H
DIV_CYCLE2:
CLR C
MOV A, R7
RRC A
MOV R7,A
MOV A, R6
RRC A
MOV R6,A
DJNZ R5,DIV_CYCLE2
;Теперь прибавим к получившемуся значению - A0
CLR C
MOV A,R7 ;Сначала складываем младший байт
ADD A, R2
MOV R7,A
MOV A,R6 ;Затем старший, с учетом переноса.
ADDC A,R1
MOV R6,A ;Результат снова помещаем в R6 и R7,
;Q4 находится в регистрах R6 и R7
MOV BUF1,R6
MOV BUF2,R7
RET
Q4_OUT:
;Преобразование двухбайтового числа к последовательности знакомест в ;памяти
MOV R1,#BUF1 ;Из памяти считываем значение Q4
MOV R6,@R1
MOV R1,#BUF2
MOV R7,@R1
MOV R5,#4 ;Обнуление 4х ячеек
MOV R1,#Razr ;памяти, в которых хранятся
NUL:
MOV @R1,#3FH ;битовые комбинации
INC R1 ;для 4х знакомест
DJNZ R5,NUL ;от младшего разряда до старшего
MOV R1,#Razr ;В регистре R1 хранится начальный адрес ;массива с бит. комбинациями знакомест
M4: MOV R2,#0 ;Обнуление старшего и
MOV R3,#0 ;младшего байта частного
MOV A,R6 ;Проверка старшего байта преобразуемого ;числа на равенство нулю,
JNZ M0 ;если не равно нулю, то переход к ;делению на 10, если равно нулю, то ;проверка младшего байта
CJNE R7,#10,M1 ;Проверка младшего байта преобразуемого ;числа, при условии что ст. байт равен 0
M1: JC M2 ;если мл. байт <10, то конец деления ;переход к формированию последнего ;разряда знакоместа
M0: MOV A,R7 ;Деление на 10
CLR C ;(сброс флага для исключения его ;влияния в первом такте деления)
SUBB A,#10 ;посредством вычитания десяти из
MOV R7,A ;младшего байта и коррекции ст. байта
MOV A,R6
SUBB A,#0 ;при этом если при коррекции ст. байта
JC M3 ;был заем, то переход к формированию ;очередного знакоместа,
MOV R6,A ;если перехода не было
MOV A,R3 ;то увеличение
ADD A,#1 ;двухбайтового
MOV R3,A ;частного
MOV A,R2 ;на единицу
ADDC A,#0 ;и
MOV R2,A ;переход к очередному вычитанию
JMP M0 ;до того момента, пока не произойдет ;заем в ст. байте преобразуемого числа
M3: MOV A,R7 ;Формирование очередного знакоместа после ;деления на 10
ADD A,#10 ;Восстановление остатка младшего байта ;после вычитания 10ти и заема из ст. байта
MOV dptr,#N_mas ;Сопоставление остатка после деления на ;10 (очередного разряда) битовой ;комбинации очередного знакоместа
MOVC A,@A+dptr ;т. к. остаток является одновременно и ;смещением на соответствующую битовую ;комбинацию и
MOV @R1,A ;сохранение этой комбинации в ;соответствующую знакоместу ячейку памяти
INC R1 ;Смещение адреса соответствующей ;знакоместу ячейки памяти на след. ячейку
MOV A,R2 ;Перемещение двух
MOV R6,A ;байт частного в
MOV A,R3 ;соответствующие два
MOV R7,A ;байта делимого и
JMP M4 ;переход к формированию очередного ;знакоместа
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |


