cc2530 实现呼吸灯效果(PWM)

方法1:通过for循环简单粗暴的实现呼吸灯

#include <ioCC2530.h>
#define D1 P1_0

void Init_Port()
{
  P1SEL &=~0x01;
  P1DIR |= 0x01; 
  D1 = 0;
}

void delay(unsigned int j)
{
  while(j--);
}

void main()
{
  Init_Port();
  while(1)
  {
    unsigned char i;
    for(i=0; i<100; i++)
    {
      D1 = 1;
      delay(100*i);
      D1 = 0;
      delay(100*(100-i));
    }
    for(i=0; i<100; i++)
    {
      D1 = 1;
      delay(100*(100-i));
      D1 = 0;
      delay(100*i);
    }
  }
}

方法2:简单的PWM

#include <ioCC2530.h>
#define D1 P1_0
#define SW1 P1_2
void Init_Port()
{
  P1SEL &= ~0X03;
  P1DIR |= 0X03;
  P1 &= ~0X03;
}
void delay(int time)
{
  while(time--);
}
void main()
{
  Init_Port();
  int i,j=1000;
  int flag = 1;
  while(1)
  {
    if(flag)
    {
      D1 = 1;``
      delay(i++);
      D1 = 0;
      delay(j--);
      if(j == 0)
        flag = 0;
    }
    else
    {
      D1 = 1;
      delay(i--);
      D1 = 0;
      delay(j++);
      if(i == 0)
        flag = 1;
    }
  }
}

方法三:定时器

#include <ioCC2530.h>
#include <string.h>

#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0	

void InitLed(void)
{
     P1DIR |= 0x01;           
     LED1 = 1;                //默认灭     
}
void InitT1()
{
    CLKCONCMD &= ~0x40;      //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40); //等待晶振为32M
    CLKCONCMD &= ~0x07;      //设置系统主时钟频率为32MHZ   
    CLKCONCMD |= 0x38;       //设置定时器所分频率为250KHZ

    PERCFG |= 0x40;          //选择定时器1映射的IO口位置,选择备用位置2,映射的IO口就是P1_0 
    					
    P2SEL &= ~0x10;          //设置优先级,定时器1优先
    P2DIR |= 0xC0;           //设定第1优先级:定时器1通道2-3

    P1DIR |= 0x01;           //设置P1_0为输出    
    P1SEL |= 0x01;           //P1_0配置为外设功能对应定时器1
     
    T1CC2H = 0x00;           //T1CC2H为T1CC0的高位,T1CC2L为T1CC0的低位
    T1CC2L = 0x00;           //修改T1CC2L可调整占空比,此处的设置决定比较时的值
    T1CC0H = 0x00;           //
    T1CC0L = 0xff; 	     //
    T1CCTL2 = 0x1c;          //设置模式
    T1CTL = 0x02;            //频率250KHz 1分频,运行模式为模模式
}
void Delay_us(uint t)
{
  while(t--)
  {
  asm("NOP"); 
  asm("NOP");
  asm("NOP");
  }
}
void main(void)
{
    InitLed();               
    InitT1();                
    uint a = 0x00;
    uint b = 0x00;
    while(1)
    {
      a++;         //改变通道2的定时值
      Delay_us(10000);
      T1CC2H = b;
      T1CC2L = a;
      if(a == 0xff)
      {
              while(1)
              {
                      a--;//改变通道2设置的定时值
                      Delay_us(10000);
                      T1CC2H = b;
                      T1CC2L = a;
                      if(a == 0)
                              break;
              }
      }
    }
}


方法思路都是通过改变PWM,调节在一个周期内灯的亮灭状态所占的百分比来实现PWM的改变
刚开始改变PWM的频率小于人眼识别图像的频率,变成了LED闪烁。后面使占空比改变的频率大于人眼识别频率,出现了呼吸灯效果

posted @   jollyF  阅读(2617)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示