PWM --用按键控制 LED 的亮度

痛定思痛。 2022-08-20 01:15 385阅读 0赞

以前写过一篇关于 PWM 的博文,已经有一年了,链接如下:

http://hi.baidu.com/do_sermon/item/ff523b0a8b9d3d173b53ee74

文中使用了示波器来显示不同占空比的波形。

其实,利用 LED 也能通过亮度来表现出 PWM 参数的变化,用实物进行测试,效果很好,但是用 PROTEUS 进行仿真试验,却只是看到闪烁的厉害,基本上看不出亮度的变化。

近来发现,加上一个大电容,就可以减弱 LED 的闪烁,亮度就能够稳定一些,这样一来,就可以用 PROTEUS 软件直接观察亮度的变化了。

电路见下图。图中的大电容(C6)的容量是 4700uF,这个是可以随便调整的,实际的电路就不需要它了。

图中的占空比参数是 10,LED(D1) 的显示为“半亮”状态。

PWM --用按键控制 LED 的亮度 - 非著名博主 - 电子信息角落

C 语言的程序,在去年就发表出来了,可见上面的链接,现在略加改动如下:

#include

unsigned char a, b;

sbit K1 = P3^2; //定义两个调整占空比的按键

sbit K2 = P3^3;

//—————————————————————

void delay(unsigned int i)

{

  1. unsigned char j;
  2. while(i--) for(j = 0; j < 60; j++);

}

//—————————————————————

void main()

{

  1. TMOD = 0x01; //T0定时方式1
  2. TH0 = (65536 - 500) / 256; //500us@12MHz
  3. TL0 = (65536 - 500) % 256;
  4. TR0 = 1;
  5. ET0 = 1;
  6. EA = 1;
  7. a = 0;
  8. b = 10;
  9. while(1) \{
  10. if(!K1) \{delay(20); if(!K1) \{b++; if(b > 19) b = 19; while(!K1);\}\}
  11. if(!K2) \{delay(20); if(!K2) \{b--; if(b < 1) b = 1; while(!K2);\}\}
  12. //以上两行是检查按键、延时消抖、修改占空比、等待按键释放,b = 1~19
  13. P0 = ((b / 10) << 4) + b % 10; //显示占空比等级
  14. \}

}

//—————————————————————

void time0() interrupt 1

{

  1. TL0 = (65536 - 493) % 256; //补偿中断进入时间
  2. TH0 = (65536 - 493) / 256; //500us@12MHz
  3. a--; //a = 1~20
  4. if(a == 0) \{a = 20; P2 = 0;\} //周期=20\*500us
  5. if(a <= b) P2 = 255; //输出到示波器
  6. P1 = ~P2; //输出到LED,低电平发光

}

//—————————————————————

这个程序,PWM 的周期比去年的短了一些;去年是应网友的要求,设计成 1s,有些偏长,不太实用。

这次也不用外部中断来输入按键了,改用查询按键的方法。

当使用按键进行占空比调整的时候,LED 可以显示出来不同的亮度。几幅截屏的画面如下:

PWM --用按键控制 LED 的亮度 - 非著名博主 - 电子信息角落

PWM --用按键控制 LED 的亮度 - 非著名博主 - 电子信息角落

当 PWM 参数稍小时,亮度有些不足,这可以适当减小一些限流电阻的阻值进行弥补。

用来显示 PWM 的 LED,其中的电流是间断的,所以,它的限流电阻可以比平常时小一些,100欧左右,是经验数据。

制作实物电路的时候,大电容就不需要了,不用花钱去买了,呵呵

发表评论

表情:
评论列表 (有 0 条评论,385人围观)

还没有评论,来说两句吧...

相关阅读

    相关 按键控制LED

    [打印Hello world][Hello world] 控制LED 实验目的 通过一个按键控制一个发光二极管的亮和灭。按键按一下LED点亮,在按一下LED熄灭