#include //程序是基于KEIL-C51編寫,引入8051頭文件sbit P10=P1^0; sbit P11=P1^1;unsigned int scale; //占空比控制變量void main(void) { unsigned int n; //延時循環變量 TMOD=0x02; //定時器0,工作模式2(0000 0010),8位定時 TH0=0x06; //定時250us(12M晶振) TL0=0x06; //預置值 TR0=1; //啟動定時器0 ET0=1; //啟動定時器0中斷 EA=1; //開啟總中斷 while(1) { for(n=0;n<50000;n++); ? ?//延時一段時間 ? ? ? ?scale++; ? ? ? ? ? ? ? ? //占空比控制變量加一 ? ? ? ?if(scale==10) ?scale=0; ?//達到循環的效果 ?} } timer0() interrupt 1 ? ? ? ? ? ? //定時器0中斷程序 { ? ?static ?unsigned int ?tt ; ? //tt用來保存當前時間在一個時鐘周期的位置 ? ?tt++; ? ? ? ? ? ? ? ? ? ? ? ?//每中斷一次,即每經過250us,tt的值自加1 ? ?if(tt==10) ? ? ? ? ? ? ? ? ? //中斷10次定時2.5ms, ? ?{ ? ? ? ?tt=0; ? ? ? ? ? ? ? ? ? ?//使tt=0,開始新的周期,達到循環的效果 ? ? ? ?P10=0; ? ? ? ? ? ? ? ? ? //點亮LED ? ?} ? ?if(scale>=tt) //如果占空比與中斷次數相同時,此時輸出高電平 P10=1; //熄滅LED燈 /* 前面的程序是將占空比設置成了10個等級,scale=1時維持高電平的時間 是1/10個PWM周期(這里是2.5ms),因為scale<=tt的時間段是低電平點亮LED燈的, ? ?scale>=tt的時間是熄滅LED燈的,通過改變一個周期內高低電平維持的時間長短 就可以控制LED燈的亮度或者是電機的轉速了,這就是PWM的工作原理 */}
PWM原理:

對程序稍作修改變為對電機的轉速控制,在proteus8.4仿真如下:

評論