ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 18.02.2020
Просмотров: 230
Скачиваний: 3
ПРИЛОЖЕНИЕ.
Управляющая программа для микроконтроллера
охранно-пропускного устройства
led1 bit p1.0 ;( индикация для вх. створки)
led2 bit p1.1 ;(индикация для вых. створки)
lock1 bit p1.2 ;(управление вх.замком)
lock2 bit p1.3 ;(управление вых.замком)
sens1 bit p1.4 ;(датчик состояния вх.замка)
sens2 bit p1.5 ;(датчик состояния вых.замка)
snd bit p1.6 ;(звуковое подтв. команд)
wdt bit p1.7 ;(управление сбросом процессора WATCHDOG)
hwrk1 bit p3.2 ;(ручное управление вх1)
hwrk2 bit p3.3 ;(ручное управление вх2)
recin bit p3.4 ;вход\выход (вход тм счит.)
recout bit p3.5 ;вход\выход (выход тм счит.)
mfree bit 0
mclose bit 1
mregs bit 2
mhard bit 3
mslave bit 4
mtest bit 5
buffer bit 16
find bit 17
wr_rd bit 18
clock bit 19
from bit 21
wait1 bit 22
wait2 bit 23
sr_in bit 24
sr_out bit 25
stop1 bit 26
stop2 bit 27
wrbuff bit 28
needwr bit 29
en_qt bit 30
enter_ bit 31
iden1 bit 32
iden2 bit 33
cseg
org 0000h
clr ie.7
ajmp init
org 000bh
ajmp time0
org 0023h
;@(050h) - базовый адресс txd-данных
;@(040h) - базовый адресс rxd-данных
push psw
push 0h
jnb scon.1,s_wr
clr scon.1
mov r0,050h
cjne r0,#059h,s_rd1
clr wrbuff
ajmp s_end
s_rd1: jnc $
cjne r0,#051h,s_rd2
s_rd2: jc $
setb wrbuff
mov sbuf,@r0
inc 050h
s_wr: jnb scon.5,s_wr1
mov r0,sbuf
clr scon.0
cjne r0,#0aah,s_end
mov 040h,#041h
setb buffer
mov 04fh,#0h
jbc scon.5,s_end
s_wr1: jnb scon.0,s_end
clr scon.0
mov r0,040h
cjne r0,#041h,s_wr2
s_wr2: jc $
cjne r0,#04bh,s_wr3
s_wr3: jnc s_end
mov @r0,sbuf
mov 04fh,#0h
inc 040h
s_end: pop 0h
pop psw
reti
;
time0:
push psw
push 0h
push 01h
push 02h
push 03h
push acc
push b
push dpl
push dph
clr tcon.4
;---------------------
jnb sens1,ftr1
inc 011h
mov 012h,#0h
mov a,011h
cjne a,#064h,$+3
jc ftr2
setb sr_in
ajmp ftr2
ftr1: inc 012h
mov 011h,#0h
mov a,012h
cjne a,#064,$+3
jc ftr2
clr sr_in
ftr2: jnb sens2,ftr3
inc 013h
mov 014h,#0h
mov a,013h
cjne a,#064h,$+3
jc ftr_end
setb sr_out
ajmp ftr_end
ftr3: inc 014h
mov 013h,#0h
mov a,014h
cjne a,#064,$+3
jc ftr_end
clr sr_out
ftr_end:
;---------------------
djnz 05ch,wt
djnz 05dh,wt
setb wait1
wt: djnz 05eh,st
djnz 05fh,st
setb wait2
;---------------------
st: djnz 015h,tm
djnz 016h,tm
setb stop1
tm: djnz 017h,tm0
djnz 018h,tm0
setb stop2
;---------------------
tm0: mov tl0,#0h
mov th0,#0f8h
jb needwr,tm3
jb buffer,tm1
mov 04fh,#0h ;04fh-очистка time out
ajmp tm4
tm1: inc 04fh
mov a,04fh
cjne a,#023h,tm2
tm2: jc tm3
setb clock
tm3: acall (serial)
tm4: pop dph
pop dpl
pop b
pop acc
pop 03h
pop 02h
pop 01h
pop 0h
pop psw
setb tcon.4
reti
;------Start progr. init.----
init:
mov p1,#0ffh ;init. p1
mov p3,#0ffh ;init. p3
mov sp,#060h
mov tmod,#021h
mov tl0,#0h
mov th0,#0f8h
mov th1,#0cch
mov tcon,#050h
mov scon,#0f8h
mov 040h,#041h
clr wrbuff
clr buffer
clr needwr
clr find
setb wait1
setb wait2
mov 05ch,#01h
mov 05dh,#01h
mov 05eh,#01h
mov 05fh,#01h
mov ip,#0h
mov ie,#092h
;------End progr. init.------
enter:
jbc clock,init
cpl wdt
jb hwrk1,mod
setb en_qt
setb enter_
clr mslave
ajmp work
mod: jb hwrk2,mod0
setb en_qt
clr enter_
clr mslave
ajmp work
mod0: mov dptr,#0h
movx a,@dptr
rrc a
mov mfree,c
rrc a
mov mclose,c
rrc a
mov mregs,c
rrc a
mov mhard,c
rrc a
mov mslave,c
rrc a
mov mtest,c
jnb mfree,mod1
anl p1,#0f0h
ajmp enter
mod1: jnb mclose,t_lock
orl p1,#0fh
ajmp enter
t_lock:acall (time_locks)
mod2: jb mregs,work
mod3: jb mhard,work
mod4: jb mslave,work
;jnb mtest,enter
;acall (test_device)
;ajmp $
work: acall (ibprog)
clr ie.1
jb find,wrk
jnb en_qt,work_end
clr en_qt
jb enter_,wrk1
ajmp wrk2
wrk: clr find
jnb mslave,wrk0
jb iden1,msl1
ajmp msl2
wrk0: jnb from,wrk2
wrk1: clr lock1
clr led1
clr iden1
msl1: clr wait1
mov 05ch,#0h
mov 05dh,05bh
ajmp work_end
wrk2: clr lock2
clr led2
clr iden2
msl2: clr wait2
mov 05eh,#0h
mov 05fh,05bh
work_end:
setb ie.1
ajmp enter
;
time_locks:
mov dptr,#01h
movx a,@dptr
mov 05bh,a
inc dptr
movx a,@dptr
mov 019h,a
clr ie.1
jnb wait1,tlk
clr stop1
mov 015h,#0h
mov 016h,019h
tlk: jb sr_in,tlk1
clr lock1
setb wait1
clr stop1
mov 015h,#0h
mov 016h,019h
tlk1: jnb wait1,tlk2
clr iden1
jnb stop1,tlk2
setb lock1
setb led1
;--------------------------
tlk2: jnb wait2,tlk21
clr stop2
mov 017h,#0h
mov 018h,019h
tlk21: jb sr_out,tlk3
clr lock2
setb wait2
clr stop2
mov 017h,#0h
mov 018h,019h
tlk3: jnb wait2,tl_end
clr iden2
jnb stop2,tl_end
setb lock2
setb led2
tl_end:
setb ie.1
ret
;
serial:
cpl wdt
mov r0,040h
mov r1,041h
cjne r1,#083h,ser
cjne r0,#043h,ser4
clr wr_rd
setb en_qt
clr enter_
ajmp ser21
ser: cjne r1,#038h,ser0
cjne r0,#043h,ser4
clr wr_rd
setb en_qt
setb enter_
ajmp ser21
ser0: cjne r1,#05ah,ser1
cjne r0,#045h,ser4
clr wr_rd
ajmp ser2
ser1: cjne r0,#04bh,ser4
cjne r1,#0a5h,ser4
setb wr_rd
ser2: setb needwr
jb wrbuff,ser4
setb wrbuff
ser21: mov 040h,#041h
acall (comp_crc)
setb scon.5
clr buffer
jnz ser4
jnb needwr,ser4
mov 051h,#05ah
ser22: mov dph,042h
mov dpl,043h
jb wr_rd,ser3
acall (mem_read)
acall (comp_crc)
mov 050h,#051h
mov 058h,a
mov sbuf,#0aah
clr needwr
ajmp ser4
ser3: acall (mem_write)
clr wr_rd
mov 051h,#0a5h
ajmp ser22
ser4: ret
;
comp_crc:
clr c
mov a,r0
jb buffer,ccrc0
subb a,#051h
mov r1,#050h
ajmp ccrc1
ccrc0: subb a,#042h
mov r1,#040h
ccrc1: mov r2,a
mov a,#0aah
ccrc2: inc r1
add a,@r1
djnz r2,ccrc2
clr c
xch a,r2
subb a,r2
jnb buffer,ccrc3
dec r0
clr c
subb a,@r0
ccrc3: ret
;
mem_read:
mov r1,#06h
mov r0,#052h
mrd1: movx a,@dptr
mov @r0,a
inc dptr
inc r0
djnz r1,mrd1
ret
;
ibprog:
clr find
jnb stop1,ibpr1
jnb wait1,ibpr1
jb iden1,ibpr1
acall (in_ibutton)
jc ibpr1
setb from
ajmp ibpr2
ibpr1: jnb stop2,ibpr_end
jnb wait2,ibpr_end
jb iden2,ibpr_end
acall (out_ibutton)
jc ibpr_end
clr from
ibpr2: setb find
acall (tm_find)
jnb mslave,ibpr_end
jnb from,ibpr3
setb iden1
ajmp ibpr_end
ibpr3: setb iden2
ibpr_end:
ret
;
mem_write:
mov r0,#044h
mov r1,#06h
acall (s_protection)
mwr1: mov a,@r0
movx @dptr,a
dec r1
mov a,#03fh
anl a,dpl
subb a,#03fh
jnz mwr4
mwr2: acall (toggle_bit)
jnz mwr6
cjne r1,#0h,mwr3
ajmp mwr6
mwr3: acall (s_protection)
mwr4: cjne r1,#0h,mwr5
ajmp mwr2
mwr5: inc r0
inc dptr
ajmp mwr1
mwr6: clr wr_rd
ret
;
toggle_bit:
mov r2,#0c0h
djnz r2,$
mov r2,#02h
tbit1: mov r3,#0ffh
tbit2: movx a,@dptr
anl a,#040h
mov b,a
movx a,@dptr
anl a,#040h
subb a,b
jz tbit3
djnz r3,tbit2
djnz r2,tbit1
tbit3: ret
;
s_protection:
jnb wr_rd,$
push dpl
push dph
push acc
mov dptr,#05555h
mov a,#0aah
movx @dptr,a
mov dptr,#02aaah
mov a,#055h
movx @dptr,a
mov dptr,#05555h
mov a,#0a0h
movx @dptr,a
pop acc
pop dph
pop dpl
ret
;
tm_find:
;r0- начальный адресс загрузки результата чтения (сравнения данных)
;dptr - адресс данных
mov dptr,#06h
mov r4,#0ch
tm_f1: mov r3,#0ffh
tm_f2: mov r0,#031h
mov r2,#06h
tm_f3: movx a,@dptr
clr c
subb a,@r0
jnz tm_f4
inc dptr
inc r0
djnz r2,tm_f3
tcc0: setb ie.7
cpl wdt
clr ie.7
jb wrbuff,tcc0
setb wrbuff
jb from,tcc1
mov 051h,#0a0h
ajmp tcc2
tcc1: mov 051h,#055h
tcc2: acall (sys_crc)
mov 050h,#051h
mov 058h,a
mov sbuf,#0aah
setb ie.7
ajmp tm_f6
tm_f4: mov a,dpl
add a,r2
mov dpl,a
jnc tm_f5
inc dph
tm_f5: djnz r3,tm_f2
djnz r4,tm_f1
clr find
tm_f6: ret
;
sys_crc:
mov 052h,031h
mov 053h,032h
mov 054h,033h
mov 055h,034h
mov 056h,035h
mov 057h,036h
mov r1,#050h
mov r2,#07h
mov a,#0aah
scrc1: inc r1
add a,@r1
djnz r2,scrc1
clr c
xch a,r2
subb a,r2
ret
;
ibmaster:
mov a,030h
cjne a,#01h,ibm_end
mov a,031h
cjne a,#0cah,ibm_end
mov a,032h
cjne a,#0d0h,ibm_end
mov a,033h
cjne a,#087h,ibm_end
mov a,034h
cjne a,#02h,ibm_end
mov a,035h
cjne a,#0h,ibm_end
mov a,036h
cjne a,#0h,ibm_end
mov a,037h
cjne a,#023h,ibm_end
ajmp ibm_ok
ibm_end:
setb c
ibm_ok:
ret
;
in_ibutton:
clr ie.7
jnb recin,ib_end
mov a,#0ffh
clr recin
djnz acc,$
cpl a
djnz acc,$
setb recin
mov a,#08h
ib_low:
jb recin,ib_high
djnz acc,ib_low
ajmp ib_end
ib_high:
clr c
mov a,#096h
ib_wait:
orl c,/recin
djnz acc,ib_wait
jnc ib_end
setb ie.7
cpl a
djnz acc,$
mov a,#033h
acall (ib1_data)
mov r0,#030h
mov r1,#08h
mov r2,#0h
ib_cod:
mov a,#0ffh
acall (ib1_data)
mov @r0,a
orl a,r2
mov r2,a
inc r0
djnz r1,ib_cod
jz ib_end ;ошибка если все биты равны нулю
acall (ibcrc)
cjne r2,#0h,ib_end ;r2-crc (верно r2=0)
ajmp ib_ok
ib_end:
setb c
ib_ok: setb ie.7
ret
;
ib1_data:
clr ie.7
mov r4,#08h
ib1_bit:
mov r3,#07h
rrc a
clr recin
djnz r3,$
mov r3,#07h
mov recin,c
djnz r3,$
mov c,recin
mov r3,#030h
djnz r3,$
setb recin
mov r3,#0ah
djnz r3,$
djnz r4,ib1_bit
rrc a
setb ie.7
ret
;
out_ibutton:
clr ie.7
jnb recout,ib2_end
mov a,#0ffh
clr recout
djnz acc,$
cpl a
djnz acc,$
setb recout
mov a,#08h
ib2_low:
jb recout,ib2_high
djnz acc,ib2_low
ajmp ib2_end
ib2_high:
clr c
mov a,#096h
ib2_wait:
orl c,/recout
djnz acc,ib2_wait
jnc ib2_end
setb ie.7
cpl a
djnz acc,$
mov a,#033h
acall (ib2_data)
mov r0,#030h
mov r1,#08h
mov r2,#0h
ib2_cod:
mov a,#0ffh
acall (ib2_data)
mov @r0,a
orl a,r2
mov r2,a
inc r0
djnz r1,ib2_cod
jz ib2_end ;ошибка если все биты равны нулю
acall (ibcrc)
cjne r2,#0h,ib2_end;2- crc (верно r2=0)
ajmp ib2_ok
ib2_end:
setb c
ib2_ok:
setb ie.7
ret
;
ib2_data:
clr ie.7
mov r4,#08h
ib2_bit:
mov r3,#07h
rrc a
clr recout
djnz r3,$
mov r3,#07h
mov recout,c
djnz r3,$
mov c,recout
mov r3,#030h
djnz r3,$
setb recout
mov r3,#0ah
djnz r3,$
djnz r4,ib2_bit
rrc a
setb ie.7
ret
;
ibcrc:
mov r0,#030h ;r0- начальный адресс проверки
mov r1,#08h ;кол-во проверяемых байт
mov r2,#0h ;crc=0
ib_beg:
mov r3,#08h ;кол-во проверяемых бит
mov a,@r0
mov r4,a
bit_crc:
xrl a,r2
rrc a
mov a,r2
jnc bit_zero
xrl a,#018h
bit_zero:
rrc a
mov r2,a
mov a,r4
rr a
mov r4,a
djnz r3,bit_crc
inc r0
djnz r1,ib_beg
ret