📄 1.asm
字号:
CKCON EQU 8EH ; 读RAM时钟周期,看门狗控制器
WDI EQU 8FH ; 喂狗的寄存器
ALU_MOD EQU PSW.1 ;8/16位模式选择 =0 是8位模式
TCON0 EQU 88H
TCON1 EQU 0C8H
EIE EQU 0A9H ;扩展中断寄存器 int2
PLM_RST EQU 91H ;载波复位寄存器
PLM_SSC BIT 0D8H.0 ;载波通信使能位
PLM_RS BIT 0F8H.0 ;载波状态标志
T_END BIT 40H ;28H.0 载波40位1发完标志
ZB_OK BIT 41H
telzb_ok bit 42h
ORG 0000H
LJMP START
ORG 0003H
;LJMP TEL
RETI
NOP
NOP
org 000bh
reti
nop
nop
org 0013h
ljmp WX
nop
nop
org 001bh
reti
nop
nop
org 0023h
reti
nop
nop
org 002bh
reti
nop
nop
org 0033h
reti
nop
nop
ORG 003BH
LJMP ZB
NOP
NOP
ORG 0050H
START: nop
nop
CLR PSW.3
CLR PSW.4 ;用第一组通用寄存器
MOV CKCON,#00111000B ;看门狗周期832mS,RAM时钟周期4
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
;初始化
MOV R0,#3EH ;存0x09
MOV @R0,#09H
INC R0
MOV @R0,#0AFH
MOV R0,#41H ;41H和42H存结束位0F00H
MOV @R0,#0FH
INC R0
MOV @R0,#00H
ANL 22H,#00H ;清标志位
ANL 23H,#00H
ANL 24H,#00H
MOV R0,#45H ;发射测试数据
MOV @R0,#36H
INC R0
MOV @R0,#0C3H ;46H存测试反馈数据
MOV R3,#0AH ; ;请47H~50H
MOV A,#00H
QL: INC R0
MOV @R0,A
DJNZ R3,QL
MOV 40H,A ;40H存ZB发送数据
; MOV R3,#5 ;振铃检测用 5次振铃有效
MOV R6,#28H ;64 bit 1
MOV R1,#4AH
mov r2,#09H ;载波发送次数
mov r4,#05h
mov r5,#05h
mov r3,#05h
;47H~49H存ZB收数据 3次
;50H存TEL接收数据 处理好的
;RAM分配 ;4AH~4EH存TEL接收数据 未处理
;——————————————————————————————————————————
;RAM 3EH 3FH 40H 41H 42H 45H 47H~49H
;——————————————————————————————————————————
;DATA 0x09 0xaf ZB发数据 ZB结束 ZB结束 ZB测试发 ZB接收数据
; 同步桢 位0x0f 位0x00 数据0x36 3次
;——————————————————————————————————————————
;RAM 4AH 4BH 4CH 4DH 4EH 50H
;——————————————————————————————————————————
;DATA TEL接收 TEL接收地址 TEL接收 TEL接收 TEL接收 处理后的含地址和
; 地址标志* 数据1 or 2 数据标志# 数据5 or 9 结束标志7 开关状态的TEL接收数据
;——————————————————————————————————————————
CLR ALU_MOD ;8位模式
CLR 30H ;30H 作为电话控制信息更新标志 26H.0
CLR T_END ;64bit 1 发完标志 40H 28H.0
clr 35h
SETB ZB_OK
MOV IE,#81H
MOV EIE,#01H
MOV TCON0,#00000001B ;边沿触发
MOV TCON1,#00000001B
SETB PLM_SSC ;使能载波通信
CLR PLM_RS ;设为收态
mov 40h,#15h
mov 2ch,#00h ;60h singn
MAIN:nop
nop
nop
fh: MOV WDI,#0A1H
jnb ZB_OK,fh
;SETB P3.1
clr PLM_SSC
LCALL DELAY1
CLR ZB_OK
MOV R6,#28H ;64 bit 1
jb 60h,sec2
DJNZ R2,XH
setb 60h ;标志,用的不好
sec2: jb 61h,sec3
djnz r3,pre_19
setb 61h ;标志,用的不好
;ljmp MAIN
sec3: jb 62h,sec4
djnz r4,pre_25
setb 62h ;标志,用的不好
;ljmp MAIN
sec4: djnz r5,pre_29
CLR PLM_SSC ;发完,则停载波
clr ea ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/////////////////////////////////////
mov r2,#09h ;载波发送次数
mov r3,#05h
mov r4,#05h
mov r5,#05h
ljmp MAIN1 ;MAIN1中开载波中断和电话中断
XH: SETB PLM_SSC
SETB PLM_SSC
SETB PLM_RS
;CLR P3.1
LJMP MAIN
pre_19:SETB PLM_SSC
SETB PLM_SSC
SETB PLM_RS
mov 40h,#19h
;CLR P3.1
LJMP MAIN
pre_25:SETB PLM_SSC
SETB PLM_SSC
SETB PLM_RS
mov 40h,#19h
;CLR P3.1
LJMP MAIN
pre_29:SETB PLM_SSC
SETB PLM_SSC
SETB PLM_RS
mov 40h,#29h
;CLR P3.1
LJMP MAIN
MAIN1:nop
nop
MOV WDI,#0A1H
;CLR P3.0 ;指示程序位置
MOV IE,#86H ;开int0
MOV EIE,#00000001B ;开int2
dengdai:MOV WDI,#0A1H
MOV IE,#86H ;开int0
MOV EIE,#00000001B ;开int2
jnb 30h,dengdai ; if 30h=1,enable zb;!=1,wait for int
pp: MOV WDI,#0A1H
jnb telzb_ok,pp
;SETB P3.4
clr PLM_SSC
LCALL DELAY1
clr telzb_ok
;CLR 30h
MOV R6,#40H ;64 bit 1
DJNZ R2,telzbxh
CLR PLM_SSC ;发完,则停载波
clr ea ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/////////////////////////////////////
mov r2,#05h ;载波发送次数
clr 30h
setb telzb_ok
ljmp MAIN1 ;MAIN1中开载波中断和电话中断
telzbxh:SETB PLM_SSC
SETB PLM_SSC
SETB PLM_RS
SETB PLM_RS
;CLR P3.4
LJMP MAIN1
ZB: nop
nop
CLR EA
CLR EA
mov ie,#00h
clr p3.0
MOV WDI,#0A1H ;foot dog
MOV PLM_RST,#0A2H ;91H
MOV PLM_RST,#0A2H ;91H
MOV PLM_RST,#0A2H ;91H
MOV PLM_RST,#0A2H ;91H
MOV PLM_RST,#0A2H ;91H
MOV PLM_RST,#0A2H ;91H
SETB PLM_SSC
SETB PLM_SSC
SETB PLM_SSC
SETB PLM_SSC
SETB PLM_RS
SETB PLM_RS
SETB PLM_RS
SETB PLM_RS
MOV WDI,#0A1H ;foot dog
;ZB时已关掉TEL中断 关总中断有用吗?
JB PLM_RS,TRANS
ZB_OUT:nop
nop
setb p3.0
SETB EA ;开中断
mov tcon1,#00000001b ;清中断申请标志
NOP
NOP
NOP
RETI
TRANS:
nop
nop
;jnb 30h,ZB_OUT
MOV PLM_RST,#0A2H ;91H
SETB PLM_RS ;0F8H.0
JB T_END,ZBF_1
SETB P3.7 ;发64bit 1
DJNZ R6,ZB_OUT
MOV R6,#08h
MOV R0,#3EH
MOV A,@R0 ;0x09 to A
MOV R7,A
SETB T_END
LJMP ZB_OUT
ZBF_1:
nop
nop
JB 10H,ZBF_2 ;10H为0x09发完标志
LCALL CYCLE_F
DJNZ R6,ZB_OUT
SETB 10H
MOV R6,#08H
INC R0
MOV A,@R0 ;r0=3fh
MOV R7,A
LJMP ZB_OUT
ZBF_2:JB 11H,ZBF_3 ;11H为0xaf发完标志
LCALL CYCLE_F
DJNZ R6,ZB_OUT
SETB 11H
MOV R6,#08H
INC R0 ; r0=40h,存载波发送数据
MOV A,@R0
MOV R7,A
LJMP ZB_OUT
ZBF_3:JB 12H,ZBF_4
LCALL CYCLE_F
DJNZ R6,ZB_OUT
MOV R6,#08H
SETB 12H
MOV R6,#08h
inc r0 ;r0=41h end bit1 0x0f
MOV A,@R0
MOV R7,A
LJMP ZB_OUT
ZBF_4:JB 13H,ZBF_4_2 ;发结束位0x0f
LCALL CYCLE_F
DJNZ R6,ZB_OUT
SETB 13H
MOV R6,#08H
INC R0 ;end bit2 0x00
MOV A,@R0
MOV R7,A
ljmp ZB_OUT
ZBF_4_2:JB 14H,ZBF_W ;发结束位0x00
LCALL CYCLE_F
DJNZ R6,ZB_OUT
SETB 14H
AA: LJMP ZB_OUT
ljmp ZB_OUT
ZBF_W: MOV R6,#28H ;64bit 1
ANL 22H,#00H ;清标志位
ANL 23H,#00H
ANL 24H,#00H
setb ZB_OK
CLR T_END
CLR PLM_RS
;clr 30h ;清控制信息更新标志
setb telzb_ok
LJMP ZB_OUT
WX: MOV WDI,#0A1H
CLR EA
MOV A,P0
ANL A,#0FH
mov c,acc.3
mov p3.0,c
mov c,acc.2
mov p3.1,c
mov c,acc.1
mov p3.4,c
mov c,acc.0
mov p3.5,c
call delay1
PRE: JNB P3.3,PRE
MOV A,P0
ANL A,#0FH
XRL A,#05
JNZ D9
MOV A,#15H
MOV 40H,A
LJMP WX_END
D9: MOV A,#19H
MOV 40H,A
WX_END: SETB EA
RETI
TEL: MOV WDI,#0A1H ;喂狗
;clr p3.4 ;电话接收过程中亮,接收完毕,灭
;setb p3.0
mov EIE,#00H ;关int2,保险些
mov EIE,#00H ;关int2,保险些
mov EIE,#00H ;关int2,保险些
mov ie,#01h;;;;;;;;;;;;;在WANCHENG中恢复
mov ie,#01h;;;;;;;;;;;;;在WANCHENG中恢复
mov ie,#01h;;;;;;;;;;;;;在WANCHENG中恢复
mov ie,#01h;;;;;;;;;;;;;在WANCHENG中恢复
;DJNZ R3,GJ_pre
ZJ: CLR P2.0 ;摘机
;clr p3.5 ;测试
DTMF:MOV WDI,#0A1H ;喂狗
;setb p0.6
; jnb p1.3,GJ_pre ;查忙音
JNB P0.5, DTMF ;看解码是否完成
JM: MOV WDI,#0A1H ;喂狗
MOV IE,#00H ;关int1
;SETB P2.4
;clr p0.6 ;end decode sign
nop
nop
nop
nop
nop
nop
nop
nop
MOV A,P0 ;读数据
ANL A,#0FH
MOV @R1,A
mov c,acc.3
mov p3.0,c
mov c,acc.2
mov p3.1,c
mov c,acc.1
mov p2.4,c
mov c,acc.0
mov p3.5,c
JB 20H,ADR1_1 ;20H为ADR0 * 收到标志
ADR0:MOV WDI,#0A1H ;喂狗
XRL A,#0BH
JNZ ERR ;不为*则判是否为0
SETB 20H
INC R1
LJMP DTMF_PRE
ADR1_1:MOV WDI,#0A1H ;喂狗
JB 21H,DAT0
XRL A,#01H ;地址不为1则看是否为2
JNZ ADR1_2
SETB 21H
INC R1
LJMP DTMF_PRE
;GJ_pre:
; ljmp GJ
ADR1_2:MOV A,@R1
XRL A,#02H
JNZ ERR ;不为2,则看是否为0
SETB 21H
INC R1
LJMP DTMF_PRE
DAT0: MOV WDI,#0A1H ;喂狗
JB 22H,DAT1_5
XRL A,#03H ;是否为3
JNZ ERR
SETB 22H
INC R1
LJMP DTMF_PRE
DAT1_5:MOV WDI,#0A1H ;喂狗
JB 23H,ENDD
XRL A,#05H ;操作不为5,看是否为9
JNZ DAT1_9
SETB 23H
INC R1
LJMP DTMF_PRE
DAT1_9:MOV A,@R1
XRL A,#09H
JNZ ERR ;操作不为9,看是否为0
SETB 23H
INC R1
LJMP DTMF_PRE
ENDD: MOV WDI,#0A1H ;喂狗
XRL A,#07H
JNZ ERR ;结束位为7,正确 处理数据
MOV A,4BH ;处理数据,将4BH、4DH合并放于50H
SWAP A
ADD A,4DH
MOV 50H,A
MOV 40H,50H ;将数据放于40H,以便载波发
MOV A,40H
CJNE A,#15H,S19
;CLR P3.0
S19:CJNE A,#19H,S25
; CLR P3.1
S25:CJNE A,#25H,S29
;CLR P3.5
S29: CJNE A,#29H,SCW
; CLR P0.6
SCW: ;;CLR P2.5
setb 30h ;置控制信息更新标志
setb 30h
setb 30h
NOP
NOP
LJMP GJ
ERR: MOV WDI,#0A1H
;clr p0.6 ;指示有错误
MOV A,@R1 ;判是否为0,为0则以前接收数据不算,
XRL A,#0AH ;重新开始接收,不为0则数据错误,
JNZ GJ ;挂机
ANL 24H,#00H ;为0,则清标志,初始化
MOV R1,#4AH ;40H中内容
LJMP DTMF_PRE ;1号开 0x15
;1号关 0x19
;2号开 0x25
;2号关 0x29
GJ: MOV WDI,#0A1H
;clr p3.0
;SETB P3.4
ANL 24H,#00H ;清标志,初始化
MOV R1, #4AH
;LCALL DELAY2
;setb p2.0
;setb p2.0
;setb p2.0
;setb p2.0
;clr p2.5
;setb p3.1
;setb p3.5
;setb p2.5
;setb p0.6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; setb telzb_ok
clr PLM_SSC
;SETB P2.5
lcall DELAY2
mov tcon0,#00000001b ;清中断标志
MOV TCON1,#00000001B
mov ie,#86h
mov ie,#86h
mov ie,#86h
mov ie,#86h
MOV EIE,#00000001B ;开int2
MOV EIE,#00000001B ;开int2
MOV EIE,#00000001B ;开int2
;clr p0.6
nop
nop
nop
nop
nop
RETI
DTMF_PRE:;CLR P2.4
MOV WDI,#0A1H
jb p3.3,DTMF_PRE
LJMP DTMF
DELAY1: MOV PLM_RST,#0A2H ;91H
MOV 60h,#0FFH ;设定延时时间为1秒左右
MOV 61h,#0FH ;
WAIT1: MOV 62h,#0FFH ;
wp1: MOV PLM_RST,#0A2H ;91H
MOV WDI,#0A1h ;
DJNZ 62h,wp1 ;
DJNZ 60h,WAIT1 ;
MOV 60h,#0FFH
DJNZ 61h,WAIT1
MOV WDI,#0A1h
MOV PLM_RST,#0A2H ;91H
RET
DELAY2: MOV WDI,#0A1h
MOV 60h,#0FFH ;设定延时时间为1秒左右
MOV 61h,#0FH ;
WAIT2: MOV 62h,#0FFH ;
wp2: MOV PLM_RST,#0A2H ;91H
MOV WDI,#0A1h ;
DJNZ 62h,wp2 ;
DJNZ 60h,WAIT2 ;
MOV 60h,#0FFH
DJNZ 61h,WAIT2
MOV WDI,#0A1h
MOV PLM_RST,#0A2H ;91H
RET
CYCLE_F:MOV A,R7
RLC A
MOV P3.7,C
MOV R7,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -