资源描述
输入捕捉(IC)编程步骤:
初始化函数
TIOS---选择工作方式为IC
TCTLx---设置对应位输入捕捉的方式(x=3、4,高位是3,低位是4)
TSCRx---控制寄存器设置,包括工作使能、确定工作方式(x=1)、中断允许、预分频
TIE---中断使能
中断函数
清除标志位---TFLG1
处理函数
【例程3】
//---------------------------------------------------------------------------//
//功能说明:利用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
【例程4】
//---------------------------------------------------------------------------//
//功能说明:利用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;
}
展开阅读全文