占空比
高电平时间与一个周期的比值;
周期信号,通过调整高电平的宽度实现对电压的控制。
练习内容
1、注意:LED是低电平亮,高电平时间占比越多led越暗,所以10%的亮度对应90%的占空比,即一个周期内90%是低电平。
2、10ms=10000us=100us*100;将10000us分成100份,100份为一个周期,每份100us
3、RT0=1;//定时器0可以在要产生脉宽调制时才打开
具体代码
#include "reg52.h"
#include <intrins.h>
sbit L1=P0^0;
sbit s7=P3^0;
unsigned char pwm=0;
void hc573(unsigned char channel)
{
switch(channel)
{
case 4: P2=(P2&0x1f)|0x80;break;
case 5: P2=(P2&0x1f)|0xa0;break;
case 6: P2=(P2&0x1f)|0xc0;break;
case 7: P2=(P2&0x1f)|0xe0;break;
}
}
void delayxms(unsigned int t)//@11.0592MHz
{
while(t--)
{
unsigned char data i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
unsigned char state=0;
void keyscan()
{
if(s7==0)
{
delayxms(10);
if(s7==0)
{
switch(state)
{
case 0:
L1=0;
TR0=1;
state=1;
pwm=90;
break;
case 1:
pwm=50;
state=2;
break;
case 2:
pwm=10;
state=3;
break;
case 3:
L1=1;
TR0=0;
state=0;
break;
}
while(s7==0);
}
}
}
void init_timer0()
{
TMOD=0x01;
TH0=(65535-100)/256;
TL0=(65535-100)%256;
ET0=1;
EA=1;
//RT0=1;//可以在要产生脉宽调制时才打开
}
unsigned char count=0;
void servicetimer0()interrupt 1
{
TH0=(65535-100)/256;
TL0=(65535-100)%256;
count++;
if(count==pwm)//如果等于占空比,将L1置高电平
{
L1=1;
}
else if(count==100)
{
L1=0;//翻转回来,进行下一个周期循环
count=0;
}
}
void main()
{
hc573(4);
L1=1;//先关闭L1,L1默认点亮
init_timer0();
while(1)
{
keyscan();
}
}