一、原理
PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则,可以通过对改变脉冲的时间宽度,来等效的获得所需要合成的相应幅值和频率的波形。
具体如下图所示:
?由上图可知,脉冲宽度调制使用一个脉冲宽度会被调制的方波,并且波型的平均值会有所变化。
波型的平均值非常明显地直接与占空比?D?有关。图中存在三种占空比状态,25%,50%和75%占空比状态,不难发现,假设占空比为D(是指在一个脉冲循环内,通电时间相对于总时间所占的比例Duty Ratio),则满足:,其中T是PWM的周期,通常和载波的周期相同。
利用PWM控制LED亮度:PWM是脉冲宽度调制信号,其中的“宽度”,即脉冲的高电平的时间。PWM信号调节LED亮度时,信号频率是不变的,改变的是脉冲的高电平的时间,即LED的导通时间。这种信号调节亮度相当于调节LED的平均电流,所以电流会变化。
二、程序编写
利用PWM脉宽信号实现独立按键S7对L1指示灯亮度变化的控制。
具体要求:
1.PWM脉宽信号的频率为100Hz。
2.系统上电后L1指示灯处在熄灭状态。
3.L1指示灯有4种亮度模式,分别是完全熄灭、10%的亮度、50%的亮度和90%的亮度。
4.按下S7按键,循环切换L1指示灯的四种亮度模式。
先将J5的跳线帽接到2和3引脚上
#include <reg52.h>
sbit L1=P0^0;
sbit S7=P3^0;
unsigned char count=0;
unsigned char pwm=0;
void delay(unsigned int t)//延时函数
{
while(t--);
}
void InitT0()//定时器初始化函数
{
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
ET0=1;
EA=1;
}
void serviceT0() interrupt 1//定时器服务函数
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;//每一次中断定时为100μs
count++;
if(count==pwm)
{
L1=1;
}
else if(count==100)
{
L1=0;
count=0;
}
}
unsigned char flag=0;
void key()//按键相关函数
{
if(S7==0)
{
delay(100);//消抖处理
if(S7==0)
{
switch(flag)
{
case 0:L1=0;TR0=1;pwm=10;flag=1;break;
case 1:pwm=50;flag=2;break;
case 2:pwm=90;flag=3;break;
case 3:L1=1;TR0=0;flag=0;break;
}
while(S7==0);//避免误触
}
}
}
void main()
{
P2=0xA0;P0=0x00;P2=0x80;P0=0xff;//关闭外设
P2=0x80;L1=1;
InitT0();
while(1)
{
key();
}
}
|