单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,任务五 定时器与计数器,一 任务背景,51系列单片机有两个16位定时器计数器,通过对机器周期计数到达定时的目的,通过对外部事件计数到达计数之目的。,1.定时器计数器的根本原理,51单片机的定时器计数器采用加法计数方式工作。两个定时器计数器T0和T1自内部均有一个16位加法计数器TH0,TL0和TH1,TL1,用来完成加1计数。当加法计数器产生溢出时,硬件自动产生溢出中断标志信号,可向CPU申请中断。由于加法计数器的初值可以由程序设定,因此其计数定时范围就可利用软件来编程。,当处于计数方式时,定时器计数器对加在T0(P3.4).T1(P3.5)引脚的脉冲信号进行加1计数,我们可以通过设置不同的初值来控制计数次数。,当处于定时方式时,定时器计数器对内部机器周期TC进行加1计数,因此其计数最小单位就是1个机器周期。例如,当我们的应用系统采用的时钟频率为12 MHz时,其机器周期Tc=1 us,其根本定时单位就是l us。,在定时计数过程中,可以用指令将加法计数器的值读回CPU。,2.定时器计数器的控制方式,(1)定时器方式存放器TMOD,TMOD称为定时器方式存放器,用来设置定时器计数器的工作方式、是否需要门控信号等,其地址为89H。定时器计数器T0、T1都有4种工作方式,可通过对方式存放器TMOD设置来选择工作方式。TMOD的低4位用于设置定时器计数器T0的工作方式高4位用于设置定时器计数器1的工作方式,各位定义如表4.5所示。,表 5-1 TMOD存放器结构,T1方式字段,T0方式字段,D7,D6,D5,D4,D3,D2,D1,GATE,C/,M1,M0,GATE,C/,M1,M0,M1、M0:工作方式选择位,其值与工作方式对应关系见表4.6。,M1 M0,工作方式,功能,0 0,方式0,13位定时器/计数器(TH的高8位和TL的低5位),0 1,方式1,16位定时器/计数器,1 0,方式2,具有自动重装初值的8位定时器/计数器,1 1,方式3,定时器0:分成两个8位计数器,定时器1:无方式3,表5-2工作方式选择,(2)定时器的控制存放器TCON,定时器的控制存放器TCON地址为88H,可以进行位寻址。用来控制定时器计数器.,开始定时计数、设置中断及中断响应等。TCON控制存放器各位定义如表4.8。,表5-4 TCON控制存放器各位定义,D7,D6,D5,D4,D3,D2,D1,D0,TF1,TR1,TF0,TR0,IE1,1T1,IE0,IT0,TF0(TF1):定时器计数器T0(T1)的中断标志位。当T0(T1)计数溢出时,由硬件置位,在允许中断的情况下,向CPU发出中断请求信号,CPU响应中断转向中断效劳程序时,由硬件自动将该位清零。,T0(T1):T0(T1)的启动控制位。当T0(T1)=1时,可启动T0(T1);当T0(T1)=0时,关闭T0(T1)。该位由软件进行设置,一般情况下,在定时器计数器初始化完成后,设置为不需门控时,用指令将该位置为l即可启动T0(T1)。IE0(LE1):外部中断0外部中断1请求标志位。,IT0(IT1):外部中断0外部中断1触发方式选择位。,3 定时器计数器的工作方式,(1)工作方式0,将方式存放器TMOD的方式选择位M1M0设置为00时,定时器计数器设定为工作方式0,由TH的8位和TL的低5位构成了13位的计数器。图4.8给出定时器T1T0在方式0时的工作原理框图。,图5-1 T1T0工作方式0:13位方式,如果C/=1,定时器计数器1工作在计数状态,那么由THI、TLl构成的13位加法计数器对Tl(P3.5)引脚上的外部脉冲计数。当计数到全1即8l9l或1FFFH再来一个外部脉冲便计数到0,计数器溢出使TFl=I以此作为定时器计数器的中断标志。,在方式0下,计数长度为1 3位二进制数最大计数值M=213=8192。如果要让数器汁数N次,那么应向计数器中写入的计数初值X为,计数初值X=最大计数值M-计数次数M计数次数=213N=8192N,例如,设置计数器计数2000次,计数次数N=2000数初值x为,计数初值x=213一N=81922000=6192,=11000001,10000 B,但应注意,上述13位计数初值的高8位写入TH1,而13位计数初值的低5位二进制数前面要加3个0,凑成8位二进制数后写入TL1。此例中应向TH1写入的数据是:11000001B(C1H),向TLI写入的数据是:00010000 B(10H),即计数初值X=C110H。,在方式0下,X=8191时是最小计数初值;x=0时,计数器从1计数到8192,x=0是方式0时的最大计数初值,最大计数次数N=8192。,如果C/=0,为定时器方式,加法计数器对机器周期Tc计数,每个机器周期计数器加1。根据计数次数N便可计算出定时时间,定时时间由下式确定:,T=NTc=(8192X)Tc,式中Tc为单片机的机器周期。如果振荡频率fosc=12 MHz,那么Tc=l us,定时范围为18192 us。,(2)工作方式l,将方式存放器TMOD的方式选择位M1M0设置为01时,定时器计数器设定为方式1,由TH0和TL0(或TH1和TL1)构成了16位的计数器。图4.9给出了定时器T0在方式1时的工作原理框图,Tl在方式1时的工作原理与此类似。,图5-2 定时器计数器0方式1的逻辑结构,如果C/=1,图4.9中开关SI自动地接在下面,定时器计数器工作在计数状态,TH0、TL0构成了一个16位的加法计数器,它对T0(P3.4)引脚上的外部脉冲计数。当计数到全1(FFFFH),再来一个外部脉冲便计数到0,计数器溢出使TF0=1,以此作为定时器计数器的中断标志向CPU请求中断。,在方式1下,计数长度为16位二进制数,最大计数值M=216=65 536。如果要让计数器计数N次,那么事先应向计数器中写入的计数初值X为,计数初值X=最大计数值M-计数次数N=216N=65 536N,在上式中,M是计数器的最大计数值,N为计次数,X是应写入TH0、TL0的计数初值。例如,让计数器计数100次,计数次数N=100,那么计数初值X为,计数初值X=216N=65356100=65436=FF9CH,此例中应向TH0写入FFH、向TL0写入9C H才可实现100次计数。,当计数初值x=65535(FFFFH)时,只计数1次便产生溢出中断,所以65 535是方式1时的最小计数初值;X=0时,计数器从l计数到65 536,计数器溢出请求中断所以0是方式l时的最大计数初值,最大计数次数N=65 536。,C/=0时为定时器方式,图4.9中开关SI接在上面,加法计数器对机器周期Tc计数,每个机器周期计数器加1。根据计数次数N便可计算出定时时间,定时时间由下式确定:,T=NTc=(65 536-X)Tc,式中Tc为单片机的机器周期。如果振荡频率fosc=12 MHz,那么Tc=1us,定时范围为165 536us。,(3)工作方式2,将方式存放器TMOD的方式选择位M1M0设置为10时,定时器计数器设定为工作方式2,作为自动重新装入初值的8位定时器计数器工作方式,通常用作为方波发生器。方式0和方式1都必须在每次定时计数结束后重新装入初值,而方式2是一种自动装入初值的工作方式。方式2在程序初始化时,TL0和TH0由软件赋予相同的计数初值。TL0用作加1计数,TH0用来保存初值,一旦TL0计数溢出,TF0将被置位,同时,TH0中的初值会自动重新装入TL0,从而进入新一轮计数,如此循环。用方式2产生方波非常方便,通常被用来作为串行通信口的波特率发生器,其内部结构如图4-10所示。图中以T0为描述对象,T1的工作原理与此类似。,图5-3 定时器计数器0方式2的逻辑结构,在工作方式2时,计数范围为1256。计数器的计数初值和定时时间分别由下式确定:,计数初值X=最大计数值M一计数次数N=28N=256一N,T=NTc=(256X)Tc,(4)工作方式3,将方式存放器TMOD的方式选择位MIMO设置为11时,定时器计数器设定为工作方式3,其逻辑结构如图5-4所示。,图4-11 定时器计数器0方式3的逻辑结构,在工作方式3时,定时器T0被分解成两个独立的8位计数器TL0和TH0。其中,TL0占用原定时器T0的控制位和中断标志位:GATE.TR0和TF0,也占用原定时器0的引脚T0(P3.4)和INT0(P3.2)。除计数位数不同于方式0、方式1外,其功能、操作与方式0、方式1完全相同,可定时亦可计数。TH0占用原T1的控制位TF1和TR1,同时还占用了定时器1的中断源,其启动和关闭仅受TR1置1或清0控制。此时,TH0只能对机器周期进行计数,因此,TH0只能用作简单的内部定时,不能用作对外部脉冲计数,它是定时器0附加的一个8位定时器。,在工作方式3时,计数范围为1256。计数初值和定时时间和上面的计算方法相同。,二 任务分析,利用定时/计数器T0从P1.0输出周期为1s 的方波,实现发光二极管闪烁,单片机晶振为12MHZ。,三 任务实施,1.流程图,根据题目要求,本任务按照先开定时器,然后等待1s钟到,发光二极管闪烁的过程,具体流程如图4.12所示。图见课本,图5-5 二极管闪烁流程图,2.接线图,本任务需用到发光二极管、定时器具体接线图如图5-6。,3 程序代码及分析,分析:定时器0工作在方式1,定时时间50mS,Tc=12振荡周期=12fosc=1us,要实现50ms的定时,定时器0在50 ms内需要计数N次:,N=50ms1 us=50000次,那么计数初值为:,X=最大计数值M计数次数N=6553650000,转换为十六进制取高8位和低8位;,程序如下:,#include /52单片机头文件,#include /包含有左右循环移位子函数的库;,#define uint unsigned int /宏定义;,#define uchar unsigned char /宏定义;,sbit P1_0=P10;/从P1.0输出;,uchar tt;/次数变量;,void main()/主函数;,TMOD=0 x01;/设置定时器0为工作方式1,TH0=(65536-50000)/256;/给计数存放器赋值,50毫秒时间,送高8位;,TL0=(65536-50000)%256;/送低8位数据;,EA=1;/开总中断,ET0=1;/开定时器0中断,TR0=1;/启动定时器0,while(1);/等待中断产生;,void timer0()interrupt 1 /中断函数,关键字interrupt,这是C语言的中断函数表示法,1表时定时器0,TH0=(65536-50000)/256;/重新赋值50毫秒中断;,TL0=(65536-50000)%256;,tt+;/50毫秒加1,加20次为一秒;,if(tt=20)/1秒是50毫秒乘20次,tt=0;/重新设置初值.,P1_0=P1_0;/比较精确的脉冲输出,50mS翻转一次,即1秒中闪烁1次,,/可随意更改中断时间做一个精确的脉冲发生器,最大中断时间为65536毫秒,4 实验结果,经过程序的调试、编译,并下载到单片机,可以在设备上显示,然后用仿真软件可以仿真得出效果图如5-7所示、实际效果图如5-8所示。,四、任务自评,通过前面的讲解,同学们应该应该熟悉了定时器的应用,那就通过下面的表格来反映,学习情况。,项目内容,完成要求,分值,完成情况,自评分值,定时器应用,流程设计正确,20,程序编写正确,30,实物连线正确,20,调试程序正确,30,四、知识拓展,1.2021年国赛试题中定时器和中断局部应用,2021年国赛试题中,在闪烁局部、按键局部、数码管显示局部都用到了该局部知识,下面程序是数码管显示局部应用定时器的程序,具体详细讲解见2021年国赛综合程序讲解。,/*定时器配置函数,但凡用到定时器的局部都要配置方式和初值*/,