PWM控制LED亮度
PS:只是拿了先成的一个板子,带下载口的,拉了8个I/O口出来,接了8个LED灯
线路弄的不好,请大家见谅
编写环境:GCC20080512
使用了一个计数器中断
图片和视频不是很清楚,希望大家谅解
(1)
/*第1,3,5,7个灯半亮,其余的全亮。 */
#include
#include
volatile signed int timecount=0;
volatile signed long timecount2=0;
unsigned int j=0;
const int LED_code[]={160,0,160,0,160,0,160,0};
SIGNAL(SIG_OVERFLOW0)//计数器溢出中断
{
TCNT0=16;
timecount++;
timecount2++;
if(timecount>=320)//PWM周期
{
PORTD|=0xff;//关
timecount=0;
}
for(j=0;j<=7;j++)
{
if(LED_code[j]<=timecount)//读取占空比值
{
PORTD&=~(1<
#include
volatile signed int timecount=0;
volatile signed long timecount2=0;
unsigned int j=0;
const int LED_code[]={280,240,200,160,120,80,40,0};
SIGNAL(SIG_OVERFLOW0)//计数器溢出中断
{
TCNT0=16;
timecount++;
timecount2++;
if(timecount>=320)//PWM周期
{
PORTD|=0xff;
timecount=0;
}
for(j=0;j<=7;j++)//依次比较读取
{
if(LED_code[j]<=timecount)
{
PORTD&=~(1<
#include
volatile signed int timecount=0;
volatile signed long timecount2=0;
volatile unsigned char adddir_FLAG=1;
unsigned int i=0;
SIGNAL(SIG_OVERFLOW0)//计数器溢出中断
{
TCNT0=16;
timecount++;
timecount2++;
if(timecount2>=2000)//每隔60毫秒更新下数组,即改变PWM的占空比
{
if(i<=0){adddir_FLAG=1;}
if(i>=48){adddir_FLAG=0;}
if(adddir_FLAG==1){i++;}
if(adddir_FLAG==0){i--;}
timecount2=0;
}
if(timecount>=48)//PWM的周期
{
PORTD=0x00;//周期初始开
timecount=0;
}
if(timecount>=i)//达到对应调节到的占空比时
{
PORTD=0xff;//关
}
}
int main(void)
{
DDRD =0xff;
PORTD|=0xff;
TCCR0=0x01;
TIMSK=0x01;
cli();
sei(); //使能全局中
while(1)
{
}
}
/*8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。*/
#include
#include
volatile signed int timecount=0;
volatile signed long timecount2=0;
unsigned int i=0;
unsigned int j=0;
unsigned int m=0;
volatile unsigned char adddir_FLAG=1;
volatile int LED_code[]={0,-40,-80,-120,-160,-200,-240,-280};//每个相隔1/8亮度
SIGNAL(SIG_OVERFLOW0)//计数器溢出中断
{
TCNT0=16;
timecount++;
timecount2++;
if(timecount2>=100)//每隔3毫秒更新下数组,即改变PWM的占空比
{
i++;
for(m=0;m<=7;m++)//依次每个数做处理(加或减)
{
if(adddir_FLAG==1)//正方向加
{
LED_code[m]+=1;
}
if(adddir_FLAG==0)//反方向减
{
LED_code[m]-=1;
}
}
if((i>=520)&&(adddir_FLAG==1))//加满520次反向
{
adddir_FLAG=0;
i=1;
}
if((i>=520)&&(adddir_FLAG==0))//减满520次反向
{
adddir_FLAG=1;
i=1;
}
timecount2=0;
}
if(timecount>=240)//PWM的周期
{
PORTD=0x00;//周期开始开
timecount=0;
}
for(j=0;j<=7;j++)//每次读取比较对应的占空比
{
if(LED_code[j]<=0)//当为负数时,作为0处理
{
PORTD|=(1<0)//当大于零时,若相应的计数达到(即达到了占空比),则关
{
if(LED_code[j]<=timecount)
{
PORTD|=(1<
#include
volatile signed int timecount=0;
volatile signed long timecount2=0;
volatile signed long timecount0=0;
volatile signed char state=1;
unsigned int i=0;
unsigned int j=0;
unsigned int m=0;
volatile unsigned char adddir_FLAG=1;
const int LED0_code[]={160,0,160,0,160,0,160,0};
const int LED_code[]={280,240,200,160,120,80,40,0};
volatile int LED1_code[]={0,-40,-80,-120,-160,-200,-240,-280};//每个相隔1/8亮度
SIGNAL(SIG_OVERFLOW0)//计数器溢出中断
{
TCNT0=16;
timecount++;
timecount0++;
timecount2++;
if(timecount0>=99999)//切换状态,并且重新初始化
{
state++;
if(state>=5)
{
state=1;
}
i=0;
j=0;
m=0;
timecount=0;
timecount0=0;
timecount2=0;
adddir_FLAG=1;
for(j=0;j<=7;j++)
{
LED1_code[j]=0-(j*40);
}
}
switch (state)
{
case 1:
if(timecount>=320)//PWM周期
{
PORTD|=0xff;//关
timecount=0;
}
for(j=0;j<=7;j++)
{
if(LED0_code[j]<=timecount)//读取占空比值
{
PORTD&=~(1<=320)//PWM周期
{
PORTD|=0xff;
timecount=0;
}
for(j=0;j<=7;j++)//依次比较读取
{
if(LED_code[j]<=timecount)
{
PORTD&=~(1<=2000)//每隔60毫秒更新下数组,即改变PWM的占空比
{
if(i<=0){adddir_FLAG=1;}
if(i>=48){adddir_FLAG=0;}
if(adddir_FLAG==1){i++;}
if(adddir_FLAG==0){i--;}
timecount2=0;
}
if(timecount>=48)//PWM的周期
{
PORTD=0x00;//周期初始开
timecount=0;
}
if(timecount>=i)//达到对应调节到的占空比时
{
PORTD=0xff;//关
}
break;
case 4:
if(timecount2>=100)//每隔3毫秒更新下数组,即改变PWM的占空比
{
i++;
for(m=0;m<=7;m++)//依次每个数做处理(加或减)
{
if(adddir_FLAG==1)//正方向加
{
LED1_code[m]+=1;
}
if(adddir_FLAG==0)//反方向减
{
LED1_code[m]-=1;
}
}
if((i>=520)&&(adddir_FLAG==1))//加满520次反向
{
adddir_FLAG=0;
i=1;
}
if((i>=520)&&(adddir_FLAG==0))//减满520次反向
{
adddir_FLAG=1;
i=1;
}
timecount2=0;
}
if(timecount>=240)//PWM的周期
{
PORTD=0x00;//周期开始开LED
timecount=0;
}
for(j=0;j<=7;j++)//每次读取比较对应的占空比
{
if(LED1_code[j]<=0)//当为负数时,作为0处理
{
PORTD|=(1<0)//当大于零时,若相应的计数达到(即达到了占空比),则关
{
if(LED1_code[j]<=timecount)
{
PORTD|=(1<
本文档为【PWM控制LED亮度】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。