Zigbee实现呼吸灯效果

**

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
![请添加图片描述](https://img-blog.csdnimg.cn/a5d8b37dfde3496ab4547998964a4c63.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6IGq5piO55qE6IOc5ZWK,size_18,color_FFFFFF,t_70,g_se,x_16
请添加图片描述

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;        //设为渐亮
     }
  }
}

请添加图片描述


版权声明:本文为weixin_46698809原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。