r />
Малюнок 3
контролер пристрій програма
Більш докладної алгоритм функціонування програми наведено на малюнку 4.
Малюнок 4.
Відповідно до цього алгоритмом була розроблена програма, забезпечує виконання мікроконтролером заданої функції.
5. Опис програми
За адресою в ПЗУ 00h розміщуємо команду переходу на мітку init (тобто ініціалізація дисплея і початок програми).
Bh- адреса підпрограми обробки переривання від таймера при його переповненні, тобто від появи прапора TF.
Привласнимо символьні імена використовуваним портам МК. Керуючі входи LCD-дисплея з'єднані з першими портами:
RS bit P1.0bit P1.1
Так само привласнимо символьні імена внутрішніх регістрів LCD-дисплея, надалі будемо звертатися до них як до зовнішньої ОЗУ:
CMD equ 00000000bequ00000001bequ00000010b
Викликаємо підпрограму налаштування режимів таймерів і налаштування дисплея. Налаштовуємо спеціальний регістр управління таймерами TMOD tmod, # 01010001b; 16-бітові таймери Т0 і Т1 і включення лічильника від зовнішніх сігналов.EA; всі переривання дозволені ET1; дозволене переривання від таймера 1.
Виробляємо настройку індикатора. Запишемо в акумулятор і згодом в командний регістр LCD команду x040h. Ця команда встановлює 8-бітну шину обміну даних LCD з МК, символьну матрицю 5х8 точок і одну використовувану рядок дисплея.
mov A, # 040h LSDSetup.
Запишемо в акумулятор і згодом в командний регістр LCD команду x0Fh. Ця команда безпосередньо включає дисплей, вибирає тип курсора. Викликаємо підпрограму, яка передає цю настройку в LCD:
mov A, # 0Fh LSDSetup.
Запишемо в акумулятор і згодом в командний регістр LCD команду x06h. Ця команда включає автоінкремент позиції і зрушення курсора вправо. Викликаємо підпрограму, яка передає цю настройку в LCD:
mov A, # 06hLSDSetup.
Переходимо на мітку StartP2.0; Встановлюємо одиничне значення стробовий порту.
Спустошуємо регістри таймерів і скидаємо прапори переповнення
mov TH0, # 0TL0, # 0TH1, # 0TL1, # 0DPTR, # 0000htr0tr1tf0tf1
Чекаємо натискання кнопки: jb p1.2, $;
Записуємо в регістри лічильника число «- 100»
mov TH1, # 0FFhTL1, # 9bh
Далі включаємо таймер і лічильник
setb TR1TR0
Мітка gr і умовний перехід не дозволяють програмою пройти далі, поки не встановлено прапор F0. Цей прапор встановлюється після одноразової обробки переривання.
gr:
jb F0, gotovo1gr
За переповнення лічильника (тобто після відліку 100 імпульсів) виставиться прапор TF1, і програма перейде за адресою обробки переривання. За даною адресою розміщена команда переходу на мітку check.
Вимикаємо таймер і лічильник
clr TR0TR1
У регістрах таймера TH0 і TL0 зберігається значення часу 100 імпульсів.
Пересилаємо значення з регістрів таймера в DPTR
mov dpl, TL0dph, TH0
Хранящееся в DPTR число необхідно перевірити і віднести в певну групу відповідно до умовою курсової роботи.
У регістри R1 і R2 записуємо значення (1/f) * 100, що відповідає 100 періодам обраної частоти в мікросекундах. Так само робимо поправку на час виконання команд. Для процесора з частотою 12 МГц час одного машинного циклу складає 2мкс.
Переносимо молодший біт DPTR в акумулятор, віднімаємо з числа, записаного в R1, значення зафіксованого часу 100 імпульсів, попередньо скинувши прапор переносу:
mov R1, # low (776) R0, # high (776) CA, DPLA, R1
Якщо після виконання віднімання встановиться прапор переносу. У цьому випадку, спрацює умовний перехід «jc», який переведе програму на мітку Perenos 7700. Якщо ж прапор переносу встановиться, що говорить про те, що дане число більше, то спрацює умовний перехід «jnc», який переведе програму по мітці neperenos 7700.
При переході по мітці Perenos 7700 зап...