专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
看到有人对DTMF有兴趣,发一个我做的电话小总机原理图和源码
2020-02-01 16:32
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
15265
81
81
电路也不完全是我设计的,,是参考了两个厂家的线路,结合两个厂家电路的优点改进而成的,但源码完全是自己做的,这个图可接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
记号,以后学习
加载中...
1
2
3
4
5
6
7
8
下一页
最后一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
;电话小总机源码
;可接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
一周热门 更多>