You are on page 1of 6

;============================================================

;
TP RELAYS ON PORT 0
DTMF ON PORT 1
;
STATUS
ON PORT 2
; ===========================================================
;$MOD51
LED
TONE_D
TONE_B
REL1
REL2
MELODY
ZERO
F10
F11
Ph

EQU
EQU
EQU
EQU
EQU
EQU
EQU
BIT
BIT
BIT

P1.7
P3.6
P3.4
P3.0
P3.1
P3.7
10
78H
79H
7AH

; LINE CHANGE-OVER RELAY


; RINGING RELAY
; UM66T MELODY GENRATOR
; BIT FLAG

On_Hook MACRO
SETB P1.6
ENDM

; HOOK SWITCH ON P1.6

Off_Hook MACRO
CLR P1.6
ENDM

; HOOK SWITCH ON P1.6

;=============================================================
;
INTERRUPT VECTOR TABLE
;=============================================================
ORG 00H
AJMP MAIN

; ENTRY ADDRESS FOR 89C51 RESET


; MAIN STARTS BEYOND INTERRUPT VECTOR SPACE

ORG 1BH
SETB Ph
AJMP PHONE

; VECTOR ADDRESS FOR INTERRUPT


; MARK "THIS IS A PHONE CALL"
; JUMP TO PHONE CALL SERVICE

;=============================================================
;
M A I N
;=============================================================
ORG 02CH

; START BEYOND THE VECTOR TABLE

ACALL INITIALIZE_SUB

; INITILIZE CONTRO RAGISTER(TMOD & IE)

MAIN:
START:
CLR LED
ACALL SCAN_TPs
JB F10,INTERCOM
SETB LED
ACALL SCAN_TPs
JB F10,INTERCOM
AJMP START
;============================================================
;
INTERCOM SERVICE

;============================================================
INTERCOM:
CLR F10
Off_Hook
SETB TONE_D
SETB TONE_B
CLR LED
CPL A
MOV P0,A

;
;
;
;
;

RESET FLAG
DISABLE PHONE CALL
ON DIAL TONE
ON BUSY TONE
ON LED PERMANENTLY

; CONNECT SCANED No. TO SPEACH-BUS

ACALL GET_DIAL_NUM

; GET NUMBER TO CALL

CJNE A,#0FFH,INTERNAL
CLR REL1
Off_Hook
CLR LED
AJMP EXTERNAL_CALL

;
;
;
;

INTERNAL:
MOV R3,A
ANL A,P0
MOV P0,A
MOV A,R3
ANL A,P2
ACALL BELL
EXTERNAL_CALL:
ACALL DELAY_HS
SPEACH: MOV A,P2
CJNE A,#255,SPEACH
ACALL RST_SYSTEM
AJMP START

IF DIAL=FF THEN PHONE CALL FROM INTERCOM


CONNECT SPEACH-BUS TO PHONE LINE
OFF-HOOK SYSTEM
ON LED PERMANENTLY

; SAVE SUBSCRIBER No. INTO R3


; CONNECT DIALED No. TO SPEACH-BUS
; PROCESSING FOR CHECKING SUBSCRIBER
; AND SUBCRIBER WITH CALLER
; RING THE BELL

; IF CALL COMPLETE THEN RESET SYSTEM


; ELSE WAIT HERE

;============================================================
;THIS ROUTINE CHECKED TP'S STATUS IF ANY OFF_HOOK FOUND SERVICE
;PROVIDED HIM
;============================================================
SCAN_TPs:
MOV R0,#76
LOOP: MOV R1,#250

; FLASHING LED WITH SCANING TPs

_1:

MOV A,#1
JB P2.0,_2
SETB F10
AJMP OUT

; START POINTER WITH ONE

_2:

RL A
JB P2.1,_3
SETB F10
AJMP OUT

_3:

RL A
JB P2.2,_4
SETB F10
AJMP OUT

_4:

RL A
JB P2.3,_5
SETB F10
AJMP OUT

_5:

RL A
JB P2.4,_6
SETB F10
AJMP OUT

_6:

RL A
JB P2.5,_7
SETB F10
AJMP OUT

_7:

RL A
JB P2.6,_8
SETB F10
AJMP OUT

_8:

RL A
JB P2.7,BACK
SETB F10
AJMP OUT

BACK:

DJNZ R1,_1
DJNZ R0,LOOP
RET

OUT:

; RETURN FROM SUB ROUTINE

;============================================================
;
THIS ROUTINE RINGING THE BELL ON DIALED NUMBER
;============================================================
BELL:
CLR TONE_D
CLR REL2
ACALL DELAY
SETB REL2

RET1:

;
;
;
;

OFF DIAL TONE


ON BELL RELAY
RING BELL FOR ONE MINIT
OFF BELL RELAY

ACALL DELAY
JB F10,RET1
ACALL DELAY1
JB F10,RET1
ACALL DELAY1
JB F10,RET1
AJMP BELL
RET

;============================================================
;
CHECK TELEPHONE'S STATUS UPTO ONE SECOND
;
IF PIKED UP THEN SET FLAG
;============================================================
DELAY1:
MOV R0,#4
LOOP11: MOV R1,#250
LOOP12: MOV R2,#250

; ONE SECOND DELAY WITH STATUS CHECKING

LOOP13: CJNE
SETB
AJMP
NOT_EQ: DJNZ
DJNZ
DJNZ
RET2: RET

A,P2,NOT_EQ
F10
RET2
R2,LOOP13
R1,LOOP12
R0,LOOP11

; MARK SUBSCRIBER READY TO TALK

;============================================================
;
ONE SECOND DELAY
;============================================================
DELAY:

; ONE SECOND DELAY

MOV R0,#4
LOOP1: MOV R1,#250
LOOP2: MOV R2,#250
LOOP3: NOP
NOP
DJNZ R2,LOOP3
DJNZ R1,LOOP2
DJNZ R0,LOOP1
RET
;============================================================
;
READ DIALED NUMBER,RE-CHECK IF 0, * OR #
;============================================================
GET_DIAL_NUM:
JNB P1.4,$
MOV A,P1
ANL A,#00001111B
CJNE A,#ZERO,STERIK
JB Ph,GET_DIAL_NUM
MOV A,#0FFH
AJMP RET3

; WAIT FOR KEY PRESS (STROB)


; READ DIALED NUMBER
; REMOVE EXTRA BITS
;
; IF ZERO FROM PHONE CALL THEN READ AGAIN
; TRUNK CALL FROM INTERCOM

STERIK: CJNE A,#11,HASH


AJMP GET_DIAL_NUM

; IF STERIK, READ AGAIN

HASH:

CJNE A,#12,NINE
AJMP GET_DIAL_NUM

; IF HASH, READ AGAIN

NINE:

CJNE A,#9,DECODE
JNB Ph,GET_DIAL_NUM
MOV A,#252
AJMP RET3

; DIAL=9 & NOT A PHONE THEN READ AGAIN


; SELECT TO ALL (VIRTUALY 8)

DECODE: DEC A
MOV R1,A
MOV A,#1
ROTATE: RL A
DJNZ R1,ROTATE
CPL A
RET3: RET
;=============================================================

;
RESET ALL SYSTEM
;=============================================================
RST_SYSTEM:
CLR TONE_D
CLR TONE_B
CLR F10
CLR Ph
CLR F11
MOV P0,#255
SETB REL1
SETB TR1
On_Hook
RET

;
;
;
;

OFF DIAL-TONE
OFF BUSY-TONE
RESET FLAG
CLEAR PHONE CALL FLAG

;
;
;
;

OFF ALL TPs RELAYS


OFF CHANGE-OVER RELAY
START TIMER/COUNTER
ENABLE PHONE CALL

;============================================================
;
INITIALIZE SYSTEM
;============================================================
INITIALIZE_SUB:
MOV TMOD,
MOV IE,
MOV TH1,
ERFLOW.
MOV TL1,

#01100000B
#10001000B
#219
#219

CLR TONE_D
CLR TONE_B
SETB TR1
RET

;
;
;
;

SET UP CONTROL REGISTERS


TIMER 1 IS SET FOR MODE 2, COUNTER OPERATION
ENABLE TIMER/COUNTER 1 INTERRUPT
AUTO RELOAD VALUE(INT1 TL1) EACH TIME AFTER OV

;
;
;
;
;

DEMO TIMER IS INITIALISED WITH (256-39=217)


TO COUNT 39(2BELL)EVENTS
OFF DIAL-TONE
OFF BUSY-TONE
START COUNTER 1

;=============================================================
;
PHONE CALL SERVICE
;=============================================================
PHONE:

NEXT:

BUSY:

CLR TR1
Off_Hook
CLR LED
ACALL UM66

;
;
;
;

STOP TIMER1
OFF-HOOK SYSTEM
ON LED PERMANENTLY
PLAY MELODY

CLR REL1
ACALL GET_DIAL_NUM
SETB REL1

; CONNECT SPEACH-BUS TO PHONE LINE


; GET NUMBER TO CALL
; DISCONNECT FOR BELL

MOV P0,A
ACALL BELL
CLR REL1
ACALL DELAY_HS

;
;
;
;

MOV A,P2
CJNE A,#255,BUSY

; IF CALL NOT COMPLETE, WAIT ARROUND HERE

JB F11,RESET
MOV P0,#255
SETB TONE_B
SETB F11
CLR F10

;
;
;
;
;

CONNECT DIALED No. TO SPEACH-BUS


RING THE BELL
CONNECT SPEACH-BUS TO PHONE LINE
PROVIDE HALF SECOND DELAY

CHECK FOR SECOND CALL


DISCONNECT ALL TELEPHONES
ON BUSY TONE
MARK FOR SECOND PHONE CALL
RESET FLAG

AJMP NEXT
RESET: ACALL RST_SYSTEM
RETI

; GO FOR NEXT PHONE CALL


; END CALL

;===================================================================
;
PLAY MELODY (UM66)
;===================================================================
UM66:

CLR MELODY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
SETB MELODY
RET

; PLAY MELODY AS GREETING MESSAGE


; FOR FIVE SECOND

; STOP MELODY

;====================================================================
;
HALF SECOND DELAY TO ESTABLISHED THE RELAY CONTECTS
;====================================================================
DELAY_HS:
MOV R0,#2
LOOP21: MOV R1,#250
LOOP22: MOV R2,#250
LOOP23: NOP
NOP
DJNZ R2,LOOP23
DJNZ R1,LOOP22
DJNZ R0,LOOP21
RET
END

; HALF SECOND DELAY

You might also like