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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

定时器/计数器(T/C)简介
一、定时器/计数器有关的特殊功能寄存器
1. 计数数寄存器TH和TL
计数器寄存器是16位的,计数寄存器由TH高8位和TL低8 位构成。

在特殊功能寄存器(SFR)中,对应T/C0为TH0和TL0,对应T/C1为TH1和TL1。

定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置。

2. 定时器/计数器控制寄存器TCON
TR0,TR1:T/C0,1启动控制位。

1——启动计数0——停止计数
TCON复位后清“0”,T/C需受到软件控制才能启动计数,当计数寄存器计满时,产生向高位的进位TF,即溢出中断请求标志。

3. T/C的方式控制寄存器TMOD
T/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---选择工作方式为IC
TCTLx---设置对应位输入捕捉的方式(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)=48MHz
REFDV=1; //总线时钟=48/2=24MHz
SYNR=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---选择工作方式为OC
TCx---通道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)=48MHz
REFDV=1; //总线时钟=48/2=24MHz
SYNR=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_BANKED
void 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;。

相关文档
最新文档