#include <reg52.h>
sbit LED1 = P1^0;
char num,pwm_count=0,pwm=0,status=0;//status用来判断呼吸方向,0为从暗到亮,1为从亮到暗
void InitTimer0()
{
TMOD = 0X01;//定时器模式1,16位定时使用
TH0 = 64443/256;
TL0 = 64443%256;//65535-(50*1000/1.085),共1ms
EA = 1;
ET0 = 1;//中断允许
}
void TIMER0() interrupt 1//定时器1中断函数
{
TH0 = 64443/256;
TL0 = 64443%256;//65535-(50*1000/1.085),共1ms
pwm_count++;
if(count == 10)
count = 0;//一个周期为进入10次中断的时间
num++;//呼吸灯相关变量
if(status == 0)//暗->亮
{
if(num == 100)//十个周期,100次中断的时间(10ms)改变一次占空比
{
num = 0;
pwm=pwm + 1;
}
}
if(pwm == 10)//当正向占空比为10/10时,改变方向为从亮->暗
{
status = 1;//亮->暗
}
if(status == 1)
{
if(num == 100)
{
num = 0;
pwm--;
}
if (pwm == 0)//再变回status = 0的情况,形成闭环
status = 0;
}
if(pwm_count<=pwm)//占空比,pwm/10
LED1 = 0;
else
LED1 = 1;
}
void main()
{
InitTimer0();
TR0 = 1;
while(1)
{
}
}
此代码有较大优化空间,希望各位支持一下!能帮助到大家,和大家分享便是我学习下去的动力。