您的位置:首页单片机51单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

用AT89C2051产生DTMF信号

[日期:2008-06-27 ] [来源:东哥单片机学习网 www.picavr.com 整理 作者:佚名] [字体: (投递新闻)

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

 
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐