使用89C51 设计的电话远程控制开关
摘要:本文主要介绍了一种以单片机 AT89C51 和双音多频解码集成电路 MT8870 为核心,通过电话线路遥控的远程多路智能控制器。该系统实用、功能灵活多样,可以对被遥控对象的状态进行查询以及控制,可以广泛的应用于家用电器或者其它场所的各种控制设备前言电话遥控作为一较新的课题与常规的遥控方式相比,显示出一定的优越性,不需进行专门的布线,不占用无线电频率资源,避免了电磁污染。同时,由于电话线路各地联网,可以充分利用现有的电话网,因此遥控距离可跨省市,甚至跨越国家。
电话属双工通信手段。因此,这可以大大体现出利用电话进行遥控的更大优越性。操作者可以通过各种提示音即时了解受控对象的有关信息,从而进行进一步的操作。电话遥控这一课题目前已有涉足者,但是只是还只限于实验室阶段,因而距离实际应用,尤其是对于日常生活尚有一定的差距,并不能完全体现出电话遥控方式的双工通信特点。本作品正是针对这一点进行了较大改进,采取单片机智能控制,利用不同的提示音达到对于不同操作的提示及对受控方状态的信息反馈,从而使操作者能够及时了解受控方信息,使产品达到交互式与智能化。
而且本作品的调试都是在线调试,已经在宿舍连接电话经过真正的交换机实验并且成功。本作品的各种电器接口、各项标准都严格遵循国家有关标准,为以后的产品化提供了良好的基础。作品为突出电话遥控的信息反馈功能,并使产品达到非常高性价比。故未对电话装置的其他功能进行进一步的扩展,而且所有使用的集成电路和其它元器件都尽量选择廉价的。在该作品的基础上进行了功能扩展是很方便的。譬如:使用语音芯片作为信号音反馈,提高本作品的实用性(此次为了保证整体电路的廉价,所以并未使用语音芯片)。
加上留言电路,主人不在家时客人留言。利用遥控方式可使主人很方便地在异地提取留言信息;在各路终端上接上传感器即可实现对环境声响的监听;接上自动拨码电路可定时将预定信息转至主人传呼机或特定电话,从而达到定时提醒主人的目的。本作品还可以应用于工厂企业的自动化控制等领域。
第一章总体设计电话智能遥控器由单片机构成主控部分,进行主要的信息处理,接收外部操作指令形成各种控制信号,并完成对于各种信息的记录;接口电路提供单片机与电话外线的接口。其中包括铃流检测、摘挂机控制、忙音检测、双音频 DTMF 识别,及语音提示电路。语音提示电路是该作品重要组成部分。为了降低本装置的造价,作品的提示音使用程序产生。语音提示电路受单片机的控制产生相应的提示音提示,并通过反馈电路反馈至电话外线。
从而使操作者对电器的操作达到交互式,并能即时了解有关的信息;显示电路用于状态设置时的显示;控制部分即受控的终端,如前所述,可通过接驳不同的终端并对电话进行必要的改动从而达到功能的扩展。这一点,可使产品达到系列化。 本系统的每一个接口电路(振铃检测、模拟摘挂机、语音反馈、双音频解码等)都已经经过实际的交换机在线实验,具有很强的实用性。本系统使用最简单的电路、最便宜的电路芯片实现了完善的功能。
本系统还有许多可以添加的功能,具有很强的市场前景。 本装置并联于电话机的两端,不会影响到电话机的正常使用。用户通过异地的电话机拨通本装置所连接外线的电话号码,通过市局交换机向电话机发出振铃信号。本装置如果检测到振铃五次,即五次响铃后无人接,自动摘机,进入密码检测,输入正确后选择被控制电器,然后输入开或关进行遥控电器,完成后返回。第二章系统设计可行性分析
2.1 总体设计分析根据电话远程智能遥控系统的具体设计要求: ⑴ 通过电话网对异地的电器实现控制(开/关); ⑵ 控制器可以实现自动模拟摘挂机; ⑶ 控制器设置密码校验; 我设计此系统必须具有以下单元功能模块: ⑴ 铃音检测、计数; ⑵ 自动摘挂机; ⑶ 密码校验; ⑷ 在线修改密码; ⑸ 双音频信号解码; ⑹ 输入信息分析; ⑺ 控制电器开关; ⑻ 电器状态查询; ⑼ 忙音检测; 根据电话机和交换机发出的不同信号音以及电话线各种状态的不同要求,我结合实际情况对具体的单元功能模块作出软件或硬件上的不同分工,具体如下:理论上交换机所发出的各种信号音都可以通过软件编程而识别,即通过单片机发出的脉冲信号来检测信号音单位时间内的脉冲个数计算出其频率,从而完成信号音识别。
但是从系统的可靠性和程序的结构设计上分析,我选择了硬件来解决振铃音检测、忙音检测、双音频信号解码等功能模块。 自动摘挂机和电器的控制必须使用具体硬件电路来实现。振铃音计数、忙音计数、密码校验、在线修改密码、输入信息分析、电器状态查询等功能模块使用软件编程方式要比硬件电路简单的多,实现也很容易。综上所述,我设计信号音检测、自动摘挂机、控制电器、双音频解码等功能模块使用硬件电路实现。而信号音计数、密码校验、在线修改密码、信息分析、电器状态查询等功能模块使用软件编程完成。
下面就硬件以及软件实现的单元电路分别进行具体分析。
2.2 硬件模块本作品使用了大量的硬件电路完成部分功能模块,其目的就是充分利用硬件电路的可靠性、稳定性,使整体电路达到比较高的稳定性。
2.2.1 自动摘挂机因为程控电话交换机对电话摘机的响应是电话线回路电流突然变大为约 30mA 的电流,交换机检测到回路电流变大就认为电话机已经摘机。自动摘挂机电路可以通过单片机控制一个继电器的开关,继电器的控制端连接一个大约 300Ω的电阻接入电话线两端,从而完成模拟摘挂机。
2.2.2 振铃音的检测当用户被呼叫时,电话交换机发来铃流信号。振铃为 25±3 伏的正弦波,谐铃失真不大于 10%,电压有效值 90±15V。振铃以 5 秒为周期,即 1 秒送,4 秒断。根据振铃信号电压比较高的特点,可以先使用高压稳压二极管进行降压,然后输入至光电耦合器。经过光耦的隔离转换,从光电耦合器输出的波形是时通时断的正弦波,经过 RC 回路进行滤波输出很标准的方波。方波信号就可以直接输出至单片机的中断计数器输入口,完成整个振铃音检测和计数的过程。
2.2.3 控制电器此部分比较简单,通过单片机控制多路继电器的开关即可,常用的电路已经很成熟,在此就不累述了。
2.2.4 双音频解码此部分是整个系统的关键,它的工作情况直接决定了系统的可靠性。经过翻阅大量的文献资料,我发现使用电话专用的双音频编解码芯片进行输入双音频信号的解码,是比较常用的一种方法。使用集成电路不但外围电路简单,而且可靠性强。经过专用集成电路的解码,信号转换成为不同的码制信号,可以直接被单片机读取。一般常用的电话双音频编解码集成电路有 8870、8880、8888 等,经过反复论证比较,我决定使用双音频解码集成片 MT8870 来完成此功能模块。有关 MT8870 的详细介绍请参阅本报告的附录部分。
2.3 软件模块经过比较,我决定使用 AT89C51 作为控制的单片机芯片,具体有关 AT89C51 的介绍不在这里累述,其详细资料请参阅本报告的附录部分。
2.3.1 信号音计数本单元可以使用 AT89C51 的两个计数器的外部中断方式来实现对不同信号音的计数。
2.3.2 密码检测本单元可以在系统初始化的时候,在单片机内部的存储器的内部开辟一块空间放置密码。当用户输入密码的时候,单片机把输入的密码写入另外的一块空间,然后利用减法运算比较两者是否相等。这样就可以实现密码检测的功能。
2.3.3 信号分析处理本单元可以利用查表方式,也可以用简单的语句,稍微长一点的语句实现,例如 CASE 语句等。 经过翻阅大量的技术资料,对具体要求实现的功能进行完整的系统分析,我认为我的电话遥控系统设计基本符合实际情况,可以完成设计任务所要求实现的基本功能。第三章硬件单元电路设计
3.1 振铃检测电路在电话线路未来铃流前,电话线路由电话交换机提供大约 48V 的直流电压。当用户被呼叫时,电话交换机发来铃流信号。振铃信号为 25±3 伏的正弦波,谐铃失真不大于 10%,电压有效值 90±15V。振铃以 5 秒为周期,即 1 秒送,4 秒断。在本电路检测铃流信号时,以五次铃响为准,即五次振铃后无人摘机,便由单片机控制自动模拟摘机。 图 3.1 原理说明:电话振铃信号通过电容 C1 隔直、D1 稳压二极管、R1 限流电阻输入至光电耦合器 4N25 的输入端 1 口,C1、D1 和 R1 共同组成振铃信号变换电路,它们使输入电压和电流不会太大,对后面的光电耦合器起保护作用。
光电耦合器 4N25 起的是隔离作用,光电耦合器是一种电信号的耦合器件,它一般是将发光二极管和光敏三极管的光路耦合在一起,输入和输出之间不可共地,输入电信号加于发光二极管上,输出信号由光敏三极管取出。光电耦合器以光电转换原理传输信息,它不仅使信息发出端(一次侧)与信息接收并输出端(二次侧)是绝缘的,从而对地电位差干扰有很强的抑制能力,而且有很强的抑制电磁干扰能力。速度高、价格低、接口简单。
振铃信号通过光耦 4N25 的 4 脚输出振铃正弦波,R2 和 C2 共同组成滤波电路,信号到了开关三极管 T1 的基极就变成了方波。经过三个反向器的整形输出到单片机 AT89C51 的 T0/P3.4 口,中断方式采用外部中断,计数 5 次产生 T0 中断,控制继电器模拟摘机,完成振铃音检测。原器件选取:
1、C1 隔直电容,因为是过滤直流,滤出低频信号,而且振铃信号的电压还比较高,因此选取 1μF 耐压 100V 的瓷片电容(由于条件限制,本人用两个 2μF 耐压 60V 的电解电容负极相连代替之);2、D1 为稳压二极管,选取 36V 的稳压二极管;3、R1 是 4N25 的限流电阻,取 33 kΩ;4、IC1 选取光电耦合器 4N25;
5、R2 和 C2 共同组成振铃信号音滤波电路,根据电话振铃的技术指标:频率 25Hz 的正弦波,1 秒通,4 秒断,τ=RC 可以推出 0.02≤τ≤4(S)。为了使振铃信号音输出很好的方波波形,如图 3.2 所示,计算后选取 R2=10kΩ,C2=100μF,τ=1s;图 3.26、R3 和 D3 共同组成振铃指示灯,R3=100Ω,D3 为黄色 5mm 发光二极管;
7、T1 和 R4 组成模拟开关电路,T1 选取 9013,根据分压原理和 74LS04 的低电平有效值,R4 取 2.9 kΩ;
8、反向器由 74LS04 中的三组反向器组成,起整流作用;
3.2 模拟摘挂机电路设计主要思路:根据国家有关标准规定:不论任何电话机,摘机状态的直流电阻应≤300Ω,有“R”键的电子电话机的摘机状态直流电阻应≤350Ω。在挂机状态下,其漏电流≤5μA。当用户摘机时,电话机通过叉簧接上约 300Ω的负载,使整个电话线回路流过约 30mA 的电流。交换机检测到该电流后便停止铃流发送,并将线路电压变为十几伏的直流,完成接续。根据有关技术指标,模拟摘挂机电路设计如图 3.3 所示:模拟摘挂机电路主要由一个三极管开关电路控制继电器的开关,继电器控制接入电话线两端的 200Ω电阻。
摘挂机信令由单片机通过使 TXD/P3.1 口变为高电平实现。经过两个反向器驱动发光二极管 D1 指示摘机,同时改变三极管 T1 的基极电压,使 T1 处于导通状态,从而开启继电器 J1,J1 使电阻 R3 接入电话线两端。因为 R3 的电阻为 200Ω,使回路电流变大,控制电路向交换机发出模拟摘机的信号,交换机响应摘机信号,完成电话线路接通。整个电路完成自动模拟摘机过程。图 3.3 根据设计原理,原器件选取如下:1、 反向器取 74LS04 中的两组反向器;
2、 R1 是摘机指示灯限流保护电阻,取 220Ω;
3、 D1 是摘机指示灯,取 5mm 绿色发光二极管;4、 R2 是三极管限流电阻,取 2kΩ;
5、 T1 三极管是起模拟开关控制继电器的作用,取 9013;
6、 D2 二极管是起继电器反向保护的作用,取 4001;
7、 J1 是继电器控制开关,取 JRC 4001F(DC5V);8、 R3 是摘机电阻,取 200Ω;
3.3 双音频解码原理简介:双音多频 DTMF 信号解码电路由 MT8870(简介详见附录)主要承担。MT8870 的连线如图 3.4 所示,它的 2、3 脚接收来自电话机的双音多频脉冲信号该双音多频信号先经其内部的拨号音滤波器,滤除拨号音信号,然后经前置放大后送入双音频滤波器,将双音频信号按高,低音频信号分开,再经高,低群滤波器,幅度检测器送入输出译码电路,经过数字运算后,在其数据输出端(11~14 脚)输出相对应的 8421 码。
MT8870 的数据输出端 Q4 ~ Q1 连到 AT89C51 的 P1 口的 P1.4 ~ P1.7,CPU 经 P1 口识别 4 位代码。电话按键与相应译码(Q4~Q1)输出见附录。其中,A,B,C,D 4 个按键常被当作 R/P,REDIAL,HOLD,HANDSFREE 等功能使用。注意,需要特别指出的是,对于“0”号码,MT8870 输出的 8421 码并非是“0000”,而是“1010”;另外,“*”,“#”字号码,MT8870 输出的 8421 码分别为“1011”和“1100”。
有些技术资料会出现错误,包括比较权威的手册,所以我是在实验中,记录下测量的每一组数据后,才把这些数据应用于程序当中。为了使单片机 AT89C51 获取有效数据,MT8870 的 STD 有效端经反相后接 CPU 的/INT0 引脚。当 MT8870 获取有效双音多频信号后,图 3.4STD 电平由低变高,再反相为低,CPU 检测后,指示 P1 口接收有效二进制代码。而无效的双音频信号(电话线路杂音、人们的语音信号等)是不会引起 MT8870 的 STD 端变化的。
DTMF 接收器的外围电路如图 3.4 所示。其中,接在电源处的电容对抗干扰有一定的作用。在实际应用中,存在这样一个问题:MT8870 的使能控制端不允许中断时,将使 MT8870 的 STD 端中断关闭。其解决办法是,将 STD 端接与非门的一输入,与非门的另一输入端接一不定电平端 P。当 STD 有效(即中断开放)时,P = 1 则/INT0 中断关闭;P = 0 时则/INT0 中断允许。本单元元器件列表:
1、 D1、D2、D3、D4 共同组成整流电路,选取 4001;
2、 R1 和 R2 是输入平衡电阻,取 100KΩ,C1 隔直电容,取 0.1μF;3、 芯片外部晶振选择 3.579MHz;
4、 IC1 是双音频解码芯片,选取 MT8870;5、 C2 选取 0.1μF;6、 R3 是输出平衡电阻,选取 100KΩ;7、 反向器选取 74LS04 的一组反向器;
3.4 信号音提示电路原理说明:为了方便本系统的使用者,本人设计了信号音提示音电路,如图 3.5。首先我规定了信号音的规范以及其对应含义:1、 响 1 声,频率为 500Hz:请输入密码;
2、 响 2 声,频率为 500Hz:请输入需要控制的电器号;
3、 响 3 声,频率为 500Hz:请输入控制开/关;4、 响 1 声,频率为 1000Hz:完成操作;
5、 响 3 声,频率为 1000Hz:密码错误;信号音从单片机 89C51 的 RXD/P3.0 口输出,先经过一组反向器进行整流、隔离,从反向器输出的是频率一定,时通时断的方波,提示信号经过隔直电容 C1 输入到音频放大集成电路 LM386N-1 的输入端。经过 LM386N-1 的放大,信号音经耦合电容 C5 至变压器 T1,它是音频输出专用的耦合变压器,正好符合阻抗匹配的要求。本电路比较难点在于耦合变压器 T1 的选取。
因为电话线中直流电压比较高,而且还有各种信号音,这些都会影响到语音信号加载到电话线上,因此本装置使用一个耦合变压器作为隔离器件。这个耦合变压器的阻抗匹配问题是设计的难点,设计初我查阅有关资料并没发现具体参数。后来看到可以邮购这种电话语音专用耦合变压器,其具体性能都很优秀,但是价格太高,不符合我的设计原则(元器件便宜),因此弃置不用。到了毕业设计的后期,本装置的基本功能已经完成,音反馈的问题又重新提到议事日程上来了。
经过我不懈的努力,终于在电子市场上发现了体积很小的电话专用耦合变压器,价格只有 2 元。这种耦合变压器分两种,一种是输入,一种是输出,经过实验表明输入用的耦合变压器反馈语音性能比较好,其体积大约是 10mm×10mm×8mm。音频放大集成电路 LM386 的连接比较简单,本装置的使用是 LM386 放大增益为 50dB 的连接方式。图 3.5 原器件选取:1、 反向器选取 74LS04 中的一组反向器;
2、 C1 的是对音频信号起隔直耦合的作用,所以取 100μF 的电解电容,耐压性能无特殊要求;
3、 IC1、R1、R2、C2、C3、 C4 和 C5 共同组成音频放大电路,IC1 选取 LM386N-1,R1 取 1kΩ,C2 取 10μF 的电解电容,C3 取 10μF 的电解电容,R2 取 1kΩ, C4 取 10μF 的电解电容,C5 取 100μF 的电解电容;4、 T1 是音频输出专用变压器;
3.5 电器控制电路原理说明:本单元电路主要是由译码扩展电路、反向电路、D 触发器和继电器控制电路组成。电路图如图 3.6 所示。首先,单片机 AT89C51 从 P1 口的低四位输出四位控制信号。P1.0、P1.1、P1.2 作为三位数据线,P1.3 作为使能控制信号,一同加在 3-8 线译码器的输入端。当使能端有效时,三位数据线经过译码器数扩展为八位数据线。这八位数据连接八个反向器进行整流隔离,然后连接 D 触发器进行数据锁存。
每个 D 触发器的输出端都控制一路继电器,而每一路继电器也控制一路电器的开关。二极管指示灯并联在开关三极管两段作为电器开关指示。这样就可以完成单片机对多路电器的控制。也可以把 P1 口的八位都用作控制电器,数据输入口改在 P2 口。图 3.6 所示的为一路电器控制电路图,在本装置中一共有八路电器可以控制,其它电器控制相同。图 3.6 元器件选取:1、3-8 线译码器选取 74LS138P;
2、反向器选取两片 74LS04(每一片内有六个反向器)中的九个反向器;
3、触发器选取四片 4013(每一片内有两个 D 触发器);4、三极管选取八个 9013;5、二极管起保护作用,选取八个 4001;6、指示灯选取八个红色 5mm 发光二极管;7、指示灯限流电阻选取八个 1kΩ的电阻;8、三极管的限流电阻选取八个 2kΩ的电阻;
9、继电器选取八个 JRC-4100F DC5V 继电器;
第四章软件设计本系统的软件设计主要分为系统初始化、振铃检测计数、控制摘挂机、双音频信号分析处理、控制电器、信号音提示等部分。每个功能模块对于整体设计都是非常重要的,单片机 T89C51 通过软件程序才能很好的对外部的信息进行采集、分析和决策。下面,就整体设计以及每个单元功能模块分别进行说明。整体流程图:
4.1 信号音发声部分本功能模块主要是产生信号提示音,方便不同的使用者。根据普通人耳的反应频率为 20Hz 至 20KHz 的范围,和 CCITT 规定的电话话音信号的频率范围是 300Hz 至 3400Hz,我在本功能单元的发声频率定为 500Hz 和 1000Hz 两种。主要分为五种提示音:
1、 低音,表示装置已经摘机,请输入密码,其参数:频率 f=500Hz,延时 t=0.5 秒/声;
2、两声低音,表示密码已经通过,请选择电器,其参数:频率 f=500Hz,延时 t=0.5 秒/声;
3、三声低音,表示电器已经选定,请控制(开/关),其参数:频率 f=500Hz,延时 t=0.5 秒/声;
4、三声高音,表示密码输入错误,其参数:频率 f=1000Hz,延时 t=0.3 秒/声;
5、一声高音,表示控制已经完成,其参数:频率 f=1000Hz,延时 t=0.3 秒/声;提示音发生是使用有限循环,反复使单片机的 RXD 口的电平反转,从而形成方波信号。 子程序代码:ORG 1100HRING10:MOV R6,#20 ;input passwordRING11:MOV R7,#20 ;800HzRING12:LCALL DL10 ;sound=1CPL P3.0 ;delay=0.5sDJNZ R7,RING12DJNZ R6,RING11CLR P3.0RET ORG 1150HRING20:MOV R3,#03RING21:MOV R6,#20 ;password wrongRING22:MOV R7,#20 ;1600HzRING23:LCALL DL20 ;sound=3CPL P3.0 ;delay=0.25sDJNZ R7,RING23DJNZ R6,RING22CLR P3.0MOV R7,#200RING24:LCALL DL10DJNZ R7,RING24DJNZ R3,RING21CLR P3.0RETORG 1200HRING30:MOV R3,#02RING31:MOV R6,#20 ;selectRING32:MOV R7,#20 ;800HzRING33:LCALL DL10 ;sound=2CPL P3.0 ;delay=0.5sDJNZ R7,RING33DJNZ R6,RING32CLR P3.0MOV R7,#200RING34:LCALL DL10DJNZ R7,RING34DJNZ R3,RING31CLR P3.0RET ORG 1250HRING40:MOV R3,#03RING41:MOV R6,#20 ;controlRING42:MOV R7,#20 ;800HzRING43:LCALL DL10 ;sound=3CPL P3.0 ;delay=0.5sDJNZ R7,RING43DJNZ R6,RING42CLR P3.0MOV R7,#100RING44:LCALL DL10DJNZ R7,RING44DJNZ R3,RING41CLR P3.0RETORG 1300HRING50:MOV R6,#40 ;finishRING51:MOV R7,#20 ;1600HzRING52:LCALL DL20 ;sound=1CPL P3.0 ;delay=0.15sDJNZ R7,RING52DJNZ R6,RING51CLR P3.0RETORG 1500HDL10:MOV R5,#25 ;delay1.25ms,f=800HZ,fosc=12MHz,DL12:MOV R4,#25DL11:DJNZ R4,DL11DJNZ R5,DL12RETORG 1600HDL20:MOV R5,#12 ;delay0.625ms,f=1600HZ,fosc=12MHz,DL22:MOV R4,#25DL21:DJNZ R4,DL21DJNZ R5,DL22RETORG 1650HDL30:MOV R5,#50 ;delay20msDL32:MOV R4,#200DL31:DJNZ R4,DL31DJNZ R5,DL32RET4.2 密码检测部分本系统密码校验的基本原理是:在系统初始化的时候把原始密码写入地址为 30H 开始的存储空间内,密码的位数“5”赋给 R7。
当系统摘机时,要求输入密码,单片机把解码后的数据(使用者输入的密码)存储在 38H 开始的存储空间内。然后单片机对进行两个存储地址的内容逐位进行比较,直到完全相等才能转到下一进程,有一位不同,程序就转到出错程序。子程序代码:ORG 0150HHOKE: CLR 7DHSETB P3.1 ;open telephoneCLR TR0 ;close T0MOV R2,#03H ;password wrong 3LCALL RING10 ;input passwordIN: CLR 7EH ;7EH=0DTMF: MOV R7,#5H ;PASSWORD:5 R7MOV R1,#38H ;signSETB P1.4SETB P1.5SETB P1.6SETB P1.7WAIT: JBC 7EH,CC ;wait INT0LJMP WAITCC: MOV R7,#5H ;password 5***MOV R0,#30H ;password topMOV R1,#38H ;signCMP: MOV A,@R1MOV R4,ACLR CMOV A,@R1SUBB A,@R0 ;testINC R0INC R1JZ AAA ;OK,pass oneLJMP QQAAA: DJNZ R7,CMP ;R7-1!
=0LJMP LL ;passQQ: DJNZ R2,IN1 ;password wrong&R2!=0LCALL RING20LJMP STOPIN1:LCALL RING20 ;password wrong,try!LJMP IN4.3 密码修改部分本系统是通过在线输入密码而改变特定存储器中的密码值的。程序代码:ORG 1700HKEYIN: SETB RS1 ;当前工作寄存器第二工作区 CLR RS0ANL A,#00H ;清零 A 寄存器 MOV B,#05HLCALL RING10 ;发提示音:输入密码***MOV R7,#5HMOV R1,#38HWPIN: JBC 7EH,READ ;等待 INT0 中断 LJMP WPINREAD: MOV R1,#38HMOV R0,#40HMOV R7,#05HREAD1: MOV A,@R1MOV @R0,AINC R0INC R1DJNZ R7,READ1 ;判断输入密码是否为 5 位,否跳转 READ1LCALL RING10 ;满 5 位,发提示音:再输入新密码 MOV R7,#5HMOV R1,#38HWRE: JBC 7EH,KEYCMP ;等待中断 INT1LJMP WREKEYCMP:MOV R6,#05HMOV R0,#40HMOV R1,#38HKEYCP:MOV A,@R0CLR CSUBB A,@R1 ;A 减((R1))INC R1INC R0JZ BBB ;A 的内容如果为 0,则跳转 BBBLJMP LLBBB: DJNZ R6,KEYCP ;R6 减 1 不为 0,则跳转 KEYCP,即循环比较密码的五位 MOV R1,#38HMOV R0,#30HMOV R6,#5HKEYREIN:MOV A,@R1MOV @R0,AINC R1INC R0DJNZ R6,KEYREIN ;R6 减 1 不为 0,则跳转,即循环比较密码的五位 LCALL RING50 ;发提示音:新密码已经设置 LJMP STOPRET4.4 控制电器部分本系统首先通过外围双音频解码电路解码的信息(选择电器)判断所选择的电器,然后跳转到每一个子程序,通过单片机向 P1 口的低四位发送数据,这些控制信息表示对不同的电器进行控制的控制字。
为了简单表示,在这里只写出了电器“一”的控制子程序,其它子程序很相似,详见附录。程序代码:LL: LCALL RING30 ;sound:input controlMOV R7,#1H ;***MOV R1,#38HCLR 7EHWAIT0: JBC 7EH,DD ;wait INT0LJMP WAIT0DD: MOV R1,#38HMOV A,@R1RR ARR ARR ARR AMOV R4,ARL AADD A,R4MOV DPTR,#TABJMP @A+DPTRTAB: LJMP ZEROLJMP EIGHT;8LJMP FOUR ;4LJMP STOP ;#LJMP TWO ;2LJMP ZERO ;0LJMP SIX ;6LJMP LL ;**LJMP ONE ;1LJMP LL ;9,**LJMP FIVE ;5LJMP LL ;A,** LJMP THREE;3LJMP LL ;*,**LJMP SEVEN;7LJMP LL ;C,**ORG 0250HZERO: LJMP LLONE: LCALL RING40 ;发提示音:请操作电器 OO1: MOV R7,#01HCLR 7EHWAIT1: JBC 7EH,WW1 ;wait INT0LJMP WAIT1WW1:MOV R1,#38H ;检查信号首位 MOV A,@R1CJNE A,#50H,BB1 ;(38)不等于 0AH(0),则跳转 BB1LJMP ZZ1 ;(38)等于 0AH(0),则跳转 ZZ1BB1: CJNE A,#80H,QUIT1 ;(38)不等于 01H(1),则跳转 QUIT1SETB P1.3 ;open 1CLR P1.2CLR P1.1CLR P1.0LJMP QUIT1ZZ1: CLR P1.3 ;close allCLR P1.2CLR P1.1CLR P1.0LCALL RING50 ;finshQUIT1: LJMP LL
4.5 振铃计数部分本单元是通过计数器 T0 的外部中断方式来计数的,程序代码:ORG 0090HTT0: SETB 7DHRETI 第五章系统调试 5.1 整体调试整体调试所使用的测试仪器仪表和工具:
1、IBM-PC/XT 兼容机一台,主频:50Hz,有软驱和 25 针串行接口;2、ME-5103 单片机仿真机一个;3、MF116 万用表一个;4、计算机 5V 稳压电源一个;5、SR8 双踪示波器;
6、Manley In-Circuit Emulator Debugger(MBUG)开发软件;本装置的调试主要分为硬件调试、软件调试和联机调试等三大部分。经过初步的分析设计后,在制作硬件电路的同时,调试也在穿插进行。这样有利于问题的分析和解决,不会造成问题的积累,而且不会因为一个小问题而进行整体电路的检查,从而可以节约大量的调试时间。软件编程中,我是首先完成单元功能模块的调试,然后进行系统调试,整体上与硬件调试的方法差不多。联机调试是最重要的一部分,同时也是本装置成功的关键。有许多新问题都不是很容易解决的。调试的步骤 5.2 硬件单元电路
5.2.1 5V 稳压电源本装置使用单 5V 稳压电源供电,要求交流成分小。经过示波器测量 5V 稳压电源输出端,其交流部分电压的峰-峰值为 6mV,符合本装置的电源要求,稳压电源调试完毕。
5.2.2 振铃音检测在本单元电路制作前期,实验室中无模拟交换机,无法产生振铃信号,我只好在完成此部分的焊接后回寝室中完成其测试。将本装置的电话线两端并联在电话机两端,摘机拨打“190”,然后挂机,市交换机会回送连续的测试振铃音。经过测量,这种测试振铃音和正常的振铃信号的频率、振幅等特性都一样,只是正常的振铃信号是 1 秒通 4 秒断,而这种测试振铃音是连续的。当送测试振铃音时,用万用表的直流档测量光电耦合器 4N25 的输出端,有明显的电压,这说明可以形成中断响应信号。
后接振铃指示灯,发现在送铃流图 5.1 信号时,指示灯亮,但是灯在闪烁。分析得光耦输出端所接的滤波电容 C2 太小,于是把原来的 1μF 换成现在的 100μF,如右图 5.1 所示,问题得到解决。因为单片机 T0 所响应的外部中断信号是低电平有效,所以在光耦输出端接了一个开关三极管 T1 控制指示灯,在三极管的输出端接了三个反向器。经过三极管 T1 的开关作用和三个反向器的反向作用,输出应该为低电平。但是在测量反向器输出端时发现:振铃指示灯亮,但反向器输出端为高电平。
说明振铃信号可以通过三极管,但无法通过反向器。分析原因可能是反向器 74LS04 坏了,换之,再测,还是老问题。经过细心测量三极管的发射极电压发现:有振铃时 Ve=1.1V,这时反向器 74LS04 认为是低电平,当无振铃脉冲信号时,还是认为是低电平,所以振铃信号无法通过反向器。解决方法很简单,把三极管的发射极端的下拉电阻 R4 从原来的 20kΩ改成 5.1kΩ,提升三极管的发射极电压。在毕业设计的后期,实验室有了模拟小交换机,经测试,本单元电路完全正常,振铃检测部分调试完毕。
5.2.3 模拟摘挂机此部分的调试较为容易,电路接好后,用 5V 高电平测试之,指示灯亮,继电器吸合正常。接入模拟小交换机,控制摘机时,交换机的端口指示灯亮,反之挂机时,指示灯灭。说明此部分完全正常。接入仿真机测试时发现:单片机的 TXD 端不能控制模拟摘挂机部分的摘挂机。分析得出结论:可能是接口的电平不相符合。解决方法:加上一个三极管模拟开关,加上一个反向器(74LS04)进行控制隔离作用。经过接入仿真机测试表明反向器的作用很明显,于是在后面的电路设计当中,我在许多的接口上大多使用了反向器。至此,模拟摘挂机部分调试完毕。
5.2.4 控制电器控制电器这部分的外围硬件电路很容易,在调试过程中很顺利完成。在接仿真机时,使用的是 P2 口控制电器,实验结果表明 P2 口无法正常控制每个电器,翻阅资料发现单片机 89C51 的 P2 口没有数据锁存功能,不能保持上一个状态的数据。解决方法:把 P2 口控制电器改为 P1 口的低四位控制电器,改线之后控制正常,但是新的问题出现了,原来要求控制八路的端口,现在只能控制四个电器。经过市场实际分析,一般的控制电器只要求 3~4 路即可,为了实验单片机扩展控制功能,提高本遥控装置的潜在功能,我决定实验使用 3-8 线译码器 74LS138 对 P1 口的低四位输出数据进行译码扩展。
具体电路详见前面。在成功的扩展了控制电器的个数后,我又发现了一个新的问题:遥控器不能同时使两路以及两路以上的电器开,即在同一时刻,遥控器只能使一路电器开启。经过仔细分析,我发现了问题原因之所在,那就是译码器的原理问题。通常情况下我们认为的译码器可以扩展所能控制的电器,其实译码器只能扩展位数,而不能使状态发生变化。例如:三位二进制 000~111 可以控制表示三个电器、八种状态,而经过 3-8 线译码器译码后,可以控制八个电器,但是其状态也只有八种,如下表所示。
A2 A1 A0 输出 D0~D70 0 0 0 1 1 1 1 1 1 10 0 1 1 0 1 1 1 1 1 10 1 0 1 1 0 1 1 1 1 10 1 1 1 1 1 0 1 1 1 11 0 0 1 1 1 1 0 1 1 11 0 1 1 1 1 1 1 0 1 11 1 0 1 1 1 1 1 1 0 11 1 1 1 1 1 1 1 1 1 0 其解决方法是:使用 D 触发器使继电器保持上一个状态,这样才能使八路电器可以控制 28=256 个状态。
5.2.5 双音频检测双音频检测是整体电路一个比较重要的过程,它的调试主要围绕着双音多频解码芯片 8870 展开的。在此部分的制作的前期,我采用的芯片是 CM8870CPI。开始连接电路调试时,整体电路工作很正常,后来这块芯片使用大约一个星期左右的时间,解码电路经常会出现解码出错的情况。经过仔细检查电路,仿真机单步执行进行调试,确认硬件电路无误,诊断为 CM8870CPI 的问题。根据我的初步分析认定可能是芯片老化的原因,后更换为 MT8870DE 发现本装置工作很正常,而且换上 MT8870DE 工作了将近一个月,整体电路没有发生任何解码误码情况,MT8870DE 在最后的联机调试过程中也没有出现任何问题。
5.3 软件程序调试 5.3.1 软件系统设置对于本系统而言,软件程序所实现的功能比较多,所以软件程序的调试显得相当的烦琐。整个程序是使用汇编语言,在 MBUG 下编写调试完成的。首先我使用的是我自己的计算机联接 MCS-51 仿真机,计算机的主频为 333MHz,但是出现了许多的问题。第一个问题就是:我所使用的 MCS-51 仿真机型号是 ME-5103,联入计算机的 25 针串行口来进行程序的读入,但是我的计算机没有 25 针串行口。
观察计算机的后面,主板上只有一个 25 针并行口,是用来连接打印机的;除了这个 25 针串行口外,还有两个 9 针串行口。我只有把 MCS-51 仿真机的 25 针接口变成 9 针串行接口,才能连接计算机。后来我找到一个 25 针-9 针的转换口,可以通过他使 MCS-51 仿真机和我的计算机联接。我使用的是 Manley In-Circuit Emulator Debugger(MBUG)开发软件,使用时发现此系统可以进行正常的 Assemble(汇编),但是不能正常的进行 Load Program,执行时会出现 divide overflow error 的错误,然后就退出此编译系统,这就使得无法进行仿真机模拟实验。
经过实验室多组同学的八台计算机的尝试,我们终于发现了问题之所在。实验结果表明:主频高于 233MHz 的计算机都不能正常联接 MCS-51 仿真机,而主频低于 100MHz 的计算机(有 25 针串行接口)均可以进行仿真实验。后来经过查阅有关技术资料,型号为 ME-5103 的 MCS-51 仿真机只能工作在 IBM PC/XT/AT 286/386/486 的环境下。由于实验室的低档计算机(能联接 MCS-51 仿真机)的不太多,所以我们只有把仅有的几台计算机进行优化重组,以便合理利用有限的计算机资源。
我的汇编语言程序相对来说还是比较多的,调试起来可能费时,所以我先在自己的计算机上对程序的语法错误(syntax error)进行调试修改,然后又对地址覆盖(org address is less)的错误进行修改,既对每个子程序的开始地址进行仔细的调整。到此为止整个软件程序调试环境就已经配好了。
5.3.2 提示音信号在本单元的调试过程中,我认为此部分的结构比较简单,因此在整体程序中直接调试。首先 Ctrl+F5 单步执行,发现此部分的 RING1 子程序正常,而其它的子程序在执行时却发生死循环。我把这几个子程序单独切出来进行分析,却发现执行正常,于是我推测并不是子程序本身的结构问题。然后使用 Ctrl+F8 对整个程序单步执行(两种单步执行的区别在于 F5 直接执行子程序,即不单步执行子程序,而 F8 对于整个程序都是单步执行,包括子程序),发现 RING2 中的 R5 寄存器已经在主程序中用作判断标志位,程序已经在外部完成对其赋值。
这样就导致重复赋值,因此无法跳出循环子程序,直接导致死循环。程序代码:ORG 1150HRING20:MOV R3,#03RING21:MOV R6,#20 ;password wrongRING22:MOV R5,#20 ;1600HzRING23:LCALL DL20 ;sound=3CPL P3.0 ;delay=0.25sDJNZ R5,RING23DJNZ R6,RING22CLR P3.0MOV R5,#200RING24:LCALL DL10DJNZ R5,RING24DJNZ R3,RING21CLR P3.0RET 后来我将子程序中的 R5 寄存器换成 R7 寄存器,子程序就正常了。
5.3.3 密码检测本部分的调试比较艰难,我是先调试一位密码,然后再调试五位密码。我先设定 R5 为一位,即先设定一位密码作为测试。首先单步执行,发现信号音无法正常输入到单片机的 38H 地址处的存储空间。现象:计算机联机单步执行,接收振铃信号,三次自动摘机,当程序执行到等待 INT0 中断(一个小的循环程序)时,既等待输入密码时,我按下“7”(事先设定的一位密码),单片机能够正常的响应中断信号,跳出循环程序,执行中断处理程序,单片机在比较比较密码时,总是出错。
在程序单步执行时,我仔细观察了每个寄存器和存储器的内容。地址为 38H 的存储空间内容始终为 FFH,并没有变化,而且无论输入什么密码,寄存器 A 的内容总是恒定不变的。因为地址为 38H 的存储空间内放的是用户输入的密码,累加器 A 放的是@30H 减去@38H 的值,即输入密码正确时应该为 0,所以我认为单片机并没有把数据写入地址为 38H 的存储空间。经过反复调试我也没有发现问题之所在,于是我抱着尝试的想法用 F9 全部执行一次。
结果很惊人,程序居然能通过密码检测部分。我仔细的思考了单步执行的每一个状态,终于发现了失败的原因。 程序单步执行到等待 INT0 中断,即要求输入密码时,按下电话机的一个按键,程序就跳出循环程序,跳到中断处理程序处处理双音频信号的输入。因为单步执行是一步一步的执行,其执行速度比较慢,等到把单片机的 P1 口高四位的双音频解码信号写入地址为 38H 的存储空间时,信号早已过去,P1 口高四位也恢复高电平,写入 P1 口高四位的数据当然是 FFH。
而 F9 全程执行速度非常快,不是外部信号等待单片机的处理,而是单片机等待外部信号的输入,当然不会漏掉数据。原因找到了,解决方法也很简单:在程序单步执行时,到了等待 INT0 中断时,我按下“7”键的时间特别长,直到看见程序执行到写入地址为 38H 的存储空间后才松手。这样数据就能正确写入寄存器,当然能够通过密码检测。程序代码:HOKE1: LJMP HOKEORG 0090HTT0: SETB 7DHRETIORG 0150HHOKE: CLR 7DHSETB P3.1 ;open telephoneCLR TR0 ;close T0MOV R2,#03H ;password wrong 3LCALL RING10 ;input passwordIN: CLR 7EH ;7EH=0DTMF: MOV R7,#1H ;PASSWORD:5 R7MOV R1,#38H ;signSETB P1.4SETB P1.5SETB P1.6SETB P1.7WAIT: JBC 7EH,CC ;wait INT0LJMP WAITCC: MOV R7,#1H ;password 5***MOV R0,#30H ;password topMOV R1,#38H ;signCMP: MOV A,@R1MOV R4,ACLR CMOV A,@R1SUBB A,@R0 ;testINC R0INC R1JZ AAA ;OK,pass oneLJMP QQAAA: DJNZ R7,CMP ;R7-1!
=0LJMP LL ;passQQ: DJNZ R2,IN1 ;password wrong&R2!=0LCALL RING20LJMP STOPIN1:LCALL RING20 ;password wrong,try!LJMP IN5.4 联机在线调试经过前一阶段硬件、软件的分别调试,本装置的制作也到了最后的冲刺阶段,那就是联机在线调试。联机在线调试所用到的设备:1、 MCS-51 仿真机一台;
2、 TC-108H“多路通”实验程控交换机一台;
3、 HA8188(9)P/T 双音多频电话机一台;
4、 HA119(6)P/T 双音多频电话机一台;
5、 主频为 50MHz 的微机一台;由于实验室条件有限,只有两台交换机供十几组使用,时间非常有限。本装置的前期调试工作尽可能的完成在交换机外,例如:振铃检测的调试基本上就是在宿舍的电话上完成的。我是选择了一个晚上从 23 点一直调试到了次日凌晨 2 点,在别人不使用交换机的时候调试基本完毕的。联机在线调试的第一步是振铃音检测,由于事先的调试,这一部分没有花太多时间,只是在单步执行的时候,有时会发生仿真机不正常结束程序的情况。
经过询问老师和同学,MCS-51 仿真机不是太稳定,这种情况经常发生,在全速执行或把程序烧录片子之后就不会发生了。双音频信号解码在联机在线调试的时候也没有发生太大的问题。最大的问题发生在程序内部的信息处理部分,因为我事先并没有对信号的编解码做规定,这样就直接导致双音频信号解码后输入到单片机内,造成跳转指令混乱。比如我按下“7”键,单片机会认为我按下的是“1”键。这一部分原理是比较简单的,但是程序还是挺麻烦的,因为当时已经是半夜,所以头脑比较混乱,我用了一个多小时的时间才把程序内译码、码制转换的问题解决。
因为调试的时候是只使用一位密码,控制一路电器,所以到了这时,我还有扩展密码位数和扩展控制路数的问题要解决。这些扩展都是时间问题,只要仔细的拷贝一些程序代码就可以顺利完成。在联机调试的后期我还发现了一些小问题:我的实验桌上一共有三排数据线,我使用的是其中的一排。结果总是第三路电器无法实现遥控,更换数据线就会变正常。经万用表测量发现原先使用的数据线有一根线根本是不导通的。我还用不同的 MCS-51 仿真机实验,发现几乎没有两台 MCS-51 仿真机的实验结果是完全相同的,不是晶振的振荡频率不同,就是有个别管脚不能输出数据。
晶振的振荡频率不同就直接造成延时不同,发生频率不一样。经过一个通宵的调试,大大小小的各种问题都得到了解决,到此为止,在线联机调试也就告一段落。
第六章系统使用说明本系统使用起来非常方便,下面我就系统使用流程图做一下简单的使用方法介绍。如右图 7.1 所示,首先用户把本装置的信号线并联在电话线的两端,插上电源线,打开电源开关,本装置自动复位,就能正常工作了。当用户从异地打来电话,本装置接收到电话振铃音,开始计数。当电话铃声计到五次,装置自动摘机,回送提示音提示输入密码。当用户在三次之内输入正确的密码后,用户就可以对装置所连的电器进行选择,然后根据需要对其进行开关控制。用户可以在一次“通话”中同时控制几个电器。如果用户控制完毕,可以按‘#’键让装置自动挂机,结束“通话”。而已经开启的电器将保持其开启的状态,直到下一次的“通话”控制使其关闭。本装置使用起来简单易学,而且功能强大。
第七章系统功能扩展本系统由于时间的限制,在毕业设计结束之前只能作到现有的程度。在本次毕业设计的后期,我也尽量对本作品的功能进行了相应的扩展。例如:单片机控制电器数量的增加,此部分充分应用了单片机外围接口扩展技术。 我在这里对本系统还可以的扩展功能做一下简单的介绍。
1、使用 MT8888 芯片还可以进一步扩展其功能,而且使本装置的体积大大减小,在这里就 MT8888 集成电路作一个简单的介绍。MT8888 是 MITEL 公司的产品,是一种带呼叫进展过滤器的单片双音多频收发器。它包括一个带增益可调放大器的 DTMF 接收器和一个 DTMF 发送器。接收器的结构及工作原理与 MT8870 大同小异,也采用集频带分离滤波和数字解码为一体的结构。其中滤波电路也采用高频群和低频群两个六阶开关电容带通滤波器,解码采用数字计数器技术来确定输入的 DTMF 音调的频率,并将其译成标准的四位二进制码。
发送器采用开关电容 D/A 变换器。片内使用了一个脉冲计数器,能合成精确的音调脉冲,保证音调脉冲准确的定时发送。MT8888 提供了一个标准的微处理器总线接口,可以直接与 MCS-51 系列微机接口。它还可以选用呼叫进展方式工作,通过呼叫进展滤波器来检测特定通带内的信号频率,供微处理机或计数器电路分析,以确定检测到的呼叫进展音的性质。MT8888 的接收工作方式,从检测 DTMF 信号到解码的过程与 MT8870 完全一致,差异较大的是解码后的二进制码的输出。
MT8888 没有延时导引输出端 stD,当收到的有效音调对已被寄存且相对应的四位二进制码已被锁在接收数据寄存器中时,片内状态寄存器中的延时控制标志位 b3 复位,同时状态寄存器中的接收数据寄存器满标志位 b2 置位,CPU 可通过查询这些状态标志来了解解码的过程。如果选中的是中断方式,当延时控制标志位复位时,IRQ/CP 端将变为低电平,向 CPU 发送中断请求,当 CPU 响应此中断,读出状态寄存器中的数据后,IRQ/CP 端返回高电平状态。
根据 MT8888 的以上特点,它可以检测出电话振铃音、忙音等信号音。我设计了新的系统功能,改进了的系统可以首先工作于第二方式,即电话线路信号音检测状态,然后根据振铃情况控制摘挂机,摘机后 MT8888 工作于第四方式,即双音频解码状态,后面就和 8870 一样了。这样就能节省硬件电路的设计制作,还可以大大缩小本装置整体体积。
2、利用 138 译码器的 STA、STB 和 STC 还可以进行级联扩展为 24 线译码器,若外接一个反向器还可以级联扩展成为 32 线译码器。
3、使用 LM567 锁相环可以对电话信号音中的忙音进行识别,使使用者更加方便,而且能够提高本装置的稳定性。