这一届的省赛中首次对PWM波进行了考察,对于PWM波的输出有两种方法,一种是用两个定时器,一种是只用一个定时器。
两个定时器:用定时器T0来控制频率,定时器T1来控制占空比。
T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
一个定时器:用 定时器0来延迟一个波形,代表一个周期,内含正周期与反周期。
题目中往往会告知频率的大小,知道频率就知道了周期,这届赛题中周期是1ms。
占空比:正周期占总周期的多少。
例如:占空比是20%,正周期是0.2ms,反周期是0.8ms。
PWM波的输出在这个板子上是从定时器0的T0口,也就是P34引脚输出的。所以我们设定P34引脚电平的高低,就是设置了PWM波的占空比。
正周期的表示方法:P34=1
反周期的表示方法:P34=0
下面以一个定时器为例:
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xAE; //设置定时初始值
TH0 = 0xFB; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;EA=1;
}
void timer0() interrupt 1//周期为1000微秒
{
tt++;
if(time_dingshi>0)
{
if(mode==0)//睡眠风 正周期:200微秒
{
if(tt<=2){P34=1;} //正周期
else if(tt<=10){tt=0;P34=0;}//反周期
}
else if(mode==1)//自然风 正周期:300微秒
{
if(tt<=3){P34=1;}
else if(tt<=10){tt=0;P34=0;}
}
else if(mode==2)//常风 正周期:700微秒
{
if(tt<=7){P34=1;}
else if(tt<=10){tt=0;P34=0;}
}
}
}