rgb灯是如何由单片机控制的(51单片机rgb灯珠程序)
光立方教程虽然说街道已经腐烂了,但是成就感还不错。每个人做的事情都有不同。这个没那么难。考验是耐力。我个人推荐能做的事就玩。基于单片机爱好者对单片机学习的热情,光立方是学习单片机非常好的练习材料,以8*8*8光立方为例,这是512个发光二极管像立方体那样构建并焊接的,有层共阴束共阳和层共阳束共阴两个方案,各层8*8个发光二极管,共8层通过c语言编译单片机程序来实现自定义动画效果。你的思考范围有多宽,光立方的动画有多大。大家光立方制作的,是为了随意控制所有的珠子,实现自己思考的优秀动画。那么,从光立方的原理开始吧。说原理的话,头会痛吧。
光立方系统框图
单LED控制方式
首先,为了理解单个LED的控制方式,可以将正极连接到电源上,通过一个限流电阻将负极连接到单片机的某个IO端口上。IO端口输出低时,LED亮灯,反之LED熄灯。
单LED控制模拟原理图
如果想驱动任意位置的LED,则可以将用于该位置的LED的列线接地,并将行线连接到+V。学习了单机的朋友们知道电子管是怎么点亮的。其中,通过扫描,所有的数字管都能正常工作,并且可以显示我们想要的数字。
点矩阵也同样,尽管是8*8的点矩阵,如果能让整体随意显示图案,就需要通过扫描来实现。不那样做的话,就无法实现正确的控制。所谓扫描,就是一次只点亮一列或纵向的灯。每次只能这样,八次是一个周期,从左到右依次订购一次,那么循环,我们看到的是完整的图像。
8*8点矩阵模拟原理图
8*8点矩阵-部分组件
各层LED的控制方式
在单LED的控制方式中,各LED需要占有一个单片机的IO端口,为了控制100个LED需要100个IO端口。那么,有没有可以用较少的IO端口控制更多LED的方法呢?答案是肯定的,这个方法是扫描驱动电路。
因此,一般来说,光立方的各层有64个灯,但分别与64个灯连接线,能够一次控制64个灯,通常单片机的销很少,一般采用74hc573、74hc595等芯片进行扩展。
光立方74hc573芯片的扩展模拟原理图
8*8*8光立方仿真原理图
8*8*8光立方LED的控制方式
首先必须准备工具、材料、理论图。
所需工具:
喷嘴钳子、
电络铁、
放大镜
材料列表:
发光二极管(2*3*4led灯512个)
限流电阻(64个500欧姆电阻限制每束的电流)
洞洞板(20cm*20cm),
单芯片机最小系统stc12c5aRD+芯片)
锁存器(8个74hc573
8路NPN达林顿管(1个uln2803),
ic插座(40个孔9个)、
焊田2卷,导线若干。
数据被并列输入74hc573,控制器存储这些数据,实现1层64个灯的同时点亮。以下,说明一个固定画面的显示、必要的硬件执行的过程。
1)将第1层64点的数据传送到8个74hc573,控制uln2803层控制芯片导通第1层开关,点亮第1层,此时其他层熄灭。
2)等待时间t。
3)熄灭第1层,开始向74hc573传送第2层的数据,锁存,开启第2层总控制开关,点亮第2层。
4)等待时间t。
熄灭第一层,将第八层的数据传送至所有74hc573,锁存,开启第八层的总开关,点亮第八层。
再回到第一步,继续循环。。
4*4*4RGB光立方8*8*8R光立方
由此,实现了一个周期的画面显示,因为人的眼睛的视觉暂时残留的特性,所以只要刷新得很快,我们看到的是光立方整体都很明亮。为了实现我们所期望的效果使画面稳定,上间隔点灯t必须一致。否则会发生亮度不均。
在实际使用上述电路的情况下,如果分别在74hc573输出的64针上一个一个地加上限流电阻,则在二极管保护作用、整体消耗功率的限制、亮度的调整上优异。
8*8*8光立方
8*8*8光立方调试
8*8*8光立方点亮效果图
8*8*8光立方平面图
8*8*8光立方显示效果图
8*8*8动画效果图
4*4*4 RGB光立方
RGB光立方是全色光立方,能够显示全色rgb是全色LED焊接。RGB LED除了将红、绿、蓝三色混合后以三原色共同交叉成像之外,也有在蓝色LED中配合黄色荧光粉,在紫外线LED中配合rgb荧光体的灯。有些LED背光板的颜色特别鲜明鲜明,甚至高画质的电视也在一定程度上,这种情况正是rgb的特色,红标榜红、绿、蓝标榜蓝的特性,在光的混合上,更具多元性的特性。
rgb全色LED灯尺寸销图
4*4*4RGB光立方仿真原理图
4*4*4RGB光立方有64个rgb的全彩色LED,控制有192个I/O,使用6个锁存器、限流电阻、上拉电阻若干、单片机最小系统stc12c5a等部件。
4*4*4RGB光立方基板走线
4*4*4RGB光立方测试
4*4*4RGB光立方调试图
4*4*4RGB光立方演示
4*4*4RGB光立方效果图
4*4*4RGB光立方动画图
4*4*4RGB光立方绿色调试
4*4*4RGB光立方混色调试
最后附上酱汁。
#includelt;stc12c5a.hgt;
#include lt;intrins.hgt;
#define uint unsigned int
#define uchar unsigned char
uchar u=1;
sbit keyout=P4^4;
uint code tab_water={
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0140,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0140,0x0220,0x0140,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x01c0,0x0220,0x0410,0x0410,0x0410,0x0220,0x01c0,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x03e0,0x0410,0x0808,0x0808,0x0808,0x0808,0x0808,0x0410,0x03e0,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x07f0,0x0808,0x1004,0x1004,0x1004,0x1004,0x1004,0x1004,0x1004,0x0808,0x07f0,0x0000,0x0000,0x0000,
0x0000,0x0ff8,0x1004,0x2002,0x2002,0x2002,0x2002,0x2002,0x2002,0x2002,0x2002,0x2002,0x1004,0x0ff8,0x0000,0x0000,
0x1ffc,0x2002,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x4001,0x2002,0x1ffc,0x0000
};
char code tab00={7,7,7,7,7,7,7,7,6,5,4,3,2,1,0,0,0,0,0,0,0,0,1,2,3,4,5,6,//28
8+6,8+6,8+6,8+6,8+6,8+6,8+5,8+4,8+3,8+2,8+1,8+1,8+1,8+1,8+1,8+1,8+2,8+3,8+4,8+5,//20
16+5,16+5,16+5,16+5,16+4,16+3,16+2,16+2,16+2,16+2,16+3,16+4,//12
24+4,24+4,24+3,24+3,//24+4
32+4,32+4,32+3,32+3,
40+5,40+5,40+5,40+5,40+4,40+3,40+2,40+2,40+2,40+2,40+3,40+4,//12
48+6,48+6,48+6,48+6,48+6,48+6,48+5,48+4,48+3,48+2,48+1,48+1,48+1,48+1,48+1,48+1,48+2,48+3,48+4,48+5,//20
56+7,56+7,56+7,56+7,56+7,56+7,56+7,56+7,56+6,56+5,56+4,56+3,56+2,56+1,56+0,56+0,56+0,56+0,56+0,56+0,56+0,56+0,56+1,56+2,56+3,56+4,56+5,56+6//28
};
char code tab10={56+7,56+7,56+7,56+7,56+7,56+7,56+7,56+7,56+6,56+5,56+4,56+3,56+2,56+1,56+0,56+0,56+0,56+0,56+0,56+0,56+0,56+0,56+1,56+2,56+3,56+4,56+5,56+6,//56+28
…………………。
太多的愿望!不粘贴的尝试!如果有必要的话。。。
来源头部
来源中间
来源尾部