使用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.2
6、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.4


STD电平由低变高,再反相为低,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 1100H
RING10:MOV R6,#20 ;input password
RING11:MOV R7,#20 ;800Hz
RING12:LCALL DL10 ;sound=1
CPL P3.0 ;delay=0.5s
DJNZ R7,RING12
DJNZ R6,RING11
CLR P3.0
RET
ORG 1150H
RING20:MOV R3,#03
RING21:MOV R6,#20 ;password wrong
RING22:MOV R7,#20 ;1600Hz
RING23:LCALL DL20 ;sound=3
CPL P3.0 ;delay=0.25s
DJNZ R7,RING23
DJNZ R6,RING22
CLR P3.0
MOV R7,#200
RING24:LCALL DL10
DJNZ R7,RING24
DJNZ R3,RING21
CLR P3.0
RET


ORG 1200H
RING30:MOV R3,#02
RING31:MOV R6,#20 ;select
RING32:MOV R7,#20 ;800Hz
RING33:LCALL DL10 ;sound=2
CPL P3.0 ;delay=0.5s
DJNZ R7,RING33
DJNZ R6,RING32
CLR P3.0
MOV R7,#200
RING34:LCALL DL10
DJNZ R7,RING34
DJNZ R3,RING31
CLR P3.0
RET


ORG 1250H
RING40:MOV R3,#03
RING41:MOV R6,#20 ;control
RING42:MOV R7,#20 ;800Hz
RING43:LCALL DL10 ;sound=3
CPL P3.0 ;delay=0.5s
DJNZ R7,RING43
DJNZ R6,RING42
CLR P3.0
MOV R7,#100
RING44:LCALL DL10
DJNZ R7,RING44
DJNZ R3,RING41
CLR P3.0
RET


ORG 1300H
RING50:MOV R6,#40 ;finish
RING51:MOV R7,#20 ;1600Hz
RING52:LCALL DL20 ;sound=1
CPL P3.0 ;delay=0.15s
DJNZ R7,RING52
DJNZ R6,RING51
CLR P3.0
RET


ORG 1500H
DL10:MOV R5,#25 ;delay1.25ms,f=800HZ,fosc=12MHz,
DL12:MOV R4,#25
DL11:DJNZ R4,DL11
DJNZ R5,DL12
RET


ORG 1600H
DL20:MOV R5,#12 ;delay0.625ms,f=1600HZ,fosc=12MHz,
DL22:MOV R4,#25
DL21:DJNZ R4,DL21
DJNZ R5,DL22
RET


ORG 1650H
DL30:MOV R5,#50 ;delay20ms
DL32:MOV R4,#200
DL31:DJNZ R4,DL31
DJNZ R5,DL32
RET


4.2 密码检测部分


本系统密码校验的基本原理是:在系统初始化的时候把原始密码写入地址为30H开始的存储空间内,密码的位数“5”赋给R7。当系统摘机时,要求输入密码,单片机把解码后的数据(使用者输入的密码)存储在38H开始的存储空间内。然后单片机对进行两个存储地址的内容逐位进行比较,直到完全相等才能转到下一进程,有一位不同,程序就转到出错程序。


子程序代码:
ORG 0150H
HOKE: CLR 7DH
SETB P3.1 ;open telephone
CLR TR0 ;close T0
MOV R2,#03H ;password wrong 3
LCALL RING10 ;input password
IN: CLR 7EH ;7EH=0
DTMF: MOV R7,#5H ;PASSWORD:5 R7
MOV R1,#38H ;sign
SETB P1.4
SETB P1.5
SETB P1.6
SETB P1.7
WAIT: JBC 7EH,CC ;wait INT0
LJMP WAIT
CC: MOV R7,#5H ;password 5***
MOV R0,#30H ;password top
MOV R1,#38H ;sign
CMP: MOV A,@R1
MOV R4,A
CLR C
MOV A,@R1
SUBB A,@R0 ;test
INC R0
INC R1
JZ AAA ;OK,pass one
LJMP QQ
AAA: DJNZ R7,CMP ;R7-1!=0
LJMP LL ;pass
QQ: DJNZ R2,IN1 ;password wrong&R2!=0
LCALL RING20
LJMP STOP
IN1:LCALL RING20 ;password wrong,try!
LJMP IN


4.3 密码修改部分


本系统是通过在线输入密码而改变特定存储器中的密码值的。
程序代码:
ORG 1700H
KEYIN: SETB RS1 ;当前工作寄存器第二工作区
CLR RS0
ANL A,#00H ;清零A寄存器
MOV B,#05H
LCALL RING10 ;发提示音:输入密码***
MOV R7,#5H
MOV R1,#38H
WPIN: JBC 7EH,READ ;等待INT0中断
LJMP WPIN
READ: MOV R1,#38H
MOV R0,#40H
MOV R7,#05H
READ1: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,READ1 ;判断输入密码是否为5位,否跳转READ1
LCALL RING10 ;满5位,发提示音:再输入新密码
MOV R7,#5H
MOV R1,#38H
WRE: JBC 7EH,KEYCMP ;等待中断INT1
LJMP WRE
KEYCMP:MOV R6,#05H
MOV R0,#40H
MOV R1,#38H
KEYCP:MOV A,@R0
CLR C
SUBB A,@R1 ;A减((R1))
INC R1
INC R0
JZ BBB ;A的内容如果为0,则跳转BBB
LJMP LL
BBB: DJNZ R6,KEYCP ;R6减1不为0,则跳转KEYCP,即循环比较密码的五位
MOV R1,#38H
MOV R0,#30H
MOV R6,#5H
KEYREIN:MOV A,@R1
MOV @R0,A
INC R1
INC R0
DJNZ R6,KEYREIN ;R6减1不为0,则跳转,即循环比较密码的五位
LCALL RING50 ;发提示音:新密码已经设置
LJMP STOP
RET


4.4 控制电器部分


本系统首先通过外围双音频解码电路解码的信息(选择电器)判断所选择的电器,然后跳转到每一个子程序,通过单片机向P1口的低四位发送数据,这些控制信息表示对不同的电器进行控制的控制字。为了简单表示,在这里只写出了电器“一”的控制子程序,其它子程序很相似,详见附录。


程序代码:
LL: LCALL RING30 ;sound:input control
MOV R7,#1H ;***
MOV R1,#38H
CLR 7EH
WAIT0: JBC 7EH,DD ;wait INT0
LJMP WAIT0
DD: MOV R1,#38H
MOV A,@R1
RR A
RR A
RR A
RR A
MOV R4,A
RL A
ADD A,R4
MOV DPTR,#TAB
JMP @A+DPTR
TAB: LJMP ZERO
LJMP EIGHT;8
LJMP FOUR ;4
LJMP STOP ;#
LJMP TWO ;2
LJMP ZERO ;0
LJMP SIX ;6
LJMP LL ;**
LJMP ONE ;1
LJMP LL ;9,**
LJMP FIVE ;5
LJMP LL ;A,**
LJMP THREE;3
LJMP LL ;*,**
LJMP SEVEN;7
LJMP LL ;C,**


ORG 0250H
ZERO: LJMP LL


ONE: LCALL RING40 ;发提示音:请操作电器
OO1: MOV R7,#01H
CLR 7EH
WAIT1: JBC 7EH,WW1 ;wait INT0
LJMP WAIT1
WW1:MOV R1,#38H ;检查信号首位
MOV A,@R1
CJNE A,#50H,BB1 ;(38)不等于0AH(0),则跳转BB1
LJMP ZZ1 ;(38)等于0AH(0),则跳转ZZ1
BB1: CJNE A,#80H,QUIT1 ;(38)不等于01H(1),则跳转QUIT1
SETB P1.3 ;open 1
CLR P1.2
CLR P1.1
CLR P1.0
LJMP QUIT1
ZZ1: CLR P1.3 ;close all
CLR P1.2
CLR P1.1
CLR P1.0
LCALL RING50 ;finsh
QUIT1: LJMP LL


4.5 振铃计数部分


本单元是通过计数器T0的外部中断方式来计数的,程序代码:


ORG 0090H
TT0: SETB 7DH
RETI



第五章 系统调试


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~D7
0 0 0 0 1 1 1 1 1 1 1
0 0 1 1 0 1 1 1 1 1 1
0 1 0 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1
1 0 0 1 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 0 1
1 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 1150H
RING20:MOV R3,#03
RING21:MOV R6,#20 ;password wrong
RING22:MOV R5,#20 ;1600Hz
RING23:LCALL DL20 ;sound=3
CPL P3.0 ;delay=0.25s
DJNZ R5,RING23
DJNZ R6,RING22
CLR P3.0
MOV R5,#200
RING24:LCALL DL10
DJNZ R5,RING24
DJNZ R3,RING21
CLR P3.0
RET
后来我将子程序中的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 HOKE
ORG 0090H
TT0: SETB 7DH
RETI
ORG 0150H
HOKE: CLR 7DH
SETB P3.1 ;open telephone
CLR TR0 ;close T0
MOV R2,#03H ;password wrong 3
LCALL RING10 ;input password
IN: CLR 7EH ;7EH=0
DTMF: MOV R7,#1H ;PASSWORD:5 R7
MOV R1,#38H ;sign
SETB P1.4
SETB P1.5
SETB P1.6
SETB P1.7
WAIT: JBC 7EH,CC ;wait INT0
LJMP WAIT
CC: MOV R7,#1H ;password 5***
MOV R0,#30H ;password top
MOV R1,#38H ;sign
CMP: MOV A,@R1
MOV R4,A
CLR C
MOV A,@R1
SUBB A,@R0 ;test
INC R0
INC R1
JZ AAA ;OK,pass one
LJMP QQ
AAA: DJNZ R7,CMP ;R7-1!=0
LJMP LL ;pass
QQ: DJNZ R2,IN1 ;password wrong&R2!=0
LCALL RING20
LJMP STOP
IN1:LCALL RING20 ;password wrong,try!
LJMP IN


5.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锁相环可以对电话信号音中的忙音进行识别,使使用者更加方便,而且能够提高本装置的稳定性。

相关