定时器 定时器的认识时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率, 我们 KST-51 单片机开发板上用的晶振是 11.0592M,那么对于我们这个单片机系统来说,时 钟周期=1/11059200 秒。 机器周期:我们的单片机完成一个操作的最短时间。机器周期主要针对汇编语言而言, 在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的 时间是可以计算出来的,而 C 语言一条语句的时间是不确定的,受到诸多因素的影响。51 单片机系列,在其标准架构下一个机器周期是 12 个时钟周期,也就是12/11059200 秒。现在 有不少增强型的 51 单片机,其速度都比较快,有的 1 个机器周期等于 4 个时钟周期,有的 1 个机器周期就等于 1 个时钟周期,也就是说大体上其速度可以达到标准 51 架构的 3 倍或 12 倍。因为我们是讲标准的 51 单片机,所以我们后边的课程如果遇到这个概念,全部是指 12 个时钟周期。 这两个概念了解即可,下边就来我们的重头戏,定时器和计数器。定时器和计数器是单 片机内部的同一个模块,通过配置 SFR(特殊功能寄存器)可以实现两种不同的功能,我们 大多数情况下是使用定时器功能,因此我们的课程也是主要来讲定时器功能,计数器功能大 家自己了解下即可。 本节开头我们就提到了定时器有多种工作模式,工作模式的选择就由 TMOD 来控制, TMOD 的位分配和描述见表 5-4 到 5-6 所示,TMOD 的位功能如表 5-5 所示。 1模式寄存器 表 5-4 TMOD——定时器模式寄存器的位分配(地址 0x89、不可位寻址) 表 5-5 TMOD——定时器模式寄存器的位描述 | | | 在表 5-4 中,标 T1 的表示控制定时器 1 的位,标 T0 的表示控制定时器 0 的位。 | | 该位被置 1 时为门控位。仅当„INTx‟脚为高并且„TRx‟控制位被置 1 时使能 定时器„x‟,定时器开始计时,当该位被清 0 时,只要„TRx‟位被置 1,定时 器 x 就使能开始计时,不受到单片机引脚„INTx‟外部信号的干扰,常用来测 量外部信号脉冲宽度。这是定时器一个额外功能。 | | 定时器或计数器选择位。该位被清零时用作定时器功能(内部系统时钟), 被置 1 用作计数器功能。 |
表 5-6 TMOD——定时器模式寄存器 M1/M0 工作模式 | | | | | | | 兼容 8048 单片机的 13 位定时器,THn 的 8 位和 TLn 的 5 位组 成一个 13 位定时器。 | | | | | | | | 8 位自动重装模式,定时器溢出后 THn 重装到 TLn 中。 | | | | 禁用定时器 1,定时器 0 变成 2 个 8 位定时器。 |
可能你已经注意到了,表 5-2 的 TCON 最后标注了“可位寻址”,而表 5-4 的 TMOD 标 注的是“不可位寻址”。意思就是说:比如 TCON 有一个位叫 TR1,我们可以在程序中直接 进行 TR1 = 1 这样的操作。但对 TMOD 里的位比如(T1)M1 = 1 这样的操作就是错误的。我们 要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD 所有位操作,不能对其中某 一位单独进行操作,那么我们能不能只修改其中的一位而不影响其它位的值呢?当然可以, 在后续课程中你就会学到方法的,现在就先不关心它了。 2定时器的寄存器(计数多少)标准(有的有扩展)的 51 单片机内部有 T0 和 T1 这两个定时器,T 就是 Timer 的缩写,现在很多51 系 列单片机还会增加额外的定时器,在这里我们先讲定时器 0 和 1。前边提到过,对于单片机 的每一个功能模块,都是由它的 SFR,也就是特殊功能寄存器来控制。与定时器有关的特殊 功能寄存器,有以下几个,大家不需要去记忆这些寄存器的名字和作用,你只要大概知道就 行,用的时候,随时可以查手册,找到每个寄存器的名字和每个寄存器所起到的作用。 表 5-1 的寄存器是存储定时器的计数值的。TH0/TL0 用于 T0,TH1/TL1 用于 T1。 表 5-1 定时值存储寄存器
写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是 11.0592M,时 钟周期就是 1/11059200,机器周期是 12/11059200,假如要定时 20ms,就是 0.02 秒,要经过 x 个机器周期得到 0.02 秒,我们来算一下x*12/11059200=0.02,得到 x= 18432。16 位定时器 的溢出值是 65536(因 65535 再加 1 才是溢出),于是我们就可以这样操作,先给 TH0 和 TL0
一个初始值,让它们经过 18432 个机器周期后刚好达到 65536,也就是溢出,溢出后可以通 过检测 TF0 的值得知,就刚好是 0.02 秒。那么初值 y = 65536 - 18432 = 47104,转成 16 进制 就是 0xB800,也就是 TH0 = 0xB8,TL0 = 0x00。 3、定时器的控制 表 5-2 TCON——定时器控制寄存器的位分配(地址 0x88、可位寻址)
GATE门控注意 过程(通过软件方式)1:定时器工作(TF=0,不写时默认为0)>>>>定时器溢出(TF=1) 过程(硬件方式)2:定时器溢出(TF=1)>>>申请中断》》中断完成(TF=0》》定时器工作 大家注意在表 5-3 中的描述中,只要写到硬件置 1 或者清 0 的,就是指一旦符合条件, 单片机将自动完成的动作,只要写软件置 1 或者清 0 的,是指我们必须用程序去完成这个动 作,后续遇到此类描述就不再另做说明了。 只使用在使用定时器的时候,需要以下几个步骤: 第一步:设置特殊功能寄存器 TMOD,配置好工作模式。 第二步:设置计数寄存器 TH0 和 TL0 的初值。 第三步:设置 TCON,通过 TR0 置 1 来让定时器开始计数。 第四步:判断 TCON 寄存器的 TF0 位,监测定时器溢出情况。 程序 TMOD = 0x01; //设置 T0 为模式 1 TH0 = 0xc1 TL0 =0x00 //设为0.5ms TR0 =0, //启动 T0,启动定时器0 if (TF0 == 1) { TF0 = 0; //定时器0清零 TH0 = 0xB8; TL0 = 0x00; cnt++; if (cnt >= 200) //判断 T0 溢出是否达到 200次,200次为1秒 { cnt = 0;} //达到 200 次后计数值清零
|
使用定时器中断时 EA=0; TMOD= 0x01; //设置 T0 为模式 1 TH0 = 0xC1; //为 T0 赋初值 0xC100(32mHZ,条件下12倍的标准单片机) TL0 = 0x00; // ET0 = 1; //使能 T0 中断 ,打开定时器中断0 TR0 = 1; //启动 T0,启动定时器0 void InterruptTimer0() interrupt 1 { TH0= 0xC1; //重新加载初值 TL0= 0x00; cnt++; //中断次数计数值加 1 if(cnt >= 200) //中断 200 次即 1 秒 { cnt= 0; //清零计数值以重新开始下 1 秒计时 flag1s= 1; //设置 1 秒定时标志为 1 }
|