單片機(jī)
PWM(脈寬調(diào)制)在很多場合都用得上,例如LED亮度控制,開關(guān)電源輸出電圧控制等。
這里采用簡單的定時器實現(xiàn)PWM波輸出,通過更改定時器定時參數(shù),控制IO口輸出
波形高低電平持續(xù)時間,實現(xiàn)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驅(qū)動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; //單片機(jī)進(jìn)入休眠模式,節(jié)省功耗
}
}
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; //設(shè)置低電平持續(xù)時間,LED2亮
TH0 = PWMH_H;
TL0 = PWMH_L;
}
else
{
LED2 = 1; //設(shè)置高電平持續(xù)時間,LED2滅
TH0 = PWML_H;
TL0 = PWML_L;
}
}