MCS-51单片机内部共有两个16位可编程定时器,计数器,即TO、Tl。既有定时功能,又有计数的功能。每个定时器都是由两个8位的特殊功能寄存器THi和TLi组成(i=0、1)。TMOD是TO和Tl的工作方式控制寄存器,TCON是TO和Tl的运行状态控制寄存器。在实际应用时,应首先根据需要对这些寄存器进行初始化,即设置TO和Tl的工作方式并对TO和Tl定时器装入初始值以得到精确的定时时间。TO和Tl的工作方式及运行状态是由TMOD和TCON两个特殊功能寄存器控制的,而TMOD和TCON是由用户所编的程序控制的。
定时器的核心是一个加l计数器,加l计数器的脉冲有两个来源:一个是系统时钟振荡器,另一个是外部脉冲,计数器对脉冲进行计数。当定时器/计数器用作定时器时是对机器周期进行计数,每经过一个机器周期计数器就加1,不断自加直到数满溢出,定时器的定时时间不仅与计数器初值有关,而且与系统的时钟频率有关。当定时器/计数器用作计数器时,计数器对来自输入引脚TO和Tl的外部脉冲计数。
MCS-51每个定时器有4种工作方式:方式0是13位计数结构,计数器由TLi的8位与THi的低5位构成,定时范围为(1—213)个机器周期;方式1是16位计数结构,定时范围为(1~216)个机器周期;方式2是8位计数结构,计数器由TLi的8位组成,当定时器溢时.THi的值能自动装入TLi中,并在此值基础上自动计数;在方式3下,也是8位的计数器,并且TO的各控制位和引脚归TLO使用,THO借用Tl的各控制位和引脚信号,Tl只能按不需要中断的方式0、1、2工作。通常用做串行通信的波特率发生器。
在实际应用中,定时器可以采用查询和中断方式,用查询的方式,程序执行的效率比较低,比较常用的是中断方式,使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。
下面我们看一个例子,需要延时为50ms,我们可以取定时器TO在工作方式1,计数初值为65536-50000=15536=3CBOH,用汇编编写中断服务程序如下:
从定时器溢出,发出中断要求,系统接受该中断要求,执行类似“LCALLXX”的动作,将正在执行的程序PC低位、高位压人堆栈,然后加载中断失量地址(0013H)到PC中,这一段过程要耗3个机器周期。在中断服务程序中把初值重新装入定时器并开启计数器①~⑥共占了10个机器周期,TLO初值应该赋值#OBDH。因为而此段位于0013H的程序超过8个字节会影响定时器1的中断入口(OOIBH),所以,要么0013H放一个中断跳转子程序,要么压缩语句。我们选用后者。因为在中断子程序中没有用累加器A,也没有运算操作,所以程序①、②、⑦、⑧可以省去。将程序③、⑥省去使计数器0-直打开,从⑤赋值后开始计算。程序修改为:
上一篇:通过单片机软件实现精确延时
下一篇:基于8051单片机的多功能用电故障控制器的实现
推荐阅读最新更新时间:2024-03-16 15:50