首页 理论教育 程序设计与仿真-零起点学Proteus单片机仿真技术

程序设计与仿真-零起点学Proteus单片机仿真技术

时间:2023-11-06 理论教育 版权反馈
【摘要】:根据流程图可以看到,程序的循环过程就是设置时间、倒计时、判断时间,其中倒计时显示时间又是一个子程序。因此,可以用定时中断处理子程序实现时间的更新(倒计时)、判断时间是否到,若时间到就执行供电或断电即可。下面我们来解决时间设置问题,这里要用到外部中断处理程序,就是第5讲的按钮处理,把两个按钮处理的外部中断设置和中断处理子程序复制进来。将中断设置加入主程序头部,中断子程序放在程序尾部。

程序设计与仿真-零起点学Proteus单片机仿真技术

下面我们进行定时供电插座的程序设计。前面已经分析了定时供电插座的基本功能,根据这些功能,就可以确定程序的框架。程序流程如图9-14所示。

为了使仿真能比较快的看到结果,这里把小时、分改为分、秒,读者在实际使用中只要稍作更改就可以了。

根据流程图可以看到,程序的循环过程就是设置时间、倒计时、判断时间,其中倒计时显示时间又是一个子程序。在前面的时间显示程序中我们知道,时间处理可以通过单片机定时器中断处理子程序来实现。

因此,可以用定时中断处理子程序实现时间的更新(倒计时)、判断时间是否到(时间为0),若时间到就执行供电或断电即可。这样,主循环只负责时间设置(若有设置请求)、时间显示就行了。

这里的时间设置请求也可以用前面讲到的外部中断请求实现,把处理程序变成中断处理子程序。所以,主循环就只剩下时间显示了。

最后,我们讨论一下供电和断电问题。如果你对电器比较了解,这个问题就很好解决了。我们在继电器原理图讲到,继电器有常开节点和常闭节点,还有一个公共节点。当继电器未通电时,即没有导通时,常开节点是断开的,常闭节点是闭合的。反之,当继电器通电时,常开节点闭合,常闭节点断开。因此,若你的插座接在常开节点,则一开始是断开的,时间到则闭合通电。反之,插座接在常闭节点,一开始就是通电的,时间到就会断开断电。所以,一个继电器的两个节点可以分别接两个插座,标上定时供电和定时断电即可。我们这个电路中的一个节点是空着的,你可以再接一路电器就显示出来了。当然,你也可以把程序做成时间到后供电,延续一段时间后再断电,这个问题留给读者自己去做。

978-7-111-36904-2-Chapter09-15.jpg

图9-14 程序流程图

下面我们就开始编程。与硬件设计类似,同样可以把以前设计的代码复制过来用,提高设计速度。首先把4位数码管时间显示的代码复制进来。因为端口没有变,因此,编译后直接就可以运行了。

978-7-111-36904-2-Chapter09-16.jpg

978-7-111-36904-2-Chapter09-17.jpg

978-7-111-36904-2-Chapter09-18.jpg

这样,我们就已经解决了时间显示问题。下面我们来解决时间设置问题,这里要用到外部中断处理程序,就是第5讲的按钮处理,把两个按钮处理的外部中断设置和中断处理子程序复制进来。

978-7-111-36904-2-Chapter09-19.jpg

把它们改成对分和秒进行处理,这里外部中断0对分处理,外部中断1对秒处理。因为只有一个按钮,就只能加,加到头清零。这里分、秒都是60进制,所以到60就清零。

978-7-111-36904-2-Chapter09-20.jpg

978-7-111-36904-2-Chapter09-21.jpg

将中断设置加入主程序头部,中断子程序放在程序尾部。这样,我们已经完成了时间设置问题。接着,我们要解决时间倒计时问题。原来显示时间是往上加1,现在改为减1,其他设置相应改动即可,这里只要把定时中断处理子程序改一下:

978-7-111-36904-2-Chapter09-22.jpg

以上秒到负值时要变成59,但分不能变为最大值。为了使初始不至于就停止,可以给分、秒赋一个初值,如3∶30。

978-7-111-36904-2-Chapter09-23.jpg(www.xing528.com)

接着,我们要解决最重要的问题,就是时间到,要开继电器。首先要在开始定义继电器引脚,现在,继电器控制端接在P1.0,定义如下:

978-7-111-36904-2-Chapter09-24.jpg

然后,要在定时中断程序中,根据条件开启继电器。这个条件就是,时间为0,即分和秒都是0:

978-7-111-36904-2-Chapter09-25.jpg

978-7-111-36904-2-Chapter09-26.jpg

剩下一个问题就是蜂鸣器发声,我们让它在定时到后发声一段时间(长时间不断发声会有扰民问题呀)。与继电器一样,先要定义蜂鸣器控制端引脚,现在蜂鸣器接在P3.0,定义如下:

sbit BUZZER=P3^0; //定义蜂鸣器控制端引脚

我们把第7讲蜂鸣器发声子程序复制过来稍作改动,加上一个循环,以便延时一段时间:

978-7-111-36904-2-Chapter09-27.jpg

把发声子程序放在程序最后。由于子程序放在最后,因此需要在开始声明一下:

978-7-111-36904-2-Chapter09-28.jpg

到这里,我们的程序就大功告成了。以下是刚才讨论的程序内容:

978-7-111-36904-2-Chapter09-29.jpg

978-7-111-36904-2-Chapter09-30.jpg

978-7-111-36904-2-Chapter09-31.jpg

978-7-111-36904-2-Chapter09-32.jpg

最后,我们在继电器常闭节点也接上灯泡,一开始常闭节点灯亮,常开节点灯不亮,时间到后反之,仿真运行结果如图9-15所示。

978-7-111-36904-2-Chapter09-33.jpg

图9-15 定时供电插座仿真运行

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈