3.1.3 定时器0中断服务程序
此中断服务程序用来计时。当开关1开启时,就开始计时,直到开关1关闭 计时才会停止。就是由于它是用来计时的,所以在小时上用的不是24进制,它可以超过24时,走到99时。
在中断中会有一次判断定时是否到,当定时到了。会自动关闭开关1。完成定时功能。 如图3-3。
开始保护现场再次赋定时初值N是否到一秒Y秒加一N是否60秒Y分钟加一Y定时是否到NN否到到60分Y小时加一关闭开关1停止走时恢复现场跳出中断图3-3 T0中断服务程序
- 31 -
第4章 调试中的问题及解决办法
可以说调试是非常重要的事情。在做产品之前首先进行理论分析,在理论上首先应该没有问题,但是理论能够完全分析的符合实际也是非常难的事。就如我,我已经分析出理论是没问题的,但是实际试验时就问题百出了。不能盲目去做板子,那样会浪费材料的,就如我这次的设计整整让我做了三块板子,才做到现在的成果。对于我来说可谓不易啊。
4.1 硬件的调试
在硬件调试中我遇到了很多问题:
第一、第一次我把原理图画出来,并认为他已经完美了没有任何问题了,就 开始做板子结果问题多多。发现电源不通。
经过检查发现LM317的管脚弄错了,我把它认为象LM7805一样的管脚功能,结果就可想而知了,根本没有电压输出的。通过上网查找LM317的资料,终于找到的他的真正管脚功能,这次的设计还真的要感谢网络,器件的资料几乎都是在网络上找到的。找到了LM317的真正管脚功能之后,我把第一次做的板子上错误的敷铜划断,用导线将其正确的连接,结果才算电源不分成功了,用万用表测量各个部分的电压也正常了。
下一步将测试光电耦合器部分的计数功能。当把电话线插上,拨打寝室电话时发现,根本就没有信号输出,经过仔细的察看,查阅多方资料,发现光电耦合器的管脚排列与我画的PCB管脚排列是不同的,错误在于光电耦合器的集电极与发射极的管脚搞错了,解决的方法与上面解决的方法相同,结果单片机可以完成了计数功能。耦合器可以正常的工作。值得注意的一点还有,光电耦合器上串接的电阻要适中,在试验中我用的电阻有点小,结果烧掉一个耦合器。当做到这个程度的时候我有认为应该没有问题了,就做了第二块板子。还有一点值的说一下的就是,在调试的时候用不到的地方最好不要先焊上。在我的设计中用到了数码管第一次做板子时我就把它们焊上了,结果没有用到就发现有错误,这就需要将它们拆下,拆下的时候就麻烦了,他们的管脚太多。这样做设计的时候就需要进行一部分一部分的调试很重要。
第二,第二次把板子焊好,再次检查板子,在电源部分和耦合器部分已经没有问题了,把程序写入单片机再次进行试验,果然单片机机可以正常计数了,并且能够完成正常的模拟摘机。进行下一步的测试,通过手机按键来控制单片机。
- 32 -
结果问题有出现了,单片机识别不了按键。首先我考虑是不是CM8870的连接有问题,但是从下载的CM8870的资料来看并没有接错,就想到了是不是程序有问题啊,就开始调试程序,调来调去问题还是照旧,没有任何变化,使我很惆怅,结果再反过来看是不是CM8870不能正常工作,试验开始了把电话线插到设计板上用手机拨打电话,模拟摘机后,按手机上的按键,这时用万用表测量CM8870的各个管脚输出的电压,发现它的译码是正确的,说明CM8870的工作是正常的。比如,按下2键CM8770可以译出正常的8421码0010。再按下另一键测量都是正常的。再测量CM8870的STD端是不是能够正常输出高电平,测量发现,STD端输出的是一个正脉冲,但是发现它的电平很低,单片机不能把它看成高电平的。原因终于算是找到了,这样我就把电路改进了一下,用一个三极管用共集电极的连接方法来提高当有按键按下单片机管脚P1.5的电平,将电路改进,用导线连接三极管,焊接到电路中,再次试验,终于发现,单片机能够正常识别按键了。再者,解码芯片周围的电阻和电容与典型应用上的数值应该差别非常小,不然会引起解码不正常,甚至不能解码。这些都应该注意的。把PCB图改正后就做了第三块板子。
4.2 软件的调试
软件的调试之前一定要保证硬件是完好的,这样就认真调试程序,不用操心硬件的问题,不能程序调试很长时间了,结果发现硬件有问题,那样就太浪费时间了,我在调试程序时并没有用我自己做的板子,而是用我们在学习期间老师发的实验板来调试程序的。
第一、软件的调试是一个复杂的过程,调试时首先发现的问题是发现,程序不能正常计数,因为以前用的多是定时计数器的定时功能很少用到它的计数功能,这次设计中用到了计数器的计数功能,所以出现了一些问题。设置中断允许控制寄存器IE时,设置错误不能正确计数,当时我做试验时也用了我做的板子,使我不知道是板子有问题还是程序的问题,让我很长时间都怀疑是板子的问题,浪费了很长时间,最后我才改用了老师发的板子,我相信那个板子是好的,而且确实那个板子是好的。最后我用发的班子上的按键完成了计数器的计数功能,当确认单片机确实可以计数时,在把单片机插到做的板子上,来试做的板子能否正确计数。其实调试软件和硬件的调试的是一起进行的。
第二、当由单片机识别密码的时候,我也遇到了问题,就是由手机输入密码的时候,每输入一个按键单片机就认为输入密码错误:
IN:MOV R0,#40H ;存放密码单元40H到45H。 MOV R2,#06H ;读入次数。
- 33 -
TO2:JNB P1.5,TO2 ;等待按键按下。 MOV A,P1 ;读入P1口的低四位。 ANL A,#0FH MOV @R0,A INC R0 DJNZ R2,TO2
我本来认为当有用信号输入时编码芯片STD端会输出一个很短的脉冲,单
片机读数就读一次。仔细一想原来不是这样的,每按下一次按键单片机就认为输入了六次。六次读入的都是一个数与我设置的初始密码不一样,就认为密码输入错误。我仔细想应该让它一个一个数字往里读,阻止它一读六次。将程序修改一下并每按一次并发出一次鸣笛,提示用户一次读入完毕:
IN:MOV R0,#40H MOV R2,#06H TO2:JNB P1.5,TO2 MOV A,P1 ANL A,#0FH MOV @R0,A INC R0
NN:JB P1.5,NN ;程序执行到这阻止单片机继续读,等待这次有效
信号的消失。
LCALL RING1 ;发出一次鸣笛,提示用户可以输入下一个数字了。 DJNZ R2,TO2 护的声音,更好控制。
第三、定时的时候也遇到了问题,当用手机给里输入定时数字时我就是定时就是不成功,起初我认为定时的数字输入不进去,仔细看程序也没有看出程序有问题,并且其他的地方都是用这样的读数方法 ,它们可以成功读入。我就用软件定时,结果定时成功了,说明定时的程序没有问题,就是单片机往里读数时错误。我想读数怎么会错,不可能的。为了看到效果早一点我定时就是三四分钟。比如定时五分钟,输入0、0、0、5。仔细想程序定时成功,而用手机定时就不成功。想了很久终于大悟过来了,手机输入的零不是十六进制的零,而是十六进制的十,原来的定时程序是这样:
MOV R2,#04H ;四位包括时两位 分两位。
MOV R1,#4FH ;定时用到的单元的最高位 SS:JNB P1.5,SS
- 34 -
程序经过这样的修改,问题就解决了,可以一个一个的输入,并且有提示拥
MOV A,P1
ANL A,#0FH ;这里无论是几都往里读。错误所在。
MOV @R1,A
DEC R1 HHH:JB P1.5,HHH LCALL RING1 DJNZ R2,SS
经过修改程序如下,问题就解决了:
MOV R2,#04H ;四位包括时 分
MOV R1,#4FH SS:JNB P1.5,SS MOV A,P1 ANL A,#0FH
MOV 38H,A ;首先把数字存放起来,等待判读。 XRL A,#0AH ;判断是不是按键上的零,即0AH.。 JNZ SSS ;如果不是就跳转到SSS。
MOV A,#00H ;如果是按键上的零(0AH),就把零给A。 SJMP HH ;跳转到HH。 SSS:MOV A,38H HH:MOV @R1,A DEC R1 HHH:JB P1.5,HHH LCALL RING1 DJNZ R2,SS
。
- 35 -