调光IC自带恒流输出,这样就省事了。
你可以了解一下ws2812,这个会好很多。想过这种程序,但因为没什么卵用就给我忘了。
pwm要挺高频率才行,不然会闪,试过3灯的rgb,原理上差不多,但是直接程序死循环都难受,不是很流畅,你也可以参考一下。。。
#include "reg52.h"
#include "intrins.h"
sbit r=P1^0
sbit g=P1^1
sbit b=P1^2
void Delay200ms()
void play(char rz1,char gz1,char bz1,int t)
void Delay10us()
//占空比从0到100变化
void main(void)
{
while(1)
{char rz=0,gz=0,bz=0
char x=0,y=0,z=0
r=1
g=1
b=1
Delay200ms() //接线验证,rgb依次亮起
r=0
Delay200ms()
r=1
g=0
Delay200ms()
g=1
b=0
Delay200ms()
b=1
Delay200ms()
for(x=5x>=0x--) //彩色连续变化
{rz=100gz=0bz=0
play(rz,gz,bz,1)
for(gz=0gz<=100gz++)
play(rz,gz,bz,1)
for(rz=100rz>=0rz--)
play(rz,gz,bz,1)
for(bz=0bz<=100bz++)
play(rz,gz,bz,1)
for(gz=100gz>=0gz--)
play(rz,gz,bz,1)
for(rz=0rz<=100rz++)
play(rz,gz,bz,1)
for(bz=100bz>=0bz--)
play(rz,gz,bz,1)
}
}
}
//显示色彩程序,pwm,显示某占空比颜色时间t
void play(char rz1,char gz1,char bz1,int t)
{
char i=rz1,j=gz1,k=bz1,yt
for(t=t*4t>=0--t)
{
i=rz1j=gz1k=bz1
for(yt=100yt>=0yt--)
{
if(i>0)
r=0
else
r=1
if(j>0)
g=0
else
g=1
if(k>0)
b=0
else
b=1
--i
--j
--k
Delay10us()
}
}
r=1g=1b=1
}
//延时程序组
void Delay200ms() //@12.000MHz
{
unsigned char i, j, k
_nop_()
_nop_()
i = 10
j = 31
k = 147
do
{
do
{
while (--k)
} while (--j)
} while (--i)
}
void Delay10us() //@12.000MHz
{
unsigned char i
_nop_()
_nop_()
i = 27
while (--i)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)