STC12C5A60S2制作呼吸灯C语言程序怎么写

单片机P2口接LED正极,P0口接LED负极,怎么写呼吸灯程序?用PWM,其它方式也行。

呼吸灯的程序:
/**************************************************************************** 
       功能:LED灯慢慢变暗,再慢慢变亮。
                  用定时器模拟的PWM调制。
单片机:AT89S52                                                   
******************************************************************************/ 
#include <reg52.h> 
#define V_TH0  0XFF              //设定定时器0,高8位的初值              
#define V_TL0  0XF6              //设定定时器0,低8位的初值            
#define V_TMOD 0X01              //设定定时器0的工作方式为:方式1(计数位数是16位                                  //,由TL0作为低8位、TH0作为高8位)
#define uchar unsigned char 
#define uint unsigned int                
void init_sys();                         //系统初始化函数
void delay(uint);                        //延时函数
unsigned char ZKB;                       //占空比

void main (void) 

   init_sys();                            //初始化
   while(1)
   {  
      for(ZKB=5;ZKB<40;ZKB=ZKB+2)         //每调节一次占空比,就延时大概8ms左右,这使得LED现象更明显
           {
                    delay(8); 
            }
      for(ZKB=40;ZKB>5;ZKB=ZKB-2)
           {
                delay(8); 
           }
    
   } 
}
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=100;y>0;y--); 
}
void init_sys()            /*系统初始化函数*/ 

  /*定时器初始化*/ 
  TMOD=V_TMOD;         
  TH0=V_TH0; 
  TL0=V_TL0; 
  TR0=1; 
  ET0=1; 
  EA=1; 
}

void timer0(void) interrupt 1 using 2              

 static uchar click=0;    //中断次数计数器变量
 TH0=V_TH0;               //重新恢复定时器初始值
 TL0=V_TL0; 
 ++click;                       //每计数10次,产生一个中断,并且click增加一个

 if (click>=100)
         click=0;              //计满一百次,这重新计数。
                                         /*因为计一次数的时间是1us,10次产生一个中断,也就是一个中断10us。100个中断为1ms。
                                    则,可以在这100个数中随便取值,用于表示占空比的多少,占空比的范围为(1~100)*/
 
 if (click<=ZKB)          //当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整 
   P1=0x00;                      //P1口接的是LED灯
 else 
   P1=0xff;
}
 
此程序的总中断时间为100ms,即频率为:100KHZ,占空比从5 变为40(即5%~25%)。

温馨提示:答案为网友推荐,仅供参考