Смекни!
smekni.com

Мікропроцесорна техніка (стр. 16 из 17)


Текст програми:

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 ІНДИВІДУАЛЬНЕ ЗАВДАННЯ

Постановка завдання

Темою індивідуального завдання є розроблення пристрою для регістрації подій. Для регістрації подій треба використати 8 дискретних датчиків які скануються з інтервалом 50 мС. По перериванню таймера 1 виконується підпрограма сканування датчиків та запису інформації про подію в зовнішню пам`ять (кількість подій – 8). При записі інформації про подію добавляється і час події, який відраховує таймер 0.

Розробка схеми алгоритму програми

Першим блоком програми повинен бути блок завантаження потрібних значень до регістрів таймерів та обнуління регістрів, які потрібні для зберігання інформацій про час, різні лічильники та для ін.

Запуск таймерів (0 та 1) важлива функція, яка дозволяє почати відлік часу та відлік інтервалів для сканування датчиків.

Щоб забезпечити паралельне реагування на події від таймерів та виводу INT0, який дає змогу користувачу проглянути записи про події в резидентній пам’яті програм, треба зациклити основну програму й надати змогу підпрограмам обробки переривань виконуватися після приходу керуючого сигналу.

Отже, для кожного пристрою – таймерів 0 та 1, вивід INT0, треба написати свою підпрограму. На схемі алгоритму такі підпрограми зображені в блоках 8, 10 та 11.

Схема алгоритма представлена на ПН5.091504.15.04.00Д

Розробка схеми електричної принципової

Так як даний пристрій базується на УНМС-2, то доцільним було б розробити схему електричну принципову керуючись готовою схемою УНМС-2, тобто відібрати потрібні елементи, а інші не враховувати.

Виходячи із завдання можна припустити, що центральним елементом схеми буде МК Atmel AT89S8252, який буде здійснювати управління над усіма іншими пристроями. Також в схеми слід включити і елементи індикації такі як семисегментний індикатор, рідкокристалічний дисплей на лінійку світо діодів. Судячи з цього треба додати до схеми буферні елементи, які б розвантажили порти МК. Схема представлена на креслені ПН5.091504.15.04.Е3


Програма на мові assembler

cseg
org 2000h
jmp main ;початок головной програми
org 2003h
jmp select ;перехід по перериванню від INT0
org 200Bh
jmp timer ;перехід по перериванню від таймера 0
org 201bh
jmp scan ;перехід по перериванню від таймера 1
main: mov TMOD,#17 ;конфігурування таймерів як 16 розрядних
mov IE,#138 ;дозвіл перериванням
setb EX0 ;дозвіл переривання від INT0
setb PT0 ;встановлення найвищого пріоритета таймеру 0
mov TL0,#LOW(555) ;завантаження у таймерт значення 50 мС
mov TH0,#HIGH(555)
mov TL1,#LOW(555)
mov TH1,#HIGH(555)
mov R0,#0 ;обнулення всіх регістрів
mov R1,#0
mov R2,#0
mov R3,#0
mov R7,#0
call tvis ;визов процедури візуалізації часу
setb TR0 ;запуск таймерів
setb TR1
loop: sjmp loop ;бескінечний цикл
timer: clr TR0 ;початок процедури обробки перивання від таймеру 0
inc R7 ;лічильник переривань
cjne R7,#180,out ;переривань було 180?
mov R7,#0 :так обнулення лікильника переривань
inc R0 ;зафіксувати 10 сек. У регістрі секунд
cjne R0,#6,out ;перевірка на те, що пройшла хвилина чи ні
mov R0,#1 ;пройшла – 60 сек = 1 сек
inc R1 ;фіксування 1 хв. У регістрі хвилин
cjne R1,#60,out ;пройшла година?
mov R1,#1 Так
inc R2 ;фіксація часу
cjne R2,#24,out ;пройшов день
mov R2,#0
inc R3
cjne R3,#32,out ;пройшов місяць
mov R3,#1
out: call tvis ;візуалізація часу кожні 10 сек.
mov TL0,#LOW(555)
mov TH0,#HIGH(555)
setb TR0
reti
scan: clr TR1 ;програмне сканування датчиків
mov DPTR,#0FFF2h ;адреса датчиків
movx A,@DPTR ;зняти значення датчиків
jz not_al ;хоча б один датчик спрацював? Якщо ні– у кінець
jnb Acc.0,n1 ;так – побітна перевірка слова від датчиків
mov R7,#1 ;перевірка 1 датчика і якщо він спрацював, то записати
call alarm ;інформацію про подвю
n1: jnb Acc.1,n2 ;2-ий
mov R7,#2
call alarm
n2: jnb Acc.2,n3 ;3-ій
mov R7,#2
call alarm
n3: jnb Acc.3,n4 ;4-ий
mov R7,#3
call alarm
n4: jnb Acc.4,n5 ;5-ий
mov R7,#4
call alarm
n5: jnb Acc.5,n6 ;6-ий
mov R7,#5
call alarm
n6: jnb Acc.6,n7 ;7-ий
mov R7,#6
call alarm
n7: jnb Acc.7,not_al ;8-и1
mov R7,#7
call alarm
not_al: mov TL1,#LOW(555)
mov TH1,#HIGH(555)
setb TR1
reti
select: clr EX0 ;підпрограма перегляду записаних подій
clr TR1 :зупинка сканування датчиків
li: mov DPTR,#0FFF2h ;сканування перемикачів для уводу номера події
movx A,@DPTR
anl A,#7 ;маскування не поьрібних розрядів
inc A ;для правильної візуалізації
call get_num ;переведення 2 значення да коду ССІ
mov DPTR,#0FFF7h ;відображення введеної цифри
movx @DPTR,A
call view ;виклик процедури, яка запише до DPTR адресу плдії
jnb P3.2,li ;зациклювання до підтвердження ввіоду
movx A,@DPTR ;відображення інформації про подійю відновідно до
mov DPTR,#0FFF7h ; введеної цифри – номера події
call get_num
movx @DPTR,A
setb EX0
setb TR1
reti
view: mov B,#20h ;процедура запису до DPTR адреси події
mul AB ;так як запис має розмір 20h біт
mov DPTR,#4000h ;перший адрес першої події
mov R5,A ;мл
mov R6,B ;ст
mov A,DPL ;додаймо до DPTR результат множення і отримаємо
add A,R5 ;адрес, за яким записана потрібна користувачу подія
mov DPL,A
mov A,DPH
add A,R6
mov DPH,A
ret
alarm: inc R4 ;підрограма запису події у РПД
cjne R4,#9,norm
mov R4,#0 ;виклик процедури виводу повідомлення об помилки - переповнення
norm: mov A,R4
mov B,#20h
mul AB
mov DPTR,#4000h
mov R5,A ;мл
mov R6,B ;ст
mov A,DPL
add A,R5
mov DPL,A
mov A,DPH
add A,R6
mov DPH,A
mov A,R7
mov B,R0
mov R0,#18h
rec: movx @DPTR,A
inc DPTR
inc DPTR
inc DPTR
inc DPTR
inc DPTR
inc DPTR
inc DPTR
inc DPTR
mov A,@R0
dec R0
dec R0
dec R0
dec R0
dec R0
dec R0
dec R0
nop
djnz R0,rec
mov A,B
movx @DPTR,A
ret
tvis: mov A,R0
mov DPTR,#0FFF1h
movx @DPTR,A
mov A,R1
anl A,#0Fh
cjne A,#9,prov
nplus: call get_num
mov DPTR,#0FFF7h
movx @DPTR,A
jmp st
prov: jnc plus
jmp nplus
plus: call get_num
mov DPTR,#0FFF7h
movx @DPTR,A
mov A,R1
swap A
anl A,#0Fh
inc A
jmp e1
st: mov A,R1
swap A
anl A,#0Fh
e: call get_num
inc DPTR
movx @DPTR,A
mov A,R2
anl A,#0Fh
cjne A,#9,prov1
nplus1: call get_num
mov DPTR,#0FFF9h
movx @DPTR,A
jmp st1
prov1: jnc plus1
jmp nplus1
plus1: call get_num
mov DPTR,#0FFF9h
movx @DPTR,A
mov A,R1
swap A
anl A,#0Fh
inc A
jmp e1
st1: mov A,R1
swap A
anl A,#0Fh
e1: call get_num
inc DPTR
movx @DPTR,A
ret
get_num: inc A
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 00111111b ;0
db 00000110b ;1
db 01011011b ;2
db 01001111b ;3
db 01100110b ;4
db 01101101b ;5

ВИСНОВКИ

В результаті виконання практики я набув практичні навички програмування і вирішення різноманітних задач. Також в ході практики були виконані всі вимоги технічного завдання і звіт включає в себе такі розділи, як – охорона праці, структура, призначення та взаємодія програмного забезпечення УНМС-2, технічне описання стенду УНМС-2, програми типових процедур, тестові програми та індивідуальне завдання.

В результаті проходження практики було вивчено: