MOVX A,@DPTR ;пустое считывние из АЦП, чтобы запомнить в его внутренний регистр адрес канала
SETB P1.5 ;разрешение счёта внешним таймером
MOV IE,#CW_IE ;разрешение прерываний
MAIN:
CALL PROC_1
CALL PROC_2
CALL PROC_3
MOV R3,#10
DELAY:
;Организация задержки на 0,5с
MOV R0,#40 ;один проход цикла DELAY 50мс
MOV R1,#255
LOOP1:
DJNZ R0,LOOP1
DJNZ R1,LOOP1
MOV R0,#216
LOOP2:
DJNZ R0,LOOP2
JNB IS_INDMODE,COMP
CALL INDOUT
COMP:
DJNZ R3,DELAY ;10циклов по 50мс
JMP MAIN
;Обработчик сигналов X1-X4 c заданием режима для
;формирования Y1
;Y1=X1+X2*X3*X4
;T1=50мс
PROC_1:
MOV A,P1
MOV C,ACC.3
ANL C,ACC.2 ;C=X4*X3
ANL C,ACC.1 ;C=X4*X3*X2
ORL C,ACC.0 ;C=X1+X4*X3*X2
MOV DPTR,#ADDR_CT0 ;программируем 0-ой канал таймера
JNC NOUT_Y1 ;если Y1=0 то к метке записи FFFFH
MOV A,#82H ;если Y1=1 то выводм сначала младший затем старший байт
MOVX @DPTR,A ;интервалы поступления счётных импульсов 24мкс
MOV A,#6H ;T1=826h*24мкс=50мс.
MOVX @DPTR,A
JMP END_PROC1
NOUT_Y1:
MOV A,#0FFH ;пишем FFFFH - на выходе таймера будем иметь постоянный
MOVX @DPTR,A ;высокий уровень => Y1=0 в течении всего времени управления
MOV A,#0FFH
MOVX @DPTR,A
END_PROC1:
RET
;Обработчик сигналов X5-X6:
;Принимаем X5-X6=>N5-N6 с АЦП
;Вычисляем Q2=N5-N6+K
;Если Q2<Q0,задаём режим для формирования Y2 длительностью 60 мс
;Если Q2>Q0,задаём режим для формирования Y3 длительностью 120 мс
PROC_2:
CLR P1.4 ;Сигнал CONVST для запуска АЦП на преобразование, регистр АЦП уже содержит адрес канала
MOV DPTR,#ADDR_ADC1 ;адрес канала для следующего преобразования в ADC
MOVX A,@DPTR;
SETB P1.4;
MOV R3,A ;сохранение считанного значения в регистр
CLR P1.4 ;Сигнал CONVST для запуска АЦП на преобразование, регистр АЦП уже содержит адрес канала
MOV DPTR,#ADDR_ADC2 ;адрес канала для следующего преобразования в ADC
MOVX A,@DPTR;
SETB P1.4;
MOV R4,A ;сохранение считанного значения в регистр
;расчет значения функции Q2=N5-N6+K
MOV A,R3 ;запись N5 в аккумулятор
CLR C ;очистка бита переноса для проведения вычитания
SUBB A,R4 ;A=N5-N6
ADD A,K ;A=N5-N6+K
JB OV,Y3_OUT ;если произошло переполнение, то Q2 больше, чем Q0
;сравнение значений Q0 и Q2
CLR C ;очистка флага переноса
SUBB A,#Q0 ;вычитание из полученного значения константы Q0
ANL A,#10000000b ;проверка бита знака, если он равен 0, то флаг Z будет установлен в 1
JNZ Y3_OUT ;если флаг Z=1 (т.е. Q2<Q0), то переход к формированию сигнала Y3
;формирование сигнала Y2
MOV DPTR,#ADDR_CT1 ;запись в DPTR адреса канала таймера 1
MOV A,#0C4H; ;T2=9C4h*24мкс=60мс
MOVX @DPTR,A ;вывод младшего бита
MOV A,#9H;
MOVX @DPTR,A ;вывод старшего бита
MOV DPTR,#ADDR_CT2 ;запись в DPTR адреса канала таймера 2
MOV A,#0FFH; ;запрещаем вывод Y3
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.