工作方式1:
方式1是16位计数结构的工作方式,计数器由TH0全部8位和TL0全部8位构成。与工作方式0基本相同,区别仅在于工作方式1的计数器TL1和TH1组成16位计数器,从而比工作方式0有更宽的定时/计数范围。
当为计数工作方式时,计数值的范围是:
1~65536(216)
当为定时工作方式时,定时时间计算公式为:
(216-计数初值)×晶振周期×12 或 (216-计数初值)×机器周期
例题1:当某 单片机 系统的外部晶振频率为6MHz,则最小定时时间为:
[216-(216-1)]×1/6×10-6×12=2×10-6=2(ms)
最大定时时间为:
(216-0)×1/6×10-6×12=131072×10-6(s)=131072(ms)≈131(ms)
例题2: 某 单片机 系统外接晶振频率为6MHz,使用定时器1以工作方式1产生周期为500ms的等宽连续正方波脉冲,并在P1.0端输出。,但以中断方式完成。
⑴ 计算计数初值
TH1=FFH TL1=83H
⑵ TMOD寄存器初始化
TMOD=10H
⑶ 程序设计
主程序:
MOV TMOD,#10H ;定时器1工作方式1
MOV TH1,#0FFH ;设置计数初值
MOV TL1,#0A1H
SETB EA ;开中断
SETB ET1 ;定时器1允许中断
LOOP:
SETB TR1 ;定时开始
HERE:
SJMP $ ;等待中断
中断服务程序:
MOV TH1,#0FFH ;重新设置计数初值
MOV TL1,#0A1H
CPL P1.0 ;输出取反
RETI ;中断返回
工作方式2
8位自动装入时间常数方式。由TLl构成8位计数器,THl仅用来存放时间常数。启动T1前,TLl和THl装入相同的时间常数,当TL1计满后,除定时器回零标志TFl置位,具有向CPU请求中断的条件外,THl中的时间常数还会自动地装入TLl,并重新开始定时或计数。所以,工作方式2是一种自动装入时间常数的8位计数器方式。由于这种方式不需要指令重装时间常数,因而操作方便,在允许的条件下,应尽量使用这种工作方式。当然,这种方式的定时/计数范围要小于方式0和方式1。工作方式2的结构见下图.
当计数溢出后,不是像前两种工作方式那样通过软件方法,而是由预置寄存器TH以硬件方法自动给计数器TL重新加载。变软件加载为硬件加载。
初始化时,8位计数初值同时装入TL0和TH0中。当TL0计数溢出时,置位TF0,同时把保存在预置寄存器TH0中的计数初值自动加载TL0,然后TL0重新计数。如此重复不止。这不但省去了用户程序中的重装指令,而且也有利于提高定时精度。但这种工作方式下是8位计数结构,计数值有限,最大只能到255。
这种自动重新加载工作方式非常适用于循环定时或循环计数应用,例如用于产生固定脉宽的脉冲,此外还可以作串行数据通信的波特率发送器使用。
例题1: 使用定时器0以工作方式2产生100ms定时,在P1.0输出周期为200ms的连续正方波脉冲。已知晶振频率fosc=6MHz。
⑴ 计算计数初值
6MHz晶振下,一个机器周期为2ms,以TH0作重装载的预置寄存器,TL0作8位计数器,假设计数初值为X,则:
(28-X)×2×10-6=100×10-6
求解得:
X=206D=11001110B=0CEH
把0CEH分别装入TH0和TL0中:
TH0=0CEH,TL0=0CEH
⑵ TMOD寄存器初始化
定时器/计数器0为工式方式2,M1M0=10;为实现定时功能 C/T=0;为实现定时器/计数器0的运行 GATE=0;定时器/计数器1不用,有关位设定为0。
综上情况TMOD寄存器的状态应为02H。
⑶ 程序设计(查询方式)
MOV IE,#00H ;禁止中断
MOV TMOD,#02H ;设置定时器0为方式2
MOV TH0,#0CEH ;保存计数初值
MOV TL0,#0CEH ;设置计数初值
SETB TR0 ;启动定时
LOOP:
JBC TF0,LOOP1 ;查询计数溢出
AJMP LOOP
LOOP1:
CPL P1.0 ;输出方波
AJMP LOOP ;重复循环
由于方式2具有自动重装载功能,因此计数初值只需设置一次,以后不再需要软件重置。
⑷ 程序设计(中断方式)
主程序:
MOV TMOD,#02H ;定时器0工作方式2
MOV TH0,#0CEH ;保存计数初值
MOV TL0,#0CEH ;设置计数初值
SETB EA ;开中断