原创 LED POV原理浅说(转)

2008-8-30 21:26 9111 4 4 分类: MCU/ 嵌入式

文章发表于:2008-02-12 02:19



如果你在网上用google搜索“POV led”一词,你会找到世界各地的各种LED 旋转屏的制作介绍。那些摇晃出的空中图案,漂浮在车轮上的动画,以及形态各异的时钟,一定给你留下深刻印象。看到这些千奇百怪、创意无限的电子作品,除了羡慕、敬佩、感叹外,你是否想过自己亲自动手也做一个,做一个属于你自己的LED旋转屏呢?其实,无论你看到的LED旋转屏如何神奇,如何复杂,其原理都一样,也很简单,说白了就是一个晃动的流水灯。


51单片机最简系统的其中的一个端口P0接上8LED,就是一个典型的流水灯实验电路。由于没有几个元件,说干就干,把所有元件焊在万能板上,不需花费多长时间,就可完成整个制作。




点击看大图


下面是随便找一个流水灯的C51程序


#include


             


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


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


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显示并不难。

=========================================


我也来做摇摇棒2008-6-29 16:34:00


单片机用MC9S08QG4。因为只有16pin,所以只装了11个LED。显示字母数字绰绰有余了,汉字估计差点儿。因为要测量摇动的周期,自制了一个简易传感器。程序用C写,可以根据摇动的快慢调整显示频率,保证了显示效果。
ps: 调了半天快门速度才照成这张相片热烈的笑脸

可以用PC编辑下载图案。因为有11个LED,所以目前做成可存储11幅图案,通过一个按键切换显示图案。用VB6写串口下载程序。人家都.net了,要抓紧学习了!CtrlC~CtrlV……往窗体上放了N个button!扫雷游戏是不是也这么做的?眨眼

用Flash模拟EEPROM存储下载的图案。 本来以为对芯片已经相当了解,最初的实验失败了,于是跑到网上求助,原来擦写Flash的routine要从RAM里执行。这么重要的事怎么不写到databook上!用C做这种事还真麻烦。经过一番周折,总算把串口下载弄好了。

没有设电源开关,一段时间不摇动就进入低功耗状态。经实验,低功耗状态下的电流小到万用表测不出来,应该不大于1uA。按按钮唤醒。有红色LED和蓝色LED的版本。觉得还是红的好看,还便宜。外壳还是没着落,难道就这样裸奔?有没有内径~16mm的透明塑料管?









mailbert抱歉,现在可以看到图片了吧。传感器用一小段铜管套在一根弯针上,另一头用一根直针挡住。弯针和直针分别接单片机的管脚和地。摇动时铜管在弯针上来回滑动,碰到一端的直针,就把单片机的一个管脚接地,产生一个中断。

文章评论0条评论)

登录后参与讨论
相关推荐阅读
hithyy 2009-03-18 12:37
汇编语言集成编辑调试环境--MasmEditor
MasmEditor是我制作的一款汇编语言集成编辑调试环境。除了具有关键字着色的编辑环境外,可以通过外部集成的方式在界面中编译、连接、调试可执行文件,更重要的是对于8086/8088指令系统可以进行源...
hithyy 2008-10-11 00:01
我的51单片机的实验板及USB下载器
图片如下   (AT89S52板子照片-JPG) 单片机的引脚引出,通过导线与外设连接,这样比较灵活,便于扩展。 目前已经使用了2年多了,用这个板子做了不少事情,如128*32的led点阵显示屏的驱动...
hithyy 2008-09-12 20:13
AVR芯片的ISP全攻略
AVR芯片的ISP全攻略 并行编程,最早的编程方法,功能最强大,但需要连接较多的引脚,通常需要12V~24V的高压,以示区别,下面称为 高压并行编程。  ISP(In System Programma...
hithyy 2008-09-07 19:27
AVRUSB技术探讨(转)
AVRUSB技术探讨(转)作者:邵子扬、王育强、吕益光 本文引用地址:http://lionwq.spaces.eepw.com.cn/articles/trackback/item/16695  摘...
广告
我要评论
0
4
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /5 下一条