Ун-ту, 1997. - 108 с. p> Токхайм Р. Мікропроцесори: Курс і вправи/Пер. З англ., Під ред. В. Н. Грасевіча. - М.: Вища школа, 1988. - 336 с. p> Додаток А
Лістинг керуючої програми
Основна програма:
ORG 00H; початковий адресу програми
CLR A; очищення акумулятора
; початкова завантаження лічильника годин
MOV R5, A; початкова завантаження
MOV R7, A; лічильника хвилин
MOV P2, A; початкова завантаження лічильника секунд
MOV R2, # 1; завантаження
MOV R1, # 1; лічильників генератора
MOV TH1, # 156; секундних імпульсів
MOV TMOD, # 20H; T/C1 в режимі 2
MOV IE, # 8DH; дозвіл переривань від T/C1
SETB TR1; старт таймера T/C1
SJMP MAIN; Перехід до основної програми
; ----- ====== П/п обслуговування переривання від T/C1 ===== --------
ORG 1BH; вектор переривання
PUSH PSW; затримка
DJNZ R2, EXIT; в одну
MOV R2, # 1; секунду
DJNZ R1, EXIT;
MOV R1, # 1;
PUSH ACC;
JNB T0, M1; корекція хвилин
JNB T1, M2; корекція годин
MOV A, R7; лічильник секунд
ADD A, # 1;
DA A;
MOV R7, A;
CJNE R7, # 60H, M3;
MOV R7, # 0;
M1: MOV A, R5; лічильник хвилин
ADD A, # 1;
DA A;
MOV R5, A;
CJNE R5, # 60H, M3;
MOV R5, # 0;
M2: CALL COMP; Запуск п/п виявлення мах кол-ва а/м.
MOV R4, # 0; Обнулення кількості а/м,
MOV R6, # 0; проїхали через міст за годину. p> MOV A, R3; Лічильник годин. p> ADD A, # 1;
DA A;
MOV R3, A;
CJNE R3, # 24H, M3;
MOV R3, # 0; Установка 0 (24) годин. p> MOV R4, # 0; Обнулення кількості а/м, що проїхали
MOV R6, # 0; через міст, з початком нової доби. p> M3: MOV P1, R3; Виведення інформації. p> MOV P2, R5; індикатори. p> POP ACC; Відновлення акумулятора. p> EXIT: POP PSW; Відновлення регістра PSW. p> RETI; Повернення з п/п.
; ----- ======== Основна програма. ======== ---------- p> MAIN: MOV R4, # 0; Обнулення
MOV R6, # 0; кількості а/м.
MOV P0, # 0FFH; Скидання тригерів
SETB RD; Скидання лічильника. p> NOP ; Затримка в 1мкс (для спрацьовування CT)
CLR RD;
MOV P0, # 0; Відновлення роботи тригерів. p> SETB WR; Імпульс перемикання ліній з датчиків. p> MOV SP, # 100; Установка покажчика стека. p> BEGIN: MOV B, # 4; Кількість датчиків. p> MOV R0, # 1; R0 = 1.
CYCLE: CLR WR; Імпульс перемикання ліній з датчиків. p> NOP; Затримка в 1мкс (для спрацьовування CT і MS).
JNB INT0, J11; Опитування лінії порту (перевірка стану датчиків). p> MOV P0, R0; Скидання соответсвующего тригера датчика
CALL SUM; Виклик п/п сумміпрванія. p> MOV P0, # 0; Відновлення счетнго режиму тригера
J11: MOV A, R0; A = R0. p> RL A; Пестановка скидає біта тригерів. p> MOV R0, A; R0 = A.
SETB WR; Імпульс перемикання ліній з датчиків. p> DJNZ B, CYCLE; B = B-1. If B <> 0, то перехід на новий цикл
; опитування датчиків.
JB INT1, J2; Якщо INT1 = 1, то J2,
CALL DSPLY; інакше виклик п/п виведення інф-ції на
; зовнішнє пристрій.
J2: SJMP BEGIN; Перехід на початок опитування датчиків. br/>
; П/п підсумовування кількості минулого транспорту.
SUM: MOV A, R6; Підсумовування десятків. p> ADD A, # 1; A = A +1.
DA A; Десяткова корекція. p> MOV R6, A; R6 = A.
JNC S1; Якщо С <> 1, то S1,
MOV A, R4; інакше додати 1 до сотням. p> ADD A, # 1; A = A +1.
DA A; Десяткова корекція. p> MOV R4, A; R4 = A.
S1: RET; Повернення з п/п.
; ------- ===== П/п порівняння количесва а/м, що пройшли раніше, ====== -----
; з минулими в цю годину.
COMP: MOV A, R0; Збереження R0
PUSH ACC; в стек. p> MOV R0, # 20H; Адреса зберігання молодшого байта максимального
; кількостей а/м.
MOV A, R6; A = R6.
SUBB A, @ R0; A = A-@ R0. p> JC C1; Якщо вміст @ R0> A, то перехід до C1,
MOV A, R6; інакше записати
MOV @ R0, A; в пам'ять мах. кол-во а/м.
C1: INC R0; Збільшення покажчика пам'яті. p> MOV A, R4; A = R4.
SUBB A, @ R0;
JC C2;
MOV A, R4;
MOV @ R0, A;
INC R0;
MOV A, R3;
MOV @ R0, A;
POP ACC; Відновлення
MOV R0, A; R0 з стека. p> C2: RET; Повернення з п/п
; --------- ======= П/П ВИВЕДЕННЯ ДАНИХ НА ВНЕШ. Устр-во ======== --------
DSPLY: MOV R0, # 20H; Початковий адресу даних. p> MOV SBUF, @ R0; Виведення даних ч/з послідовний порт
INC R0; Збільшення покажчика пам'яті. p> MOV SBUF, @ R0;
INC R0;
MOV SBUF, @ R0;
INC R0;
RET; Повернення з п/п.
END
Додаток Б
Карта прошивки пам'яті програм
0: 1: 2: ...