Після запуску програми виконується настроювання таймерів Т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