当前位置:文档之家› 定时器计数器(TC)简介以及例子说明

定时器计数器(TC)简介以及例子说明

定时器/计数器(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;。

相关主题