Текст програми:
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 |
ВИСНОВКИ
В результаті проходження практики було вивчено: