• 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闪烁。后面使占空比改变的频率大于人眼识别频率,出现了呼吸灯效果

  • 相关阅读:
    价值观
    周记 改
    周记
    C语言问卷调查
    icon踩坑记录
    console.log(a)和console.log(window.a)的区别?
    记录一次微信二次分享的优化过程
    在jQuery中使用自定义属性
    10个JS技巧
    日常工作总结 2019/10/10
  • 原文地址:https://www.cnblogs.com/forgetjolly/p/16004393.html
Copyright © 2020-2023  润新知