旋转LED显示
项目说明:
这是09年初参加学院科技创新比赛的项目,我们小组给它取了个名字,叫做“旋转LED显示器”,老外们大概将它叫做“LED POV”,实现起来比较简单,是单片机初学者入门很好的学习对象。
先上视频(由于录制问题,显示画面闪烁严重,将就着看吧):
YouTube,优酷上面有很多相关视频,个人感觉YouTube上面的项目无论是效果还是创意都更好(题外话,真怀念YouTube被和谐前,看视频时刚一打开就直接缓冲到底的速度呀)。
原理简介:人的眼睛存在视觉暂留现象, 旋转LED显示器能够很好地利用人眼的视觉暂留特性,当一排LED灯旋转时,通过控制LED灯的闪烁时间和频率,就可呈现一幅完整的画面,如显示字符、图片等,与LED点阵的显示有几分相仿。
实现方法:利用高速旋转电机,带动一排LED灯旋转,当其达到稳定后,就类似于LED点阵显示器。此时,使用单片机作为控制器,在不同的时间控制不同的LED灯的亮灭,由于人的眼睛存在视觉暂留现象,便能够出现预先做好的画面。

装置底部是从电子市场买的散热风扇,把显示部分的电路和电源直接用热熔胶固定在风扇扇叶上(为了风扇旋转起来平衡,我还估摸着在差不多的地方粘了块橡皮,= =|||)
看这个装置的样子是挺土的,不过也有创新改进的地方,看下图,

这是一个中断触发装置,用来解决什么问题呢?如果你做了类似的装置就会有所了解,底部的风扇每转一至两圈,16个LED小灯就得把要显示的字用闪烁的方式显示一遍,而第一遍和第二遍显示的位置很难固定,因为风扇旋转不稳定。大家看相关的制作也能发现这个问题,显示的图像无法固定在一个位置上。在某天晚上,我突发奇想,就添加了这么个东西,每旋转一圈,中断触发装置就触发一次中断,执行相应的显示动作,能够保证显示图像固定在一个位置上。
如果你也想做这个很好玩的装置,可以参考以下几篇文章,我也是在借鉴了这些东西之后做的。
LED旋转屏原理浅说(POV led)
LED摇摇棒的升级版本-32只LED摇摇棒
![]()
如果你在网上用google搜索“POV led”一词(POV即persistancd of vision),会找到世界各地的各种LED 旋转屏的制作介绍。那些摇晃出的空中图案,漂浮在车轮上的动画,以及形态各异的时钟,一定给你留下深刻印象。看到这些千奇百怪、创意无限的电子作品,除了羡慕、敬佩、感叹外,你是否想过自己亲自动手也做一个,做一个属于你自己的LED旋转屏呢?其实,无论你看到的LED旋转屏如何神奇,如何复杂,其原理都一样,也很简单,说白了就是一个晃动的流水灯。
在51单片机最简系统的其中的一个端口P0接上8个LED,就是一个典型的流水灯实验电路。由于没有几个元件,说干就干,把所有元件焊在万能板上,不需花费多长时间,就可完成整个制作。
下面是随便找一个流水灯的C51程序
#include <reg51.h>
void main(void)
{
unsigned int i,ch;
ch=0x01;
while(1)
{
for(i=500;i>0;i--);
if(ch==0x00) ch=0x01; else ch=ch<<1;
P0=~ch;
}
}
将这程序编译下载到系统的单片机上,待LED灯光开始正常开跑后,我们拿着它在手上来回晃动,你发现这光已经不是一条竖直线了,它已经变成了一条条斜线。你可以适当修改程序中的延时,让这一连串的斜线更漂亮些(宽和高基本一致),怎么样,我们的最简LED旋转屏就这样做成了。
高兴之余,发现这与我们的目标好象还有点遥远,我们并不需要这些斜线,怎样才能做出网上的那些大虾那样显示的各种各样的文字图案呢?接下来,我们还得想其它办法,换一下思路,将需要的图案数据一串存在数组中,运行时又将数据一串串读出来,驱动LED,这样就能看到我们想看到的图案了。
这是用此思路编的流水灯C51程序
#include <reg51.h>
code unsigned char led[]={0x01,0x02, 0x04,0x08,0x10,0x20,0x40,0x80};
void main(void)
{
unsigned int i,j;
while(1)
{
for(j=0;j<8;j++){
P0=~led[j];
for(i=3000;i>0;i--);
}
}
}
运行看一下, 结果与我们的第一个程序效果是一样的,但这个程序的优势在于我们可以按我们的要求,改变数组中的数据来驱动端口上的LED,达到我们预期的显示效果。这可以说是流水灯的万能程序。这样我们迈出了第一步。
再来看如何产生需要的图案。
现在我们让LED显示数字12为例,我们先作一个表。
0 1 0 0 1 1 1 1 低四位
1 1 0 0 1 0 0 1
0 1 0 0 0 0 0 1
0 1 0 0 0 0 1 0
0 1 0 0 0 1 0 0 高四位
0 1 0 0 1 0 0 0
0 1 0 0 1 0 0 0
1 1 1 0 1 1 1 1从下到上将每列看成是一个16进制数,我得到8个16进制数
10000010=0x82
11111111=0xff
10000000=0x80
00000000=0x00
11100011=0xe3
10010001=0x91
10001001=0x89
10000111=0x87
这样我们得到了我们想要的一组扫描码{0x82,0xff,0x80,0x00,0xe3,0x91,0x89,0x87}
将前一程序的数组数据改成我们得到的扫描码,我们得到新的C51程序
#include <reg51.h>
code unsigned char led[]={0x82,0xff,0x80,0x00,0xe3,0x91,0x89,0x87};
void main(void)
{
unsigned int i,j;
while(1)
{
for(j=0;j<8;j++){
P0=~led[j];
for(i=600;i>0;i--);
}
for(i=8000;i>0;i--);
for(i=8000;i>0;i--);
}
}
编译下载后,将运行进的电路板来回晃晃看……,哈,“12”已隐约出现在眼前。
![]()
哈哈,是不是成功离我们已经不远了。
最后是发挥部分。接着要做的事就是解决如何让这些LED运动,如何检测运行时的开始和结束,如何给运动着的系统供电,如何控制运动着的系统….等等。不同的解决方案造就各具特色的LED旋转屏。
用上面的办法对一些简单图案还能行,当遇到LED个数多或图文复杂时,用这样直接取码的工作量就会很大,这就需要专门软件,根据显示的字符和图案自动生成扫描码。好在网上有不少这类软件可免费下载,免去了手工取码之苦。
临渊羡鱼,不如退而结网,动手做一个真正属于自己的旋转LED显示并不难。




不错不错嘛~~加油好好干哈~~
2010-02-22 01:03
额额,,,我想问问。。这个风扇的转速大概是多少?3500-4500转的???
2010-03-12 12:52@duoduolo 没有,这个风扇我记得是在电子市场买的,额定电压好像是12V,我最后只是用5V来供电,速度上慢了很多
2010-03-12 18:41啦啦啦
2010-06-03 16:43