⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 infoprocess-51.asm

📁 支持电话拨号
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        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 + -