1、第6章 MCS-51单片机内部 定时器/计数器及其应用,6.1 定时器的结构及工作原理 6.2 定时器的控制 6.3 定时器的工作模式及其应用.,在单片机应用和控制系统中,经常需要对某个控制参数和控制对象进行定时或延时控制。这种定时一般可采用两种方法。一是利用延时程序来实现,但这样会降低CPU的工作效率;另外一种方法就是通过一个可编程的实时时钟或可编程的时钟接口芯片来实现。这种方法可以使CPU与时钟并行工作,并且不会影响CPU的效率。除了定时外,还有一些控制是按对某种事件的计数结果来进行的,因此,单片机内部均设有可编程的定时器/计数器。 MCS-51系列单片机内有两个16位定时/计数器,即定时
2、器0(T0)和定时器1(T1)它们都具有定时和事件计数的功能,可用于定时控制延时,对外部事件计数和检测等场合。本章主要介绍MCS-51单片机的定时器/计数器的内部结构、工作原理及工作方式,最后通过具体的实例介绍定时器/计数器的应用。,6.1 定时器的结构及工作原理,定时器结构:16位定时器T0由8位特殊功能寄存器TH0和TL 0构成,16位定时器T1由8位特殊功能寄存器TH1和TL1构成。 定时器工作方式定时器的工作方式由寄存器TMOD设置,定时器控制寄存器TCON(TR0、TR1位)用于启动和停止定时器的计数,并控制定时器的状态。 T0和T1实际上都是16位加1计数器,可由编程来设置它工作状
3、态。,当定时器/计数器为定时工作方式时,加1信号由振荡器的12分频产生,即每过一个机器周期,计数值增1,直至计满溢出为止。显然,定时器的定时时间与系统的振荡频率有关。由于一个机器周期等于12个振荡周期,所以 计数频率 fcount=1/12fosc例:晶振为12MHZ ,则计数周期为T=12/(12*106)Hz=1微秒,最短的定时周期,定时器工作方式,当定时器/计数器为计数工作方式时,通过引脚T0和T1对外部信号计数,外部脉冲的下降沿触发计数采样过程:,在每个机器周期的 S5P2期间采样引脚,当输入脉冲信号从1到0的负跳变时,计数器就自动加1。 由于检测一个由1到0的跳变需要两个机器周期,所
4、以 计数的最高频率为振荡频率的1/24。为了确保给定电平在变化前至少被采样一次,外部计数脉冲的高低电平均需保持一个机器周期以上。(占空比没有限制),计数器工作方式:,结论:单片机中的定时器和计数器是同一个东西,只不过计数器用来记录外界发生的事情,而定时器则是由单片机提供的一个非常稳定的计数源。,综上所述,我们已知定时器/计数器是一种可编程部件,所以在其开始工作之前,CPU必须将一些命令(控制字)写入定时器/计数器。这个过程称为定时器/计数器的初始化。当CPU用软件给定时器设置了某种工作方式之后,定时器就会按设定的工作方式独立运行,不再占用CPU的操作时间,除非定时器计数溢出,才可能中断CPU当
5、前操作。,6.2 定时器的控制,8051单片机的定时器/计数器主要由T0,T1和方式寄存器TMOD和控制寄存器TCON等组成。可以通过软件对这些寄存器进行设置来实现不同的控制目的。其中,TH0和TL0用来存放定时器T0的计数初值,TH1和TL1用来存放定时器T1的计数初值,TMOD用来控制定时器的工作方式,TCON用作中断溢出标志并控制定时器的启、停。,C/T:功能选择位。C/T=0为选择定时方式。在定时方式中,以振荡输出时钟脉冲的12分频信号作为计数信号,也就是每一个机器周期定时器加“1”, 若晶振为12MHz,则定时器的计数频率位1MHz; 当C/T=1时,为计数功能,采用外部引脚T0(P
6、3.4),T1(P3.5)的输入脉冲作为计数脉冲, 当外部输入脉冲发生1到0的负跳变时, 计数器加1,最高计数频率为时钟频率的1/24。,GATE:门控位。GATE=0,允许软件控制位TR0或TR1启动定时器;GATE=1,允许外中断引脚INT0(或INT1)为高电平,且由软件使TR0(或TR1)置1时,才能启动定时器工作。TMOD不能位寻址,只能用字节指令设置定时器工作方式。复位时,TMOD所有位均为零。,6.3 定时器的工作模式及其应用.,8051单片机的定时器/计数器T0和T1可由软件对TMOD的M1,M0位进行四种工作模式设置,即模式0,模式1,模式2和模式3。 在模式0 、模式1和模
7、式2时,T0与T1的工作模式相同; 在模式3时,两个定时器的工作模式不同。,6.3.1模式0及应用,模式0是选择定时器的高8位和低5位组成的一个13位定时器/计数器,图6.4是T0在模式0时的逻辑电路结构。,6.3.1 模式0及应用,在这种模式下,16位寄存器只用了13位。其中,TL0的高3位未用,TH0占8位。当TL0的低5位溢出时,向TH0进位。当TH0溢出时,向中断标志位TF0进位,并申请中断。 因此,可通过查询TF0 是否置位或考察中断是否发生来判断定时器/计数器0的操作完成与否。 当C/T=0时, 控制开关接通振荡器12分频输出端, T0对机器周期计数。 即定时器工作方式。 定时时间
8、由下式决定:T=(213 _ T0初值)振荡周期12,当C/T=1 控制开关与引脚T0(P3.4)接通,计数器T0对来自外部引脚T0的输入脉冲计数,当外部信号电平发生由1到0跳变时,计数器加1,这时,T0成为外部事件计数器。 当GATE=0时,封锁或门输出恒为1,使外部中断输入引脚INT0信号失效,同时又打开与门,由TR0控制定时器T0的开启和关断。若TR0=1,接通控制开关,启动定时器T0工作,计数器被控制为允许计数。若TR0=0,则断开控制开关,停止计数。 当GATE=1时,与门的输出由INT0的输入电平和TR0位的状态来确定。若TR0=1,则打开与门,外部信号电平通过INT0引脚直接开启
9、或关断定时器T0。 当INT0为高电平时,允许计数,否则停止计数。这种工作方式可用来测量外部信号的脉冲宽度等。,例 6.1 设定时器T0选择工作模式0,定时时间为1ms, fosc =6MHz,试确定T0初值,计算最大的定时时间T0。解:当T0处于模式0时,为13位计数器,设初值为X。则:(213_X)1/(6106)12=110-3X=7692=1111000001100BTL0的低5位:01100B=0CHTH0为:11110000B=F0HT0最大定时时间对应于13位计数器的初值X为0, 即(TH0)=00H,(TL0)=00H,则: T=2131/(6106)12=16.384ms。,
10、例6.2 利用T0方式0产生1ms的定时,在P1.0引脚上输出周期2ms的方波。设单片机晶振频率fOSC=12MHz。解:要在P1.0输出周期为2ms的方波,只要P1.0每隔1ms取反一次即可,具体操作如下:(1)取T0的方式字为:TMOD=00H,即TMOD.1 TMOD.0 M1M0=00,T0为方式0;TMOD.2 C/T=0 T0为定时状态;TMOD.3 GATE=0 表示计数不受INT0控制;TMOD.4 TMOD.7 可为任意值,因T1不用,这里取值为0 。(2)计算1ms定时T0的初值:机器周期为(1/fOSC)12=1/(12106)12=1s, 设T0的计数初值为X,则 (2
11、13-X)110-6=110-3msX=213-110-3/(110) -6 =8192-1000=7192D=1110000011000高8位: E0H 低5位: 18H,TH0初值为E0H,TL0初值为18H。采用查询TF0的状态来控制P1.0输出,程序如下:MOV TMOD,#00H ;置T0为方式0MOV TL0,#18H ;送计数初值MOV TH0,#0E0H SETB TR0 ;启动T0LOOP:JBC TF0, NEXT ;查询定时时间到否?SJMP LOOP NEXT:MOV TL0,#18H ;重赋计数初值MOV TH0,#0E0HCPL P1.0 ;输出取反SJMP LOO
12、P ; 重复循环采用查询方式的程序很简单,但在定时器整个计数过程中,CPU要不断查询溢出时标志TF0的状态, 这就占用了CPU工作时间,以致CPU的效率不高。采用定时溢出中断方式,可以提高CPU的效率。,例6.3 采用中断方式产生例6.2所要求的方波 主程序: ORG 00HAJMP MAINORG 000BH ;T0中断入口AJMP CTC0 ;转中断服务程序 MAIN: MOV TMOD,#00H ;置T0为模式0MOV TL0, #18H MOV TH0,#0E0H ;置初值SETB EA ;CPU开中断SETB ET0 ;T0允许中断SETB TR0 ;启动T0 HERE: SJMP
13、HERE ;等待中断,虚拟主程序 中断服务程序: CTC0: MOV TL, #18H ;重装初值MOV TH0, #0E0HCPL P1.0 ;输出方波RETI ;中断返回,6.3.2 模式1及应用,定时器工作于模式1下,见图6.5。其结构与操作几乎与模式0完全相同,差别仅在于计数器的位数不同。用于定时工作方式时, 计数时间为:T=(216-T0初值)振荡周期12若晶振频率fosc=12MHz,则最长定时时间为:Tmax=(1216-0)1/1212s=65.536ms。用于计数工作方式时,计数长度为216=65536 (个外部脉冲),6.3.2模式1及应用,例6.4 用定时器T1产生一个1
14、00HZ的方波, 由P1.0输出,设fosc=12MHz, 采用查询方式。解:方波周期 T=1/100Hz=0.01s=10ms 用T1定时5ms计数初值 X为: X=216-125103/12=60536=EC78H程序如下:MOV TMOD, #10H ;T1模式1,定时方式SETB TR1LOOP:MOV TH1,#0ECH ; 置初值MOV TL1, #78H JNB TF1 ,$ ; 判断溢出CLR TF1CPL P1.0SJMP LOOP,6.3.3 模式2及应用,定时器/计数器工作方式2下,其逻辑结构如图所示。它由作为8位计数器的TL0及作为重置初值的缓冲器的TH0构成。工作于方
15、式2的T1的逻辑结构与T0类同。,6.3.3 模式2及应用,方式0和方式1若用于循环重复定时或计数时,当计数溢出时,要重新对计数器装入初值,而方式2,具有初值自动装入的功能,具体如下: 在方式2中,16位计数器拆成两个部分,TL0用作位计数器,TH0用来保存计数初值。在程序初始化时,由软件赋予同样的初值,一旦TL0计数溢出,便使TF0置位,将TH0中的初值则自动装入TL0继续计数。 由于定时工作方式时,其定时时间(TH0溢出周期)为:t=(28-TH0初值)振荡周期12用于计数工作方式时,最大计数长度(TH0初值=0) 28=256。模式2的优点可省去软件重装常数的语句,定时时间精确特别适用于
16、作串行口波特率发生器。,例6.5 当外引脚P3.4(T0)上电平发生负跳变时,从P1.0输出500s的同步脉冲。请编程实现该功能。解:(1)模式选择首先选T0为模式2,外部事件计数方式。当P3.4引脚上的电平发生负跳变时,T0计数器加1,溢出标志TF0置1;然后改变T0为500s定时工作方式,并使P1.0输出由1变为0。T0定时到产生溢出,使P1.0引脚恢复输出高电平,T0又恢复外部事件计数方式。(2)计算初值T0工作在外部事件计数方式,当计数到28-1时,再加1计数器就会溢出。设计数初值为X,当再出现一次外部事件时,计数器溢出。则X+1=28X=28-1=11111111B=0FFHT0工作
17、在定时方式时,设晶振频率为6MHz,500微秒相当于250个机器周期。因此,初值X为(28-X)2s =500sX=28-250=6=06H,(3)程序清单 START:MOV TMOD,#06H ;设置T0为模式2,外部计数方式MOV TH0,#0FFH ;T0计数器初值MOV TL0,#0FFHSETB TR0 ;启动T0计数 LOOP1:JBC TF0,PTF01 ;查询T0溢出标志,TF0=1时转移,且 TF0=0(即查P3.4负跳变)SJMP LOOP1 PTF01: CLR TR0 ;停止计数MOV TH0,#02H ;设置T0为模式2,定时方式MOV TH0,#06H ;T0定时
18、500微秒MOV TL0,#06HCLR P1.0 ;P1.0清0SETB TR0 ;启动定时500微秒 LOOP2: JBC TF0,PTF02 ;查询溢出标志,定时到TF0=1转移,且TF0=0(第一个500微秒到否?)SJMP :LOOP2 PTF02:SETB P1.0 ;P1.0置1(到了第一个500微秒)CLR TR0 ;停止计数SJMP START,例6.6 利用定时器T1方式2对外部信号计数,要求每计满200个脉冲将P1.0端取反。解: 外部信号T1(P3.5)引脚输入,每发生一次负跳变计数器加1,每输入200个脉冲,计数器发生溢出中断,将P1.0取反一次。T1设置为方式计数状
19、态,方式字为:TMOD=60H初值计算:X=28-200=56D=38H因此,TL1的初值为38H,重装初值TH1=38H程序清单: MAIN: MOV TMOD,#60H ;置T1为模式2计数工作方式MOV TL1, #38H ; 置初值MOV TH1, #38HMOV IE, #88H ; 定时器T1开中断SETB TR1 ;启动计数器 HERE: SJMP HERE ORG 001BHCPL P1.0RETI,6.3.4 模式3及其应用,模式3只适用于定时器T0,若将T1置为模式3,则它将停止计数,其效果类同将TR1=0, 即关闭定时器T1。当T0工作在模式3下,TH0和TL0被分成两个
20、相互独立的8位计数器如图6.7所示。,6.3.4 模式3及其应用,其中,TL0使用原T0的各控制位、引脚、中断源,即使用C/T,GATE,TR0,TF0和INT0(P3.2)引脚,其功能和操作与模式0和模式1相同,只是TL0只能使用8位寄存器。既可以工作在定时器方式也可以工作在计数器方式。 TH0只可作简单的内部定时功能, 它占用T1的控制位TR1和T1的中断标志位TF1,同时也占用了T1的中断源,由TR1来负责启动和关闭。 在定时器T0用作模式3时,T1仍可设置为模式02,其的逻辑图简化为图6.8(a)和(b):,T0工作在方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发
21、生器,或不需要中断的场合.,6.3.5 综合应用能够举例,例6.8 设时钟频率为12MHz,编写利用T1产生1s定时的程序解:(1) T1的工作模式的确定因为定时事件较长,采用哪一种工作模式合适呢?在fOSC=12MHz时,模式0最长可定时 2131s = 8.192ms模式1最长可定时2161s = 65.536ms模式2最长可定时 281 = 256s经分析,可选模式1,定时事件为50ms,另设一个软件计数器,初始值为20,每隔50ms中断一次,中断20次为1s(2) 求初值X:(216_X)1/(12106)12=5010-3sX=65536-5000=155360=3CB0H因此 (T
22、H1)=3CH ,(TL1)=B0H,(3)程序如下:ORG 0000HLJMP MAIN ;转向主程序ORG 001BH ;T0的中断入都地址AJMP SERVEORG 2000HMAIN: MOV SP,#60H ;主程序MOV R2,#20MOV TMOD,#10H ; T1定时器模式1MOV TL1,#0B0HMOV TH1,#3CHSETB TR1SETB ET1SETB EASJMP SERVE: MOV TL1,#0B0HMOV TH1,#3CHDJNZ R2,LOOPCLR TR1LOOP: RETIEND,例6.9 利用定时器T0方式2对外部信号计数, 要求每次满200次后从
23、P1.0输出宽度为5ms的高电平如此循环下去 (设fosc=12MHz)解:根据题意,T0交替工作于计数方式和定时器方式,先计数满200次后改为定时器方式,5ms后又回到计数方式。计数器为方式2,定时器为方式1。T0的方式控制字: 计数方式为TMOD=06H定时方式为TMOD=01HT0的初值:计数初值为X=28-200=56D=38HT=(216-T0初值)振荡周期12=5ms定时初值为EC78H,程序如下: MAIN: CLR TR0MOV TMOD, #06H ; T0为计数方式MOV TH0, #38H ;送计数初值MOV TL0, #38HSETB TR0 ; 启动T0计数 CLR
24、P1.0 ; P1.0为低电平 WAIT: JBC TF0, TIME ;200次未满则等待SJMP WAIT TIME: CLR TR0 ;停止T0工作SETB P1.0 ;P1.0为定时方式MOV TMOD, #10HMOV TH0, #0ECH MOV TL0, #78H ;送定时初值SETB TR0 ;启动T0定时 WAIT1: JBC TF0, MAIN ;5ms未到等待SJMP WAIT1END,例 6.10 利用T0确定INT0引脚上出现的正脉冲的宽度,并将测到的机器周期的个数存入30H,31H中。解:设T0为定时器方式1,门控位GATE置1,初值取0。当INT0引脚变为高电平时
25、采用外触发方式 启动T0定时;当外部INT0引脚变为低电平时停止T0定时,这时TH0和TL0中的值就是INT0引脚为高电平期间的所经过机器周期数。,程序清单如下: MAIN:MOV TMOD, #09H ;送方式控制字MOV TL0, #00H ;送定时初值MOV TH0, #00H WAIT1: JNB P3.2 WAIT1 ; 等待INT0变高SETB TR0 ;自动定器计器 WAIT:JB P3.2 WAIT ;等待INT0变低电平CLR TR0MOV 30H,TL0MOV 31H,TH0SJMP $END,思考题与习题六,6.1 定时器T0和T1各有几种工作方式?简述之。 6.2 已知
26、单片机系统时钟频率fOSC=12MHz,若要求定时值分别为0.1ms,1ms和10ms,定时器T0工作在方式0,方式1和方式3时,定时器对应的初值各为多少? 6.3 定时器/计数器0已预置为156,切选定用于方式2的计数方式,现在T0引脚上输入周期为1ms的脉冲,问: 此时定时器/计数器0的实际用途是什么? 在什么情况下,定时器/计数器0溢出? 6.4 设系统时钟为6MHz,利用T0和P1.0产生连续矩形波,高电平宽度为50s,低电平宽度为300s。 6.5 利用定时器来测量单次正脉冲宽度,采用何种工作方式可获得最大的量程?设fosc=6MHz,求允许测量的最大脉冲宽度是多少? 6.6 试编制一段程序,其功能为: 当P1.2引脚的电平上跳时,对P1.1的输入脉冲进行计数;当P1.2引脚的电平下跳时停止计数,并将计数值写入R6与R7。 6.7 已知单片机系统时钟频率fosc=6MHz,试编写程序,使P1.0输出如下的矩形脉冲(建议用定时器工作方式2)。,