通过单片机定时器产生PWM波

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通过单片机定时器产生PWM波

PWM(脉宽调制)在很多场合都用得上,例如LED亮度控制,开关电源输出电圧控制等。这里采用简单的定时器实现PWM波输出,通过更改定时器定时参数,控制IO口输出波形高低电平持续时间,实现PWM波。

代码如下:

#include

#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;

}

}

相关文档
最新文档