ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 24.03.2020

Просмотров: 237

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

ПРИЛОЖЕНИЕ.

Управляющая программа для микроконтроллера

охранно-пропускного устройства

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