PWM( 脉宽调制) 在很多场合都用得上,例如LED 亮度控制,开关电源输出电圧控制等。
这里采用简单的定时器实现PWM 波输出,通过更改定时器定时参数,控制IO 口输出
波形高低电平持续时间,实现PWM 波。
代码如下:
这里采用简单的定时器实现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;
}
}
#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;
}
}
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3363/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2010-8-1 14:24
评论列表