第9课 定时器
for(x=z;x> 时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。 C/T :定时/计数模式选择位。C/T=0为定时模式;C/T =1为计数模式。 M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。具体说明如下表: (2)定时器/计数器控制寄存器TCON TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下: TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。 TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。 TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。 TR0(TCON.4):T0运行控制位,其功能与TR1类同。 3、定时器工作方式及赋初值 通过对上面TMOD寄存器的介绍,我们知道,通过设置M0M1可能选择定时器的工作方式。这里可能有的人对选择定时器工作方式及赋初值是什么意思不明白,其实也很好理解,前面我们不是把加1计数器比作装水的水桶吗,而51单片机有4种工作方式就相当于有4种不同大小的装水的水桶,所以我们必须通过TMOD这个寄存器选择哪使用哪一个水桶(也就是选择哪一种工作方式);至于为什么要赋初值前面我实际已经有讲到过,计数器从全是装0到全部装1的整个时间是固定的,而我们实际用使用需要不同的定时间,所以我们必须先在计数器内先装一些数,然后在这个基本上进行加1计数,就可以得到我们想要的定时时间。 定时器总共有四种工作方式,而因为定时器工作方式1比较常用,所以这里仅对定时器0工作方式1进行介绍,并介绍如何赋初值。 方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 ,其逻辑结构图如图3所示。 图3 定时器0工作方式1逻辑结构图 当GATE=0,TR0=1时,TL0便在机器周期的作用下开始自动加1,当加了256次后自动向前进一位,直到TH0也计满,然后溢出,置标志寄存器TF0=1,如果此时设置了中断允许,CPU便作进入中断函数内进行中断程序的处理。注意,此时若TR0=1一直打开的话,计数器满后会全部自动清零,然后重新重复以上过程,直到TR0=0时结束。 接下来讲解如何计算定时器的初值问题。定时器一旦启动,它便在原来的数值基础上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHZ,12个时钟周期为一个机器周期,那么此时的机器周期就是1us,计满TH0和TL0就需要2X16-1,再来一个脉冲,计数器就溢出,随即向CPU申请中断。因此溢出一次的时间为65536us,约等于65.5ms,如果我们要定时50ms,此时就需要向TH0t和TL0里面先赋初值,在这个初值的基础上计50000个数后,定时器溢出,此时刚好就是50ms中断一次,如需要定时1S时,在写程序时当产生20次50ms的定时器中断后便认定是1s,这样便可以精确制定定时时间了。要定时50ms,即要计50000个数,TH0和TL0中应该装的总数是65536-50000=15536,把15536对256求模:15536/256装入TH0中,把15536对256求余:15536%256装入TL0中就可以了。 以上就是定时器赋初值的计算方法,总结后可以得出以下结论:当用定时器的方式1时,设机器周期为t ,定时器产生一次中断的时间为T,那么需要计数的个数N=T/t,装放THX和TLX中的数分别为: THX=(65536-N)/256 ,TLX=(65536-N)%256 要计算机器周期t,就需要知道系统的时钟频率,也就是单片机外接晶振的频率,实验板上的时钟频率为11.0592MHZ,那么机器周期为12X(1/11059200)=1.09us,若T=50ms.那么N=50000/1.09=45873,如果晶振为12MHX的话,用同样的方法算出来N=50000. 4程序举例 下面我们举一个例子,用单片机的定时器0、工作方式1和中断技术实现让L1以间隔1s的时间闪烁。 这里我们先总结一下,在使用定时器主要对定时器作相应的初始化,其步骤为: (1)对TMOD赋值 选择计数或者定时 确定T0或T1的工作方式。 (2)计算初值,并将其写入TH0、TL0或TH1、TL1。 (3)使TR0或TR1置位,启动定时/计数器定时或计数。 (4)需使用中断方式时,则对IE等赋值,开放中断 下面我们给出相关程序。 例1:1357灯以间隔1s的时间闪烁。 #include #define uint unsigned int//
定时器单片 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)