#include <msp430.h>
#include"pwm_init_t.h"
#include"msp_430_t.h"
#include <msp430.h>
#define uint unsigned int
#define uchar unsigned char
//***位操作***//
#define P1BIT4_OUT_HIGH P1OUT |=BIT4
#define P1BIT4_OUT_LOW P1OUT &=~BIT4
#define P1BIT5_OUT_HIGH P1OUT |=BIT5
#define P1BIT5_OUT_LOW P1OUT &=~BIT5
#define P1BIT7_OUT_HIGH P1OUT |=BIT7
#define P1BIT7_OUT_LOW P1OUT &=~BIT7
#define P2BIT4_OUT_HIGH P2OUT |=BIT4
#define P2BIT4_OUT_LOW P2OUT &=~BIT4
#define P2BIT5_OUT_HIGH P2OUT |=BIT5
#define P2BIT5_OUT_LOW P2OUT &=~BIT5
#define P2BIT3_OUT_HIGH P2OUT |=BIT3
#define P2BIT3_OUT_LOW P2OUT &=~BIT3
unsigned char triangular[32]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0,0xfe,0xf0,0xe0,0xd0,0xc0,0xb0,0xa0,0x90,0x80,0x70,0x60,0x50,0x40,0x30,0x20,0x10};
unsigned char sinewav[16] ={0x00,0x31,0x61,0x8e,0xb4,0xd4,0xec,0xfb,0xfe,0xfb,0xec,0xd5,0xb5,0x8e,0x62,0x32};
void delay_t(int i)
{
volatile int x,y;
for(x=i;x>0;x--)
for(y=100;y>0;y--);
}
char pwm_duty_t(char pwms_x)
{
int i;
char wave[32];
if(pwms_x == 0)
for(i=0;i<32;i++)
{wave[i]=triangular[i];
CCR1=wave[i];
delay_t(100);
// for(i=0;i<16;i++)
// wave[i]=0;
else if(pwms_x == 1)
for(i=0;i<16;i++)
{wave[i]=sinewav[i];
CCR1=wave[i];
delay_t(100);
// for(i=0;i<16;i++)
// wave[i]=triangular[i];
// else if(pwms_x == 2)
// for(i=0;i<16;i++)
// wave[i]=sawtooth[i];
}
}
/*
* pwm初始化函数
*
* P1.2 Timer0_A ,捕捉:CCI0A输入
* P1.3 比较器输出
*/
void pwm_init_t()
{
//***初始化端口***//
P1DIR |= 0x04; // P1.2 and P1.3 output
P1SEL |= 0x04; // P1.2 and P1.3 TA1/2 options
// P2DIR |= 0x0C; // P2.2 和P2.3 为输出
// P2SEL |= 0x0C; // P2.2 和P2.3 分别为TB1 和TB2
CCR0 = 0xff; // PWM Period
// TBCCR0 = 0xff; //PWM 的周期为256,也就是DAC 为8bit
CCTL1 = OUTMOD_7; // CCR1 reset/set
CCR1 = 0; // CCR1 PWM duty cycle
TACTL |= TASSEL_2 + MC_1; // SMCLK, up mode
// TACTL = TASSEL_2 + MC_3; // SMCLK, up-down mode
// TACTL = TASSEL_1 + MC_1; // ACLK, up mode
// TACTL = TASSEL_1 + MC_3; // ACLK, up-down mode
}
/*
* PWM输出初始化(管脚设置)
*
* P1.2 比较模式:OUT1输出
* P1.0 作为ADC中断的指示灯
* 定时器启用单调增模式
*/
void PWM_INIT_IO(void)
{
P1DIR |= BIT2 + BIT0; //设置IO
P1SEL |= BIT2;
P1BIT2_OUT_HIGH; //高电平初始化
TACTL |= TASSEL_2 + // 时钟源SMCLK
ID0+ //输入不分频
MC_1+ //单调增模式
TAIE; //中断允许
TACCTL1 &= ~CAP; //比较模式
TACCTL1 = OUTMOD_6; //输出模式6:OUT1翻转/置位
CCR0 = PERIOD;
CCR1 = 0;
}
void P1_3_interrupt_init(void)
{
P1DIR |= 0x01; // P1.0 output, else input
P1OUT |= 0x08; // P1.3 set, else reset
P1REN |= 0x08; // P1.3 pullup
P1IE |= 0x08; // P1.3 interrupt enabled
P1IES |= 0x08; // P1.3 Hi/lo edge
P1IFG &= ~0x08; // P1.3 IFG cleared
// _BIS_SR(LPM4_bits + GIE); // Enter LPM4 w/interrupt
}
void PORT_ISR(VOID)
{
delay();
P1IFG &= ~(BIT0);
pwms_x=pwms_x+1;
}
void main(void) {
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
pwm_init_t();
P1_3_interrupt_init();
char pwms_x=0;
while(1)
pwm_triangular();
}