我们经常需要设计驱动直流电机的电路或者直流电磁铁,下面介绍如何用单片机实现定时控制继电器(见附图)。
设计要求:按下启动P1.0按键后,电动机能运转:按下P1.1按键后,电动机停止。到延时10分钟结束后,电动机也能自行停止,实现定时控制。
一、系统仿真图(见附图)
二、程序一编制
基本思路是,通过两个按键的判别,启动直流电磁铁,同时引用delay()10分钟延时函数实现定时控制。于是程序分两个模块进行即延时模块delay()和主函
仿真时却发现存在问题:在按下启动Pl.0按键后,电动机能运转;但是按下停止P1.1按键后,电动机不能随时停止。到延时10分钟结束后,电动机才能停止运转。
分析原因是:在电动机运行的10分钟时间内,无法停止,程序仍运行在延时的阶段,所以需要利用定时器中断程序,按下启动按键后,延时时间运转。并能随时停止。
三、改编的程序
改编程序的分析:利用定时器TO中断,实现到时间停止。故编写voidtime0Ointerrupt1即定时器TO的中断程序(这里因为调试的需要,故将延时时间缩短为5秒,以利于观察)。
1.主函数中我们并未设定延时时间,完全依赖于定时中断程序,如if(start==1){P2_0=0;},后面没有延时时间:只要按键一启动并且延时时间一到就执行中断的程序;停止按钮一按下,电动机就停止,实现了随时停止电机的可能。
2.主函数中TR0=1后定时器开始计时,不占用CPU的时间.CPU的工作和定时器的计数是同时进行的,互不影响。
直到定时器计满溢出,表明定时时间50ms到,才向CPU发出中断申请,CPU相应中断暂停主程序的执行,转去执行中断处理函数time0,并重载TO的计数初始值。
3.按下启动按键.P2.0=0电机运行,并且变量i加1.并判断变量i的值是否达到100次,说明定时时间5s已到.将i的值重新初始化为0。每到一次50ms中断程序,配合按键按下,达到电机运行5s的时间延时。
4.为了确保定时器的每次中断都是50ms,我们需要在中断函数中每次都要为THO、TLO重新加载计数初始值。否则的话,计数器溢满后讲自动回零,下一次将从零开始计数定时,那么定时时间将不再是50ms了。
通过两个程序的比较,大家对定时器中断有了一定的了解,相信在以后的编程学习中,会更加得心应手。