基于51单片机设计的电话遥控器
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仿真机的实验结果是完全相同的,不是晶振的振荡频率不同,就是有个别管脚不能输出数据。晶振的振荡频率不同就直接造成延时不同,发生频率不一样。
经过一个通宵的调试,大大小小的各种问题都得到了解决,到此为止,在线联机调试也就告一段落。
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)