📄 accesscontrol-51.asm
字号:
PCTOMCU7:cjne a,#"Y",PCTOMCU8 ;第2个字符是否为Y:信息处理器的应答
setb clqyd ;处理器应答位=1
clr tr0
SETB CKJSBZ
ajmp NEXTB
PCTOMCU8:cjne a,#"T",PCTOMCU9 ;第2个字符是否为T ////
MOV A,GNJZC
CJNE A,#0CH,NEXTB
mov yx,#52h ;电话的pnone到电台的mic:发信号
lcall DK ;打开开关
mov yx,#43h ;电台的phone到电话的mic
lcall gd ;打开开关
;SETB CKJSBZ
SETB ptt_d ;电台发
ajmp NEXTB
PCTOMCU9:cjne a,#"S",PCTOMCU10 ;第2个字符是否为S ////
MOV A,GNJZC
CJNE A,#0CH,NEXTB
mov yx,#52h ;电话的pnone到电台的mic:发信号
lcall gd ;打开开关
mov yx,#43h ;电台的phone到电话的mic
lcall dk ;打开开关
;SETB CKJSBZ
CLR ptt_d ;电台收
ajmp NEXTB
PCTOMCU10:cjne a,#"G",PCTOMCU2 ;第2个字符是否为G ////
MOV A,GNJZC
CJNE A,#0CH,NEXTB
;SETB CKJSBZ
clr lrc ;挂机
mov GNJZC,#0AH ;功能键默认为无线
ajmp NEXTB
;******************************************************
ZDT0: PUSH PSW
PUSH A
mov a,t0ms ;T0模式:0_1K单音;1_串口收到第1个字节启动定时
cjne a,#00h,ZDT0b
CPL BELL ;输出单音
ZDT0a: MOV TH0,T0HZC ;T0初始值恢复
MOV TL0,T0LZC
POP A
POP PSW ;中断返回
RETI
ZDT0b: cjne a,#01h,ZDT0d
CLR CKQSBZ ;在100MS内串口未收到结束符将CKQSBZ和CKJSBZ清0
CLR CKJSBZ
ZDT0c: clr tr0
ajmp ZDT0a
ZDT0d: cjne a,#02h,ZDT0e
djnz r4,ZDT0a ;在r4*100MS内未收到信息处理器的应答则发1遍就挂机
clr tr0
setb clqyd
ajmp ZDT0a
ZDT0e: cjne a,#03h,ZDT0a ;振铃
CPL BELL
jnb zlbz,ZDT0f ;振铃标志:533Hz=1、666Hz=0
djnz r5,ZDT0a
clr zlbz
MOV T0HZC,#0feH ;0.705ms=666.25Hz
MOV T0LZC,#32H
mov r5,#65 ;62*0.705=46.4ms
ajmp ZDT0a
ZDT0f: djnz r5,ZDT0a
setb zlbz
MOV T0HZC,#0fdH ;0.938ms=533Hz
MOV T0LZC,#0bfH
mov r5,#49 ;49*0.938ms=46.4ms
ajmp ZDT0a
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dk: SETB ST ;打开MT8816开关
SETB DI
CLR ST
ret
gd: SETB ST ;关断MT8816开关
clr DI
CLR ST
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CRAB: MOV MT8880,#01011000B ;写CRA
SETB CP
CLR CP
MOV MT8880,#01010001B ;写CRB
SETB CP
CLR CP
RET
FSY: MOV MT8880,#01010001B ;发双音100ms
SETB CP
CLR CP
LCALL D100MS
RET
TFSY: MOV MT8880,#01010000B ;双音停发
SETB CP
CLR CP
RET
FDY: MOV MT8880,#01011000B ;写CRA发单音
SETB CP
CLR CP
MOV MT8880,#01010101B ;写CRB发单音
SETB CP
CLR CP
MOV MT8880,#01011101B ;写数
SETB CP
CLR CP
MOV MT8880,#01010001B ;发单音
SETB CP
CLR CP
RET
TFDY: MOV MT8880,#01010000B ;停发单音
SETB CP
CLR CP
RET
FTSY: MOV YX,#1CH ;发提示音:BEII输出到放大器2的输入
lcall DK
mov t0ms,#00h ;T0模式:0_1K单音;1_串口收到第1个字节启动定时
MOV T0HZC,#0FEH ;T0初始值设置(0.5ms)
MOV T0LZC,#0CCH
SETB TR0
RET
TFTSY: MOV YX,#1CH ;停发提示音:BELL脚输出作为提示音
lcall GD
CLR TR0
RET
SR: MOV MT8880,#01111111B ;读SR
SETB CP
CLR CP
RET
DR: MOV MT8880,#01011111B ;读DR
SETB CP
CLR CP
RET
DTMF: CLR SYCX
LCALL CRAB
LCALL SR
JB AR3,DTMF1
SETB SYCX
DTMF1: RET
;************发送1个字节到HD7279,高位在前**********
SEND: PUSH ACC
MOV BIT_COUNT,#8
LCALL LONG_DELAY
SEND_LOOP: MOV C,DATA_OUT.7 ;输出1位
MOV DAT,C
SETB CLK
MOV A,DATA_OUT
RL A
MOV DATA_OUT,A
LCALL SHORT_DELAY
CLR CLK
LCALL SHORT_DELAY
DJNZ BIT_COUNT,SEND_LOOP ;检测是否8位均发送完毕
CLR DAT
POP ACC
RET
;************从HD7279接收1个字节,高位在前*****************
RECEIVE: PUSH ACC
MOV BIT_COUNT,#8 ;设定计数器=8
SETB DAT
LCALL LONG_DELAY
RECEIVE_LOOP:SETB CLK
LCALL SHORT_DELAY
MOV A,DATA_IN ;数据左移
RL A
MOV DATA_IN,A
MOV C,DAT ;读取1位数据
MOV DATA_IN.0,C
CLR CLK
LCALL SHORT_DELAY
DJNZ BIT_COUNT,RECEIVE_LOOP ;是否已接收8位数据
CLR DAT
POP ACC
RET
;延时子程序
LONG_DELAY: MOV TIMER4,#16 ;设定延时为约50us
DJNZ TIMER4,$
RET
SHORT_DELAY: MOV TIMER4,#2 ;设定延时为约8us
DJNZ TIMER4,$
RET
;-----------------------------------------------------------------------
;读1字节
;调用前需打开iap功能
;入口:dptr=字节地址
;返回;a=读出字节
byte_read: mov isp_contr,#enable_isp ;打开iap功能,设置flash操作等待时间
mov isp_cmd,#01 ;select read AP Mode
mov isp_addrh,dph
mov isp_addrl,dpl
clr ea
mov isp_trig,#46h
mov isp_trig,#0b9h
nop
mov a,isp_data ;数据在isp_data
setb ea
lcall iap_disable
ret
;-------------------------------------------
;字节编程
;调用前需打开iap功能
;入口:dptr=字节地址#,a=需编程字节的数据
byte_program:mov isp_contr,#enable_isp ;打开iap功能,设置flash操作等待时间
mov isp_cmd,#02 ;select read AP Mode
mov isp_addrh,dph
mov isp_addrl,dpl
mov isp_data,a ;数据进isp_data
clr ea
mov isp_trig,#46h
mov isp_trig,#0b9h
nop
setb ea
lcall iap_disable
ret
;-------------------------------------------
;擦除扇区,入口:dptr=扇区地址
sector_erase:mov isp_contr,#enable_isp ;打开iap功能,设置flash操作等待时间
mov isp_cmd,#03 ;select read AP Mode
mov isp_addrh,dph
mov isp_addrl,dpl
clr ea
mov isp_trig,#46h
mov isp_trig,#0b9h
nop
setb ea
lcall iap_disable
ret
;-------------------------------------------
iap_disable: mov isp_contr,#0 ;关闭iap功能,清与isp有关的特殊功能寄存器
mov isp_cmd,#0
mov isp_trig,#0
ret
;-------------------------------------------
delay: clr a
mov TIMER4,a
mov TIMER5,a
mov TIMER6,#1h
delay_loop: djnz TIMER4,delay_loop
djnz TIMER5,delay_loop
djnz TIMER6,delay_loop
ret
;***********************************************************
DGB: LCALL GWX ;段关闭:除电源灯外全灭
LCALL GYX
LCALL GZJ
LCALL GZQ
LCALL GGH
RET
GDY: MOV DATA_OUT,#0C0H ;段关闭指令
LCALL SEND
MOV DATA_OUT,#48 ;电源灯
LCALL SEND
RET
GWX: MOV DATA_OUT,#0C0H ;段关闭指令
LCALL SEND
MOV DATA_OUT,#49 ;无线灯
LCALL SEND
RET
GYX: MOV DATA_OUT,#0C0H ;段关闭指令
LCALL SEND
MOV DATA_OUT,#50 ;有线灯
LCALL SEND
RET
GZJ: MOV DATA_OUT,#0C0H ;段关闭指令
LCALL SEND
MOV DATA_OUT,#51 ;转接灯
LCALL SEND
RET
GZQ: MOV DATA_OUT,#0C0H ;段关闭指令
LCALL SEND
MOV DATA_OUT,#52 ;灾情灯
LCALL SEND
RET
GGH: MOV DATA_OUT,#0C0H ;段关闭指令
LCALL SEND
MOV DATA_OUT,#53 ;改号灯
LCALL SEND
KDY: MOV DATA_OUT,#0E0H ;段点亮指令
LCALL SEND
MOV DATA_OUT,#48 ;电源灯
LCALL SEND
RET
KWX: MOV DATA_OUT,#0E0H ;段点亮指令
LCALL SEND
MOV DATA_OUT,#49 ;无线灯
LCALL SEND
RET
KYX: MOV DATA_OUT,#0E0H ;段点亮指令
LCALL SEND
MOV DATA_OUT,#50 ;有线灯
LCALL SEND
RET
KZJ: MOV DATA_OUT,#0E0H ;段点亮指令
LCALL SEND
MOV DATA_OUT,#51 ;转接灯
LCALL SEND
RET
KZQ: MOV DATA_OUT,#0E0H ;段点亮指令
LCALL SEND
MOV DATA_OUT,#52 ;灾情灯
LCALL SEND
RET
KGH: MOV DATA_OUT,#0E0H ;段点亮指令
LCALL SEND
MOV DATA_OUT,#53 ;改号灯
LCALL SEND
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
D10MS: MOV TIMER7,#20
D10MS1: MOV TIMER6,#153
DJNZ TIMER6,$
DJNZ TIMER7,D10MS1
RET
D100MS: MOV TIMER7,#200
D100MS1:MOV TIMER6,#153
DJNZ TIMER6,$
DJNZ TIMER7,D100MS1
RET
D3MS: MOV TIMER7,#6
D3MS1: MOV TIMER6,#153
DJNZ TIMER6,$
DJNZ TIMER7,D3MS1
RET
D50US: MOV TIMER7,#20
DJNZ TIMER7,$
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -