|
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;
- }
- }
复制代码
|
|