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

  • 格式:doc
  • 大小:64.00 KB
  • 文档页数:8

下载文档原格式

  / 8
  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 /* common defines and macros */

#include /* 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 */

}