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