ANL A,#40h ;Сохраняем только битовое
;значение
ANL A,ANDREZ
MOV ANDREZ,A
MOV A,@R0
ANL A,#3Fh ;Сохраняем только
;значение частоты
MOV R2,A
SUBB A,MINBYTE1 ;Определение, минимальный ли
;байт
JNC BYTE2
MOV MINBYTE1,R2
MOV A,R3
DEC A
MOV NOFMIN1,A
BYTE2: INC R0
MOV A,@R0 ;Второй байт
MOV R4,A
SUBB A,MINBYTE2
JNC NOTMIN
MOV MINBYTE2,R4
MOV A,R3
DEC A
MOV NOFMIN2,A
NOTMIN: DEC R3
CJNE R3,#0,ANALYZE ;Цикл пока не
;обработаем все данные
MOV A,NOFMIN1
CJNE A,NUMBER,NOACT ;Сравнение номера
;обладателя минимальной частоты с собственным номером и, если
;эти значения совпадают, выдать управляющие воздействия
SETB P1.4
JMP BITACT
NOACT: CLR P1.4
BITACT: MOV A,ANDREZ
CJNE A,#40h,BNOACT ;Если результат
;операции логического умножения равен единице, то выдаём
;управляющие воздействия, иначе – переход на BNOACT
SETB P1.6
JMP B2ACT
BNOACT: CLR P1.6
;Аналогично анализу первого байта
производим анализ
;номера обладателя минимального значения аналогового сигнала и
;выдачу управляющих воздействий
B2ACT: MOV A,NOFMIN2
CJNE A,NUMBER,NOB2ACT
SETB P1.5
JMP ENDACT
NOB2ACT: CLR P1.5
ENDACT: CLR PSW.3 ; Выбор банка регистров 0
RET
Обработчик прерывания от УАПП производит анализ, в результате чего он был вызван. Если произошел конец передачи байта, то обработчик производит отключение передатчика от ЛС и возвращает управление программе. Если завершился приём байта, то обработчик должен проанализировать, какой это байт (маркер или данные), а также сохранить информацию, полученную в этом байте в переменных или таблице данных.
PCAINT: JNB SCON.1,RESEIVE
CLR P1.3
RETI
RESEIVE: SETB PSW.3
MOV R1,SBUF ;Сохранение полученного байта
MOV A,R1 ;Проверка бита паритета
JB PSW.0,ODD
JB SCON.2,ERRINP ;RB8!=P => ERROR!
JMP NOERR
ODD: JNB SCON.2,ERRINP ;RB8!=P => ERROR!
NOERR: JB ACC.7,WMARK ;SBUF.7=1 => Маркер
MOV A,CURRENT ;Определение номера контроллера
CJNE A,#0FFh,GETB
JMP RETURN ;Если номер неизвестен
GETB: MOV A,NBYTE ;Загрузка счётчика принятых
;байт. Если этот счётчик <2, то можно принимать
байт, иначе -
;необходимо вернуться из прерывания
CJNE A,#2,NEXTB
JMP ERRINP
NEXTB: MOV A,CURRENT
RL A ;*2
ADD A,NBYTE ;A+=NBYTE
ADD A,#TABLE ;A=#TABLE+2*CURRENT+NBYTE
MOV R0,A
MOV A,R1 ;A<-SBUF
MOV @R0,A ;(#TABLE+2*CURRENT+NBYTE)<-SBUF
INC NBYTE
CLR ISMARKER ;Мы получили данные (а не маркер) JMP RETURN
WMARK: ANL A,#7 ;3 младших бита - это номер
MOV CURRENT,A ;получателя маркера
MOV A,R1
ANL A,#38h ;Следующие 3 бита – это количество
RR A ;работающих контроллеров
RR A
RR A
MOV QUANT,A
MOV A,R1
MOV C,ACC.6 ;6-й бит – признак цикла
MOV INITC,C ;инициализации
SETB ISMARKER ;Мы получили маркер
JMP RETURN ;(а не данные)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.