**
CC2530实现呼吸灯效果
**
编程实现 PWM 输出驱动 LED , 控制 PWM 电平的宽度,逐渐改变 PWM 的占空比来使得 LED 能够模拟呼吸过程长 —— 由渐暗到渐亮,渐亮到渐暗, 如此反复,利用 LED 余辉和人眼的暂留效应,实现模拟呼吸过程。
我们利用CC2530的定时器1的自由运行模式输出PWM,控制P1.1实现呼吸灯效果。
CC2530定时器1是一个独立的16位定时器,支持定时/计数功能(输入捕获、输出比较和PWM功能),
在自由运行模式下,不用配置定时器1计数器高(T1CNTH)、低(T1CNTL)字节,因为自由运行模式的计数周期是固定值0xffff,当计数器达到最终计数值0xffff时,系统自动设置标志位IRCON.T1IF和·T1STAT.OVFFIF。
PWM调光就是利用在一定的时间下I/O口输出的高电平和低电平的多少即占空比达到调整电压、电流、功率的方法,最终达到调整光亮度。

CC2530外设I/O引脚映射
定时器1一共5个通道它们相互独立,互不影响。
有映射表看出P1_1是定时器1的通道1

TxCTL寄存器
我们选择1分频,自由运行模式
T1CTL |= 0x01; //00000001
TxSTAT寄存器
不使用中断则不设置
PxDIR寄存器
使用P1_1,为避免直接赋值会冲掉P1其他输出端口,用“|”来表示 P1DIR |= 0x02; //00000010
PERCFG寄存器
使用定时器1备通道0 PERCFG |= 0x20; //00100000
PxSEL寄存器
将P1_1设为外设功能 P1SEL |= 0x20; //00000010
TxCCTLx
设置定时器1向上比较清除输出 比较模式 T1CCTL2|= 0x64; //01100100
定时器捕获比较值寄存器
TxCCxH寄存器
TxCCxL寄存器
#include "iocc2530.h"
#define LED1 P1_0 //D3
#define LED2 P1_1 //D4
#define LED3 P1_3 //D5
#define LED4 P1_4 //D6
#define sw1 P1_2
unsigned char h; //
//引脚初始化
void IO_Init()
{
P1SEL &= ~0x1f; //11100000
P1DIR |= 0x1b; //00011011
LED1=LED2=LED3=LED4=0;
}
void InitT1()
{
T1CTL |= 0x01; //定时器1时钟频率1分频,自动重装0x0000-0xFFFF
PERCFG=0x40; //定时器1选择外设位置2
P1SEL|=0x02; //P1_0选择外设功能0x01
T1CCTL1=0x64; //定时器1通道2向上比较,比较模式
T1CC1L=0xff;
T1CC1H=h;
}
void main(void)
{
unsigned char a=1; //a=1为渐亮,a=2为渐灭
IO_Init();
InitT1()
;
while(1)
{
if((T1STAT&0x02)>0)
{
T1STAT=T1STAT&0xfd; //清除中断标志
if(a==1) //渐亮
h=h+1;
else //渐灭
h=h-1;
T1CC1L=0xff; //重装比较值
T1CC1H=h;
if(h>=254) //最大亮度
a=2; //设为渐灭
if(h==0) //最小亮度
a=1; //设为渐亮
}
}
}
