1、单片机应用技术 (C语言版) 第7章 定时器/计数器,2018/10/6,1,第7章 定时器/计数器,目 录7.1 定时器/计数器的结构及原理 7.2 定时器/计数器的控制 7.3 定时器/计数器的工作方式 7.4 定时器/计数器应用举例,2018/10/6,2,本章主要讨论MCS-51单片机定时器/计数器的逻辑结构和工作原理。内容主要有定时器T0、T1的逻辑结构,工作方式的选择和应用。本章为单片机的主要内容,也是第8章串行口的学习的基础。,2018/10/6,3,7.1 MCS-51 计数/定时器的原理,实质是计数器,脉冲每次下降沿,计数器加1. 计数脉冲来源于内部的晶振,由于周期极为准确,
2、称定时器。 计数脉冲来源于外部引脚,由于周期一般不准确,称为计数器。,89c51 有2个可独立控制的16位定时器/计数器: T0、T1,计数(定时)周期:机器周期,2018/10/6,4,计数周期的计算: 12MHz晶振:每计一个数的时间为1uS。如:计100个数的时间为100uS。计50000个数的时间为50mS。 11.0592MHz晶振:每计一个数的时间为1.085uS。,2018/10/6,5,几个基本概念 1、计数器的容量:容量一般用二进制的位数表示。 2、加1计数器:每来一个脉冲,计数数值加1。 3、计数器溢出:计数器计数达到容量的最大值时,再来一个脉冲,计数值将回到0,重新计数,
3、且相应的标志位置1,称为“溢出”。 4、计数初值:计数器开始计数的值。,2018/10/6,6,7.1.2 MCS-51定时/计数器的结构,2018/10/6,7,MCS-51定时/计数器结构说明: 两个16位的可编程定时器/计数器:定时器/计数器0、1。 每个定时器有两部分构成:THx和TLx 特殊功能寄存器TMOD和TCON ,主要对T0和T1进行控制。 引脚P3.4、P3.5,输入计数脉冲。 特殊功能寄存器之间通过内部总线和控制逻辑电路连接起来。,2018/10/6,8,MCS-51定时/计数器的工作原理,定时器/计数器T0、T1 的内部结构简图如下图所示。,2018/10/6,9,从上
4、图可以看出: 定时器的实质是一个加1计数器。 C/T =0 ,为定时器方式。计数信号由片内振荡电路提供,振荡脉冲12分频送给计数器,每个机器周期计数器值增1。,2018/10/6,10,C/T =1 ,为计数方式。计数信号由Tx引脚(P3.4、P3.5)输入,每输入一有效信号,相应的计数器中的内容进行加1。 控制信号TRx=1时,定时器启动。 当定时器由全1加到全0时计满溢出,从0开始继续计数,TFx=1 ,向CPU申请中断。,2018/10/6,11,7.2.2 T0、T1的控制寄存器TCON,TF1、TF0:T1、T0的溢出标志位计数溢出,TFx=1。中断方式:自动清零;查询方式:软件清零
5、。,7.2 定时器/计数器的控制,2018/10/6,12,TR1、TR0:T1、T0启停控制位。置1,启动定时器;清0,关闭定时器。 IE1、IE0:外部中断1、0请求标志位 IT1、IT0:外部中断1、0触发方式选择位,2018/10/6,13,7.2.1 T0、T1 工作方式寄存器TMOD 功能:确定定时器的工作方式。 其格式如图所示:,GATE外部门控制位。GATE0,不使用外部门控制计数器GATE1,使用外部控制门。 TRx=1, P3.2(P3.3)=1时,启动定时器。,TMOD不能位寻址,2018/10/6,14,C/T定时或计数方式选择位 。C/T0时,为定时器C/T1时,为计
6、数器计数器时采样过程:CPU在每机器周期S5P2期间,输入信号进行采样。若前一机器周期采样值为1,下一机器周期采样值为0,则计数器增1,随后的机器周期S3P1期间,新的计数值装入计数器。,2018/10/6,15,补充(P128 7.4节)由于检测一个从1-0的下降沿需要2个机器周期,因此被检测的外部输入脉冲的频率=1/24振荡频率。例如:单片机晶振12MHz,则被检测的外部输入脉冲最高为500Hz。,P134 3(2),2018/10/6,16,M1、M0工作方式选择位。 如下表所示:,2018/10/6,17,注:方式0是为了与早期的MCS-48系列单片机兼容,现在不必使用,采用方式1替代
7、方式0。,2018/10/6,18,2、 M1M001时,选择模式1。T0的结构:16位定时器/计数器。,2018/10/6,19,7.3 定时器T0、T1的工作方式,TL0:存放计数初值的低8位。TH0: 存放计数初值的高8位; (一次中断)定时时间=(216-定时初值)机器周期(一次中断)最大定时时间:216机器周期注意:每次计满溢出后,计数器都复位为0,要进行新一轮的计数还需重新赋初值。(即方式1的初值不能保存住,每次都要重新赋初值) 举例方式1,2018/10/6,20,C语言程序(方式1) #include sbit LED=P10; unsigned char t; void ma
8、in() LED=0; /定义灯的初始状态为灭TMOD=0x10; /设置定时器1工作在方式1TH1=(65536-50000)/256;TL1=(65536-50000)%256; /设置定时初值TR1=1; /启动定时器1,2018/10/6,21,EA=1; ET1=1;/允许定时器1中断 while(1); void timer1( ) interrupt 3 TH1=(65536-50000)/256;TL1=(65536-50000)%256;t+;if(t=20) LED=LED;t=0; ,重新赋初值,2018/10/6,22,方式1要进行新一轮计数,还需重新设置计数初值,不仅
9、导致编程麻烦,而且影响定时时间精度。,有没有一种方式可以避免方式1的缺陷?,2018/10/6,23,3、 M1M0 10时,选择模式2。(8位自动重装定时器/计数器),2018/10/6,24,T0的结构:TL0:8位的定时器/计数器;TH0:8位预置寄存器,用于保存初值。 工作过程:当TL0计满溢出时,TF0置1,向CPU发出中断请求;同时引起重装操作(TH0的计数初值送到TL0),进行新一轮计数。,2018/10/6,25,注:(1)方式2具有自动重装初值的功能,但是由于是8位计数器,最大计数值为256,所以一次中断的最大定时时间为28机器周期。(一次中断)定时时间:(28-定时初值)机
10、器周期(2)在模式2能够满足计数或定时要求时,尽可能使用模式2。方式2举例,2018/10/6,26,方式2: #include sbit P1_0=P10; void main( ) TMOD=0x02; /选择工作模式TL0=0x06;TH0=0x06; /为定时器赋初值EA=1; ET0=1; /允许定时0中断TR0=1; /启动定时器0while(1); /等待中断 void time0( ) interrupt 1 P1_0=P1_0; ,不用重新赋初值,方式2具有自动重装初值功能,2018/10/6,27,4、定时器/计数器工作方式的选择方法 (1)首先确定计数值N (2)确定工作
11、方式原则是尽可能地选择模式2,2018/10/6,28,7.5 定时器/计数器C51编程,一、定时器的初始化步骤 1、确定工作方式,设置TMOD。 2、设置定时器的计数初值。设置THx和TLx。 3、中断设置:设置IE(EA,ETx)。 4、启动定时器。设置TCON(TRx)可以使用位操作指令。,2018/10/6,29,方式1:(一次中断)定时时间:(216-定时初值)机器周期方式2:(一次中断)定时时间:(28-定时初值)机器周期,所以要确定定时初值,2018/10/6,30,二、 定时/计数器初值的计算,计数初值:C= 2n N n:8/16 定时初值:C= 2n - t/T T:机器周
12、期=12/晶振频率如:晶振为12MHz时,T1us 举例:单片机晶振12MHz,定时50ms,采用定时器0方式1,试计算初值,并装入TH0,TL0中。,2018/10/6,31,方法1: 初值: C=65536-50000=15536 =3CB0H TH0=3CH, TL0=B0H,2018/10/6,32,方法2初值:TH0=(65536-N)/256;TL0=(65536-N)%256;N=t/T(计数个数)。若采用的晶振为11.0592MHz, T=1.09s,则定时50ms时,N=45872,2018/10/6,33,三、 定时器的应用举例,例1 单片机系统晶振频率为12MHz,利用定
13、时器T0的方式2使P1.0口输出周期为0.2ms的方波信号。 分析:每隔0.1ms改变一次P1.0的输出状态,即形成方波。 1、初值计算: 在方式2下:C= 28-100=156=9CH,2018/10/6,34,2、C语言程序: #include sbit p1_0=P10; /进行位定义 void main ( ) TMOD=0x02; /T0工作在方式2TL0=0x9c; /装入计数(重装)初值TH0=0x9c;EA=1; /允许定时器1中断ET0=1; /开中断TR0=1 ; /启动定时器1while(1); ,2018/10/6,35,2018/10/6,36,void time0
14、( ) interrupt 1 p1_0=p1_0; /取反,产生方波 ,2018/10/6,37,例2 设单片机晶振频率为12MHz,用定时器/计数器0编程实现从P1.0输出周期为500s的方波。 分析:定时时间:方波周期为500s,定时250s。方式选择:定时器0可以选择方式1和2。方式2最大的定时时间为256s,满足250s的定时要求,选择方式2。,2018/10/6,38,(1)初值计算C=256-250/1C=6;则TH0=TL0=6 (2)程序: A:采用中断处理方式的程序 :,2018/10/6,39,#include sbit P1_0=P10; void main( ) TM
15、OD=0x02; /选择工作模式TL0=0x06;TH0=0x06; /为定时器赋初值EA=1; ET0=1; /允许定时0中断TR0=1; /启动定时器0while(1); /等待中断 void time0( ) interrupt 1 P1_0=P1_0; ,2018/10/6,40,B:采用查询方式处理的程序: # include sbit P1_0=P10; void main() TMOD=0x02;TL0=0x06;TH0=0x06;TR0=1;while (1) if(TF0=1) /查询计数溢出 TF0=0;P1_0=P1_0; ,While(!TF0);,2018/10/6,
16、41,例3 利用定时器精确定时1s控制LED以秒为单位闪烁。已知fosc=12MHz。 分析:定时器/计数器在定时方式下,各个方式最大定时时间分别为: 方式1=6553612/fosc=65.536ms 方式2=25612/fosc=0.256ms,2018/10/6,42,选择方式1。 定时时间为50ms,当50ms的定时时间到,中断一次,用变量记住中断次数,连续中断20次,正好1S,调用亮灯函数; 再连续定时20次,调用灭灯函数。循环工作,即达到1s闪烁1次的效果。,2018/10/6,43,2、程序设计: C语言程序: #include sbit LED=P20; unsigned ch
17、ar t; void main() LED=0; /定义灯的初始状态为灭TMOD=0x10; /设置定时器1工作在方式1TH1 =(65536-50000)/256;TL1=(65536-50000)%256; /设置定时初值TR1=1; /启动定时器1,2018/10/6,44,EA=1; ET1=1; /允许定时器1中断 while(1); void timer1() interrupt 3 TH1 =(65536-50000)/256;TL1=(65536-50000)%256;t+;if(t=20) LED=LED;t=0; ,中断服务程序中不要写过多处理语句,2018/10/6,45
18、,四、 计数器的应用举例,每按一次按键,计数器加1,用液晶显示出来,2018/10/6,47,void main( ) uint x;TMOD=0x06;TL0=0;TH0=0;TR0=1; LcdInt( ); delay(5);while(1) x=TH0*256+TL0;write_zs(5,x); ,本章小结本章首先总体简单介绍了MCS-51单片机定时器/计数器的结构、工作原理和相关的寄存器。然后重点研究了MCS-51单片机定时器/计数器T0、T1的不同工作方式的结构和工作原理。最后应用实例,讨论了各个定时器/计数器不同工作方式的应用。,2018/10/6,48,本章小结(续)MCS-51单片机定时器/计数器是单片机中非常重要、应用非常多的部件,单片机是否用得灵活、是否能够充分发挥单片机的功能与作用,与定时器/计数器是否掌握应用得好关系密切。,2018/10/6,49,