版主
主题
帖子
积分27576
阅读权限200
注册时间2008-11-19
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2017-3-5 00:03
|
显示全部楼层
以下是完整程序,就是网上找的一个rgb调光程序改的。我一楼没有贴全部代码,是怕别人看见那么长就不帮我看了
/******************************************************************
函数功能:利用pwm技术控制RGB全彩灯变色和呼吸的实验
说 明:可以设置全彩灯在1600万色之间进行变化,也可以选择一些特定颜色
进行呼吸,本程序为个人原创,转载请注明出处
设计 者:空心菜
联系 QQ:190719416
日 期:2016/8/5
*******************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define R_ON() PORTB&=~((1<<PB0)|(1<<PB1))
#define R_OFF() PORTB|=(1<<PB0)|(1<<PB1)
#define G_ON() PORTB&=~((1<<PB2)|(1<<PB3))
#define G_OFF() PORTB|=(1<<PB2)|(1<<PB3)
#define Y_ON() PORTB&=~((1<<PB4)|(1<<PB5))
#define Y_OFF() PORTB|=(1<<PB4)|(1<<PB5)
#define B_ON() PORTB&=~((1<<PB6)|(1<<PB7))
#define B_OFF() PORTB|=(1<<PB6)|(1<<PB7)
unsigned int R_ZKB=1,G_ZKB=1,B_ZKB=1;
unsigned int num=100; //num的值最大可设置为255,当设置成255,且在变色模式下能达到1600万色
unsigned char FLAG;
void T1_Normal_Init()
{
OCR1A=120; //12M晶振
TIMSK|=(1<<OCIE1B);//OCIE1A=1;
TCCR1A=0x00;
TCCR1B=0x08; //ctc模式
TCCR1B|=0x01; //分频设置
sei();
}
void main()
{
DDRA=0xff; //打开led总开关
PORTA=0xfb;
DDRB=0xff; //PB设为输出
PORTB=0xff; //上拉电阻
T1_Normal_Init();
while(1)
{
if(FLAG)
{
FLAG=0;
R_ZKB+=1;
if(R_ZKB>=num)
{
R_ZKB=1;
G_ZKB+=1;
if(G_ZKB>=num)
{
G_ZKB=1;
B_ZKB+=1;
if(B_ZKB>=num)
{
B_ZKB=1;
}
}
} //以上为全彩变色模式
}
}
}
/**************************************************************
函数功能:定时器0中断服务函数
说 明:设置定时溢出时间为10us,频率10khz,当进入中断后,为了避免
在程序执行过程中未完又进入下一次中断,先关闭定时器,当此
段程序执行完再打开定时器,并设置一个标志位,给主函数去判断
***************************************************************/
ISR(TIMER1_COMPB_vect)
{
unsigned int count;
for(count=1;count<num;count++) //分辨率为num
{
if(count<R_ZKB)
{
R_ON(); //当红色占空比大于计数值时点亮
}
else R_OFF(); //否则就关闭红色
if(count<G_ZKB)
{
G_ON();
}
else G_OFF();
if(count<B_ZKB)
{
B_ON();
}
else B_OFF();
}
FLAG=1;
}
|
|