学蓝桥Chapter9:PWM调制
PWM是啥
PWM是一种对模拟信号电平进行数字编码的方法。
简单理解为,在给定周期内以波的形式(注:不一定是方波形式)控制高/低电平(1/0)的占空比,从而实现对具体模拟信号(具体如灯的亮度,风扇的转速)的控制
PWM调制思路
- 自己定义一个周期长度T和一个时间单位t,如1μs
T和t之间的关系可以简单理解成一个线性关系T=Kt(K为次数)
- 最后定义时间单位执行n次时为高电平,执行m次时为低电平,但是要保证
(n+m)*t=T
如 :我设定T=100μs
,t=1μs
,所以T=10*t
。我给了n=30
,给了m=70
,因为(30+70)*1=100μs
,所以这个调制是合理的。
通过PWM调制控制灯亮度
要求:按第一次10%的亮度,按第二次50%的亮度,按第三次90%的亮度,按第四次熄灭
#include <reg52.h>
sbit L1=P0^0;
sbit s7=P3^0;
unsigned char count=0;
unsigned char Ttimes;//定义定时周期T内的高电平持续次数
void hc(unsigned int num47){ //HC138译码器选择4或7
switch(num47)
{
case 4:
P2=(P2&0x1f)|0x80;break;
case 7:
P2=(P2&0x1f)|0xc0;break;
}
}
void initT0(){
EA=1;
ET0=1;
TMOD=0x01;
//先不在这里定义TR0
//自己确定定时周期T但先不用在程序中设定该变量,设定时周期T=10000微秒
TH0=(65535-100)/256; //12mhz的晶振下,1个脉冲就是1微秒。这里定时100微秒以作为T的时间单位,那么需要100次才能达到T的时间长度10000微秒
TL0=(65535-100)%256;
}
void timerun() interrupt 1
{
TH0=(65535-100)/256; //非自动重装需要再写一次
TL0=(65535-100)%256;
count++;
if(count==Ttimes){
L1=1;
}
else if(count==100){
L1=0;
count=0;
}
}
void delay(unsigned char i){
while(i--);
}
unsigned char stat=0; //运行状态变换码
void scankeys(){
if(s7==0){
delay(300);
if(s7==0){
switch(stat){
case 0:
L1=0; //拉低初始电平至0v
TR0=1; //启用定时器/计数器T0,进行定时
Ttimes=10; //以100微秒作为时间单位,高电平持续10次,具体表现为10%的亮度
stat=1; //下一次运行状态变换
break;
case 1:
Ttimes=50; //以100微秒作为时间单位,高电平持续50次,具体表现为50%的亮度
stat=2;
break;
case 2:
Ttimes=90; //以100微秒作为时间单位,高电平持续90次,具体表现为90%的亮度
stat=3;
break;
case 3:
L1=1; //拉高电平,与led供电端等电位,关闭led灯
TR0=0; //关闭定时器/计数器T0,关闭计时
stat=0; //当led处于关闭状态,下一次按下后将会开始回到10%的亮度
break;
}
while(s7==0);//松手操作
}
}
}
void main(){
hc(4);
initT0();
while(1){
scankeys();
}
}