У ході технологічного процесу на конвейєрі, вироби автоматично упаковуються в коробки. В одній коробці міститься 500 виробів. Потрібно кожні:
1) 120мкс подавати сигнали на завантаження в коробку одного виробу (момент відвантаження перехід 1->0);
2) По закінченні завантаження коробки здійснити подачу сигналу на упакування коробки і переміщення її далі по конвейєру (перехід 1->0);
3) Зробити паузу на час подачі наступної коробки (не менш 2с), після чого продовжити завантаження.
Постановка задачі програмування:
Для рахунку числа виробів потрібно програмний лічильник розрядністю не менше 9 біт (511 значень). Для формування тимчасових інтервалів використовуємо лічильник/таймер 0. Дані часового інтервалу дозволяють використовувати лічильник/таймер у режимі 2 як таймер. Після установки прапорця переповнення таймера зовнішній вихід повинний перейти зі стану «1» у стан «0». Для управління процесом відвантаження виробу використовуємо вихід Р1.0. Коли лічильник дорахує до 500, то рахунок по таймеру 0 припиняється, подається сигнал на переміщення по конвеєру (Р1.1). За допомогою лічильника/таймера 1 виконується затримка на 2 с. Так максимальний коефіцієнт рахунку в режимі 1 дорівнює 0FFFFH, то час переповнення рівний 0.065536с, тому потрібно виконати повний цикл прорахунку 31 раз, що складає 2.032с. Після продовжити видачу імпульсів на вході Р0.0.
Рисунок 5.1 Загальний алгоритм роботи програми
Рисунок 5.2 Алгоритм роботи обробника переривань
Програма:
NAME Real_process
LOAD EQU 90H ; Опис символьних імен, що підставляються
NEXT_BOX EQU 91h
PROG SEGMENT CODE ;Опису сегментів
STACK SEGMENT IDATA
FLAGS SEGMENT BIT
RSEG STACK ; Сегмент стека
DS 10H
RSEG FLAGS ; Сегмент прапорців
COUNT_H: DBIT 1 ; Старший розряд лічильника циклів
END_LOAD: DBIT 1 ; Прапор кінця циклу завантаження
CSEG AT 0 ; Код початку програми
USING 0
JMP START
CSEG AT 0BH ; Код оброблювача переривання таймера 0
USING 1 ; Використовуємо банк регістрів 1
SETB RS0 ; Переключення банку
CLR LOAD ; Подаємо імпульс на завантаження виробу
MOV R1,A ; Зберігаємо вміст А
MOV A, R0 ; У R0 молодший байт лічильника циклів
JB COUNT_H, LAB1 ; Перехід, якщо в старшому розряді лічильника 1
ADD A,#1 ; Інкремент акумулятора
JNC LAB2 ; Перехід, якщо немає переповнення
SETB COUNT_H ; Установка старшого розряду лічильника
SJMP LAB2 ; Перехід на завершення оброблювача
LAB1:
INC A; Інкремент А
CJNE A,#0F4H, LAB2 ; Перехід, якщо молодший байт ;лічильника не дорівнює 0f4H (500 – це 1F4H)
CLR COUNT_H ; Очищення старшого розряду лічильника
CLR A ;Очищення акумулятора
SETBEND_LOAD ;Установка прапорця кінця циклу завантаження
LAB2:
MOV R0, A; Збереження нового значення лічильника
MOV A, R1; Відновлення А після переривання
CLR RS0 ; Переключення на банк регістрів 0
RETI; Повернення з обробки переривання
;*************** Основна програма ***********************
RSEG PROG
START: MOV SP,#STACK-1
CLR COUNT_H ; Початкова ініціалізація перемінних
CLR END_LOAD
MOV 08H,A ; Занесення в регістр R0 банка 1 нуля
MOV TMOD, #12H ; Програмування режимів таймерів 0-режим 2, 1- ; режим 1