📄 infoprocess-51.asm
字号:
lcall byte_program ;写字节
inc r0 ;存储地址+1
ajmp START1
AJ14: cjne a,#0EH,AJ18 ;是否是在灾情状态下按的0~9键(呼叫控制器中键值=0CH)
djnz r6,AJ18
MOV zqh2,B ;取回该键值并将该键值保存在灾情程度中
;将02H+本机地址+灾情种类+灾情程度+03H发出
SETB REST8816 ;MT8816复位
LCALL D10MS
CLR REST8816
mov yx,#28h ;7512的输出到电台的mic
acall 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
acall 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
mov yx,#48h ;7512的输出到电话的mic ////
acall DK ;打开开关
CLR MOD1 ;7512发
lcall d100ms
MOV SBUF,#02H ;通过电台发送数据:02H+"T"+03H
JNB TI,$
CLR TI
MOV SBUF,#"T" ;接通指令,使接入控制器处于转接状态///
JNB TI,$
CLR TI
MOV SBUF,#03H
JNB TI,$
CLR TI
SETB MOD1
lcall d100ms
jnb ptt_s,$
CLR MOD1
lcall d100ms
MOV SBUF,#02H ;通过电台发送数据:02H+"T"+03H
JNB TI,$
CLR TI
MOV SBUF,#"S" ;断开指令,使接入控制器结束转接状态///
JNB TI,$
CLR TI
MOV SBUF,#03H
JNB TI,$
CLR TI
mov yx,#48h ;7512的输出到电话的mic /////
acall GD ;关断开关
SETB MOD1 ;7512收
lcall d100ms
ajmp START1
PTT02: CJNE A,#0CH,ZL0 ;在无线与有线通话状态下按的PTT
SETB ptt_d ;电台发
jnb ptt_s,$
lcall d100ms
CLR ptt_d ;电台不发
ajmp START1
;*******收到振铃信号*************************************
tz2: ajmp ck0
ZL0: JB RV,tz2 ;收到振铃信号否?
LCALL D100MS
JB RV,tz2
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输入
ACALL DK
lcall kyx ;有线灯亮
lcall gwx ;无线灯灭
jb d1czl,zl1
setb d1czl ;第1次振铃标志=1
mov r7,#3 ;振铃次数
ZL1: jnb RV,ZL3 ;振铃期间判断有键按下否?
LCALL D100MS
ZL2: clr tr0 ;停止振铃
lcall kwx ;无线灯亮
lcall gyx ;有线灯灭
MOV YX,#1CH ;发提示音:BELL脚输出作为提示音
ACALL GD
djnz r7,tz0 ;振铃次数到否? //tz1
ajmp zl4
tz0: AJMP START1
ZL3: JB KEY,ZL1 ;检测是否有键按下
clr tr0 ;停止振铃
lcall kwx ;无线灯亮
lcall gyx ;有线灯灭
MOV YX,#1CH ;发提示音:BELL脚输出作为提示音
ACALL GD
ajmp START1
;自动摘机接收信息
zl4: setb LRC ;有线摘机状态
lcall d100ms
lcall d100ms
lcall d100ms
lcall d100ms
lcall kyx ;有线灯亮
lcall gwx ;无线灯灭
clr d1czl ;第1次振铃标志
mov yx,#38h ;电台的phone到7512的I\O
acall GD ;关断
mov yx,#48h ;连接7512的I\O到电话的mic
acall DK
CLR MOD1 ;7512处于发
lcall d100ms
MOV SBUF,#02h ;发送应答信息:02H Y 03H
JNB TI,$
CLR TI
MOV SBUF,#"Y"
JNB TI,$
CLR TI
MOV SBUF,#03h
JNB TI,$
CLR TI
mov yx,#48h ;断开7512的I\O到电话的mic
acall GD
mov yx,#58h ;电话的phone到7512的I\O:收有线的数据
acall DK ;打开
mov yx,#7fh ;7512的RX到单片机RX:有线数据到单片机
acall DK ;打开开关
SETB MOD1 ;7512处于收
lcall d100ms
mov t0ms,#02h ;T0模式:0_1K单音;1_串口收到第1个字节启动定时;2_拨号后等待回答
MOV T0HZC,#10H ;T0初始值设置100ms:在10*100MS内收到数据
MOV T0LZC,#00H ;
mov th0,T0HZC
mov tl0,T0LZC
mov r4,#10 ;1S内收到接入控制器数据有效
clr clqyd ;1S内未收到接入控制器数据=1
CLR CKQSBZ
CLR CKJSBZ
SETB TR0 ;打开定时器0
zl5: jnb clqyd,zl6 ;1S内收到接入控制器数据转发到计算机,否则挂机退出
clr ckqsbz
clr ckjsbz
clr clqyd
ajmp AJ3a ;去挂机
tz1: AJMP START1
zl6: JNB CKJSBZ,zl5 ;收到串口数据否?
zl7: clr tr0
MOV R0,#CKQS ;开始发送信息
DEC R0
zl8: INC R0
MOV SBUF,@r0
JNB TI,$
CLR TI
CJNE @R0,#03H,ZL8
clr ckqsbz
clr ckjsbz
clr clqyd
ajmp AJ3a ;去挂机
;*******收到串口数据*************************************
tz3: AJMP START1
CK0: JNB CKJSBZ,tz3 ;收到串口数据否?
ajmp zl7
;********外部中断服务程序********************************
BINGKOU: PUSH PSW
PUSH A
NEXTA: POP A
POP PSW ;中断返回
RETI
;********串口接收数据中断服务程序***********************
PCTOMCU: PUSH PSW
PUSH A
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",PCTOMCU2 ;第2个字符是否为Z
AJMP PCTOMCU5
PCTOMCU2:MOV SBUF,#15H ;通过串口发送接收不正确数据
JNB TI,$
CLR TI
CLR CKQSBZ
CLR CKJSBZ
clr tr0 ;关定时器0
AJMP NEXTB
PCTOMCU3:cjne r0,#4fh,PCTOMCU4
ajmp PCTOMCU2 ;最多收32个字节
PCTOMCU4:cjne a,#03H,PCTOMCU5 ;是否为03H
MOV @R0,A ;保存收到的数据03H
MOV SBUF,#06H ;通过串口发送确认数据
JNB TI,$
CLR TI
SETB CKJSBZ
CLR CKQSBZ
AJMP NEXTB
PCTOMCU5:MOV @R0,A ;保存收到的数据
PCTOMCU6:INC R0
NEXTB: POP A
POP PSW ;中断返回
RETI
;******************************************************
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -