📄 main.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 + -