Аппаратные средства МПС. Карта распределения адресного пространства МПС. Расчет электрического сопряжения компонентов МПС, страница 17

INIT:

;инициализация переменных

mov INPUT_MODE,#0

;инициализация IOP

mov DPTR,#8041H            ;

mov A,#0DBH                             ;11011011B-очистка памяти дисплея, код

;бланкирования 20H(пробел "_"), сброс байта ;состояния и cигнала прерывания

movx @DPTR,A                ;

mov A,#01H                       ;00000001B-установка режима 1-клавишного

;нажатия, сканирования в режиме инверсного

;дешифратора на 4 выхода

movx @DPTR,A                ;

mov A,#28H                      ;00101000B-инициализация опорной частоты

movx @DPTR,A                ;

;инициализация таймеров-счетчиков

mov TMOD,22H                ;установка режима 2 таймеров 0,1

mov TCON,50H                 ;запуск таймеров 0,1

mov SYS_CLOCK_LOW,#0

mov SYS_CLOCK_HIGH,#0

;инициализация системы прерываний

setb EX0                            ;разрешить прерывания от внешнего источника 0

setb ET0                           ;разрешить прерывания от таймера 0

setb ET1                           ;разрешить прерывания от таймера 1

RET

3.4  Логическая обработка сигналов X1,…,X4 и формирование управляющего сигнала Y1

В соответствии с заданием Y1=X1+X2X3X4. Ниже приведен исходный текст программного модуля PROCESS_BOOLEAN, производящего логическую обработку сигналов:

PROCESS_BOOLEAN:

mov C,P1.4

anl C,P1.5

anl C,P1.6

orl C,P1.3

mov P1.7,C

mov R3,#2*TM1

call DELAY

clr P1.7

RET

3.5  Ввод напряжений X5,X6 и формирование сигналов Y2,Y3

PROCESS_ANALOG_1:

;получить цифровой эквивалент X6 от АЦП

mov DPTR,#8001H            ;канал 2 АЦП

movx @DPTR,A                ;занести в регистр АЦП номер читаемого канала

movx A,@DPTR                ;прочитать N6

mov R0,A                          ;сохранить в R0

;получить цифровой эквивалент X5 от АЦП

mov DPTR,#8000H            ;канал 1 АЦП

movx @DPTR,A

movx A,@DPTR

clr C                                 ;подготовить бит переноса к вычитанию

subb A,R0                         ;A=N5-N6

add A,K                            ;A=N5-N6+K=Q2

clr C

subb A,Q0                        ;сравнить A с Q0. Если A<Q0, то бит переноса C=1

jc L1                                 ;на формирование Y2

;формирование сигнала Y3

setb P3.1

mov R3,#TM3*2

acall DELAY

clr P3.1

sjmp L2

;формирование сигнала Y2

L1:     setb P3.0

mov R3,#TM2*2

acall DELAY

clr P3.0

L2:     RET

DELAY:

push ACC

;перезагрузить тймер-счетчик 1

clr TR1

setb TR1

mov TIMER,#0

mov A,R3

DELAY_L1:

cjne A,TIMER,DELAY_L2

sjmp DELAY_L1

DELAY_L2:

pop ACC      

RET

3.6  Ввод напряжения X7 и формирование сигнала Y4

PROCESS_ANALOG_2:

mov DPTR,#8002H

movx @DPTR,A

movx A,@DPTR

;вычислить N7*A1=N7*0.125=N7/8, т.е сдвинуть N7 вправо на 3 разряда

;используем циклический сдвиг через бит переноса, обнуляя последний

;перед каждым сдвигом

clr C

rrc A

clr C

rrc A

clr C

rrc A

add A,A0

mov Q4,A               ;сохранить Q4

mov DPTR,#8020H

movx @DPTR,A

RET

3.7  Обработка сигналов прерывания

IE0_HANDLER:

jnb P1.0, INT1_PROC

jnb P1.1, INT2_PROC

jnb P1.2, INT3_PROC

reti

INT1_PROC:           ;Обработка прерывания от аварийного датчика (INT1).

acall DISPLAY_ALL

;включить аварийную сигнализацию на ПУ

mov R3,#2              ;загрузить в R3 значение для формирования задержки 1мс

L3:     clr P3.3                   ;включить динамик

acall DELAY

setb P3.23              ;выключить динамик

acall DELAY

sjmp L3                  ;крутиться в бесконечном цикле, ожидая сброса

INT2_PROC:

;сохранить в NVRAM содержимое внутреннего ОЗУ CPU и значения регистров ;специального назначения

push 0

push ACC

push DPL

push DPH

mov R0,#0F0H        ;начать с области РСН и спускаться вниз

L4:     mov A,@R0            ;прочитать содержимое ячейки внутреннего ОЗУ

movx @R0,A           ;переслать значение по одноименному адресу в NVRAM