PWM --用按键控制 LED 的亮度
以前写过一篇关于 PWM 的博文,已经有一年了,链接如下:
http://hi.baidu.com/do_sermon/item/ff523b0a8b9d3d173b53ee74
文中使用了示波器来显示不同占空比的波形。
其实,利用 LED 也能通过亮度来表现出 PWM 参数的变化,用实物进行测试,效果很好,但是用 PROTEUS 进行仿真试验,却只是看到闪烁的厉害,基本上看不出亮度的变化。
近来发现,加上一个大电容,就可以减弱 LED 的闪烁,亮度就能够稳定一些,这样一来,就可以用 PROTEUS 软件直接观察亮度的变化了。
电路见下图。图中的大电容(C6)的容量是 4700uF,这个是可以随便调整的,实际的电路就不需要它了。
图中的占空比参数是 10,LED(D1) 的显示为“半亮”状态。
C 语言的程序,在去年就发表出来了,可见上面的链接,现在略加改动如下:
#include
unsigned char a, b;
sbit K1 = P3^2; //定义两个调整占空比的按键
sbit K2 = P3^3;
//—————————————————————
void delay(unsigned int i)
{
unsigned char j;
while(i--) for(j = 0; j < 60; j++);
}
//—————————————————————
void main()
{
TMOD = 0x01; //T0定时方式1
TH0 = (65536 - 500) / 256; //500us@12MHz
TL0 = (65536 - 500) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
a = 0;
b = 10;
while(1) \{
if(!K1) \{delay(20); if(!K1) \{b++; if(b > 19) b = 19; while(!K1);\}\}
if(!K2) \{delay(20); if(!K2) \{b--; if(b < 1) b = 1; while(!K2);\}\}
//以上两行是检查按键、延时消抖、修改占空比、等待按键释放,b = 1~19
P0 = ((b / 10) << 4) + b % 10; //显示占空比等级
\}
}
//—————————————————————
void time0() interrupt 1
{
TL0 = (65536 - 493) % 256; //补偿中断进入时间
TH0 = (65536 - 493) / 256; //500us@12MHz
a--; //a = 1~20
if(a == 0) \{a = 20; P2 = 0;\} //周期=20\*500us
if(a <= b) P2 = 255; //输出到示波器
P1 = ~P2; //输出到LED,低电平发光
}
//—————————————————————
这个程序,PWM 的周期比去年的短了一些;去年是应网友的要求,设计成 1s,有些偏长,不太实用。
这次也不用外部中断来输入按键了,改用查询按键的方法。
当使用按键进行占空比调整的时候,LED 可以显示出来不同的亮度。几幅截屏的画面如下:
当 PWM 参数稍小时,亮度有些不足,这可以适当减小一些限流电阻的阻值进行弥补。
用来显示 PWM 的 LED,其中的电流是间断的,所以,它的限流电阻可以比平常时小一些,100欧左右,是经验数据。
制作实物电路的时候,大电容就不需要了,不用花钱去买了,呵呵
还没有评论,来说两句吧...