定时器计数器(TC)简介以及例子说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
#include
#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 */
}