第一步:配置工作方式寄存器—TMOD
TMOD寄存器的字节地址为89H,不能位寻址。一般采用整体赋值的方式进行配置;如:TMOD=0x01 // 0000 0001 GATE=0,定时器仅受TCON寄存器中TRx(x=0,1)来控制
GATE=1,定时器TCON寄存器中TRx(x=0,1)和外部中断引(INT0或INT1)上的电平状态来共同控制。
C/T=1,为计数器模式;
C/T=0,为定时器模式。
M1M0一工作方式选择位;一共有4种工作方式,通常选择 方式1 和 方式2;即M1M0 = 0 1 或M1M0 = 1 0
第二步:赋初值 —— THx、TLx
注意:
(1) 51单片机定时器常常方式1或者方式2
(2)方式1可以装入的总数是65536
(3)方式2可以转入的总数是256
赋值举例(以方式1和方式2):
1、采用方式1
使用定时器0的方式1,定时1ms。因为1ms = 1000us。故,65536 - 1000=64536 。即为16进制的0xfc18。
方法一:
TH0 = (65536 - 1000) / 256
TL0 = (65536 - 1000) % 256
方法二
TH0 = 0xfc
TL0 = 0x18
2、采用方式2定时
使用定时器0的方式2,定时0.1ms。因为0.1ms = 100us。故,256 - 100 = 246 。即为16进制的 0xf6 。
TH0 = TL0 = 0xf6
或者:
TH0 = 0xf6
TL0 = 0xf6
第三步:配置控制寄存器——TCON
控制寄存器(TCON)在特殊功能寄存器中,字节地址为88H,位地址(由低位到高位)分别是88H~8FH,该寄存器可进行位寻址。可采用TRO=1,IT0=1的方式进行配置启动
TF1一定时器1溢出标志位。
当定时器1计满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。需要注意的是,如果使用定时器的中断,那么该位完全不用人为去操作,但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0。
TR1-定时器1运行控制位。
由软件清0关闭定时器1。当GATE=1,且INT1为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器1。
TFO-定时器0溢出标志,其功能及操作方法同TF1。
TRO-定时器0运行控制位,其功能及操作方法同TR1.
IE1-外部中断1请求标志。
当IT1=0时,为电平触发方式,每个机器周期的S5P2采样lNT1引脚,若INT1脚为低电平,则置1,否则IE1清0。
当IT1=1时,INT1为跳变沿触发方式,当第一个机器周期采样到INT1为低电平时,则IE1置1。IE1=1,表示外部中断1正在向CPU申请中断。当CPU响应中断,转向中断服务程序时,该位由硬件清0。
IT1-外部中断1触发方式选择位。
IT1=0,为电平触发方式,引脚INT1.上低电平有效。
IT1=1,为跳变沿触发方式,引脚INT1.上的电平从高到低的负跳变有效。
IE0一外部中断0请求标志,其功能及操作方法同IE1。
IT0–外部中断0触发方式选择位,其功能及操作方法同IT1。
第四步:开总中断——EA = 1;
定时器0方式1的逻辑框图
程序示例
(1)使用定时器0、方式1
定时 1ms(500HZ),使LED闪烁
1ms = 1000us ;65536 - 1000 = 64536。 64536的十六进制为 0xfc18
#include<reg51.h>
sbit LED = P1^0;
int main(void)
{
TMOD = 0x01; //第一步:配置TMOD // 0000 0001 ; 选择方式1
TH0 = 0xfc;
TL0 = 0x18; // 第二步:赋初值 // 0xfc18 = 64536. 定时1000us = 1ms (500HZ)
TR0 = 1; //第三步:配置TCON // 定时方式,选择定时器 T0
ET0 = 1; // 定时器/计数器0中断允许位,打开T0中断
EA = 1; //第四步:开总中断
while(1);
}
void timer0() interrupt 1
{
TH0 = 0xfc;
TL0 = 0x18; // 方式1 在中断中需要重新赋初值
LED = ~LED;
}
(1)使用定时器0、方式2
定时 0.1ms(5000HZ),使LED闪烁
0.1ms = 100us ; 256 - 100 = 156; 十六进制为0x9c
#include<reg51.h>
sbit LED = P1^0;
int main(void)
{
TMOD = 0x02; //第一步:配置TMOD // 0000 0002 ; 选择方式2
TH0=TL0=0x9c; // 第二步:赋初值 // 0x9c = 156. 定时100us = 0.1ms (5000HZ)
TR0 = 1; //第三步:配置TCON // 定时方式,选择定时器 T0
ET0 = 1; // 定时器/计数器0中断允许位,打开T0中断
EA = 1; //第四步:开总中断
while(1);
}
void timer0() interrupt 1
{
LED = ~LED; //方式2不需要重新赋初值
}
【参考文档】
《51单片机C语言教程(郭天祥)》