《定时器计数器》由会员分享,可在线阅读,更多相关《定时器计数器(51页珍藏版)》请在金锄头文库上搜索。
1、第5章 定时器/计数器5.1 定时器/计数器概述5.1.1 定时器/计数器的结构及工作原理5.1.2 定时器/计数器的特殊功能寄存器5.1.3 定时器、计数器的工作方式5.2 定时器初始化程序5.3 定时器/计数器的使用举例5.3.1 定时器方式应用5.3.2 计数器方式应用MCS-51单片机提供2个16位的定时器/计数器:T0和T1 它们均可以用作定时器和事件计数器,为 单片机系统提供定时和计数功能。 5.1 定时器/计数器的结构及工作原理定时器/计数器的核心就是一个加1计数器 ,每当一个脉冲或计数信号来到时,计数器中的 计数值在事先设定好的计数初值基础上加1。当 计数器为全1时,再输入一个
2、脉冲就使计数值回零 ,同时从最高位溢出一个脉冲,使定时器/计数 器相关的特殊功能寄存器中的相应位置1,作为计 数器的溢出标志并引发中断,使单片机采取相应 的处理。1.工作原理2.结构(1)定时器/计数器T0 由2个8位特殊功能寄存器TH0和TL0构成。 TH0:用于存放高8位的二进制计数值。 TL0:用于存放低8位的二进制计数值。(4)工作方式寄存器TMOD用于设置定时器/计数器的工作方式。(2)定时器/计数器T1由2个8位特殊功能寄存器TH1和TL1构成。 TH1:用于存放高8位的二进制计数值。 TL1:用于存放低8位的二进制计数值。(3)控制寄存器TCON用于启动和停止定时器/计数器,产生
3、溢出位。 定时器/计数器工作于定时状态还是计数状态 ,取决于输入的脉冲信号。当输入脉冲信号为单片机系统时钟源时,是 一等间隔脉冲序列,脉冲数乘以间隔时间就是定 时时间,此时加1计数器工作于定时状态。当输入脉冲信号为非固定频率的事件发生信 号时,加1计数器就相当于外部事件计数器,工 作于计数状态。当计数到计数值为全1时,再有一个脉冲信 号输入将使得计数器溢出。这时,加1计数器从 最高位溢出一个脉冲使TCON的溢出标志位TF0 或TF1置1,同时将计数值清零。如果定时器/计数器工作于定时状态,则表 示定时时间到。如果定时器/计数器工作于计数状态,则表 示计数时间到。计数到计数值为全1用作计数器时,
4、加1计数器在其对应的 外部输入端T0(P3.4)或T1(P3.5)检测到一个 负跳变时加1。用作计数器用作定时器时,在每个机器周期加1计数器 都加1,因此也可以看作对机器周期的累计。如果单片机采用12MHz的晶体振荡器,则 加1计数器的计数频率为1MHz,即每微秒加1计 数器加1。这样就可以按定时时间的要求计算出 加1计数器的预置计数值。用作定时器5.1.2 定时器/计数器的特殊功能寄存器1. 定时器/计数器控制寄存器TCON位地址8FH8EH8DH8CH8BH 8AH89H88HTCONTF1TR1TF0TR0IE1IT1IE0IT0TF0:定时器T0溢出中断请求标志。启动T0计数后, T0
5、从初值开始加1计数,当产 生溢出时,由硬件置位TF0 ,向CPU申请中断, CPU响应TF0中断时,清零该标志位。TF1:定时器T1溢出中断请求标志。同TF0。TR0:定时器T0运行控制位由软件置位/清零来控制定时器T0的启动/停止。 (1) 当选通控制位GATE=0时TR0=1,T0启动计数;TR0=0,T0停止计数。(2)当选通控制位GATE=1时,TR0=1,P3.3引脚=1时,T0启动计数, TR0=0,P3.3引脚=0时,禁止T0计数。TR1:定时器T1运行控制位同TR1 。2. 定时器/计数器工作方式寄存器TMODM1、M0:工作方式选择位 M1 M0工作方式功 能 说 明0 0方
6、式013位定时器/计数器 0 1方式116位定时器/计数器 1 0方式2可自动重新载入计数初值的8位定时器/计数器 1 1方式3T0用作2个8位定时器/计数器,关闭T1 GATE:选通控制位 C/ T:定时器/计数器选择位 C/ T1工作为计数器功能 ; C/ T0工作为定时器功能 。 GATE0 由软件控制TR0或TR1启动定时器;GATE1 由外部中断引脚INT0(P3.2)和 INT1(P3.3)输入电平分别控制T0和T1的运行【例】 EA=1; /总中断允许ET0=1; /定时器T0中断允许TR0=1; /定时器T0启动TMOD=0x01;/设T0为方式1、定时器工作状态5.1.3 定
7、时器/计数器的工作方式 2个16位定时器/计数器具有定时和计数两 种功能,每种功能都包括了四种工作方式。 用户通过指令把方式字写入定时器/计数 器工作方式寄存器TMOD来选择T0或T1的功 能和工作方式 。1. 工作方式0M1M0=00 T0(或T1)在工作在方式0时,是一个13位的 定时器/计数器。在这种方式下,16位寄存器(TH0和TL0)只 用13位。其中TL0的高3位未使用。计数方式时计数值的范围:1 213 = 8192为定时方式时定时时间为:T(213计数初值)晶体振荡器周期12 例:若振荡频率fosc=12MHz, 问最长定时时间是多少?解:则最长定时时间为:( 213 -0)1
8、(12 10-6 )12=8192 s2.工作方式1M1M0=01 T0(或T1)在工作在方式1时,是一个16位的定 时器/计数器。其逻辑电路和工作情况与工作方式 0完全相同,所不同的只是组成计数器的位数。计数方式时计数值范围:165536 (216) 定时方式时定时时间:T(216计数初值)晶体振荡器周期12 例:若振荡频率fosc=6MHz, 则最长定时时间为: ( 216 -0)1(6 10-6 )12 =131072s工作方式0和工作方式1的最大特点:工作方式0和工作方式1的最大特点是计数溢出 后,计数寄存器的值全为0。因此循环定时或计数应 用时就存在重新设置计数初值的问题,这不但影响
9、 定时精度,而且给程序编写带来不便。3. 工作方式2M1M0=10 具有自动重新加载功能,计数溢出后计数初 值可由硬件自动重新装载。在这种工作方式下,16位计数器被分为两部分 ,即以TL0作计数器,以TH0作预置数寄存器,初 始化时把计数初值分别装入TL0和TH0中。当计数 溢出后,由预置数寄存器以硬件方式自动加载。计数方式时计数范围: 1256(28)定时工作时定时时间:T(28计数初值)晶体振荡器周期12 4. 工作方式3M1M0=11 只适用T0 ,T0被拆成2个独立的8位计数 器TL0和TH0。TL0既可以作计数器使用,又可以作定时 器使用,T0的各控制位和引脚信号全归它使 用。其功能
10、和操作与工作方式0和工作方式1 完全相同。TH0只能作为定时器使用,控制位和引脚 信号均借用T1的。5.2 定时器初始化程序由于定时/计数器是可编程的,因此在定时或 计数之前要用程序初始化,初始化一般有以下几个 步骤:方式0: M=213=8192 方式1: M=216=65536 方式2: M=28=256 方式3: M=28=256选择工作方式的一般原则:计数值void poweroninitial(void);/cpu初始化程序 void timer0(void); /定时器T0方式1,定时时间100ms unsigned int n,k;/n:定时结束计数值,k:控制灯的亮灭void
11、main(void) poweroninitial();/开机后,对单片机初始化 k=0x01;/设置第一个LED亮 while(1)/等待定时中断到来,进入定时中断函数 return; /加电时,所有LED全灭 /设置定时器,将定时器T0设置为方式1void poweroninitial(void) P1=0xff;/所有LED灯均灭 TMOD=0x01;/设置 T0方式1 TH0=0x3c;/装入定时初值 TL0=0xb0; EA=1;/总中断允许 ET0=1;/定时器T0中断允许 TR0=1;/定时器T0启动 n=0;/计数初值 k=0;/控制P1口LED灯亮灭的值 return; /定
12、时器T0中断函数,每当定时器定时中断信号到时(100ms 定时结束),执行该函数 void timer0(void) interrupt 1 using 1 n+;/每100ms,n值加1 if(n=10)/当n=10时,定时时间到1s n=0; P1=k; /P1口的LED灯低电平亮,故取反 k=kvoid poweroninitial(void);/cpu初始化程序 void main(void) poweroninitial();/开机后,对单片机初始化while(1) P1=TL0;/由于是低电平点亮,故计数 值需取反后输出 return; /加电后,系统初始化函数的主要作用是:将定时
13、器T0设 置为方式2 void poweroninitial(void) TMOD=0x06;/设置 T0方式2,是8位计数器 TH0=0x00;/装入定时初值 TL0=0x00; TR0=1;/定时器T0启动return; 【例】 P1口的P1.0 P1.7分别接八个发光二 极管L0 L7。使用定时器T1以工作方式1进行 50ms精确定时, 振荡器频率为12MHz 。编写程序模拟一个时序控制装置:要求开机后:第一秒钟L0、L2亮;第二秒钟L1、L3亮;第三秒钟L4、L6亮;第四秒钟L5、L7亮;第五秒钟L0、L2、L4、L6亮;第六秒钟L1、L3、L5、L7亮;第七秒钟全亮 ;第八秒钟全灭;
14、之后又从头开始,一直循环下去。 定时器实验 1. 硬件电路2. 软件 以下为time.c 源文件: /-定时器实验- /-头文件引用- #include #include /-宏声明- #define uchar unsigned char uchar idata LED8= 0xfa,0xf5,0xaf,0x5f,0xaa,0x55,0x00,0xff;/显示常数表 uchar times=20; /延时一秒的常数 uchar status=0;/-主程序- void main() TR1=1; /允许T1计数 ET1=1; /开中断T1 EA=1;/开中断 TMOD=0x10;/置T1为方
15、式1 TL1=0x00;/延时50ms的时间常数 TH1=0x4b; while(1); /-定时器- void int1( ) interrupt 3 times=(times-1); if(times=0) times=20;/延时一秒的常数 P1=LEDstatus;/送P1口显示 status=(status+1) 计数器实验 【例】使用T1作为定时器,T0作为计数器 ,均按方式1工作,测试P3.4(T0)引脚上每 50ms来了多少脉冲,将其数值按二进制数在 LED灯上显示出来,每隔3秒测试显示一次, 振 荡器频率为6MHz 。 硬件电路软件以下为counter.c 源文件: /-定时器实验- /-头文件引用- #include /-宏声明- #define uchar unsigned char uchar times=60; /延时 3 秒常数 uchar status=0; /-定时中断程序- voidint_t1() interrupt 3 status=TL0;/保存计数值 times-; if(times=0) tim