#include <msp430x14x.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define CPU_F ((double) 8000000.0)//当前CPU主频
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
uint sintable[]={255,246,239,225,213,200,180,162,130,122,108,95,80,59,39,28,17,10,3,1,3,10,
17,28,39,59,80,95,108,122,130,162,180,200,213,225,239,246,255};
uint t=0;
void Init_clk()//时钟初始化
{
uchar i;
BCSCTL1 &=~XT2OFF;//(置TX2=0)使TX2有效,默认是关闭的
do
{
IFG1 &= ~OFIFG;//清振荡器失效标志
for(i=0xff;i>0;i--);
}while((IFG1 & OFIFG)!=0); //若振荡器失效标志有效
BCSCTL2|=SELM_2+SELS+DIVS_2; //使MCLK=XT2=8M,SMCLK经过4分频,则SMCLK=2M
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
Init_clk(); //时钟初始化
P4DIR |= 0x07; // P4.0 - P4.2 输出
P4SEL |= 0x07; // P4.0 - P4.2 第二功能(PWM输出)
TBCTL = TBSSEL_2 + MC_1; // SMCLK,增计数模式
TBCCTL0 |=CCIE; //CCR0比较模式,打开中断
TBCCR0 = 255; //PWM周期
TBCCTL1 = OUTMOD_7; //选择输出模式7,当TBR计数到0时,CCRx数据加载到TBCTLx中
TBCCTL2 = OUTMOD_7;
TBCCR1 =sintable[t];
TBCCR2 = 128; //占空比128/255=50%
while(1)
{
_EINT();//打开总中断
}
}
#pragma vector=TIMERB0_VECTOR
__interrupt void timerB()
{
t=(t+1)%39;
TBCCR1=sintable[t];//将新的抽样值装入TBCCR1
}
|