#include<reg52.h>
sbit led1=P2^0;//呼吸灯
int flg=0;//标志pwm_now的增减
void initT1()//定时器T1初始化
{
EA=1;//打开总中断
ET1=1;//打开定时器T1
TMOD=0X20;//T1方式2,8位重装
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仿真时只能看到闪烁频率的变化,而无法看到很自然的呼吸灯现象。社区里非付费内容的呼吸灯代码大都尝试了,也只能达到闪烁频率的变化的效果,无法达到实际呼吸灯现象(就类似于网上能查到的呼吸灯实物视频)。有点急。