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

📄 用at89c2051产生dtmf信号.asm

📁 用89c2051模拟产生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 + -