通过定时器1,用定时器中断产生PWM,让LED产生呼吸灯效果


#include<reg52.h>
 sbit led1=P2^0;//呼吸灯
 int flg=0;//标志pwm_now的增减
void initT1()//定时器T1初始化
{
    EA=1;//打开总中断
    ET1=1;//打开定时器T1
    TMOD=0X20;//T1方式28位重装
    TH1=TL1=243-100;  //100us
    TR1=1;//开始计数
}
void timer1() interrupt 3
{ static int n=10000;//定义初始占空比
    static int i=1;//定义占空比变化方向
    unsigned int pwm_val=n;//设置初始占空比
    unsigned int pwm_now=1;//设置初值
    TH1=TL1=243-100;  //100us
    led1=(pwm_now<=pwm_val)?0:1;    //判断现值是否小于等于占空比,输出led1端口电平
    if(pwm_now==0||pwm_now==10000)//现值到达端点
    {
        flg=1-flg;//现值增减置换
    }
    if(flg==0)//现值增加
        pwm_now++;
        else//现值减少
        pwm_now--;
         if(pwm_now==0)
         {
         n=n-i;//占空比的增减置换
       }
}
void main()//主函数
{
    initT1();
    while(1);
}

以上代码可作参考,但以上代码明显缺陷是用proteus仿真时只能看到闪烁频率的变化,而无法看到很自然的呼吸灯现象。社区里非付费内容的呼吸灯代码大都尝试了,也只能达到闪烁频率的变化的效果,无法达到实际呼吸灯现象(就类似于网上能查到的呼吸灯实物视频)。有点急。