
定时器模块应用.doc
4页输入捕捉(输入捕捉(IC)编程步骤:)编程步骤:初始化函数 TIOS---选择工作方式为 IC TCTLx---设置对应位输入捕捉的方式(x=3、4,高位是 3,低位是 4) TSCRx---控制寄存器设置,包括工作使能、工作使能、确定工作方式(x=1)、中断允中断允 许许、预分频 TIE---中断使能中断使能 中断函数 清除标志位---TFLG1 处理函数【例程 3】 //---------------------------------------------------------------------------// //功能说明:利用 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)=48MHzREFDV=1; //总线时钟=48/2=24MHzSYNR=2;while(!(CRGFLGCLKSEL=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 【例程 4】 //---------------------------------------------------------------------------// //功能说明:利用 PT0 的输出比较功能,定时进入中断 // 利用 PORTB 显示定时的时间 //程序设计:电子设计吧 //设计时间:2010.01.15 //---------------------------------------------------------------------------//#include /* common defines and macros */ #include /* 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(!(CRGFLGCLKSEL=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; }。












