本帖最后由 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; //达到脉宽设定值时,输出PWM低电平 else if(time==40) //PWM的频率为1khz左右 { time=0; PWM=1; } } void InitTimer2(void) //初始化函数 { RCAP2H = 0xff //定时25us初值 RCAP2L = 0x0e7; ET2=1; EA=1; TR2=1; } void main(void) { InitTimer2(); while(1) { pluse=20; } } 把PWM波的周期定为1ms,占空比分40级可调(即每级差2.5%),这样定时器T2每25us产生一个定时中断,每40次中断后进入下一个PWM波的周期。在程序中,pluse=20,即占空比为50%,输出的平均电压为12*50%=6V。PWM产生的过程是这样的,开始时PWM为1,当计时到达pluse时(即到达了设定的脉宽宽度时间)PWM=0,随后到达PWM周期时间后PWM=1,此时下一个PWM周期重新开始。
|