STC15W4K58S4 PWM波输出实验4 呼吸灯
如果在每个PWM周期中改变翻转点T2的值,就可以改变PWM波的占空比。在输出端口连接电阻和LED灯就可以看到LED的呼吸灯效果。
程序中PWM计数器使用默认值,即系统时钟频率SYSclk,设置PWM周期为3000,起始电平为低电平,翻转点T1为0,翻转点T2的值从1开始不断增加,当到达最大值3000时,再逐渐减小,减小到0后再增加,从而可以平滑地改变占空比,调节输出平均电压,实现LED呼吸灯效果。注意输出端口一定要串联上电阻。
翻转点T2在PWM计数器溢出中断服务程序中修改,PWM计数溢出标志CBIF,每当PWM计数器的值达到设定的周期,例如3000时产生溢出,中断标志置位。在中断服务程序中需软件清除中断标志位。
程序代码
#include "STC15W4K.H"
#define uchar unsigned char
#define uint unsigned int
void PWM_CBIF() interrupt 22
{
static uint idata a=1;
static uint idata b=0;
if(a==1)
{
b++;
if(b==3000)
a=0;
}
if(a==0)
{
b--;
if(b==0)
{ a=1; b++; }
}
P_SW2|=0x80;
PWM2T2=b;
P_SW2&=0x0F;
PWMIF=0;
}
void main()
{
P2M0=0;
P2M1=0; //设置P2端口为准双向弱上拉
//因系统上电后,与PWM有关的端口均为高阻态
//所以,这里要设置为弱上拉状态
P_SW2|=0x80;
PWMCFG=0x00; //配置PWM初始输出为低电平
PWMCKS=0x03; //PWM使用系统时钟
PWMCR=0x01; //PWM通道2输出使能
PWM2CR=0x08; //PWM输出为P2.7
PWMC=3000;
PWM2T1=0; //第一次翻转的PWM计数值
PWM2T2=0; //第二次翻转的PWM计数值
P_SW2&=0x0F;
PWMCR=0xC1; //PWM计数器开始 ECBIF
EA=1;
while(1)
{
;
}
}