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