第 6章 定时器 /计数器及应用
6.1 定时器 /计数器的结构
6.2 定时器 /计数器的工作方式退出
6.1 定时器 /计数器的结构
6.1.1 定时器 /计数器的结构定时器 /计数器的结构如图 6-1所示 。
6.1.2 定时器 /计数器的工作方式寄存器 TMOD
定时器 /计数器是一种可编程部件,在工作之前必须通过软件设定它的工作方式,即对工作方式寄存器
TMOD中每位进行设定 。 下面介绍每位的含义:
TMOD( 89H)
其中,低 4位用于决定 T0的工作方式,高 4位用于决定 T1的工作方式 。
1,M1和 M0工作方式控制位
M0和 M1为工作方式控制位,确定 4种工作方式,
如表 7-1所示 。
2,C/T定时器 /计数器方式选择位
C/T=0,设置为定时方式,对机器周期进行计数;
C/T=1,设定为计数方式,对外部信号进行计数,
外部信号接至 T0( P3.4) 或 T1( P3.5) 引脚 。
3,GATE门控位
GATE=0时,只要用软件使 TR0( 或 TR1) 置 1就能启动定时器 T0( 或 T1) ;
GATE=1时,只有在 INT0( 或 INT1) 引脚为高电平的情况下,且由软件使 TR0( 或 TR1) 置 1时,才能启动定时器 T0( 或 T1) 工作 。
6.1.3 定时器 /计数器的控制寄存器 TCON
设定好了定时器 /计数器的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器 TCON中的某些位来启动它工。要使定时器 /计数器停止运行,也必须通过设置 TCON中的某些位来实现。当定时器 /计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。下面介绍控制寄存器 TCON每位的含义:
TF1:定时器 T1溢出标志位。当定时器 T1溢出时,
由硬件自动使 TF1置 1,并向 CPU申请中断。 CPU响应中断后,自动对 TF1清零。 TF1也可以用软件清零。
TR1:定时器 T 1运行控制位。可由软件置 1
(或清零)来启动(或关闭)定时器 T1,使定时器 T1
开始计数。用指令 SETB TR1(或 CLR TR1)使 TR1
置 1(或清零)。
TF0:定时器 T0溢出标志位。其功能与 TF1相同。
TR0:定时器 T0运行控制位。其功能与 TR1相同。
IE1:外部中断 1请求标志位。
IT1:外部中断 1触发方式控制位。
IE0:外部中断 0请求标志位。
IT0:外部中断 0触发方式控制位。
IE1,IT1,IE0,IT0这 4位将在第 3节讲述。
控制寄存器 TCON的位地址是 88H,可以对它进行位寻址。
6.2 定时器 /计数器的工作方式
6.2.1 工作方式 0
定时器 /计数器 T0工作在方式 0时,16位计数器只用了 13位,即 TH0的高 8位和 TL0的低 5位,组成一个
13位定时器 /计数器 。
1,工作在定时方式
2,工作在计数方式
【 例 6-1】 利用定时器 T0产生定时脉冲 。 每隔 2ms
产生宽度为 2个机器周期的正脉冲,由 P1.0输出此定时序列脉冲信号 ( 设时钟频率为 6MHZ) 。
解:首先求出定时器 T0初值 。 由于时钟频率为
6MHZ,所以,机器周期为 2μs 。
因为,t=( 213-T0初值 )?机器周期所以,当 t=2ms时,则,( 213-T0初值 )? 2?10-
6=2?10-3
解得,T0初值 =7096=11011101 11000B,其中将高
8位 11011101 B=DDH赋给 TH0,低 5位 11000B=18H赋给 TL0。
方法一:
采用查询工作方式,编程如下:
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN,CLR P1.0
MOV TMOD,#00H ;设定 T0的工作方式
MOV TH0,#0DDH ;给定时器 T0送初值
MOV TL0,#18H
SETB TR0 ;启动 T0工作
LOOP,JNB TF0,$ ; $为当前指令指针地址
CLR TF0
SETB P1.0 ;产生 2μs正脉冲
CLR P1.0
MOV TH0,#0DDH ;重装载 TH0和 TL0
MOV TL0,#18H
SJMP LOOP
END
方法二:
采用中断工作方式,编程如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0INT
ORG 0100H
MAIN,CLR P1.0
MOV TH0,#0DDH ;给定时器 T0送初值
MOV TL0,#18H
MOV IE,#82H ;允许 T0中断
SETB TR0 ;启动 T0
SJMP $
中断服务程序:
ORG 0300H
T0INT,SETB P1.0
CLR P1.0
MOV TH0,#0DDH ;重装载 TH0和 TL0
MOV TL0,#18H
RETI
6.2.2 工作方式 1
定时器 T0工作方式 1与工作方式 0类同,差别在于其中的计数器的位数。工作方式 0以 13位计数器参与计数,工作方式 1则以 16位计数器参与计数。
1,工作在定时方式
2,工作在计数方式工作方式 1是 16位计数器 。 这是工作方式 1与工作方式 0在计数方式时唯一差别 。
【 例 6-2】 用定时器 T0产生 50HZ的方波 。 由 P1.0
输出此方波 ( 设时钟频率为 12MHZ) 。
解,50HZ的方波周期为 20ms,可以用定时器产生
10ms的定时,每隔 10ms改变一次 P1.0的电平,即可得到 50HZ的方波 。 此时,应使定时器 T0工作在方式 1。
工作在方式 1时的 T0初值,根据下式计算:
t=( 216-T0初值)?机器周期解得 t=55536= 11011000 11001100B=D8CCH,其中将高 8位 D8H赋给 TH0,低 8位 CCH赋给 TL0。
采用中断工作方式,编程如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0INT
ORG 0100H
MAIN,MOV TMOD,#01H
MOV TH0,#0D8 H
MOV TL0,#0CC H
MOV IE,#82H
SETB TR0
SJMP $
中断服务程序;
ORG 0300H
T0INT,CPL P1.0
MOV TH0,#0D8H
MOV TL0,#0CCH
RETI
6.2.3 工作方式 2
定时器 T0在工作方式 2时,16位的计数器分成了两个独立的 8位计数器 TH0和 TL0。
1,工作在定时方式
2,工作在计数方式工作方式 2与工作方式 0,方式 1的差别,在于工作方式 2是一个 8位的计数器 。
6.2.4 工作方式 3
工作方式 3仅对定时器 T0有效 。 当定时器 T0工作在方式 3时,将 16位的计数器分为两个独立的 8位计数器 TH0和 TL0。
当定时器 T0工作在方式 3时,定时器 T1只能工作在方式 0~ 2,并且工作在不需要中断的场合。
6.1 定时器 /计数器的结构
6.2 定时器 /计数器的工作方式退出
6.1 定时器 /计数器的结构
6.1.1 定时器 /计数器的结构定时器 /计数器的结构如图 6-1所示 。
6.1.2 定时器 /计数器的工作方式寄存器 TMOD
定时器 /计数器是一种可编程部件,在工作之前必须通过软件设定它的工作方式,即对工作方式寄存器
TMOD中每位进行设定 。 下面介绍每位的含义:
TMOD( 89H)
其中,低 4位用于决定 T0的工作方式,高 4位用于决定 T1的工作方式 。
1,M1和 M0工作方式控制位
M0和 M1为工作方式控制位,确定 4种工作方式,
如表 7-1所示 。
2,C/T定时器 /计数器方式选择位
C/T=0,设置为定时方式,对机器周期进行计数;
C/T=1,设定为计数方式,对外部信号进行计数,
外部信号接至 T0( P3.4) 或 T1( P3.5) 引脚 。
3,GATE门控位
GATE=0时,只要用软件使 TR0( 或 TR1) 置 1就能启动定时器 T0( 或 T1) ;
GATE=1时,只有在 INT0( 或 INT1) 引脚为高电平的情况下,且由软件使 TR0( 或 TR1) 置 1时,才能启动定时器 T0( 或 T1) 工作 。
6.1.3 定时器 /计数器的控制寄存器 TCON
设定好了定时器 /计数器的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器 TCON中的某些位来启动它工。要使定时器 /计数器停止运行,也必须通过设置 TCON中的某些位来实现。当定时器 /计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。下面介绍控制寄存器 TCON每位的含义:
TF1:定时器 T1溢出标志位。当定时器 T1溢出时,
由硬件自动使 TF1置 1,并向 CPU申请中断。 CPU响应中断后,自动对 TF1清零。 TF1也可以用软件清零。
TR1:定时器 T 1运行控制位。可由软件置 1
(或清零)来启动(或关闭)定时器 T1,使定时器 T1
开始计数。用指令 SETB TR1(或 CLR TR1)使 TR1
置 1(或清零)。
TF0:定时器 T0溢出标志位。其功能与 TF1相同。
TR0:定时器 T0运行控制位。其功能与 TR1相同。
IE1:外部中断 1请求标志位。
IT1:外部中断 1触发方式控制位。
IE0:外部中断 0请求标志位。
IT0:外部中断 0触发方式控制位。
IE1,IT1,IE0,IT0这 4位将在第 3节讲述。
控制寄存器 TCON的位地址是 88H,可以对它进行位寻址。
6.2 定时器 /计数器的工作方式
6.2.1 工作方式 0
定时器 /计数器 T0工作在方式 0时,16位计数器只用了 13位,即 TH0的高 8位和 TL0的低 5位,组成一个
13位定时器 /计数器 。
1,工作在定时方式
2,工作在计数方式
【 例 6-1】 利用定时器 T0产生定时脉冲 。 每隔 2ms
产生宽度为 2个机器周期的正脉冲,由 P1.0输出此定时序列脉冲信号 ( 设时钟频率为 6MHZ) 。
解:首先求出定时器 T0初值 。 由于时钟频率为
6MHZ,所以,机器周期为 2μs 。
因为,t=( 213-T0初值 )?机器周期所以,当 t=2ms时,则,( 213-T0初值 )? 2?10-
6=2?10-3
解得,T0初值 =7096=11011101 11000B,其中将高
8位 11011101 B=DDH赋给 TH0,低 5位 11000B=18H赋给 TL0。
方法一:
采用查询工作方式,编程如下:
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN,CLR P1.0
MOV TMOD,#00H ;设定 T0的工作方式
MOV TH0,#0DDH ;给定时器 T0送初值
MOV TL0,#18H
SETB TR0 ;启动 T0工作
LOOP,JNB TF0,$ ; $为当前指令指针地址
CLR TF0
SETB P1.0 ;产生 2μs正脉冲
CLR P1.0
MOV TH0,#0DDH ;重装载 TH0和 TL0
MOV TL0,#18H
SJMP LOOP
END
方法二:
采用中断工作方式,编程如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0INT
ORG 0100H
MAIN,CLR P1.0
MOV TH0,#0DDH ;给定时器 T0送初值
MOV TL0,#18H
MOV IE,#82H ;允许 T0中断
SETB TR0 ;启动 T0
SJMP $
中断服务程序:
ORG 0300H
T0INT,SETB P1.0
CLR P1.0
MOV TH0,#0DDH ;重装载 TH0和 TL0
MOV TL0,#18H
RETI
6.2.2 工作方式 1
定时器 T0工作方式 1与工作方式 0类同,差别在于其中的计数器的位数。工作方式 0以 13位计数器参与计数,工作方式 1则以 16位计数器参与计数。
1,工作在定时方式
2,工作在计数方式工作方式 1是 16位计数器 。 这是工作方式 1与工作方式 0在计数方式时唯一差别 。
【 例 6-2】 用定时器 T0产生 50HZ的方波 。 由 P1.0
输出此方波 ( 设时钟频率为 12MHZ) 。
解,50HZ的方波周期为 20ms,可以用定时器产生
10ms的定时,每隔 10ms改变一次 P1.0的电平,即可得到 50HZ的方波 。 此时,应使定时器 T0工作在方式 1。
工作在方式 1时的 T0初值,根据下式计算:
t=( 216-T0初值)?机器周期解得 t=55536= 11011000 11001100B=D8CCH,其中将高 8位 D8H赋给 TH0,低 8位 CCH赋给 TL0。
采用中断工作方式,编程如下:
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0INT
ORG 0100H
MAIN,MOV TMOD,#01H
MOV TH0,#0D8 H
MOV TL0,#0CC H
MOV IE,#82H
SETB TR0
SJMP $
中断服务程序;
ORG 0300H
T0INT,CPL P1.0
MOV TH0,#0D8H
MOV TL0,#0CCH
RETI
6.2.3 工作方式 2
定时器 T0在工作方式 2时,16位的计数器分成了两个独立的 8位计数器 TH0和 TL0。
1,工作在定时方式
2,工作在计数方式工作方式 2与工作方式 0,方式 1的差别,在于工作方式 2是一个 8位的计数器 。
6.2.4 工作方式 3
工作方式 3仅对定时器 T0有效 。 当定时器 T0工作在方式 3时,将 16位的计数器分为两个独立的 8位计数器 TH0和 TL0。
当定时器 T0工作在方式 3时,定时器 T1只能工作在方式 0~ 2,并且工作在不需要中断的场合。