新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于89C51设计的电话远程控制开关

基于89C51设计的电话远程控制开关

作者:时间:2012-06-07来源:网络收藏

5.2.4 控制电器

控制电器这部分的外围硬件电路很容易,在调试过程中很顺利完成。在接仿真机时,使用的是P2口控制电器,实验结果表明P2口无法正常控制每个电器,翻阅资料发现单片机的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的问题。根据我的初步分析认定可能是芯片老化的原因,后更换为DE发现本装置工作很正常,而且换上DE工作了将近一个月,整体电路没有发生任何解码误码情况,DE在最后的联机调试过程中也没有出现任何问题。

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


上一页 1 2 3 4 下一页

评论


相关推荐

技术专区

关闭