1、PWM控制
PWM控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要的波形。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
其实,在CT107D板子上就是通过调节PWM一个周期内的占空比来控制LED的亮度,通过改变一个周期中的高低电平所占比例,进而控制LED灯亮(强度)。
2、LED控制
在在CT107D板子上,以LED1为例,当P00口为低电平时,LED1亮。当P00口为高电平的时,LED1灭。所以通过PWM控制在一个周期内高低电平的比例,进而控制LED1的发光强度。
另外,在一个周期中,低电平所占比例越大,发光强度越亮。代码中展示了如下图所示亮度变化图:
初始板子上电时,LED1灭,按一次S7调节一次亮度,如上图来回循环。
选择PWM的频率为100hz,即0.01s=10ms=10000us=100us x 100,则定时器可以每次定时100us,总计计数100次为一个PWM周期,故20%的亮度可以选择:
pwm_zhankongbi=20;
40%的亮度可选择:
pwm_zhankongbi=40;
下面给出低电平所占比例与亮度匹配图:
总之在一个周期内,低电平所占比例越大,即亮度越强。
3、代码
#include<stc15f2k60s2.h>
#define uchar unsigned char
uchar pwm_zhankongbi=0;
uchar n;
uchar flag=0;
uchar count=0;
void Time0_init();
void delayms(uchar ms);
void keyscan();
void main(){
Time0_init();
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P00=1;
while(1)
{
keyscan();
if(flag==1)
{
flag=0;
switch(count)
{
case 0:
P00=0;
pwm_zhankongbi=20; //20%的亮度
EA=1;ET0=1;
count=1;
break;
case 1:
P00=0;
pwm_zhankongbi=40; //40%的亮度
count=2;
break;
case 2:
P00=0;
pwm_zhankongbi=60; //60%的亮度
count=3;
break;
case 3:
P00=0;
pwm_zhankongbi=80; //80%的亮度
count=4;
break;
case 4:
P00=1;
count=0;
EA=0;ET0=0;
break;
}
}
}
}
void Time0_init(){
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
}
void Time0_service() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
n++;
if(n==pwm_zhankongbi)
{
P00=1;
}
else if(n==100)
{
P00=0;
n=0;
}
}
void keyscan(){
if(P30==0)
{
delayms(5);
if(P30==0)
{
flag=1;
}
}
while(!P30);
}
void delayms(uchar ms){
uchar k,i,j;
for(k=ms;k>0;k--)
{
i=12;
j=169;
do
{
while(j--);
}
while(i--);
}
}