📄 用at89c2051产生dtmf信号.asm
字号:
TIME1L: EQU 30H
TIME1H: EQU 31H
TIME2L: EQU 32H
TIME2H: EQU 33H
SCL: EQU B0H
SDA: EQU B1H
WHO: EQU B2H
CDAT: EQU B3H
CLKI: EQU B5H
CLKO: EQU B4H
WAIT MACRO
ACALL IICDELAY
ENDM
ORG 0000H
JMP MAIN
ORG 000BH
PUSH 72H
PUSH 73H
RET
ORG 001BH
PUSH 76H
PUSH 77H
RET
ORG 0030H
MAIN: MOV IE,#00H
MOV SP,#07H
SETB WHO
JB WHO,TELE ;P3.2为识别脚
AJMP CCODE ;P3.2=0,说明与主机相连
;**************************************
;电话拔号主程序
TELE: MOV DPTR,#TIME1
MOV 72H,DPL
MOV 73H,DPH
MOV DPTR,#TIME2
MOV 76H,DPL
MOV 77H,DPH
MOV R1,#40H ;从24C01读取号码到内部RAM
MOV R0,#01H ;40H开始的单元,号码以FFH结
MAIN1: ACALL READ_CHAR ;束,FEH为延时
MOV @R1,A
INC R0
INC R1
CPL A
JZ DO1
AJMP MAIN1
DO1: MOV R0,#00H
ACALL READ_CHAR
MOV R7,#4H ;有线方式连发4次分机号码
CLR C
SUBB A,#7H
JC DO10
MOV R7,#15 ;电话线方式连发15次分机号码
DO10: DEC R1
DEC R1
MOV A,@R1
DO11:
MOV @R1,A
INC R1
DJNZ R7,DO11
MOV @R1,#FFH
MOV R0,#40H ;开始拔号
DO4: MOV A,@R0
CLR C
SUBB A,#FEH
JNZ DO5
INC R0
CALL DELAY
JMP DO4
DO5: MOV A,@R0
CPL A
JZ OK
CPL A
RL A
RL A
MOV DPTR,#TAB1
ADD A,DPL
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
MOV R1,#30H
MOV R2,#4
DO3: CLR A
MOVC A,@A+DPTR
MOV @R1,A
INC R1
INC DPTR
DJNZ R2,DO3
CALL TEL
INC R0
JMP DO4
OK: CLR P1.4
MOV PCON,#03H
JMP $
DELAY: MOV R5,#06H
MOV R6,#FFH
MOV R7,#FFH
DELAY1: DJNZ R7,DELAY1
CPL P1.4
DJNZ R6,DELAY1
DJNZ R5,DELAY1
RET
TAB1: DB 9AH,FEH,FEH,FDH ;0
DB 73H,FEH,43H,FDH ;1
DB 9AH,FEH,43H,FDH ;2
DB BEH,FEH,43H,FDH ;3
DB 73H,FEH,87H,FDH ;4
DB 9AH,FEH,87H,FDH ;5
DB BEH,FEH,87H,FDH ;6
DB 73H,FEH,C6H,FDH ;7
DB 9AH,FEH,C6H,FDH ;8
DB BEH,FEH,C6H,FDH ;9
DB 9AH,FEH,FEH,FDH ;10
DB 73H,FEH,FEH,FDH ;11
DB BEH,FEH,FEH,FDH ;12
DB DEH,FEH,43H,FDH ;13
DB DEH,FEH,87H,FDH ;14
DB DEH,FEH,C6H,FDH ;15
DB DEH,FEH,FEH,FDH ;16
TEL: MOV TMOD,#11H
MOV IE,#8AH
MOV TL0,TIME1L
MOV TH0,TIME1H
MOV TL1,TIME2L
MOV TH1,TIME2H
SETB TR0
SETB TR1
MOV R5,#01 ;03
MOV R7,#FFH
MOV R6,#FFH
DEL1: DJNZ R6,DEL1
CPL P1.4
DJNZ R7,DEL1
DJNZ R5,DEL1
CLR TR0
CLR TR1
MOV R5,#1
MOV R7,#80H ;ffH
MOV R6,#FFH
DEL2: DJNZ R6,DEL2
CPL P1.4
DJNZ R7,DEL2
DJNZ R5,DEL2
RET
TIME1: CLR TR0
CPL P1.2
MOV TL0,TIME1L
MOV TH0,TIME1H
SETB TR0
RETI
TIME2: CLR TR1
CPL P1.3
MOV TL1,TIME2L
MOV TH1,TIME2H
SETB TR1
RETI
;********************************
;贮存号码操作
;发命令前必须发至少2个字节55H以达到同步
CCODE: ACALL REC
CLR C
SUBB A,#55H
JNZ CCODE
ACALL REC
CLR C
SUBB A,#55H
JNZ CCODE
CCODE_1: ACALL REC
CLR C
SUBB A,#55H
JZ CCODE_1
ADD A,#55H
JB ACC.7,CCODE_2
CCODE_3: ACALL LDELAY
AJMP CCODE
CCODE_2: ANL A,#03H
RL A
MOV DPTR,#COMMAND_TAB
JMP @A+DPTR
COMMAND_TAB: AJMP READ_ID ;80H,读识别码
AJMP READ_CODE ;81H,读贮存的号码
AJMP WRITE_CODE ;82H,写号码
AJMP CCODE_3 ;A<80H和A>82H无效
;*******************************************
READ_ID: MOV A,#'T'
ACALL SEND
AJMP CCODE
;********************************************
READ_CODE: MOV R0,#00H
ACALL READ_CHAR
ANL A,#1FH
MOV R1,A
ACALL SEND
RC_1: INC R0
ACALL READ_CHAR
ACALL SEND
DJNZ R1,RC_1
AJMP CCODE
;**********************************************
WRITE_CODE: ACALL REC
MOV R1,A
MOV R0,#00H
ACALL WRITE_CHAR
WC_1: INC R0
ACALL REC
ACALL WRITE_CHAR
DJNZ R1,WC_1
AJMP CCODE
;********************************
;往24C01写一字节
;入口:A中为写入的内容
; R0中为写入内容的地址
WRITE_CHAR: PUSH A
ACALL START
MOV A,#A0H
ACALL SEND_CHAR
ACALL ACK
MOV A,R0
ACALL SEND_CHAR
ACALL ACK
POP A
ACALL SEND_CHAR
ACALL ACK
ACALL STOP
MOV R6,#30
MOV R7,#FFH
DELL: DJNZ R7,$
DJNZ R6,DELL
RET
;**********************************
;从24C01读一字节
;入口:R0中为要读出内容的地址
;出口:A中为读到的内容
READ_CHAR: ACALL START
MOV A,#A0H
ACALL SEND_CHAR
ACALL ACK
MOV A,R0
ACALL SEND_CHAR
ACALL ACK
ACALL START
MOV A,#A1H
ACALL SEND_CHAR
ACALL ACK
ACALL REC_CHAR
ACALL STOP
RET
;***********************************
;起动24C01时序
START: SETB SCL
SETB SDA
WAIT
CLR SDA
WAIT
CLR SCL
WAIT
RET
;************************************
;停止24C01时序
STOP: CLR SDA
WAIT
SETB SCL
WAIT
SETB SDA
WAIT
RET
;************************************
;往24C01发一8位数据
;入口:A
SEND_CHAR: MOV R6,#08H
SEND_CH_1: RLC A
MOV SDA,C
WAIT
SETB SCL
WAIT
CLR SCL
WAIT
DJNZ R6,SEND_CH_1
RET
;**************************************
;从24C01接收一8位数据
;出口:A
REC_CHAR: MOV R6,#08H
REC_CH_1: SETB SCL
WAIT
MOV C,SDA
RLC A
CLR SCL
WAIT
DJNZ R6,REC_CH_1
RET
;**************************************
;检测24C01的响应信号
;出口:CY
ACK: SETB SDA
WAIT
SETB SCL
WAIT
MOV C,SDA
CLR SCL
WAIT
RET
;**************************************
;延时
IICDELAY: MOV R7,#20
DJNZ R7,$
RET
;*************************************
SEND: MOV R7,#08H
SEND_1: RRC A
MOV CDAT,C
CLR CLKO
JB CLKI,$
SETB CLKO
JNB CLKI,$
DJNZ R7,SEND_1
MOV P3,#FFH
RET
REC: MOV P3,#FFH
MOV R7,#08H
REC_1: JB CLKI,$
MOV R6,#80H
DJNZ R6,$
MOV C,CDAT
RRC A
CLR CLKO
JNB CLKI,$
SETB CLKO
DJNZ R7,REC_1
RET
LDELAY: MOV R6,#30
MOV R7,#FFH
LDEL: DJNZ R7,$
DJNZ R6,LDEL
RET
ORG 7FDH
DB 02H,07H,FDH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -