本帖最后由 Sooofia 于 2018-3-31 20:51 編輯
#include "reg52.h" #define uint unsigned int #define uchar unsigned char sbit PWM = P1^1; uchar pluse; //占空比寄存器 void Timer2() interrupt 5 { static uchar time; TF2=0; if(++time==pluse) PWM=0; //達(dá)到脈寬設(shè)定值時(shí),輸出PWM低電平 else if(time==40) //PWM的頻率為1khz左右 { time=0; PWM=1; } } void InitTimer2(void) //初始化函數(shù) { RCAP2H = 0xff //定時(shí)25us初值 RCAP2L = 0x0e7; ET2=1; EA=1; TR2=1; } void main(void) { InitTimer2(); while(1) { pluse=20; } } 把PWM波的周期定為1ms,占空比分40級(jí)可調(diào)(即每級(jí)差2.5%),這樣定時(shí)器T2每25us產(chǎn)生一個(gè)定時(shí)中斷,每40次中斷后進(jìn)入下一個(gè)PWM波的周期。在程序中,pluse=20,即占空比為50%,輸出的平均電壓為12*50%=6V。PWM產(chǎn)生的過程是這樣的,開始時(shí)PWM為1,當(dāng)計(jì)時(shí)到達(dá)pluse時(shí)(即到達(dá)了設(shè)定的脈寬寬度時(shí)間)PWM=0,隨后到達(dá)PWM周期時(shí)間后PWM=1,此時(shí)下一個(gè)PWM周期重新開始。
|