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閃爍。后面使占空比改變的頻率大於人眼識別頻率,出現了呼吸燈效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM