89C52单片机怎么通过按键产生PWM信号来控制LED灯的不同亮度?

2024-10-27 23:38:01
推荐回答(2个)
回答(1):

用几个变量表示按键的按下/松开状态,然后用定时器中断设置PWM的频率,例如要50hz的频率,那么定时器中断周期(PWM周期的一半)可以设置为10ms,在中断服务程序内根据按键的状态确定是否需要对PWM输出管脚进行翻转。改方法可以输出占空比为50%的PWM信号。

LED是英文 light emitting diode (发光二极管)的缩写,它的基本结构是一块电致发光的半导体材料芯片,用银胶或白胶固化到支架上,然后用银线或金线连接芯片和电路板,然后四周用环氧树脂密封,起到保护内部芯线的作用,最后安装外壳,所以 LED 灯的抗震性能好。运用领域涉及到手机、台灯、家电等日常家电和机械生产方面。

回答(2):

#include
#define uchar unsigned char
#define uint unsigned int
sbit lamp=P2^0;//输出
sbit k1=P3^3;//加键
sbit k2=P3^2;//减键
sbit k3=P3^4;//停止
uchar a=10;

void delay(uint x)//延时函数
{
uchar i;
while(x--)
for(i=0;i<110;i++);
}
void init()
{
TMOD=0X01;//晶振11.0592,定时器定时方式1
TH0=0XFF;//100us定时
TL0=0XA4;
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//开定时器
}

void key()
{
if(!k1)
{
delay(10);
if(!k1)
{
a++;
if(a==99)
a=1;
}
}
// while(!k1);
if(!k2)
{
delay(10);
if(!k2)
{
a--;
if(a==1)
a=99;
}
}
// while(!k2);
if(!k3)
{
delay(10);
if(!k3)
{
TR0=~TR0;//开定时器
}
}
while(!k3);
}
void main()
{

init();
while(1)
{
key();

}
}

void timer0() interrupt 1 using 3
{
uchar count; /*中断次数计数器变量*/
TH0=0xFF; /*恢复定时器初始值*/
TL0=0xA4;
count++;
if (count>=100)
count=0;

if (count<=a) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
lamp=0;
else
lamp=1;

}