//MSP430G2553 呼吸灯演示程序 - 使用Timer_A,Up Mode, DCO SMCLK
//
// 介绍: 该程序利用TIMER A 的 UP模式 在P1.6脚产生PWM输出
// 将CCR0设置为1500来定义PWM的周期,利用循环不断改变CCR1的值,
// 实现利用改变PWM的占空比来改变LED亮度.
// ACLK = na, SMCLK = MCLK = TACLK = default DCO
//
// MSP430G2553
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.6/TA1|--> CCR1 - PWM
//
// 使用 MSP430 LaunchPad , MSP430G2553芯片
// 在IAR Embedded Workbench for MSP430 5.40下编译测试通过
//******************************************************************************
#include "msp430g2553.h"
// *************************************************************
// 延时函数,对于1M主频,约延时1ms
// *************************************************************
void delay_1ms(void)
 {
 unsigned int k;
 for (k=0;k<195;k++);
 }
// *************************************************************
// 延时函数,延时n*ms
// *************************************************************
void delay_nms(unsigned int n)
 {
 unsigned int j;
 for (j=0;j
 {
 delay_1ms();
 }
 }
// *************************************************************
// 主程序
// *************************************************************
void main(void)
{
 unsigned const PWMPeriod = 1500; //设置PWMPeriod参数
 volatile unsigned int i; //变量
 WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
 BCSCTL1= CALBC1_1MHZ; //1M内部时钟,其他也可以
 DCOCTL = CALDCO_1MHZ;
 P1DIR |=BIT6; // 设置 P1.6为输出
 P1SEL |=BIT6; // 设置 P1.6为TA0.1输出
 TACCR0 = PWMPeriod; // 设置PWM 周期
 TACCTL1 = OUTMOD_7; // 设置PWM 输出模式为:7 - PWM复位/置位模式,
 // 即输出电平在TAR的值等于CCR1时复位为0,当TAR的值等于CCR0时置位为1,改变CCR1,从而产生PWM。其实模式2也可以
 TACTL = TASSEL_2 +MC_1; // 设置TIMERA的时钟源为SMCLK, 计数模式为up,到CCR0再自动从0开始计数
 while(1)
 {
 CCR1=0;//确保开始是暗的
 //渐亮过程:不断设置CCR1的值,使翻转的时间变长,改变PWM的占空比
 //由于只有1个定时器,编程有些你困难,故仍引入delay函数
 for(i=0;i
 {
 CCR1=i;
 delay_nms(4-(i/500)); //占空比变化的延时,调整延迟时间可改变呼吸灯变暗的速度
 //在暗的时候延长delay时间,可增强效果
 }
 //渐暗过程:不断设置CCR1的值,使翻转的时间变短,改变PWM的占空比
 for(i=PWMPeriod;i>0;i-=1)
 {
 CCR1=i;
 delay_nms(4-(i/500)); //占空比变化的延时,调整延迟时间可改变呼吸灯变暗的速度
 //在暗的时候延长delay时间,可增强效果
 }
 CCR1=0; //确保灯暗
 delay_nms(600); //暗0.6S增强效果
 }
}