下面我们进行定时供电插座的程序设计。前面已经分析了定时供电插座的基本功能,根据这些功能,就可以确定程序的框架。程序流程如图9-14所示。
为了使仿真能比较快的看到结果,这里把小时、分改为分、秒,读者在实际使用中只要稍作更改就可以了。
根据流程图可以看到,程序的循环过程就是设置时间、倒计时、判断时间,其中倒计时显示时间又是一个子程序。在前面的时间显示程序中我们知道,时间处理可以通过单片机的定时器中断处理子程序来实现。
因此,可以用定时中断处理子程序实现时间的更新(倒计时)、判断时间是否到(时间为0),若时间到就执行供电或断电即可。这样,主循环只负责时间设置(若有设置请求)、时间显示就行了。
这里的时间设置请求也可以用前面讲到的外部中断请求实现,把处理程序变成中断处理子程序。所以,主循环就只剩下时间显示了。
最后,我们讨论一下供电和断电问题。如果你对继电器比较了解,这个问题就很好解决了。我们在继电器原理图讲到,继电器有常开节点和常闭节点,还有一个公共节点。当继电器未通电时,即没有导通时,常开节点是断开的,常闭节点是闭合的。反之,当继电器通电时,常开节点闭合,常闭节点断开。因此,若你的插座接在常开节点,则一开始是断开的,时间到则闭合通电。反之,插座接在常闭节点,一开始就是通电的,时间到就会断开断电。所以,一个继电器的两个节点可以分别接两个插座,标上定时供电和定时断电即可。我们这个电路中的一个节点是空着的,你可以再接一路电器就显示出来了。当然,你也可以把程序做成时间到后供电,延续一段时间后再断电,这个问题留给读者自己去做。
图9-14 程序流程图
下面我们就开始编程。与硬件设计类似,同样可以把以前设计的代码复制过来用,提高设计速度。首先把4位数码管时间显示的代码复制进来。因为端口没有变,因此,编译后直接就可以运行了。
这样,我们就已经解决了时间显示问题。下面我们来解决时间设置问题,这里要用到外部中断处理程序,就是第5讲的按钮处理,把两个按钮处理的外部中断设置和中断处理子程序复制进来。
把它们改成对分和秒进行处理,这里外部中断0对分处理,外部中断1对秒处理。因为只有一个按钮,就只能加,加到头清零。这里分、秒都是60进制,所以到60就清零。
将中断设置加入主程序头部,中断子程序放在程序尾部。这样,我们已经完成了时间设置问题。接着,我们要解决时间倒计时问题。原来显示时间是往上加1,现在改为减1,其他设置相应改动即可,这里只要把定时中断处理子程序改一下:
以上秒到负值时要变成59,但分不能变为最大值。为了使初始不至于就停止,可以给分、秒赋一个初值,如3∶30。
(www.xing528.com)
接着,我们要解决最重要的问题,就是时间到,要开继电器。首先要在开始定义继电器引脚,现在,继电器控制端接在P1.0,定义如下:
然后,要在定时中断程序中,根据条件开启继电器。这个条件就是,时间为0,即分和秒都是0:
剩下一个问题就是蜂鸣器发声,我们让它在定时到后发声一段时间(长时间不断发声会有扰民问题呀)。与继电器一样,先要定义蜂鸣器控制端引脚,现在蜂鸣器接在P3.0,定义如下:
sbit BUZZER=P3^0; //定义蜂鸣器控制端引脚
我们把第7讲蜂鸣器发声子程序复制过来稍作改动,加上一个循环,以便延时一段时间:
把发声子程序放在程序最后。由于子程序放在最后,因此需要在开始声明一下:
到这里,我们的程序就大功告成了。以下是刚才讨论的程序内容:
最后,我们在继电器常闭节点也接上灯泡,一开始常闭节点灯亮,常开节点灯不亮,时间到后反之,仿真运行结果如图9-15所示。
图9-15 定时供电插座仿真运行
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。