Отчет по практике: Мікропроцесорна техніка
Уведення й відображення значень перемикачів здійснюється за допомогою регістра DPTR по адресах відповідно 0FFF2h й 0FFF1h.
Для фіксац значень у кожному з доступних регістрів використається зовнішнє переривання INT0(перехід з 1 в 0), в оброблювачі переривання якого й записаний код збереження значення.
Алгоритм роботи програми:
Текст програми:
cseg | ||
org 2000h | ||
jmp main | ||
org 2003h | ;початок переривання по INT0 | |
mov DPTR,#0fff2h | ;опитування перемикачів | |
movx A,@DPTR | ||
mov DPTR, #0fff1h | ;вивід значень перемикачів | |
movx @DPTR,A | ||
call 0230h | ;затримка 50млС | |
mov IE,#0 | ;для закінчення програми | |
reti | ||
main: | mov IE, #10000001b | ;дозволу переривання |
loop: | mov DPTR,#0fff2h | ;опитування перемикачів |
movx A,@DPTR | ||
mov DPTR, #0fff1h | ;вивід значень перемикачів | |
movx @DPTR,A | ||
sjmp loop | ;нескінченний цикл сканування до переривання |
3. Просуммировать два уведених значення й суму записати в DPTR.
Уведення й відображення значень перемикачів здійснюється за допомогою регістра DPTR по адресах відповідно 0FFF2h й 0FFF1h.
Текст програми:
cseg | ||
org 2000h | ||
jmp main | ||
org 2003h | ||
clr EX0 | ||
jmp INT_0 | ||
main: | mov IE, #10000001b | ;дозволу переривання |
mov R7,#0 | ;лічильник операндов | |
setb IT1 | ||
loop: | mov DPTR,#0fff2h | ;опитування перемикачів |
movx A,@DPTR | ||
mov DPTR, #0fff1h | ;вивід значень перемикачів | |
movx @DPTR,A | ||
sjmp loop | ;нескінченний цикл сканування до переривання | |
INT_0: | clr IT1 | ;змінити фронт спрацьовування переривання |
mov DPTR,#0fff2h | ;опитування перемикачів | |
movx A,@DPTR | ||
mov DPTR, #0fff1h | ;вивід значень перемикачів | |
movx @DPTR,A | ||
mov R6,A | ;запам'ятовування поточних значень перемикачів | |
mov A,R7 | ;для перевірки на кількість уведених операндов | |
jz nul | ;уведено два операнда? | |
mov A,R6 | ;да | |
mov R1,A | ;додавання операндов | |
add A,R0 | ||
mov R0,A | ;для виводу за допомогою процедури SSI_W | |
call 0940 | ;вивід | |
mov DPL,A | ;запис значення в DPTR | |
jmp exit | ;кінець програми | |
nul: | mov A,R6 | ;немає |
mov R0,A | ;збереження першого операнда | |
inc R7 | ;наступний буде вводитися другий операнд | |
setb EX0 | ;дозволу переривання | |
jmp ex | ;вихід з процедури уведення | |
exit: | mov R7,#0 | ;для закінчення програми |
ex: | reti |
4. Секундомір. Програма використає апаратні засоби відліку тимчасових інтервалів - таймер 0 (200Bh). Час виводиться на ССИ за допомогою стандартної процедури 0940 (для цього потрібне значення потрібно помістити в регістр R0). Програма виконується в зацикленому стані.
Алгоритм роботи програми:
Текст програми:
cseg | ||
org 2000h | ||
jmp main | ;перехід до виконання головної програми | |
org 200Bh | ||
jmp timer | ;перехід до виконання програми обробки переривання | |
main: | mov TMOD,#01h | ;включаємо 16 – розрядний таймер |
mov IE,#10000010b | ;дозволяємо переривання від таймера | |
mov TL0,#LOW(555) | ;завантаження значення для відліку – 50мС | |
mov TH0,#HIGH(555) | ||
mov R0,#1 | ;початку з 1 секунди | |
call 0940h | ;візуалізація секунд | |
setb TR0 | ;старт таймера | |
loop: | sjmp loop | ;нескінченний цикл |
timer: | clr TR0 | ;зупинка таймера |
inc R7 | ;20*50мС=1С | |
cjne R7,#20,out | ;пройшла 1С? | |
mov R7,#0 | ;так обнуління лічильника циклів по 50мС | |
inc R0 | ;пройшла 1С – инкремент показника секунд | |
cjne R0,#60,out1 | ;пройшла 1 хвилина? | |
mov R0,#1 | ;так - секунди = 1 | |
out1: | call 0940h | ;показати секунди |
out: | mov TL0,#LOW(555) | ;завантаження значення для відліку – 50мС |
mov TH0,#HIGH(555) | ||
setb TR0 | ;старт таймера | |
reti | ;кінець підпрограми обробки переривання |
5. Стан перемикача INT0. Завдяки цій програмі можна обробляти переривання від INT0 без використання переходів на програма-оброблювач переривань і сканувати стан цього виводу порту P3 як скануються перемикачі. Принцип програми складається з сканування всього порту й виділення із цього значення потрібного біта(другого). У судячи із цього біта визначається сигнал на INT0. Програма циклічно скану порт і відповідно до зазначеного біта видає значення на лінійку светодиодов. Два значення - усі запалені - INT0=1; Половина запалена - INT0=0
Текст програми:
cseg | ||
org 2000h | ||
jmp main | ;перехід до виконання головної програми | |
org 2003h | ||
jmp ent | ;перехід до виконання програми обробки переривання | |
main: | mov IE,#10000001b | ;дозволяємо переривання від INT0 |
loop: | mov A,P3 | ;сканування значень на порту P3 (INT0 – P3.2) |
jb Acc.2,true | ;INT0=1? | |
jmp false | ;немає | |
true: | mov DPTR,#0FFF1h | ;так візуалізація |
mov A,#255 | ;запалити всі светодиоды – INT0=1 | |
movx @DPTR,A | ||
jmp loop | ;нескінченне сканування | |
false: | mov DPTR,#0FFF1h | ;нема - візуалізація |
mov A,#11110000b | ;запалити половину светодиодов – INT0=0 | |
movx @DPTR,A | ||
jmp loop | ;нескінченне сканування | |
ent: | clr EX0 | ;прийшов сигнал INT0 |
mov DPTR,#0FFF2h | ;вивід значень перемикачів на лінійку светодиодов | |
movx A,@DPTR | ||
mov DPTR,#0FFF1h | ||
movx @DPTR,A | ||
call 0230h | ;затримка для фіксації візуалізації | |
setb EX0 | ;дозвіл переривання від INT0 | |
reti | ;кінець підпрограми обробки переривання |
7 ІНДИВІДУАЛЬНЕ ЗАВДАННЯ
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13