定时器计数器(TC)简介以及例子说明
- 格式:doc
- 大小:64.00 KB
- 文档页数:8
定时器、计数器的基本结构及工作原理定时器/计数器简称定时器,其作用主要包括产生各种时标间隔、记录外部事件的数量等,是微机中最常用、最基本的部件之一。
805l单片机有2个16位的定时器/计数器:定时器0(T0)和定时器1(T1)。
T0由2个定时寄存器TH0和TL0构成,T1则由TH1和TL1构成,它们都分别映射在特殊功能寄存器中,从而可以通过对特殊功能寄存器中这些寄存器的读写来实现对这两个定时器的操作。
作定时器时,每一个机器周期定时寄存器自动加l,所以定时器也可看作是计量机器周期的计数器。
由于每个机器周期为12个时钟振荡周期,所以定时的分辨率是时钟振荡频率的1/12。
作计数器时,只要在单片机外部引脚T0(或T1)有从1到0电平的负跳变,计数器就自动加1。
*与定时器、计数器的有关寄存器简介定时器/计数器T0和T1有2个控制寄存器-TMOD和TCON,它们分别用来设置各个定时器/计数器的工作方式,选择定时或计数功能,控制启动运行,以及作为运行状态的标志等。
其中,TCON寄存器中另有4位用于中断系统。
另外还有4个八位计数器组成。
1、定时器方式控制寄存器TMODTMOD在特殊功能寄存器中,字节地址为89H,无位地址。
TMOD的格式如下图示。
由图可见,TMOD的高4位用于T1,低4使用于T0,4种符号的含义如下:GATE:门控制位。
其作用见图1.6。
GATE和软件控制位TR、外部引脚信号INT的状态,共同控制定时器/计数器的打开或关闭。
C/T:定时器/计数器选择位。
C/T=1,为计数器方式;C/T=0,为定时器方式。
M1M0:工作方式选择位,定时器/计数器的4种工作方式由M1M0设定。
M1M0=00:工作方式0(13位方式)。
M1M0=01:工作方式1(16位方式)。
M1M0=10:工作方式2(8位自动装入时间常数方式)。
MlM0=11:工作方式3(2个8位方式--仅对T0)。
2.定时器控制寄存器--TCONTCON在特殊功能寄存器中,字节地址为88H,位地址(由低位到高位)为88H一8FH,由于有位地址,十分便于进行位操作。
单片机定时器计数器单片机定时器/计数器在单片机的世界里,定时器/计数器就像是一个精准的小管家,默默地为系统的各种操作提供着精确的时间控制和计数服务。
无论是在简单的电子时钟、还是复杂的通信系统中,都能看到它们忙碌的身影。
那什么是单片机的定时器/计数器呢?简单来说,定时器就是能够按照设定的时间间隔产生中断或者触发事件的模块;而计数器则是用于对外部脉冲或者内部事件进行计数的功能单元。
我们先来看看定时器的工作原理。
想象一下,单片机内部有一个像小闹钟一样的东西,我们可以给它设定一个时间值,比如说 1 毫秒。
当单片机开始工作后,这个小闹钟就会以一个固定的频率开始倒计时,当倒计时结束,也就是 1 毫秒到了,它就会发出一个信号,告诉单片机“时间到啦”!这个信号可以用来触发各种操作,比如更新显示、读取传感器数据等等。
定时器的核心在于它的时钟源。
就好比小闹钟的动力来源,时钟源决定了定时器倒计时的速度。
常见的时钟源有单片机的内部时钟和外部时钟。
内部时钟一般比较稳定,但精度可能会受到一些限制;而外部时钟则可以提供更高的精度,但需要额外的电路支持。
再来说说计数器。
计数器就像是一个勤劳的小会计,不停地数着外面进来的“豆子”。
这些“豆子”可以是外部的脉冲信号,也可以是单片机内部产生的事件。
比如,我们可以用计数器来统计电机旋转的圈数,或者计算按键被按下的次数。
计数器的工作方式也有多种。
可以是向上计数,就是从 0 开始,不断增加,直到达到设定的最大值;也可以是向下计数,从设定的最大值开始,逐渐减少到 0。
还有一种更灵活的方式是双向计数,根据需要在向上和向下之间切换。
那么,定时器/计数器在实际应用中有哪些用处呢?比如说,在一个智能温度控制系统中,我们可以用定时器每隔一段时间读取一次温度传感器的数据,然后根据温度的变化来控制加热或者制冷设备的工作。
而计数器则可以用来统计设备运行的次数,以便进行维护和保养。
在电子时钟的设计中,定时器更是发挥了关键作用。
单片机中的定时器与计数器的原理与应用在单片机中,定时器和计数器是两种常见的功能模块,它们在各种应用中都扮演着非常重要的角色。
本文将对单片机中定时器与计数器的原理和应用进行详细的介绍。
一、定时器的原理与应用定时器是单片机中的一种计时功能模块,它可以在一定的时间间隔内产生一个中断信号,用于控制各种时间相关的任务。
定时器一般由一个计数器和一个控制逻辑组成,计数器用于计数,控制逻辑用于设置计数器的初值、控制计数器的计数方式以及处理定时器中断等功能。
定时器在单片机中有各种不同的应用,例如用于控制LED的闪烁频率、控制蜂鸣器的鸣叫时间、测量外部信号的脉冲宽度等。
通过合理地设置定时器的初值和工作模式,可以实现各种复杂的定时功能。
二、计数器的原理与应用计数器是单片机中另一种常见的功能模块,它可以实现对外部信号的计数和测频等功能。
计数器一般由一个计数寄存器和一个控制逻辑组成,计数寄存器用于记录计数值,控制逻辑用于设置计数器的计数方式、清零计数器以及处理计数器溢出等功能。
计数器在单片机中也有广泛的应用,例如用于计算外部脉冲的频率、测量两个信号之间的时间间隔、实现车辆流量统计等。
通过合理地设置计数器的工作模式和计数方式,可以实现各种计数功能。
三、定时器与计数器的联合应用定时器和计数器在单片机中经常会联合应用,以实现更加复杂和精密的定时计数功能。
例如,可以使用定时器来生成一个固定时间间隔的中断信号,然后在中断服务程序中通过计数器来计数外部脉冲的个数,从而实现对外部脉冲的精确计数。
通过合理地运用定时器和计数器,可以实现各种高级的时间计数功能,使单片机在实际应用中发挥更大的作用。
综上所述,定时器和计数器是单片机中非常重要的功能模块,它们在各种应用中都有着广泛的应用。
合理地掌握定时器和计数器的原理和应用,可以为单片机的开发和应用带来极大的便利。
希望通过本文的介绍,读者能够更加深入地了解单片机中定时器与计数器的原理与应用。
定时器/计数器(T/C)简介一、定时器/计数器有关的特殊功能寄存器1. 计数数寄存器TH和TL计数器寄存器是16位的,计数寄存器由TH高8位和TL低8 位构成。
在特殊功能寄存器(SFR)中,对应T/C0为TH0和TL0,对应T/C1为TH1和TL1。
定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置。
2. 定时器/计数器控制寄存器TCONTR0,TR1:T/C0,1启动控制位。
1——启动计数0——停止计数TCON复位后清“0”,T/C需受到软件控制才能启动计数,当计数寄存器计满时,产生向高位的进位TF,即溢出中断请求标志。
3. T/C的方式控制寄存器TMODT/C1 T/C0 C/T :计数器或定时器选择位。
1——为计数器0——为定时器GATE:门控信号1——T/C的启动受到双重控制,即要求TR0/TR1和INT0/INT1同时为高。
M1和M0:工作方式选择位。
(四种工作方式)4.定时器/计数器2(T/C2)控制寄存器TF2:T/C2益出标志——必须由软件清除EXF2:T/C2外部标志。
当EXEN2=1,且T2EX引脚上出现负跳变而引起捕获或重装载时置位,EXF2要靠软件来清除。
RCLK:接收时钟标志1——用定时器2 溢出脉冲作为串行口的接收时钟0——用定时器1的溢出脉冲做接收时钟。
TCLK:发送时钟标志。
1——用定时器2 溢出脉冲作为串行口的发送时钟0——用定时器1的溢出脉冲作发送时钟EXEN2:T/C2外部允许标志。
1——若定时器2未用作串行口的波特率发生器,T2EX端的负跳变引起T/C2的捕获或重装载。
0——T2EX端的外部信号不起作用。
TR2:T/C2运行控制位1——T/C2启动0——T/C2停止C/T2:计数器或定时器选择位1——计数器0——定时器CP/RL:捕获/重载标志。
1——若EXEN2=1,且T2EX端的信号负跳变时,发生捕获操作。
0——若定时器2溢出,或在EXEN2=1条件下T2EX端信号负跳变,都会造成自动重装载操作。
第六章TCC計時器6-1、簡介ET44M210微控制器內提供了一個有預除器(Prescaler)的計時器(TCC),一個自由振盪計時器(FRC)。
TCC及FRC的時脈來源是IC內部的Clock或是外部RC振盪。
6-2、TCC如圖6-1所示為ET44M210的TCC功能方塊圖。
這是一個8位元附有預除器(Prescaler)的計時器。
TCC的時脈來源可以是來自IC內部的Clock也可以是來自外部RC振盪。
當TCC的時脈是來自IC內部的Clock時,TCC會在每個指令週期自動加1。
當TCC 的時脈是來自外部RC振盪時,TCC會在外部TCC接腳正緣觸發(Rising Edge) 或負緣觸發(Falling Edge) 時自動加1。
TCCS0是選擇TCC時脈使用IC內部的Clock或是來自外部RC振盪。
TCCE是選擇是否啟動TCC的功能。
TCCOF是表示TCC是否發生溢位中斷。
PS0~PS2是選擇以預除器的倍率,因為TCC有使用預除器,因此TCC加1的時間是由PS0~PS2所決定。
當TCC計時器內的值由FFh變成00h時,產生溢位中斷,中斷旗標暫存器中的TCC 溢位中斷旗標(TCCOF)會被設為1,程式會跳至中斷相量位址0x0028h去執行相關的中斷副程式以下是TCC Timer 計算的公式:TCC Timer=(0x100-TCC) * Prescaler* (1/Clock Source) 當TCC的時脈是來自外部RC振盪時,在ET44M210的ICE上,RC振盪的公式是Freq (KHz) * R (Meg Ohm) = 150 (常數)而由於ET44M210的ICE上,RC震盪電阻的預設值是300KΩ,因此外部RC的振盪頻率是500KHz。
I.TCC相關的暫存器預除器(Prescaler Counter )– PRC (0x0F)一個八位元的計數器。
Time Clock Counter – TCC (0x10)此暫存器存放TCC的值。
定时器计数器常用编程方法定时器和计数器是嵌入式系统中常用的功能模块,用于实现时间测量、任务调度、PWM生成等功能。
在嵌入式系统的开发中,了解和掌握常用的定时器计数器编程方法至关重要。
本文将介绍几种常用的定时器计数器编程方法,以帮助开发者更好地运用定时器计数器。
一、基本概念在进行定时器计数器编程之前,我们首先需要了解一些基本概念。
1. 定时器:定时器是一种能够按照一定时间周期自动计数,并产生相应中断或触发事件的硬件模块。
2. 计数器:计数器是一种能够按照外部信号或者内部时钟信号进行计数,并提供计数结果的硬件模块。
3. 溢出中断:当定时器或计数器的计数值达到最大值后,会发生溢出,并触发溢出中断,用于实现周期性的定时或计数功能。
4. 输入捕获:定时器计数器可以通过输入捕获功能,实时记录外部事件信号的时间戳,用于时间测量等应用。
二、定时器计数器编程方法在嵌入式系统中,常用的定时器编程方法包括常规模式、CTC模式、PWM模式等。
下面分别介绍这些方法的基本原理及编程实现。
1. 常规模式常规模式是定时器最简单的工作模式,通过设置计数器的初值和溢出中断来实现定时功能。
其编程步骤如下:(1)设置定时器计数器的初值,决定计数器的起点。
(2)使能定时器的溢出中断,当计数器溢出时触发中断。
(3)启动定时器计数。
下面是一个使用常规模式实现定时功能的示例代码:```C#include <avr/io.h>#include <avr/interrupt.h>void Timer_Init(){// 设置计数器初值TCNT1 = 0;// 使能溢出中断TIMSK |= (1 << TOIE1);// 启动定时器计数,使用外部时钟源TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10);}// 定时器溢出中断处理函数ISR(TIMER1_OVF_vect){// 处理定时事件}int main(){Timer_Init();// 主循环while (1){// 其他任务处理}return 0;}```2. CTC模式CTC模式(Clear Timer on Compare Match)是一种定时器工作模式,可以实现在指定时间后产生中断或触发事件。
定时器/计数器(T/C)简介一、定时器/计数器有关的特殊功能寄存器1. 计数数寄存器TH和TL计数器寄存器是16位的,计数寄存器由TH高8位和TL低8 位构成。
在特殊功能寄存器(SFR)中,对应T/C0为TH0和TL0,对应T/C1为TH1和TL1。
定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置。
2. 定时器/计数器控制寄存器TCONTR0,TR1:T/C0,1启动控制位。
1——启动计数0——停止计数TCON复位后清“0”,T/C需受到软件控制才能启动计数,当计数寄存器计满时,产生向高位的进位TF,即溢出中断请求标志。
3. T/C的方式控制寄存器TMODT/C1 T/C0 C/T :计数器或定时器选择位。
1——为计数器0——为定时器GATE:门控信号1——T/C的启动受到双重控制,即要求TR0/TR1和INT0/INT1同时为高。
M1和M0:工作方式选择位。
(四种工作方式)4.定时器/计数器2(T/C2)控制寄存器TF2:T/C2益出标志——必须由软件清除EXF2:T/C2外部标志。
当EXEN2=1,且T2EX引脚上出现负跳变而引起捕获或重装载时置位,EXF2要靠软件来清除。
RCLK:接收时钟标志1——用定时器2 溢出脉冲作为串行口的接收时钟0——用定时器1的溢出脉冲做接收时钟。
TCLK:发送时钟标志。
1——用定时器2 溢出脉冲作为串行口的发送时钟0——用定时器1的溢出脉冲作发送时钟EXEN2:T/C2外部允许标志。
1——若定时器2未用作串行口的波特率发生器,T2EX端的负跳变引起T/C2的捕获或重装载。
0——T2EX端的外部信号不起作用。
TR2:T/C2运行控制位1——T/C2启动0——T/C2停止C/T2:计数器或定时器选择位1——计数器0——定时器CP/RL:捕获/重载标志。
1——若EXEN2=1,且T2EX端的信号负跳变时,发生捕获操作。
0——若定时器2溢出,或在EXEN2=1条件下T2EX端信号负跳变,都会造成自动重装载操作。
二、定时器/计数器的工作方式1.方式0当TMOD中M1M0=00,T/C工作在方式0。
方式0为13位的T/C,由TH提供高8位,TL提供低5位的计数值,满计数值213,但启动前可以预置计数初值。
当C/T=0时,T/C为定时器,振荡源12分频的信号作为计数脉冲;当C/T=1时,T/C为计数器,对外部脉冲输入端T0或T1输入的脉冲计数。
计数脉冲能否加到计数器上,受到启动信号控制。
当GATE=0时,只要TR=1,则T/C启动。
当GATE=1时,启动信号=TR×INT,此时T/C启动受到双重控制。
T/C启动后立即加1计数,当13位计数满时,TH向高位进位,此进位将中断溢出标志TF置1,产生中断请求,表示定时时间到或计数次数到。
若T/C开中断(ET=1)且CPU开中断(恩爱)则当CPU转向中断服务程序时,TF自动清0。
2.方式1当TMOD例子一.输入捕捉(IC)编程步骤:初始化函数TIOS---选择工作方式为ICTCTLx---设置对应位输入捕捉的方式(x=3、4,高位是3,低位是4)TSCRx---控制寄存器设置,包括工作使能、确定工作方式(x=1)、中断允许、预分频TIE---中断使能中断函数清除标志位---TFLG1处理函数//---------------------------------------------------------------------------////功能说明:利用PP3通道产生40Hz,占空比为50%的方波// 利用PT0采集方波的个数,并在PB口显示//程序设计:电子设计吧//设计时间:2010.01.13//---------------------------------------------------------------------------//#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information */#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"unsigned int Input_Num;//----------------------时钟初始化------------------------------//void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1){ //锁相环时钟=2*16*(2+1)/(1+1)=48MHzREFDV=1; //总线时钟=48/2=24MHzSYNR=2;while(!(CRGFLG&0x08));CLKSEL=0x80;}//--------------------通道0输入捕捉初始化-------------------//void ECT0_Init(void){TSCR2=0x06; //禁止溢出中断,分频系数64(24/64MHz) TIOS_IOS0=0; //通道0为输入捕捉TCTL4=0x01; //捕捉上升沿TIE_C0I=1; //通道0输入捕捉中断允许TSCR1=0x80; //使能定时器}//---------------------PWM通道3初始化程序-------------------//void PWM_Init(void){PWME_PWME3=0x00; // PWW is disabled 禁止PWMPRCLK=0x33; // 0b0011 0011 A=B=24M/8=3M 时钟预分频寄存器设置PWMSCLA=150; // SA=A/2/150=10k 时钟设置PWMSCLB=150; // SB=B/2/15 =10k 时钟设置PWMCTL=0x00; // no concatenation 控制寄存器设置PWMCLK_PCLK3=1; // PWM3-----SB 时钟源的选择PWMPOL_PPOL3=1; // Duty=High Time 极性设置PWMCAE_CAE3=0; // left-aligned 对齐方式设置PWMPER3=250; // Frequency=SB/250=40 周期寄存器设置PWMDTY3=125; // Duty cycle = 50% 占空比寄存器设置PWME_PWME3=1; // enable 使能}//----------------------主函数-------------------------//void main(void){PLL_Init();PWM_Init();ECT0_Init();DDRB=0XFF;PORTB=0X00;EnableInterrupts;for(;;){} /* wait forever *//* please make sure that you never leave this function */}//--------------------转速计算:-------------------------------//////智能车转速子函数////----------------------------------------------------------------//#pragma CODE_SEG NON_BANKED //定时器通道0输入捕捉中断void interrupt 8 Timer0_Onput(void){TFLG1_C0F=1; //清中断标志位Input_Num++;PORTB=Input_Num;if(Input_Num>=255){Input_Num=0;}}二、输出比较(OC)编程步骤:初始化函数TIOS---选择工作方式为OCTCx---通道x的OC寄存器赋初值,经过N秒后进入第一次中断TCTLx---设置对应位输入捕捉的方式(x=1、2,高四位是1,低四位是2)TSCRx---控制寄存器设置,包括工作使能、确定工作方式(x=1)、中断允许、预分频TIE---中断使能中断函数清除标志位---TFLG1重新赋初值TCx//---------------------------------------------------------------------------////功能说明:利用PT0的输出比较功能,定时进入中断// 利用PORTB显示定时的时间//程序设计:电子设计吧//设计时间:2010.01.15//---------------------------------------------------------------------------//#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information */#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"//利用定时器输出比较功能产生定时中断//----------------------变量定义----------------------//static unsigned int waittime = 0;//---------------------时钟初始化-------------------//void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1){ //锁相环时钟=2*16*(2+1)/(1+1)=48MHzREFDV=1; //总线时钟=48/2=24MHzSYNR=2;while(!(CRGFLG&0x08));CLKSEL=0x80;}//--------------------定时器初始化------------------//void ECT0_Init(void){TIOS=0x01; //定时器通道0设置为输出比较TC0=0x00ee; //赋初值,当TCNT从0计数到此值时第一次进入中断TCTL2=0x02; //其他七路与定时器断开执行的动作时:0通道输出清零TSCR2=0x86 //溢出中断禁止24M/64=2.67微秒,计一个数用2.67微秒TSCR1=0x80; //使能定时器TIE=0x01; //通道0输出比较中断允许}//-----------------------主函数------------------------//void main(void){PLL_Init();ECT0_Init();DisableInterrupts;DDRB=0xff;PORTB=0x00;for(;;){EnableInterrupts;}}//-----------------------中断函数处理-------------------//#pragma CODE_SEG NON_BANKEDvoid interrupt 8 Timer0_ISR(void) //8为定时器通道0的中断标号{unsigned int m;TFLG1_C0F=1;//清中断标志位DisableInterrupts;m=TCNT;TC0=m+37500; //37500*2.67us=10ms定时时间waittime++;if(waittime>=255){waittime=0;}PORTB=waittime;。