⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 用PWM方波调节LED亮度
💻 C
字号:
/*******************************************************************************
程序名称:用PWM方波调节LED的亮度
硬件接法:P1.1控制LED,低电平点亮
          K3和K4分别接在P3.4、P3.5,按下时为低电平
运行效果:按K3可调暗LED,按K4可调亮LED
*******************************************************************************/


#include <reg51.h>


//定义I/O接口
sbit PWM = P1^1;		//PWM输出(接LED)
sbit K3 = P2^0;		//按下使PWM方波占空比增加(LED变暗)
sbit K4 = P2^1;		//按下使PWM方波占空比减少(LED变亮)


//定义PWM最大级数
#define PWM_MAX		8


//定义PWM级数,分为0~PWM_MAX-1级
unsigned char PwmValue;


/*******************************************************************************
函数:KeyScan()
功能:键盘扫描
返回:扫描到的键值
*******************************************************************************/
unsigned char KeyScan()
{
	unsigned char k;
	k = '\0';
	if ( K3 == 0 ) k = '+';
	if ( K4 == 0 ) k = '-';
	return k;
}


/*******************************************************************************
函数:T1_INT_SVC()
功能:定时器T1的中断服务函数
*******************************************************************************/
void T1INTSVC() interrupt 3
{
	static unsigned char t = 0;
	TR1 = 0;
	TH1 = 0xFF;
	TL1 = 0x00;
	TR1 = 1;
	t++;
	if ( t >= PWM_MAX ) t = 0;
	if ( t <= PwmValue )
	{
		PWM = 1;
	}
	else
	{
		PWM = 0;
	}
}


/*******************************************************************************
函数:Delay()
功能:延时0.01~2.56s
参数:
	t>0时,延时(t*0.01)s
	t=0时,延时2.56s
说明:
	晶振用11.0592MHz
*******************************************************************************/
void Delay(unsigned char t)
{
	do
	{
		TH0 = 0xDC;
		TL0 = 0x00;
		TR0 = 1;
		while ( !TF0 );
		TR0 = 0;
		TF0 = 0;
	} while ( --t != 0 );
}


/*******************************************************************************
函数:SysInit()
功能:系统初始化
*******************************************************************************/
void SysInit()
{
	TMOD &= 0xF0;
	TMOD |= 0x01;	//设置T0为16位定时器
	TMOD &= 0x0F;
	TMOD |= 0x10;	//设置T1为16位定时器
	PwmValue = PWM_MAX / 2;		//设置PWM初值
	PWM = 1;		//PWM管脚为高
	TH1 = 0xFF;
	TL1 = 0x00;		//定时器T1赋初值
	TR1 = 1;		//启动定时器T1
	ET1 = 1;		//使能T1中断
	EA = 1;			//使能总中断
}


//主函数
void main()
{
	unsigned char k;
	SysInit();
	for (;;)
	{
	//键盘扫描
		for (;;)
		{
			Delay(5);
			k = KeyScan();
			if ( k != '\0' ) break;
		}
	//处理按键
		switch ( k )
		{
		case '+':
			if ( PwmValue < PWM_MAX-1 ) PwmValue++;
			break;
		case '-':
			if ( PwmValue > 0 ) PwmValue--;
			break;
		default:
			break;
		}
	//等待按键抬起
		for (;;)
		{
			Delay(5);
			if ( KeyScan() == '\0' ) break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -