主程序: #include #include float c,a=45; int n=0; long int b=300,cnt=0; #define pi 3.14 #define CCR0_ini 500 #define keyin (P2IN & 0xf0) void delay(void) { unsigned int tmp; for(tmp = 12000;tmp > 0;tmp--); } void creat_spwm(int av,float f); int spwm[500]; void TimerB_Init() { P4DIR|=BIT1+BIT2+BIT3+BIT4+BIT5+BIT6; // P4.1 - P4.6 output P4SEL |= BIT1+BIT2+BIT3+BIT4+BIT5+BIT6; TBCCR0 = CCR0_ini; TBCCTL1 = OUTMOD_2; TBCCTL4 = OUTMOD_6; TBCCR1=TBCCR4=spwm[n]; TBCCTL2 = OUTMOD_2; TBCCTL5 = OUTMOD_6; TBCCR2=TBCCR5=spwm[n]; TBCCTL3 = OUTMOD_2; TBCCTL6 = OUTMOD_6; TBCCR3=TBCCR6=spwm[n+(int)(c*2/3)]; /*TBCCTL4 = OUTMOD_2; TBCCR4=spwm[n+53+53+53]*100; TBCCTL5 = OUTMOD_2; TBCCR5=spwm[n+53+53+53+53]*100; TBCCTL6 = OUTMOD_2; TBCCR6=spwm[n+53+53+53+53+53];*/ TBCCTL0=CCIE; TBCTL = TBCLR + MC_1 + TBSSEL_2+TBIE; // clear TAR, up mode*/ } /*********** av用来控制斩波时SPWM占空比,以达到控制电压输出的目的 av++可增大输出电压,av--可减小输出电压 c控制生成spwm时的点数,用来改变频率 4M/(CCR0*c)=Fsin ************/ void creat_spwm(int av,float f) { int i; c=2800000/(CCR0_ini*f); //c*=2; for(i=0;i0;i--); } while ((IFG1&OFIFG)!=0); } void main() { WDTCTL=WDTPW+WDTHOLD; ini_sys(); creat_spwm(b,a); TimerB_Init(); _EINT(); //_BIS_SR(LPM0_bits + GIE); while(1); } #pragma vector=TIMERB0_VECTOR __interrupt void TimerB(void) { n=(n+1)%(int)c; TBCCR1=TBCCR4=spwm[n]; TBCCR2=TBCCR5=spwm[n]; TBCCR3=TBCCR6=spwm[(n+(int)(c*2/3))%(int)c]; int temp; if(keyin != 0xf0) //键值有改变 { delay(); //延时消抖 if(keyin != 0xf0) //再次检测按键状态 { temp=keyin; while(keyin != 0xf0); //等待按键被放开 switch(temp) //转换键值 { case 0xe0: creat_spwm(b,a++); break; case 0xd0: creat_spwm(b+=10,a); break; //a-=10;CCR0=a;CCR1=CCR2=a>>1; case 0xb0: P2OUT = 0xfb;break; case 0x70: P2OUT = 0xf7;break; default: P2OUT = 0xff;break; } delay();delay();delay();delay(); delay();delay();delay();delay(); } } }