ZigBee入门-CC2530-实验(七)-PWM-定时器-控制LED的亮度代码

PWM:说白了就是连续的时间内高低电平的组合,就是方波嘛~我们使一个GPIO定时器的计时下,一段时间使GPIO输出高电平,一段时间使GPIO输出低电平,我们拿示波器接到对应的GPIO上就可以看到PWM波。
PWM在我们实际应用开发中是很常见,例如:驱动电机的正转、反转;LED的亮度;蜂鸣器的声音高低;PWM控制在工业上更是尤为的重要。
// 本次实验实现:通过定时器比较模式,输出PWM波-改变LED亮度
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char

#define LED1 P1_0      //P1.0口控制LED1

void Init_Led();       //声明初始化LED函数
void Init_Timer1();    //声明定时器T1初始化函数
void Init_Clock();     //声明初始化时钟函数
void Delay(uint ms);   //声明延时函数


/*=======================主程序入口============================*/
void main()            
{

  Init_Led();          //初始化LED灯
  Init_Clock();        //初始化时钟
  Init_Timer1();       //初始化定时T1
  
/********************************************************************
 * 通过依次给T1CC2L赋不同的值,
 * 进而改变PWM的占空比,来控制LED的亮度。
 * 现象:LED由 暗 慢慢 变亮 一直循环。
 *******************************************************************/ 
  
  while(1)
  {
    uchar i;
    uchar array[11]={0xF7,0xE1,0xC8,0xAF,0x96,
                     0x7D,0x64,0x4B,0x32,0x19,0x0A};
                     //占空比依次增大,LED逐渐变亮
   
    for(i = 0; i < 11; i++)
    {
      T1CC2H = 0x00;//高位不变
      T1CC2L = array[i];//依次改变占空比
      Delay(50000);
      Delay(50000);
    }
  }
}
/*=======================声明函数的具体实现==========================*/
void Init_Led()
{
  P1SEL &=~ 0x03;     //配置P1.0 P1.1为通用I/O口
  P1DIR |=  0x03;     //配置P1.0 P1.1为输出
  LED1 = 0;           //初始LED1为熄灭
}

void Init_Timer1()
{
  PERCFG |= 0X40;//选定时器T1的I/O位置  置1:备用位置2
  P2SEL &= ~0X10;//定时器1优先
  P2DIR |= 0XC0; //第1优先级:定时器1通道2-3
  
  P1DIR |= 0XFF; //端口1为输出
  P1SEL |= 0X01; //timer1 通道2映射口P1.0为外设 
  //以上是配置PWM输出在P1_0脚,P1_0接有LED灯
  
  //定时器通道0初值 1ms的周期时钟,频率为976.516Hz
  T1CC0H = 0X00;
  T1CC0L = 0Xff;     //255
  //以上是为了确定基准频率     
  
  //定时器通道2比较值 修改T1CC2L可调整led的亮度
  T1CC2H = 0X00;     
  T1CC2L = 0X7D;     //125 ≈255%2;50%的占空比 
  //以上就是相对与基准频率 改变的占空比
  
  T1CCTL2 = 0x1c;    //通道2比较模式
  T1CTL = 0x02;      //250KHz 不分频
}
void Init_Clock()
{
  CLKCONCMD &= ~0x40;       //系统时钟源选择:外部32MHz 。
  while(!(SLEEPSTA & 0x40));//等待晶振稳定
  CLKCONCMD &= ~0x47;       //128分频 CLKSPD不发分频
  SLEEPCMD |= 0x04;         //关闭不用的RC振荡器
}
void Delay(uint ms)
{
  uint i,j;
  for(i=0; i<ms; i++)
    for(j=0; j<535;j++);
}
如果大家觉得实验中一些寄存器的配置不是很明白,大家就拿出咱们吃饭的家伙CC2530的数据手册来把实验中出现的寄存器在手册中查找,去理解,数据手册网上多的是。

啃骨头,要好好啃,使劲啃,啃到底,才能啃到精髓嘛~~

我会每天更新一篇ZigBee入门-CC2530-的基础实验,让大家学习Zigbee技术不在是从入门到“入土”,而是从入门到巅峰~!!!

欢迎大家的留言和评论我会在看到的第一时间内答复。

看完后感觉得到帮助的小伙伴,要点点赞哦~

给笔者一些动力嘛!谢谢啦~

原创文章 13 获赞 10 访问量 545

猜你喜欢

转载自blog.csdn.net/weixin_45636395/article/details/105868652