📄 accesscontrol-51.asm
字号:
lcall sector_erase ;擦除扇区(只能1个扇区一起擦除,只有要写的字节为空时才能写入)
lcall delay
CLR GH
ajmp START1
AJ10: cjne a,#2,AJ11 ;是否是修改本机电话号码?
mov dph,#22h ;第2扇区存本机电话号码
mov dpl,#00h
ajmp AJ9
AJ11: cjne a,#3,AJ12 ;是否是修改本机地址?
mov dph,#24h ;第3扇区存本机地址
mov dpl,#00h
ajmp AJ9
AJ12: lcall ftsy ;按了改号键后第1个键值不是1、2、3告警
lcall d100ms
lcall tftsy
lcall d100ms
lcall ftsy
lcall d100ms
lcall tftsy
ajmp START1
AJ13: MOV A,B ;取回该键值并将该键值保存在相应的扇区储存单元
mov dpl,r0 ;dph的值在檫除时未变
lcall byte_program ;写字节
inc r0 ;存储地址+1
ajmp START1
AJ14: cjne a,#0EH,AJ18 ;是否是在灾情状态下按的0~9键(呼叫控制器中键值=0CH)
djnz r6,AJ18
MOV zqh2,B ;取回该键值并将该键值保存在灾情程度中
;将02H+本机地址+灾情种类+灾情程度+03H发出
mov yx,#28h ;7512的输出到电台的mic
lcall dk
;SETB MOD1 ;7512处于发
CLR MOD1
setb ptt_d ;电台处于发
lcall d100ms
mov r2,#00h ;记本机地址号码位数
mov r1,#bjdz ;存本机地址起始
mov dph,#24h ;调出第3扇区存的本机地址
mov r0,#00h
AJ15: mov dpl,r0
lcall byte_read
cjne a,#0ffh,AJ19
MOV WSZC,r2 ;暂存本机地址位数
MOV R7,#3 ;发R7遍
AJ16: lcall d10ms ;每遍之间延时
MOV SBUF,#02H ;通过电台发送数据:02H+本机地址+灾情种类+灾情程度+03H
JNB TI,$
CLR TI
MOV SBUF,#"Z"
JNB TI,$
CLR TI
mov r1,#bjdz ;本机地址起始
AJ17: mov a,@r1
add a,#30h ;将16进制转换成ASC码
MOV SBUF,a ;发本机地址码
JNB TI,$
CLR TI
inc r1
djnz r2,AJ17 ;读本机地址码时记的位数
mov a,zqh1 ;灾情种类
add a,#30h ;将16进制转换成ASC码
MOV SBUF,a ;发灾情种类
JNB TI,$
CLR TI
mov a,zqh2 ;灾情程度
add a,#30h ;将16进制转换成ASC码
MOV SBUF,a ;发灾情程度
JNB TI,$
CLR TI
MOV SBUF,#03H ;发03H
JNB TI,$
CLR TI
mov R2,WSZC ;取回本机地址位数
djnz r7,AJ16
lcall d100ms
clr ptt_d ;电台处于收状态
setb mod1 ;7512处于收
lcall d100ms
mov GNJZC,#0AH ;功能键默认为无线
AJMP AJ0A ;到无线按键
AJ18: MOV zqh1,B ;取回该键值并将该键值保存在灾情种类中
ajmp START1
AJ19: mov @r1,a
inc r0
inc r1
inc r2
AJMP AJ15
;*******PTT按键******************************************
PTT0: jb ptt_s,ZL0 ;判断手柄是否按下?
lcall d10ms ;消抖
jb ptt_s,ZL0
MOV A,GNJZC ;判断是在何种功能状态下按的PTT
CJNE A,#0AH,PTT01 ;在与无线通话状态下按的PTT
SETB ptt_d ;电台发
jnb ptt_s,$
lcall d100ms
CLR ptt_d ;电台不发
ajmp START1
PTT01: CJNE A,#0BH,PTT02 ;在与有线通话状态下按的PTT
jnb ptt_s,$
lcall d100ms
ajmp START1
PTT02: CJNE A,#0CH,ZL0 ;在无线与有线通话状态下按的PTT
mov yx,#52h ;电话的pnone到电台的mic:发信号
lcall DK ;打开开关
mov yx,#43h ;电台的phone到电话的mic
lcall gd ;打开开关
SETB ptt_d ;电台发
jnb ptt_s,$
mov yx,#52h ;电话的pnone到电台的mic:发信号
lcall gd ;打开开关
mov yx,#43h ;电台的phone到电话的mic
lcall dk ;打开开关
lcall d100ms
CLR ptt_d ;电台不发
ajmp START1
;*******收到振铃信号*************************************
ZL0: JB RV,CK0 ;收到振铃信号否?
LCALL D100MS
JB RV,CK0
mov t0ms,#03h ;T0模式:0_1K单音;1_串口收到第1个字节启动定时;2_拨号后等待回答
MOV T0HZC,#0FDH ;3_振铃
MOV T0LZC,#0BFH ;533Hz用46.4ms;666Hz用46.4ms模拟振铃音
mov r5,#49 ;49*0.938ms=46.4ms
setb zlbz ;振铃标志:533Hz=1、666Hz=0
SETB TR0 ;打开定时器0
MOV YX,#1CH ;发提示音:BELL脚输出到放大器2输入
lcall DK
lcall kyx ;有线灯亮
lcall gwx ;无线灯灭
ZL1: jnb RV,ZL3 ;振铃期间判断有键按下否?
LCALL D100MS
ZL2: clr tr0 ;停止振铃
lcall kwx ;无线灯亮
lcall gyx ;有线灯灭
MOV YX,#1CH ;发提示音:BELL脚输出作为提示音
lcall GD
tz1: AJMP START1
ZL3: JB KEY,ZL1 ;检测是否有键按下
ajmp ZL2
;*******收到串口数据*************************************
CK0: JNB CKJSBZ,tz1 ;收到串口数据否?
mov yx,#38h ;电台的phone到7512的I\O
lcall GD ;关断
mov yx,#67h ;8880输出到7512的EAI端
lcall DK ;打开开关
mov yx,#48h ;7512的I\O到电话的mic
lcall DK ;打开开关
setb LRC ;有线摘机状态
lcall d100ms
mov r2,#00h ;记对方电话号码位数便于拨号用
mov r1,#dfhm ;存对方电话号码
mov dph,#20h ;调出第1扇区存的对方电话号码
mov r0,#00h
CK1: mov dpl,r0
lcall byte_read
cjne a,#0ffh,CK2
ajmp ck3
CK2: mov @r1,a
inc r0
inc r1
inc r2
ajmp ck1
ck3: mov r3,#00h ;记本机电话号码位数便于发送给对方用
mov r1,#bjhm ;存本机电话号码
mov dph,#22h ;调出第2扇区存的本机电话号码
mov r0,#00h
CK4: mov dpl,r0
lcall byte_read
cjne a,#0ffh,CK5
ajmp ck6
CK5: ADD A,#30H ;16进制转换成ASC码
mov @r1,a
inc r0
inc r1
inc r3
ajmp ck4
;拨号
CK6: setb LRC ;有线摘机状态
lcall d100ms
lcall d100ms
lcall d100ms
lcall d100ms
mov r1,#dfhm ;存的对方电话号码
ck7: LCALL CRAB ;发双音
mov a,@r1 ;取对方电话号码
ANL A,#0FH
cjne a,#00h,ck8
MOV A,#0AH ;键盘值=0时发0A
ck8: ORL A,#10H ;发数字低4位决定
MOV MT8880,A
SETB CP
CLR CP
LCALL FSY ;发双音100ms
LCALL TFSY ;停发双音
lcall D100MS
inc r1
djnz r2,ck7 ;拨完对方号码
mov yx,#67h ;断开8880输出到7512的EAI端
lcall GD
mov yx,#48h ;断开7512的I\O到电话的mic
lcall GD
mov yx,#58h ;电话的phone到7512的I\O:收有线的数据
lcall DK ;打开
mov yx,#7fh ;7512的RX到单片机RX:有线数据到单片机
lcall DK ;打开开关
mov t0ms,#02h ;T0模式:0_1K单音;1_串口收到第1个字节启动定时;2_拨号后等待回答
MOV T0HZC,#10H ;T0初始值设置100ms:在200*100MS内收到应答才行
MOV T0LZC,#00H ;
mov th0,T0HZC
mov tl0,T0LZC
mov r4,#200 ;20S内收到信息处理器的应答才发数据到信息处理器
clr clqyd ;20S内收到信息处理器的应答=1
CLR CKQSBZ
CLR CKJSBZ
SETB TR0 ;打开定时器0
jnb clqyd,$ ;20S内收到信息处理器的应答则发1遍就挂机、未收到也发1遍挂机
mov yx,#7fh ;关断7512的RX到单片机RX
lcall GD ;关断
mov yx,#58h ;电话的phone到7512的I\O
lcall GD ;关断
mov yx,#38h ;电台的phone到7512的I\O
acall GD ;关断
mov yx,#48h ;连接7512的I\O到电话的mic
acall DK
CLR MOD1 ;7512处于发
lcall d100ms
MOV R0,#CKQS ;开始发送信息
ck9: cjne @r0,#03h,ck11
mov r0,#bjhm ;发本机号码
ck10: MOV SBUF,@r0 ;通过串口发送数据:02H 灾情地址代码 灾情代码 本机电话号码 03H
JNB TI,$
CLR TI
djnz r3,ck12 ;R3存的是本机号码位数
mov a,#03h ;发结束字符03H
MOV SBUF,a
JNB TI,$
CLR TI
clr ckqsbz
clr ckjsbz
clr clqyd
SETB MOD1 ;7512处于收
lcall d100ms
mov yx,#58h ;电话的phone到7512的输入端:收数据用
lcall DK ;打开开关
mov yx,#7fh ;7512的RX到单片机:无线数据到单片机
lcall DK ;打开开关
mov yx,#48h ;连接7512的I\O到电话的mic
acall gd
ajmp AJ3a ;去挂机
ck11: MOV SBUF,@r0 ;通过串口发送数据:02H 灾情地址代码 灾情代码 本机电话号码 03H
JNB TI,$
CLR TI
inc r0
ajmp ck9
ck12: inc r0
ajmp ck10
;********外部中断服务程序********************************
BINGKOU: PUSH PSW
PUSH A
NEXTA: POP A
POP PSW ;中断返回
RETI
;********串口接收数据中断服务程序***********************
PCTOMCU: PUSH PSW
PUSH A
;clr et0
JNB RI,NEXTB ;TI=1,为发送中断
CLR RI ;清接收中断标志
MOV A,SBUF ;读出串口接收的数据
JB CKJSBZ,NEXTB ;结束符未清不接收新数据
JB CKQSBZ,PCTOMCU1 ;必须找到02H
CJNE A,#02H,NEXTB ;第1个字符是否为02H
SETB CKQSBZ
CLR CKJSBZ
MOV R0,#CKQS
MOV @R0,A ;保存开始字符
mov r4,#2
mov t0ms,#02h ;T0模式:0_1K单音;1_串口收到第1个字节启动定时;2_拨号后等待回答 ///
MOV T0HZC,#10H ;T0初始值设置100ms:在100MS内收到结束符才行
MOV T0LZC,#00H ;实际传输时间11*8.33ms=91.63ms
MOV TH0,T0HZC
MOV TL0,T0LZC
SETB TR0 ;打开定时器0
AJMP PCTOMCU6
PCTOMCU1:cjne r0,#31h,PCTOMCU3
cjne a,#"Z",PCTOMCU7 ;第2个字符是否为Z
AJMP PCTOMCU5
PCTOMCU2:MOV SBUF,#15H ;通过串口发送接收不正确数据
JNB TI,$
CLR TI
CLR CKQSBZ
CLR CKJSBZ
clr tr0 ;关定时器0
AJMP NEXTB
PCTOMCU3:cjne r0,#3Ah,PCTOMCU4
cjne a,#03H,PCTOMCU2 ;第11个字符是否为03H
MOV @R0,A ;保存收到的数据03H
clr tr0 ;关定时器0
MOV SBUF,#06H ;通过串口发送确认数据
JNB TI,$
CLR TI
SETB CKJSBZ
CLR CKQSBZ
AJMP NEXTB
MOV A,#30H
PCTOMCU4:CJNE A,#30H,$+3 ;第3到第10个字节的值必须是30H~39H
JC PCTOMCU2
CJNE A,#3AH,$+3
JNC PCTOMCU2
PCTOMCU5:MOV @R0,A ;保存收到的数据
PCTOMCU6:INC R0
NEXTB: ;setb et0
POP A
POP PSW ;中断返回
RETI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -