CC2530单片机编写呼吸灯,采用定时器T1,自由运行模式

CC2530单片机编写呼吸灯程序,结果是呼吸过程不明显,看到的貌似一直闪烁,查不出原因。


```c
#define D3  P1_0
#define D4  P1_1
#define D5  P1_3
#define D6  P1_4
#define  sw1  P1_2

uint8   pwm_wanttime=0;//多长时间改变一次占空比即PWM的一个周期
uint16  breath_wanttime=0;//占空比改变的速度
uint8   directflag=0;//渐亮还是渐暗判断位
uint8   pwm_value=0;//脉冲中高电平持续时间(占空比)

/******************呼吸灯************************/
void  t1_init()
{
   T1CTL=0x05;//8分频,自由运行模式
    TIMIF|=0x40;
    IRCON=0x00;
    EA=1;
    T1IE=1;
    T1CNTL=(65535-2000)%256;//(8/16M)*1000=1ms定时
    T1CNTH=(65535-2000)/256;
}

#pragma vector=T1_VECTOR
__interrupt void T1(void)
{
  pwm_wanttime++;
  breath_wanttime++;
  if(pwm_wanttime==pwm_value)  
    D3=1;//灯亮
  if(pwm_wanttime==10)
  {
     pwm_wanttime=0;
     D3=0;//灯灭
  }
  
  if((breath_wanttime==200)&&(directflag==0))//每隔200ms变化一次占空比
  {
    breath_wanttime=0;
    pwm_value++;
    if(pwm_value==9)  directflag=1;
  }
  if((breath_wanttime==200)&&(directflag==1))
  {
    breath_wanttime=0;
    pwm_value--;
    if(pwm_value==1)  directflag=0;
  }
}

/********************MAIN************************/
void main(void)
{
   halBoardInit();//选手不得在此函数内添加代码
    ConfigRf_Init();//选手不得在此函数内添加代码
 //端口初始化
    P1SEL&=~(0x1f);
    P1DIR=0x1b;
    P0SEL&=~(0X02);
    P0DIR&=~(0X02);
    D3=D4=D5=D6=0;
    //定时器T1 8分频,自由运行模式
    t1_init();
   while(1)
   {
      ;
   }
}

```

【以下回答由 GPT 生成】

解决方案

为了使呼吸过程更明显,我们可以对呼吸灯程序进行以下优化:

  1. 增加占空比变化的速度:当前代码中,占空比每隔200ms才变化一次,可以缩短这个时间间隔,例如每隔100ms变化一次。修改代码中的breath_wanttime变量的值即可实现:
if((breath_wanttime == 100) && (directflag == 0))  // 每隔100ms变化一次占空比
{
  breath_wanttime = 0;
  pwm_value++;
  if(pwm_value == 9)  directflag = 1;
}
if((breath_wanttime == 100) && (directflag == 1))
{
  breath_wanttime = 0;
  pwm_value--;
  if(pwm_value == 1)  directflag = 0;
}
  1. 调整占空比改变的步进值:当前代码中,占空比每次改变+1或-1,可以增加或减小这个变化步进。修改代码中的pwm_value++pwm_value--的部分即可实现。例如,将增加或减小的步进值改为2:
if((breath_wanttime == 100) && (directflag == 0))  // 每隔100ms变化一次占空比
{
  breath_wanttime = 0;
  pwm_value += 2;  // 增加步进值
  if(pwm_value >= 9)  // 修改条件
  {
    pwm_value = 9;
    directflag = 1;
  }
}
if((breath_wanttime == 100) && (directflag == 1))
{
  breath_wanttime = 0;
  pwm_value -= 2;  // 减小步进值
  if(pwm_value <= 1)  // 修改条件
  {
    pwm_value = 1;
    directflag = 0;
  }
}
  1. 使用硬件定时器提高精度:当前代码中使用的是软件定时器T1,可以考虑使用硬件定时器来提高定时的精度。具体的实现方法取决于硬件支持的定时器模块,可以参考硬件手册或者其他相关文档来了解如何使用硬件定时器。

请注意,以上的优化建议是基于代码的可修改性,并且假设硬件支持必要的功能和资源。如果硬件不支持硬件定时器或者其他相关功能,那么无法进行对应的优化。如果以上的优化方法仍然无法满足您对呼吸灯效果的要求,可能需要考虑其他的方案或者硬件设计来实现更明显的呼吸效果。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^