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

📄 accesscontrol-51.asm

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