📄 学习型电话网络远程控制器源程序.asm.txt
字号:
SENT1:
SETB SDA
NOP
SENT:
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
DJNZ BITCNT,SENTB
NOP
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR F0
JNB SDA,ACKEND
SETB F0
ACKEND:
NOP
CLR SCL
RET
;3.4---------------------------------------------------
;接收1个字节数据
RCVBYTE:
SETB SDA ;设置总线为读
MOV BITCNT,#08H
RCV:
NOP
CLR SCL ;清总线,准备读数据
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
CLR C
JNB SDA,RCV0
SETB C
RCV0:
RLC A
NOP
NOP
DJNZ BITCNT,RCV
CLR SCL
NOP
NOP
NOP
CLR SDA
JNB ACK,SENTACKB
SETB SDA
SENTACKB:
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
CLR ACK
RET
;**************************************************************************
;延时20MS子程序
DEL_20MS: SETB RS0
MOV R0,#100
DEL_20MS1: MOV R1,#100
DJNZ R1,$
DJNZ R0,DEL_20MS1
CLR RS0
RET
;-------------------------------------------------------------------------
;蜂鸣器发生子程序,0.5s
BZ_800: SETB RS0
MOV R0,#80
BZ_800_1: SETB BZ_AUD
SETB BZ_AUD1
MOV R1,#200
DJNZ R1,$
MOV R1,#200
DJNZ R1,$
CLR BZ_AUD
CLR BZ_AUD
MOV R1,#200
DJNZ R1,$
MOV R1,#200
DJNZ R1,$
DJNZ R0,BZ_800_1
SETB BZ_AUD
SETB BZ_AUD1
CLR RS0
RET
;-------------------------------------------------------------------------
;蜂鸣器发生子程序,0.5s
BZ_MU: SETB RS0
MOV R4,#4
MOV R5,#250
MOV R6,#250
BZ_MU0: MOV R0,#200
BZ_MU1: SETB BZ_AUD
SETB BZ_AUD1
MOV R1,#200
DJNZ R1,$
MOV A,R5
MOV R2,A
DJNZ R2,$
CLR BZ_AUD
CLR BZ_AUD1
MOV R3,#200
DJNZ R3,$
MOV A,R6
MOV R2,A
DJNZ R2,$
DJNZ R0,BZ_MU1
MOV A,R5
CLR C
SUBB A,#40
MOV R5,A
MOV A,R6
CLR C
SUBB A,#40
MOV R6,A
DJNZ R4,BZ_MU0
CLR BZ_AUD
CLR BZ_AUD1
CLR RS0
RET
;**************************************************************************
;电话控制子程序
PH_CON: CLR EX0
CLR LED1
LCALL PH_IN
MOV A,RING_CON
JNZ PH_CON1
LCALL DTMF
PH_CON1: SETB LED1
SETB EX0
RET
;**************************************************************************
;模拟摘机子程序
PH_IN: JB PH_RING,PH_INBC ;无低电平信号退出
JNB JP1,PH_IN0
MOV RING_CON,#3
JMP PH_IN01
PH_IN0: MOV RING_CON,#5
PH_IN01: SETB GV_XSFLAG
MOV GV_XS,#10
PH_IN1: JNB PH_RING,PH_IN2
MOV C,GV_XSFLAG ;5S无信号退出
JNC PH_INBC
JMP PH_IN1 ;等待低电平
PH_IN2: LCALL DEL_20MS
JB PH_RING,PH_IN21 ;冗余
DEC RING_CON
MOV GV_XS,#10 ;RESET TIMER
PH_IN21: MOV A,RING_CON ;达到设定值退出
JZ PH_IN3
JNB PH_RING,$ ;等待高电平
JMP PH_IN1
PH_IN3: SETB PIK_HANG
MOV R3,#50 ;延时1S
PH_IN4: LCALL DEL_20MS
DJNZ R3,PH_IN4
LCALL BZ_MU ;摘机5声短低音
CLR GV_XSFLAG
PH_INBC: CLR GV_XSFLAG
RET
;**************************************************************************
;双音多频控制
DTMF: MOV OPER_CON,#00H
DTMF1: LCALL DTMF_DE
DTMF2: MOV A,R1
JNZ DTMF_BC ;超过10S不够位退出返回,需重拨
MOV A,DTMF_CON
CJNE A,#3,DTMF5
JB PW_FLAG,DTMF3
LCALL CONTROL ;3位数并且无密码进行开关机
INC OPER_CON
MOV A,OPER_CON
CJNE A,#4,DTMF1 ;超过4次操作退出
JMP DTMF_BC
DTMF3: LCALL CH_PW ;3位数并且有密码进行密码检测
JB PW_OK,DTMF31
INC OPER_CON
MOV A,OPER_CON
CJNE A,#3,DTMF1 ;超过3次操作退出
JMP DTMF_BC
DTMF31: LCALL DTMF_DE
MOV A,R1
JNZ DTMF_BC ;超过10S不够位退出返回,需重拨
MOV A,D_DATA1
CJNE A,#0CH,DTMF4 ;为*号进行密码设定!!!!!!!!!!!!1
MOV A,DTMF_CON
CJNE A,#05,DTMF_BC
LCALL SET_PW
JMP DTMF_BC
DTMF4: LCALL CONTROL ;第1位不为*号进行开关机
INC OPER_CON
MOV A,OPER_CON
CJNE A,#4,DTMF31 ;超过10次操作退出
JMP DTMF_BC
DTMF5: MOV A,DTMF_CON
CJNE A,#05,DTMF_BC
JB PW_FLAG,DTMF_BC ;密码存在,错误退出
LCALL SET_PW ;5位数进行密码设定
JMP DTMF_BC
DTMF_BC: CLR PIK_HANG
RET
;-------------------------------------------------------------------------
;双音多频解码
DTMF_DE: MOV GV_XS,#10 ;10S内无按键操作退出
SETB GV_XSFLAG
MOV DTMF_CON,#00H
MOV R0,#15H
DTMF_DE01: JB DTMF_REQ,DTMF_DE02 ;高电平读数据
JB GV_XSFLAG,DTMF_DE01
JMP DTMF_DE4 ;超过10S退出
DTMF_DE02: LCALL DEL_20MS
MOV A,P2
ANL A,#0FH
MOV @R0,A
INC R0
MOV P0,A
INC DTMF_CON
MOV R2,#100
DTMF_DE03: LCALL DEL_20MS
DJNZ R2,DTMF_DE03
JB DTMF_REQ,$ ;等待低电平重新读取数据
MOV A,15H
CJNE A,#0CH,DTMF_DE00
MOV R1,#4
JMP DTMF_DE0
DTMF_DE00: MOV R1,#2 ;第1位不为*号则计数3位
DTMF_DE0: JB DTMF_REQ,DTMF_DE1 ;高电平读数据
JB GV_XSFLAG,DTMF_DE0
JMP DTMF_DE4 ;超过10S退出
DTMF_DE1: LCALL DEL_20MS
MOV A,P2
ANL A,#0FH ;屏蔽高4位
MOV @R0,A
MOV P0,A
INC R0
INC DTMF_CON
DEC R1
MOV R2,#100
DTMF_DE11: LCALL DEL_20MS
DJNZ R2,DTMF_DE11
MOV A,R1 ;超过位退出
JZ DTMF_DE3
DTMF_DE2: JB DTMF_REQ,$ ;等待低电平重新读取数据
JMP DTMF_DE0
DTMF_DE3: CLR GV_XSFLAG
CLR LED1
LCALL DEL_20MS
SETB LED1
LCALL DEL_20MS
DTMF_DE4: RET
;-------------------------------------------------------------------------
;控制开关机
CONTROL: MOV A,D_DATA1
CJNE A,#1,CON_OFF ;第1位不为1,转关机控制
MOV A,D_DATA2
CJNE A,#1,CON_BC ;第1位为1,第2位不为1,退出
MOV A,D_DATA3
CJNE A,#1,CON_BC
LCALL KEY_1
JMP CON_BC
CON_OFF: MOV A,D_DATA1
CJNE A,#0AH,CON_BC ;不为0退出
MOV A,D_DATA2
CJNE A,#0AH,CON_BC
MOV A,D_DATA3
CJNE A,#0AH,CON_BC
CLR LED1
LCALL KEY_2
LCALL BZ_800
LCALL BZ_800
LCALL BZ_800
LCALL BZ_800
CON_BC: LCALL BZ_800
RET
;-------------------------------------------------------------------------
;密码检测
CH_PW: CLR PW_OK
MOV A,D_DATA1
CJNE A,PW1,CH_PW2
MOV A,D_DATA2
CJNE A,PW2,CH_PW2
MOV A,D_DATA3
CJNE A,PW3,CH_PW2
SETB PW_OK
LCALL BZ_MU ;密码正确5声短低音
JMP CH_PWBC
CH_PW2: MOV R3,#2 ;密码不正确2声短低音
CH_PW3: LCALL BZ_800
MOV R4,#40
LCALL DEL_20MS
DJNZ R3,CH_PW3
CH_PWBC: RET
;-------------------------------------------------------------------------
;密码设定
SET_PW: MOV A,D_DATA1
CJNE A,#0CH,SET_PWBC ;第1位不为#号则退出
MOV A,D_DATA5
CJNE A,#0CH,SET_PWBC ;第5位不为#号则退出
MOV PW1,D_DATA2
MOV PW2,D_DATA3
MOV PW3,D_DATA4
MOV A,PW1
CJNE A,#0AH,SET_PW0
MOV A,PW2
CJNE A,#0AH,SET_PW0
MOV A,PW3
CJNE A,#0AH,SET_PW0
CLR PW_FLAG ;取消密码
LCALL BZ_MU
JMP SET_PWBC
SET_PW0: SETB PW_FLAG
SET_PW1: LCALL BZ_MU ;密码设定或取消密码正确5声短低音
SET_PWBC: RET
;**************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -