原理:调节高低电平的占空比

#include "STC15F2K60S2.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar LED;
void SelectHC573(uchar val) 
{
	switch(val)
	{
		case 4 : P2 = (P2 & 0x1f) | 0x80; break;
		case 5 : P2 = (P2 & 0x1f) | 0xa0; break;
		case 6 : P2 = (P2 & 0x1f) | 0xc0; break;
		case 7 : P2 = (P2 & 0x1f) | 0xe0; break;
		default: P2 = (P2 & 0x1f); break;		
	}
}
void InitSystem()//系统初始化关闭蜂鸣器、继电器、LED
{
	SelectHC573(5);
	P0 = 0xbf;      //由于不同板子的引脚接法不同,此时的初始值也不同
	SelectHC573(4);	
	P0 = 0xff;     //LED全灭
}
void Timer0Init(void)		//100微秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x9C;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA = 1;
}
uint pwmval = 0;   //pwm高低电平时间设置,pwmval越大,led越亮
bit pwmFlag =  0;  //PWM标志位,为0表示led越来越亮,为1表示led越来越暗
uint pwmCount = 0;
void ServiceTimer0() interrupt 1
{
	uchar pushp0,pushp2;
	pushp0 = P0;
	pushp2 = P2;//入栈
	pwmCount++;
	if(pwmCount<=100)       //100*100us=10ms,高低电平时间通过pwmva调节
	{
		if(pwmCount <= pwmval)//低电平时间
			LED = 0x00;					//将led状态暂时存储到变量LED中,避免直接对P0操作
		else 
			LED = 0xff;					//高电平时间
	}
	else
	{
		pwmCount=0;
		if(pwmval==100) 
			pwmFlag=1;     
		if(pwmval==0)
			pwmFlag=0;	
		
		if(pwmFlag==0)
			pwmval=pwmval+1;
		else
			pwmval=pwmval-1;
	}
	P2 = pushp2;//出栈
	P0 = pushp0;
}
void main()
{
	InitSystem();
	Timer0Init();
	while(1)
	{	
		SelectHC573(4);
		P0 = LED;	//此时,打开led的573,再将变量LED状态赋给P0
	}
}

注意点:在蓝桥杯中,若想控制led,最好设置一个8位的变量,将led状态储存到该变量中,否则很可能会因为中断或者其他对P0口的设置状态而影响led状态。