WM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.
对于蓝桥杯来说PWM 信号其实就是一高一低的一系列电平组合在一起。具体方法是给I/O加一个定时器,对于你要求输出的PWM信号频率与你的定时器一致,用定时器中断来计数,但是这种方法一般不采用,除非对于精度、频率等要求不是很高可以这样实现。
下面为例子
pwm频率100hz 周期=0.01s =10ms =10000us=100us*100
通过定时器控制这100个定时过程中高电平个数实现占空比调节
#include <STC15F2K60S2.h>
#define uchar unsigned char;
#define uint unsigned int;
uchar count=0;
uchar flag=0;
uchar tt=0;//定时器计数
uchar pwm_num=0;//pwm占空比
void allinit();//打开控制L1锁存器
void Delay5ms();
void keyscan();
void Timer0Init(void);
void main()
{
allinit();
Timer0Init();
P00=1;
while(1)
{
keyscan();
if(flag==1)
{
flag=0;
switch(count)
{
case 0:
P00=0;//L1亮 共阴极 10%亮度则为低电平时间
EA=1;
ET0=1;
pwm_num=10;
count=1;
break;
case 1:
pwm_num=50;
count=2;
break;
case 2:
pwm_num=90;
count=3;
break;
case 3:
P00=1;
EA=0;
ET0=0;
count=0;
break;
}
}
}
}
void allinit()
{
P2=0X80;
// P0=0XFF;//led
//
// P2=0XC0;
// P0=0XFF;//段选
// P2=0XE0;
// P0=0XFF;//位选数码管
//
// P2=0XA0;
// P0=0X00;//蜂鸣器 继电器
}
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
void keyscan()
{
if(P30==0)
{
Delay5ms();
if(P30==0)
{
flag=1;
}
while(!P30);
}
}
void Timer0Init(void) //100微秒@11.0592MHz pwm频率100hz 周期0.01s 10ms 10000us=100us*100
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xAE; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer0() interrupt 1
{
tt++;
if(tt==pwm_num)
{
P00=1;
}
else if(tt==100)
{
P00=0;
tt=0;
}
}