PWM(脉宽调制)在很多场合都用得上,例如LED亮度控制,开关电源输出电圧控制等。
这里采用简单的定时器实现PWM波输出,通过更改定时器定时参数,控制IO口输出
波形高低电平持续时间,实现PWM波。
代码如下:
#include<reg52.h> 
 
#define T0_INTERRUPT 1  //T0中断向量号
#define PWMH_L 0x9C 
#define PWMH_H 0xFF   //PWM低电平时间0.1ms 
 
#define PWML_L 0xCE 
#define PWML_H 0xFF    //PWM高电平时间0.05ms  
 
sbit LED1 = P1^0;   //常亮LED,作为对比,仿真看不出效果
sbit LED2 = P1^1;    //PWM驱动LED 
 
 
 
typedef unsigned char uchar; 
typedef unsigned int uint; 
 
void Init_T0(); 
 
void main() 
{ 
    LED1 = 0;      //点亮LED1 
    LED2 = 1;      //熄灭LED2 
    Init_T0();    //初始化定时器0 
    while(1) 
    { 
        PCON |= 0x01; //单片机进入休眠模式,节省功耗
    } 
} 
 
void Init_T0() 
{ 
    TMOD &= 0xF0; 
    TMOD |= 0x01;  //16位定时器模式
     
    TH0 = PWML_H; 
    TL0 = PWML_L; 
     
    EA = 1;       //开全局中断
    ET0 = 1;      //允许T0中断
    TR0 = 1;      //启动定时器
} 
 
void T0_Interrupt() interrupt T0_INTERRUPT 
{ 
    TF0 = 0; 
    if(LED2 == 1) 
    { 
        LED2 = 0;        //设置低电平持续时间,LED2亮
        TH0 = PWMH_H; 
        TL0 = PWMH_L; 
    } 
    else 
    { 
        LED2 = 1;        //设置高电平持续时间,LED2灭         
        TH0 = PWML_H; 
        TL0 = PWML_L; 
    } 
}  |   
     
  
 |