Після запуску програми виконується настроювання таймерів Т0 і Т1 основного мікроконтролера: таймер Т0 використається як 16-бітовий лічильник, таймер Т1 - як 16-бітовий таймер, що реалізує інтервал часу 50 мс. Програмно забезпечується вимірювальний інтервал тривалістю 1 с., протягом якого таймер Т0 підраховує кількість імпульсів від генератора. Після закінчення інтервалу підрахована кількість відображається на панелі семисегментних індикаторів, і вимірювальний цикл повторяться знову.
У ході роботи програми можна змінювати частоту генерації за допомогою потенціометра Fген, розташованого на верхній панелі корпуса УУМС-2. Результат вимірів відповідно повинен змінюватися. Відображуване числове значення фактично відповідає частоті генеруємих імпульсів, вираженої в герцах.
Програма BTN_LED.ASM з індивідуальним удосконаленням
Призначення. Виконується циклічне читання стану перемикачів для завдання бітових сигналів (адреса 0FFF2h) і отримане двійкове число відображається на лінійці світодіодів (адреса 0FFF1h) чотирма різними способами:
- число відображається відповідно с бітовими значеннями;
- старша тетрда числа відображається відповідно с бітовими значеннями, а молотша тетрода – відповідно з інверсними значеннями;
- старша тетрда числа відповідно з інверсними значеннями, а молодша тетрода – відображається відповідно с бітовими значеннями;
- число відображається відповідно з інверсними значеннями бітів.
Кожний спосіб візуалізації триває 10 секунд, протягом яких можно задавати різні значення перемикачів.
| cseg | ||
| org 2000h | ||
| jmp main | ||
| org 200Bh | ||
| jmp timer | ||
| main: | mov TMOD,#01h | |
| mov IE,#10000010b | ||
| mov TL0,#LOW(555) | ||
| mov TH0,#HIGH(555) | ||
| mov DPTR,#0FFF7h | ||
| mov A,#1 | ||
| mov R2,#1 | ||
| mov R1,#0 | ||
| call get_n | ||
| movx @DPTR,A | ||
| setb TR0 | ||
| loop: | mov DPTR,#0FFF1h | |
| movx @DPTR,A | ||
| quit: | cjne R1, #0,two | |
| mov dptr,#0FFF2h | ||
| movx A,@DPTR | ||
| jmp loop | ||
| two: | cjne R1,#1,three | |
| mov dptr,#0FFF2h | ||
| movx A,@DPTR | ||
| cpl Acc.0 | ||
| cpl Acc.1 | ||
| cpl Acc.2 | ||
| cpl Acc.3 | ||
| jmp loop | ||
| three: | cjne R1,#2,fore | |
| mov dptr,#0FFF2h | ||
| movx A,@DPTR | ||
| cpl Acc.4 | ||
| cpl Acc.5 | ||
| cpl Acc.6 | ||
| cpl Acc.7 | ||
| jmp loop | ||
| fore: | cjne R1,#3,loop | |
| mov dptr,#0FFF2h | ||
| movx A,@DPTR | ||
| cpl A | ||
| jmp loop | ||
| timer: | mov R4,A | ;збереження значення акумулятора | 
| clr TR0 | ;маскування переривання від таймера 0 | |
| inc R7 | ;лічильник переривань (180 = 10 сек) | |
| cjne R7,#180,out | ;пройшло 10 секунд? | |
| mov R7,#0 | ;так – обнуління лічильника | |
| inc R1 | ;інкрементуємо показник циклів | |
| cjne R1,#4,outa | ;пройшло 4 циклів | |
| mov R1,#0 | ;обнулення показника | |
| outa: | inc R2 | |
| cjne R2,#5,outw | ||
| mov R2,#1 | ||
| outw: | mov A,R2 | |
| call get_n | ||
| mov DPTR,#0FFF7h | ||
| movx @DPTR,A | ||
| mov DPTR,#0FFF1h | ||
| out: | mov A,R4 | |
| mov TL0,#LOW(555) | ||
| mov TH0,#HIGH(555) | ||
| setb TR0 | ||
| reti | ||
| get_n: | movc A,@A+PC | ;підпрограма конверсії значення акумулятора в код ССІ | 
| ret | ||
| db 00000110b ;1 | ;таблиця значень ССІ для конверсії | |
| db 01011011b ;2 | ||
| db 01001111b ;3 | ||
| db 01100110b ;4 | 
6. ПРОГРАМИ ТИПОВИХ ПРОЦЕДУР
1. Передати вміст буфера резидентної пам'яті даних по непрямій адресі з R0. Алгоритм програми представления на рисунку 6.1
|  | 
Текст програми:
| Мітка | Команди | Коментар | 
| cseg | ||
| org 2000h | ||
| jmp main | ;перехід на виконання головної програми | |
| org 2003h | ;початок переривання по INT0 | |
| mov DPTR,#0fff2h | ;завантаження адреси лінійки перемикачів | |
| movx A,@DPTR | ;прийняття значень перемикачів | |
| mov DPTR, #0fff1h | ; завантаження адреси лінійки світодіодів | |
| movx @DPTR,A | ;візуалізація значень перемикачів | |
| call 0230h | ;затримка 50мс | |
| mov R0,A | ;завантаження уведеної адреси | |
| mov @R0,SBUF | ;передача байта в РПД | |
| mov IE,#0 | ;для запобігання накладення переривань | |
| reti | ;кінець програми-оброблювача | |
| main: | mov IE, #10000001b | ;активація переривання по INT0 | 
| loop: | sjmp loop | ;нескінченний цикл | 
2. Завантажити в покажчик даних початкову адресу 7F00 масиву даних, розташованого в зовнішній пам'яті даних. Алгоритм програми представления на рисунку 6.2
Текст програми:
| Мітка | Команди | Коментар | 
| counter equ PSW.5 | ||
| cseg | ||
| org 2000h | ||
| jmp main | ;перехід на початок програми | |
| org 2003h | ;обробка переривання по INT0 | |
| mov IE,#0 | ;для запобігання спрацьовування непотрібного переривання | |
| mov A,R0 | ||
| call o | ||
| call 0220h | ||
| mov IE, #10000001b | ;дозвіл переривання по INT0 | |
| reti | ;повернення з підпрограми обробки переривання | |
| main: | mov IE, #10000001b | ;дозвіл переривання по INT0 | 
| clr counter | ;обнуління лічильника введених тетрад | |
| loop: | mov DPTR,#0FFF2h | ;сканування перемикачів | 
| movx A,@DPTR | ||
| mov DPTR,#0FFF7h | ;для відображення на ССІ | |
| call visual | ;підпрограма відображення введеної инф. | |
| call 0230h | ;затримка для фіксації значення ССІ | |
| sjmp loop | ;цикл сканування введеної инф. | |
| visual: | mov R0,A | ;підпрограма зберігає значення Акк. | 
| anl A,#0Fh | ;виділення мол. тетради для коверции | |
| call get_num | ;у код ССИ за допомогою підпрограми | |
| movx @DPTR,A | ;відображення мол. частини 16-го числа | |
| inc DPTR | ;для відображення ст. частини | |
| mov A,R0 | ;відновлення значення Акк. | |
| swap A | ;виділення ст. тетради для коверции | |
| anl A,#0Fh | ||
| call get_num | ;у код ССИ за допомогою підпрограми | |
| movx @DPTR,A | ;відображення ст. частини 16-го числа | |
| ret | ; кінець підпрограми | |
| o: | jb counter,sec | ;лічильник дорівнює 1? | 
| mov R1,A | ;ні, а значить зберегти введене значення | |
| setb counter | ;лічильник – друга тетрада | |
| jmp fist | ;завершення циклу уведення першої тетради | |
| sec: | mov DPH,A | ;дорівнює, а значить збереження уведеної инф. | 
| mov DPTR,#0FFF9h | ;візуалізація зі старшого розряду | |
| call visual | ;виклик процедури візуалізації | |
| mov A,R1 | ;мол. тетрада уведена | |
| mov DPL,A | ;запис в DPTR | |
| mov DPTR,#0FFF7h | ;візуалізація з мол. розряду | |
| call visual | ;візуалізація з мол. розряду | |
| l: | jmp l | ;зациклення – кінець програми | 
| fist: | call 0230h | ;затримка 50 мс | 
| ret | ;вихід з підпрограми візуалізації | |
| get_num: | inc A | ;підпрограма перекладу 16-ССІ | 
| movc A,@A+PC | ||
| ret | ||
| db 00111111b | ;0 | |
| db 00000110b | ;1 | |
| db 01011011b | ;2 | |
| db 01001111b | ;3 | |
| db 01100110b | ;4 | |
| db 01101101b | ;5 | |
| db 01111101b | ;6 | |
| db 00000111b | ;7 | |
| db 01111111b | ;8 | |
| db 01101111b | ;9 | |
| db 01110111b | ;A | |
| db 01111100b | ;B | |
| db 00111001b | ;C | |
| db 01011110b | ;D | |
| db 01111001b | ;E | |
| db 01110001b | ;F | 
3. Програма виконує завантаження керуючого слова в регістр керування таймером TCON з лінійки перемикачів по перериванню INT0 і візуалізацію слова на лінійці світодіодів. Алгоритм програми представления на рисунку 6.3
Рисунок 6.3 – Алгоритм програми 3
Текст програми:
| Мітка | Команди | Коментар | 
| cseg | ;сегмент коду | |
| org 2000h | ;початкова адреса програми | |
| jmp main | ;перехід на установку регістра IE | |
| org 2003h | ;початок переривання по INT0 | |
| mov DPTR,#0fff2h | ;запис адреси лінійки перемикачів | |
| movx A,@DPTR | ;збереження даних з перемикачів в А | |
| mov DPTR, #0fff1h | ;запис адреси лінійки світодіодів | |
| movx @DPTR,A | ;візуалізація байта даних | |
| mov TCON,A | ;пересилання байта даних у регістр TCON | |
| mov IE,#0 | ;обнуління регістра IE | |
| reti | ;вихід з підпрограми переривання | |
| main: | mov IE, #10000001b | ;установка регістра IE | 
| loop: | sjmp loop | ;зациклення (нескінченний цикл) | 
4. Програма виконує скидання всіх прапорів користувача (область РПД із адресами 20h-2Fh).
Текст програми:
| Мітка | Команди | Коментар | 
| cseg | ;сегмент коду | |
| org 2000h | ;початкова адреса програми | |
| ;запис значень на згадку | ||
| start: | MOV A,#0 | ;установка початкового значення | 
| MOV R0, #20h | ;завантаження в R0 початкового значення адреси пам'яті | |
| MOV R1, #0Fh | ;завантаження в R1 кількості повторень циклу | |
| DM: | INC A | ;збільшення записуваного значення | 
| MOV @R0,A | ;запис значення на згадку | |
| INC R0 | ;збільшення адреси пам'яті | |
| MOV DPTR,#0FFF1h | ;запис адреси лінійки світодіодів | |
| MOVX @DPTR,A | ;візуалізація байта даних | |
| call 0220h | ;затримка 1c | |
| DJNZ R1, DM | ;зациклення (якщо не всі байти записані) | |
| ;обнуління комірок пам'яті | ||
| MOV R0, #20h | ;завантаження в R0 початкового значення адреси пам'яті | |
| MOV R1, #0Fh | ;завантаження в R1 кількості повторень циклу | |
| loop: | MOV DPTR,#0FFF1h | ;запис адреси лінійки світодіодів | 
| MOV A,@R0 | ;пересилання вмісту R0 для візуалізації | |
| MOVX @DPTR,A | ;візуалізація байта даних | |
| call 0220h | ;затримка 1c | |
| MOV @R0, #0 | ;відчищання байта даних | |
| MOV A, @R0 | ;пересилання обнуленного регістра R0 в А | |
| MOVX @DPTR,A | ;візуалізація байта даних | |
| call 0220h | ;затримка 1c | |
| call 0220h | ;затримка 1c | |
| INC R0 | ;збільшення адреси байта даних | |
| DJNZ R1, loop | ;зациклення (якщо не всі байти відчищені) | |
| jmp start | ;зациклення | 
Запам'ятати у ВПД уміст регістрів банку 0. Початкова адреса у ВПД 5000h. Алгоритм програми представления на рисунку 6.4