看到有人对DTMF有兴趣,发一个我做的电话小总机原理图和源码

2020-02-01 16:32发布

电路也不完全是我设计的,,是参考了两个厂家的线路,结合两个厂家电路的优点改进而成的,但源码完全是自己做的,这个图可接4个分机(可自行扩充为8个),除有一般电话小总机的基本功能,还有黑名单功能,相熟人的电话还有特殊铃响,几年了,这机子放在家里一直在用,没维修过.
      一直想增加一个远程控制的功能,一个电话就能控制家里的电器的工作,由于没时间,一直没有实现.

原理图及源码ourdev_500165.rar(文件大小:40K) (原文件名:电话小总机.rar)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
80条回答
zjiafu
1楼-- · 2020-02-01 19:34
贴出源码部分:由于我这边电话号码长度为8位,所以代码中没有考虑到7位长度的情况.

;电话小总机源码
;可接4个分机,可扩充为8位,有一般电话小总机的基本功能,还有黑名单功能.
;铃响有四种情况:
;           列入黑名单的----------不接,不响
;           相熟人的电话----------"嘟嘟嘟....嘟嘟嘟....嘟嘟嘟"
;           普通电话--------------"嘟...嘟...嘟...嘟"
;           内线------------------"嘟嘟....嘟嘟....嘟嘟..."
;============================
; 键值  编码     数据
;  1    0001     01H
;  2    0010     02H
;  3    0011     03H
;  4    0100     04H
;  5    0101     05H
;  6    0110     06H
;  7    0111     07H
;  8    1000     08H
;  9    1001     09H
;  0    1010     0AH
;  *    1011     0BH
;  #    1100     0CH
;  A    1101     0DH
;  B    1110     0EH
;  C    1111     0FH
;  D    0000     00H
;============================
;P1.0----------POWER LED("1"有效)
;P1.1----------HOLD LINE
;P1.2----------振铃检测("1"有效)
;P1.3----------DTMF 信号检测("1"有效)
;P1.4~P1.7-----D0~D3
;P3.0----------铃流输出允许("0"有效)
;P3.1----------"0"内外线通话,"1"外线接通IC音乐卡
;P3.4----------"0"分机与内线电压连通,"1"与外线电压连通
;P3.5----------提示音信号输出("1"有效)
;P0.0~P0.7-----摘机检测(为"1"摘机)
;P2.0~P2.7-----分机接通控制("1"有效)
;============================
        ORG    0000H
L0000:  MOV    SP, #4CH
        MOV    P0,#0FFH
        MOV    P2,#00H
        MOV    P1,#0FDH
        SETB   P3.0
        CLR    P3.1
        CLR    P3.4
        CLR    P3.5
        ;==============
        LCALL  L120
        ;==============
L0001:  CPL    P1.0
        MOV    R5,#01H             ;0.5S
L0002:  MOV    R6,#27H
L0003:  MOV    R7,#00H
L0004:  LCALL  L10                  ;检测是否有内线拨号
        LCALL  L20                  ;检测是否有外线打入
        DJNZ   R7,L0004
        DJNZ   R6,L0003
        DJNZ   R5,L0002
        SJMP   L0001
;==========================
L10:    MOV    A,P0                 ;内线拨打(内线或外线)程序
        JNZ    L11
        RET
L11:    SETB   P1.0
        MOV    15H,A
        SETB   P3.4
        ;-------------
        LCALL  L160                 ;延时0.1S
        ;-------------
        MOV    A,P0
        CJNE   A,15H,L11A
        SJMP   L11B
L11A:   CLR    P3.4
        ;-------------
        LCALL  L160                 ;延时0.1S
        MOV    A,15H
        ;============
L11B:   MOV    17H,A                ;
        CPL    A
        MOV    P2,A
        LCALL  L100
        CJNE   A,#0BH,L17
        CLR    P3.4                ;按"*"键,开关切换到内线电源
        ;===========
        LCALL  L140                ;有提示音方式
        ;===========
        CJNE   A,#08H,L13
        ;===========
        LCALL  L100                ;无提示音方式
        ;===========
        CJNE   A,#0AH,L13
        ;===========
        LCALL  L100                ;无提示音方式
        ;===========
        MOV    16H,A
        JZ     L13
        CLR    C
        SUBB   A,#05H
        JNC    L13
        MOV    A,16H
        MOV    R0,A
        MOV    A,#80H
L12:    RL     A
        DJNZ   R0,L12
        MOV    16H,A
        CJNE   A,17H,L15         ;没有拨打自己,进入下一步
L13:    LCALL  L150              ;输出出错提示音
        LJMP   L0000
        ;================
L15:    LCALL  L110              ;拨打内线 ,内线方式铃流输出,直到对方摘机才返回
        SETB   P3.0              ;关闭铃流开关
        CLR    P3.1              ;关音乐
        SETB   P1.1              ;摘机,内线通话过程中,外线不允许打入
        MOV    A,16H             ;已接通,设置两线相连,其它的继开,保证通话内容保密
        ORL    A,17H
        MOV    18H,A
        CPL    A
        MOV    P2,A
        ;------------
        LCALL  L160
        ;------------
L16:    MOV    A,P0
        JNZ    L16A              ;等待通话结束
        LJMP   L0000
L16A:   ANL    A,18H
        CJNE   A,18H,L16B
        SJMP   L16
L16B:   LCALL  L150              ;输出出错提示音
        LJMP   L0000
        ;=================
L17:    MOV    A,17H             ;拨打外线,设置其它线的继开,保证通话内容保密
        CPL    A
        MOV    P2,A
L18:    MOV    A,P0
        JNZ    L18               ;等待通话结束
        LJMP   L0000
;================================================
L20:    JNB    P1.2,L21
        RET
L21:    SETB   P1.0
        LCALL  L280              ;检测反极信号,若2秒内无接到,则为干扰
        MOV    P2,#0AH
        SETB   P3.4
        LCALL  L180
        MOV    A,10H
        JZ     L21A               ;没有显示,干扰
        LCALL  L30                ;RET   A
        SJMP   L22
L21A:   ;JNB    P1.2,$
        ;MOV    10H,#00H
        ;MOV    R4,#05H           ;捕捉出错或失败,测试是否干扰.
;L21B:   SETB   P1.0
        ;LCALL  L120
        ;LCALL  L160
        ;JB     P1.2,L21C
        ;INC    10H
;L21C:   CLR    P1.0
        ;LCALL  L120
        ;LCALL  L160
        ;JB     P1.2,L21D
        ;INC    10H
;L21D:   DJNZ   R4,L21B
        ;SETB   P1.0
        ;MOV    A,10H
        ;JNZ    L21E
        LJMP   L0000              ;是干扰,复位.
        ;==================
L21E:   MOV    A,#01H
        ;=============
L22:    CLR    P3.4
        JNZ    L22A
        LCALL  L220
        SJMP   L22B
L22A:   LCALL  L210              ;
L22B:   CPL    A
        MOV    P2,A
        SETB   P3.4
        LCALL  L160              ;
        JNB    P1.2,$
L23:    LCALL  L100              ;检测转线信号
        CJNE   A,#0BH,L23
        LCALL  L100
        CJNE   A,#08H,L23
        LCALL  L100
        CJNE   A,#0AH,L23
        LCALL  L100
        MOV    16H,A
        JZ     L23
        CLR    C
        SUBB   A,#05H
        JNC    L23
        MOV    A,16H
        MOV    R0,A
        MOV    A,#80H
L24:    RL     A
        DJNZ   R0,L24
        MOV    16H,A
        MOV    A,P0
        MOV    17H,A
        CJNE   A,16H,L25         ;没有拨打自己,进入下一步
        SJMP   L23
L25:    SETB   P1.1              ;HOLD LINE
        LCALL  L310
        SETB   P3.0              ;关闭铃流开关
        CLR    P3.1              ;关音乐
        MOV    A,16H
        CPL    A
        MOV    P2,A
        ;-----------
        LCALL  L160
        ;-----------
        CLR    P1.1              ;FREE LINE
        LJMP   L23
;================================================
L30:    MOV    A,10H
        ANL    A,#0FH
        ;================
        CJNE   A,#08H,L32       ;捕捉成功后,加入的判断及处理
        MOV    DPTR,#TAB8       ;4位特征码没有记录,转入8位本地电话检索
        MOV    R2,A
        LCALL  L90
L31:    SJMP   L35
        ;=================
L32:    CJNE   A,#0BH,L33
        MOV    DPTR,#TAB11      ;手机号码/三位区号+8位号码/四位区号+7位号码
        MOV    R2,A
        LCALL  L90
        SJMP   L35
        ;=================
L33:    CJNE   A,#0CH,L34
        MOV    DPTR,#TAB12      ;四位区号+8位号码
        MOV    R2,A
        LCALL  L90
        SJMP   L35
        ;=================
L34:    CJNE   A,#0AH,L37
        MOV    DPTR,#TAB10      ;三位区号+7位号码
        MOV    R2,A
        LCALL  L90
L35:    JNZ    L36
        RET
        ;=================
L36:    CJNE   A,#0FFH,L37
        SETB   P3.4             ;0FFH----黑名单,拒绝接听
        SETB   P1.1
        LCALL  L120
        LCALL  L120
        LCALL  L120
        LCALL  L120
        LJMP   L0000
        ;=================
L37:    MOV    A,#01H
        RET
;================================================
L90:    CLR    A                ;DPTR----TAB,R2-----N
        MOVC   A,@A+DPTR
        CJNE   A,#0DH,L91
        MOV    A,#01H
        RET
L91:    MOV    R0,#11H
        MOV    A,R2
        MOV    R1,A
L92:    CLR    A
        MOVC   A,@A+DPTR
        CJNE   A,#0FFH,L93      ;出现0FFH,说明符合黑名单特征,结束查找.
        RET
        ;=================
L93:    MOV    20H,A
        MOV    A,@R0
        INC    R0
        INC    DPTR             ;指向下一个
        CJNE   A,20H,L94
        DJNZ   R1,L92
        CLR    A
        MOVC   A,@A+DPTR
        RET
L94:    INC    DPTR             ;指向下一个
        DJNZ   R1,L94           ;注意:因为后有一个参数,也要跳过.
        CLR    A
        MOVC   A,@A+DPTR
        CJNE   A,#0DH,L91       ;未完,指向下一组
        MOV    A,#01H
        RET
;=======================================================================================
;设计本来用24C02之类保存数据的,由于打雷时干扰大,储存的数据经常丢失,后来改成写入表就算了.
;=======================================================================================
;0DH为表格结束标志;号码后带一参数,00H---熟人的电话,0FFH---电话黑名单,01H---普通电话
;电话号码格式:
;            "0"-------0AH
;            "1"-------01H
;            "2"-------02H
;            "3"-------03H
;            "4"-------04H
;            "5"-------05H
;            "6"-------06H
;            "7"-------07H
;            "8"-------08H
;            "9"-------09H
;================================================
;号码长度为8位时

TAB8:   ;下面是一个黑名单例子,0FFH是黑名单特征
        DB 008H,008H,00AH,001H,0FFH,0FFH,0FFH,0FFH,0FFH                 ;8801开头的全不接
        DB 008H,008H,007H,008H,009H,003H,001H,001H,0FFH                 ;88789311的不接
        ;=============================================
        ;下面是一个熟人电话的例子,后面特征是00H
        DB 008H,005H,005H,001H,00AH,008H,008H,009H,000H                 ;85510889
        DB 0DH                                                          ;0DH为结束标志
        DB 00H,00H,02H,00H,00H                                          ;防止程序出错,及时复位
;================================================
;号码长度为10位时
TAB10:  ;DB                                                             ;三位区号+7位号码
        DB 0DH                                                          ;0DH为结束标志
;================================================
;号码长度为11位时,可以是手机号码,三位区号+8位号码,四位区号+7位号码
TAB11:  DB 00AH,001H,00AH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH  ;010开头的电话列入黑名单,全不接
        DB 001H,003H,004H,003H,003H,00AH,005H,006H,00AH,00AH,00AH,000H  ;13433056000,熟人手机号码
        DB 0DH                                                          ;0DH为结束标志
        DB 00H,00H,02H,00H,00H                                          ;防止程序出错,及时复位
;================================================
;号码长度为12位时
TAB12:  ;DB                                                             ;四位区号+8位号码
        DB 0DH                                                          ;0DH为结束标志
        DB 00H,00H,02H,00H,00H                                          ;防止程序出错,及时复位
;================================================
L100:   MOV    A,P0              ;按键检测程序
        JNZ    L101
        LJMP   L0000             ;操作者主动放弃通话,则完全退出此次操作
        ;---------------
L101:   JNB    P1.3,L100
        MOV    A,P1
        SWAP   A
        ANL    A,#0FH
        JB     P1.3,$
        RET
;================================================-
L110:   MOV    R4,#0CH
        CLR    P3.0                ;打开铃流开关
        SETB   P3.1                ;放音乐
L111:   MOV    P2,16H              ;拨打内线
        ;=============
        LCALL  L120                ;响0.4S
        ;=============
        MOV    P2,#00H
        LCALL  L160                ;延时0.1S
        ;=============
        LCALL  L130                ;停0.5S,检测摘机
        ;=============
        MOV    P2,16H              ;响0.5S
        ;=============
        LCALL  L120                ;延时0.1S
        ;=============
        MOV    P2,#00H
        LCALL  L160
        ;=============
        LCALL  L130                ;停1S,检测摘机
        LCALL  L130
        ;=============
        DJNZ   R4,L111             ;8次振铃后对方若无摘机,则输出出错提示音
        CLR    P3.1                ;关音乐
        LCALL  L150
        LJMP   L0000
;=======================================
L120:   MOV    R5,#0DH             ;0.4S
L121:   MOV    R6,#3FH
L122:   MOV    R7,#48H
        DJNZ   R7,$
        DJNZ   R6,L122
        DJNZ   R5,L121
        RET
;=========================================
L130:   MOV    A,16H
        ORL    A,17H
        MOV    18H,A
        MOV    R5,#10H             ;0.5S
L131:   MOV    R6,#24H
L132:   MOV    R7,#20H
L133:   MOV    A,P0
        ANL    A,18H
        JNZ    L134
        LJMP   L0000               ;操作者主动放弃通话,则完全退出此次操作
        ;------------
L134:   CJNE   A,18H,L135          ;未接通,继续
        SETB   P3.0                ;关闭铃流开关
        CLR    P3.1                ;关音乐
        POP    A
        POP    A
        RET                        ;接通返回
L135:   DJNZ   R7,L133
        DJNZ   R6,L132
        DJNZ   R5,L131
        RET
;===============================
L140:   CPL    P3.5              ;有提示音方式按键检测程序
        MOV    A,P0
        JNZ    L141
        LJMP   L0000             ;操作者主动放弃通话,则完全退出此次操作
        ;---------------
L141:   MOV    R7,#18H
L142:   JB     P1.3,L143
        DJNZ   R7,L142
        SJMP   L140
L143:   CLR    P3.5
        MOV    A,P1
        SWAP   A
        ANL    A,#0FH
        JB     P1.3,$
        RET
;===============================
L150:   MOV    R5,#09H             ;450HZ T=0.4S 出错提示音,等待操作者挂机
L151:   MOV    R6,#14H             ;0.2S
L152:   CPL    P3.5
        MOV    R7,#42H
L153:   MOV    A,P0
        JZ     L156
        DJNZ   R7,L153
        DJNZ   R6,L152
        DJNZ   R5,L151
        ;-------------
        CLR    P3.5
        MOV    R6,#2FH             ;0.2S
L154:   MOV    R7,#00H
L155:   MOV    A,P0
        JZ     L156
        DJNZ   R7,L155
        DJNZ   R6,L154
        SJMP   L150
L156:   RET
;=============================
L160:   MOV    R6,#3AH       ;稍作延时0.1S
L161:   MOV    R7,#00H
        DJNZ   R7,$
        DJNZ   R6,L161
        RET
;=============================
L180:   MOV    R0,#10H
        MOV    R1,#10H
        CLR    A
L180A:  MOV    @R0,A
        INC    R0
        DJNZ   R1,L180A
        ;==============
        MOV    R0,#11H
L181:   MOV    R5,#02H            ;1S
L182:   MOV    R6,#92H           ;尝试捕捉DTMF来电显示信号
L183:   MOV    R7,#00H
L184:   JB     P1.3,L188
        DJNZ   R7,L184
        DJNZ   R6,L183
        DJNZ   R5,L182
        SETB   P1.0
        ;=============
        MOV    A,R0
        CJNE   A,#11H,L184A
        RET
L184A:  DEC    R0                 ;指向最后一个数据
        MOV    R7,#00H            ;完整----3,只有头-----1,只有尾-----2,都无----0
        MOV    A,@R0
        LCALL  L190
        JC     L185
        INC    R7                 ;有尾+2
        INC    R7
        DEC    R0
L185:   MOV    A,11H
        LCALL  L190
        JC     L187
        INC    R7                 ;有头+1
        MOV    R1,#12H
L186:   MOV    A,@R1
        DEC    R1
        MOV    @R1,A
        INC    R1
        INC    R1
        MOV    A,R1
        SETB   C                   ;R1-R0-1=0完成
        SUBB   A,R0
        JNZ    L186
        DEC    R0
        ;================
L187:   MOV    A,R0
        CLR    C
        SUBB   A,#10H
        MOV    10H,A             ;成功,还回号码长度.
        ANL    A,#0FH
        MOV    10H,A
        MOV    A,R7
        SWAP   A
        ORL    A,10H
        MOV    10H,A
        RET
L188:   MOV    A,P1
        SWAP   A
        ANL    A,#0FH
        MOV    @R0,A
        INC    R0
        JB     P1.3,$
        SJMP   L181
;================================================
L190:   JZ     L191
        CLR    C
        SUBB   A,#0DH
        JNC    L191
        SETB   C
        RET
L191:   CLR    C
        RET
;================================================
L210:   MOV    10H,#00H            ;普通电话响铃方式
        MOV    R4,#02H             ;4.5秒内无发现P1.2变低,系统则认为结束操作(0.4S*4+0.1S+1S)
L211:   MOV    P2,#05H             ;这里只有801,803允许接听,所以为05H,若要全部都能接听,改为0FH
        CLR    P3.0                ;打开铃流开关
        ;=============
        MOV    R3,#03H
L212:   JB     P1.2,L213
        INC    10H
L213:   LCALL  L120                ;0.4S
        DJNZ   R3,L212
        ;=============
        SETB   P3.0
        MOV    P2,#0AH             ;这里只有801,803允许接听,所以为0AH,若要全部都能接听,改为00H
        LCALL  L160                ;0.1S
        ;=============
        JB     P1.2,L214           ;
        INC    10H
        ;=============
L214:   LCALL  L230                ;0.5S
        JB     P1.2,L215
        INC    10H
L215:   LCALL  L230                ;0.5S
        JB     P1.2,L216
        INC    10H
        ;=============
L216:   MOV    A,10H
        JNZ    L210                ;半周内有变低,重新计数.
        DJNZ   R4,L211
        LJMP   L0000               ;无振铃信号,拨打者放弃操作,或电信局终止操作
;================================================
L220:   MOV    10H,#00H            ;内部电话响铃方式,4.5秒内无发现P1.2变低,结束操作
        MOV    R4,#02H
L221:   MOV    R3,#03H             ;(0.2+0.1+0.283)*3=0.9
L222:   MOV    P2,#05H             ;这里只有801,803允许接听,所以为05H,若要全部都能接听,改为0FH
        CLR    P3.0                ;打开铃流开关
        JB     P1.2,L223
        INC    10H
L223:   LCALL  L160                ;0.1S
        LCALL  L160                ;0.1S
        ;=============
        SETB   P3.0
        MOV    P2,#0AH             ;这里只有801,803允许接听,所以为0AH,若要全部都能接听,改为00H
        LCALL  L160                ;0.1S
        ;=============
        JB     P1.2,L224
        INC    10H
L224:   MOV    R5,#09H             ;0.283S
        LCALL  L231
        DJNZ   R3,L222
        ;=============
        MOV    R3,#02H             ;0.283*2
L225:   JB     P1.2,L226
        INC    10H
L226:   MOV    R5,#09H             ;0.283S
        LCALL  L231
        DJNZ   R3,L225
        ;===============
        JB     P1.2,L227
        INC    10H
L227:   MOV    A,10H
        JNZ    L220                ;半周内有变低,重新计数.
        DJNZ   R4,L221
        LJMP   L0000               ;无振铃信号,拨打者放弃操作,或电信局终止操作
;=========================================
L230:   MOV    R5,#10H             ;0.5S
L231:   MOV    R6,#30H
L232:   MOV    R7,#20H
L233:   MOV    A,P0
        ANL    A,#05H
        JZ     L234
        SETB   P3.0                ;关闭铃流开关
        MOV    R7,A
        POP    A
        POP    A
        MOV    A,R7
        RET                        ;接通返回
L234:   DJNZ   R7,L233
        DJNZ   R6,L232
        DJNZ   R5,L231
        RET
;================================================
L280:   JNB    P1.2,$
        LCALL  L160
        MOV    R5,#03H            ;2S
L281:   MOV    R6,#0C1H           ;尝试捕捉DTMF来电显示信号
L282:   MOV    R7,#00H
L283:   JNB    P1.2,L284
        DJNZ   R7,L283
        DJNZ   R6,L282
        DJNZ   R5,L281
        LJMP   L0000
L284:   RET
;================================================
L310:   MOV    R4,#0CH
        CLR    P3.0                ;打开铃流开关
        SETB   P3.1                ;放音乐
L311:   MOV    P2,16H              ;转内线
        ;=============
        LCALL  L120                ;响0.5S
        ;=============
        MOV    P2,#00H
        LCALL  L160                ;稍作延时
        ;=============
        LCALL  L330                ;停0.5S,检测摘机
        ;=============
        MOV    P2,16H              ;响0.5S
        ;=============
        LCALL  L120                ;稍作延时
        ;=============
        MOV    P2,#00H
        LCALL  L160
        ;=============
        LCALL  L330                ;停1S,检测摘机
        LCALL  L330
        ;=============
        DJNZ   R4,L311             ;8次振铃后对方若无摘机,则输出出错提示音
        CLR    P3.1                ;关音乐
        MOV    A,16H
        CJNE   A,17H,L312
        LJMP   L0000               ;已转过一次,不再转,与外线断开.
L312:   MOV    16H,17H             ;若转线不成功,转回原线
        SJMP   L310
;=========================================
L330:   MOV    R5,#15H             ;0.5S
L331:   MOV    R6,#24H
L332:   MOV    R7,#20H
L333:   MOV    A,P0
        ANL    A,16H
        CJNE   A,16H,L334          ;未接通,继续
        SETB   P3.0                ;关闭铃流开关
        CLR    P3.1                ;关音乐
        POP    A
        POP    A
        RET                        ;接通返回
L334:   DJNZ   R7,L333
        DJNZ   R6,L332
        DJNZ   R5,L331
        RET
;==============================================
        END
ccdavid
2楼-- · 2020-02-01 23:04
MARK,谢谢
luckroll
3楼-- · 2020-02-02 05:03
沙发 地板都没抢到 地下室 顶一下
ndust
4楼-- · 2020-02-02 08:00
记号
lileistone
5楼-- · 2020-02-02 09:45
 精彩回答 2  元偷偷看……
lizhoubob
6楼-- · 2020-02-02 09:53
记号,以后学习

一周热门 更多>