微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于89C51设计的电话远程控制开关

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

时间:06-07 来源:互联网 点击:

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的存储空间后才松手。这样数据就能正确写入寄存器,当然能够通过密码检测。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top