http://hi.baidu.com/52_diy/blog/item/d8310dfac0a97716a8d3114b.html

 

POV即persistancd of vision 利用单片机控制流水灯,通过流水灯移动以及人的视觉暂留效应产生各种图形或文字。效果如下图:

【转帖】POV LED基于51单片机的旋转LED电子钟

 

【转帖】POV LED基于51单片机的旋转LED电子钟

 

【转帖】POV LED基于51单片机的旋转LED电子钟

 

【转帖】POV LED基于51单片机的旋转LED电子钟
【转帖】POV LED基于51单片机的旋转LED电子钟这张可以窥探其原理.

 

原理比较简单,使用单片机很容易实现,转帖旋转LED电子钟制作详细过程。

关于作者提出的两个难点,个人观点,供电科采用电机单独供电,单片机供电加装在旋转的电路板上。改进电路,使用电子钟芯片,加装备用电池,加装备用电池后也可以很容易解决调时问题。本人打算在次基础上改进一下进行制作,另作者提供的源程序没有任何注释,对与我们新手很不方便,随后我将在电路改进后写出有详细注释的程序,以方便更多人制作,敬请期待。

以下内容转自“艺新工作室

【转帖】POV LED基于51单片机的旋转LED电子钟
   
  在网上看到不少老外做的各种旋转LED显示屏,非常COOL,我也动手用洞洞板试做了一个类似的显示屏,结果感觉还不错。于是再接再励继续努力,将作品进一步改进,完善后制成如今这个样子。
  由于刚学51单片机,加上制作电路板软件也是从零开始,的确花了我不少的时间和精力。不过也就是在这艰难的独立制作中,真正学到了不少实在的东西。
  本项目的关键是如何解决高速旋转的电路板如何供电,如何调时的问题。我采用电机电刷的原理,将旋转轴钻空,通过一只插头将电源的从反面引到前面的电路板上,而这个旋转的插头又与固定在背板上的两个铜片接触的。调时的问题有些困难,一是让电路板在旋转前与PC机相接,由电脑传送调时数据,这虽然可行但不方便。还有就是用遥控方法,但此方案在调试方面有很大的困难。
  显示方式上,我采用平衡式的两排LED,这除了在旋转时能较好的保持平衡外,主要能利用两边交替显示方式,比单排要快一倍。
  本装置不仅是一个时钟,它还可以动态显示汉字及图案,这就看如何发挥了。
  其具体制作过程如下:
  一。旋转电机的制作
  从制作成本与方便考虑,选用旧电脑用的大软驱上的直流无刷电机,只是对局部进行改造。
          
【转帖】POV LED基于51单片机的旋转LED电子钟
就是这种古董软驱
  
【转帖】POV LED基于51单片机的旋转LED电子钟
软驱上的直流无刷电机
     
【转帖】POV LED基于51单片机的旋转LED电子钟
拆开后的电机
              
   仔细拆开直流电机,将带圆盘的铝轴从中开孔,让它刚好能插入一个插头。       
【转帖】POV LED基于51单片机的旋转LED电子钟
将旋转轴加工成这样
  
【转帖】POV LED基于51单片机的旋转LED电子钟
装配好以后
           
按拆开时的顺序,反序将轴安装直流电机上。
【转帖】POV LED基于51单片机的旋转LED电子钟
电机装配完成后
  
用两片铜片做的电刷
【转帖】POV LED基于51单片机的旋转LED电子钟
【转帖】POV LED基于51单片机的旋转LED电子钟
电刷装好后的侧面图
  
将电路板上较突出的元件改焊在反面,
【转帖】POV LED基于51单片机的旋转LED电子钟
  
电机的电源接法。
  
【转帖】POV LED基于51单片机的旋转LED电子钟
从电路板标注的符号看,“+”为电源正,“G”为电源负,
“C”与“M”端分别与电源正相连匀可使电机运转
      
将一张旧唱片按电机座的位置开孔,而定位用的挡光板应根据电路板上感光组件的位置确定。
  
【转帖】POV LED基于51单片机的旋转LED电子钟
      
二。电路板的制作
  本制作品用51单片机控制,具体电原理图如下:
      
【转帖】POV LED基于51单片机的旋转LED电子钟
         
         
【转帖】POV LED基于51单片机的旋转LED电子钟
用Protel 99设计制作了电路板。
     
【转帖】POV LED基于51单片机的旋转LED电子钟
【转帖】POV LED基于51单片机的旋转LED电子钟
【转帖】POV LED基于51单片机的旋转LED电子钟
    
最后得到完成的作品。
      
【转帖】POV LED基于51单片机的旋转LED电子钟
  
          
遥控器用的是松下车载机的,只用了其中的六个键。
   
【转帖】POV LED基于51单片机的旋转LED电子钟
       
三。软件编程

  因学的是C51(不懂汇编)这里只提供C语言源程序。

#include <reg51.h>

sbit gate11=P3^0;
sbit gate12=P3^1;

unsigned char BUFFER[]={0,0,0,0,1,1,7};
unsigned char M[]={31,28,31,30,31,30,31,31,30,31,30,31};

unsigned char maxnum[]={59,23,31,12,99};
unsigned char minnum[]={0,0,1,1,0};

unsigned char yy[34];

unsigned char code NUM1[] =         
{

0x80,0x7F,0xC0,0xFF,0x40,0x90,0x40,0x8C, // -0-
0x40,0x82,0xC0,0xFF,0x80,0x7F,0x00,0x00,

0x00,0x00,0x00,0x81,0x80,0x81,0xC0,0xFF, // -1-
0xC0,0xFF,0x00,0x80,0x00,0x80,0x00,0x00,

0x80,0xE0,0xC0,0xF0,0x40,0x98,0x40,0x8C, // -2-
0x40,0x86,0xC0,0xC3,0x80,0xC1,0x00,0x00,

0x80,0x40,0xC0,0xC0,0x40,0x84,0x40,0x84, // -3-
0x40,0x84,0xC0,0xFF,0x80,0x7B,0x00,0x00,

0x00,0x0C,0x00,0x0E,0x00,0x0B,0x80,0x89, // -4-
0xC0,0xFF,0xC0,0xFF,0x00,0x88,0x00,0x00,

0xC0,0x47,0xC0,0xC7,0x40,0x84,0x40,0x84, // -5-
0x40,0x8C,0x40,0xFC,0x40,0x78,0x00,0x00,

0x00,0x7F,0x80,0xFF,0xC0,0x84,0x40,0x84, // -6-
0x40,0x84,0x00,0xFC,0x00,0x78,0x00,0x00,

0xC0,0x00,0xC0,0x00,0x40,0xF0,0x40,0xF8, // -7-
0x40,0x0C,0xC0,0x07,0xC0,0x03,0x00,0x00,

0x80,0x7B,0xC0,0xFF,0x40,0x84,0x40,0x84, // -8-
0x40,0x84,0xC0,0xFF,0x80,0x7B,0x00,0x00,

0x80,0x03,0xC0,0x87,0x40,0x84,0x40,0x84, // -9-
0x40,0xC4,0xC0,0x7F,0x80,0x3F,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63, // -:-
0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,
};

unsigned char code NUM2[]=
{
    0x00,0x00,0x7f,0x80,0xff,0xc0,0x82,0x40, // -0-
    0x8c,0x40,0x90,0x40,0xff,0xc0,0x7f,0x80,

    0x00,0x00,0x00,0x00,0x20,0x40,0x60,0x40, // -1-
    0xff,0xc0,0xff,0xc0,0x00,0x40,0x00,0x40,

    0x00,0x00,0x41,0xc0,0xc3,0xc0,0x86,0x40, // -2-
    0x8c,0x40,0x98,0x40,0xf0,0xc0,0x60,0xc0,

    0x00,0x00,0x40,0x80,0xc0,0xc0,0x88,0x40, // -3-
    0x88,0x40,0x88,0x40,0xff,0xc0,0x77,0x80,

    0x00,0x00,0x0c,0x00,0x1c,0x00,0x34,0x00, // -4-
    0x64,0x40,0xff,0xc0,0xff,0xc0,0x04,0x40,

    0x00,0x00,0xf8,0x80,0xf8,0xc0,0x88,0x40, // -5-
    0x88,0x40,0x8c,0x40,0x8f,0xc0,0x87,0x80,

    0x00,0x00,0x3f,0x80,0x7f,0xc0,0xc8,0x40, // -6-
    0x88,0x40,0x88,0x40,0x0f,0xc0,0x07,0x80,

    0x00,0x00,0xc0,0x00,0xc0,0x00,0x83,0xc0, // -7-
    0x87,0xc0,0x8c,0x00,0xf8,0x00,0xf0,0x00,

    0x00,0x00,0x77,0x80,0xff,0xc0,0x88,0x40, // -8-
    0x88,0x40,0x88,0x40,0xff,0xc0,0x77,0x80,

    0x00,0x00,0x70,0x00,0xf8,0x40,0x88,0x40, // -9-
    0x88,0x40,0x88,0xc0,0xff,0x80,0x7f,0x00,

    0x00,0x00,0x00,0xc0,0x01,0x80,0x03,0x00, // -/-
    0x06,0x00,0x0c,0x00,0x18,0x00,0x30,0x00,
};


unsigned char code HZ_12[] =
{

      0x80,0x00,0x88,0x1F,0x30,0x48,0x00,0x24, //"调"
      0xF0,0x1F,0x10,0x01,0x50,0x1D,0xF0,0x15,
      0x50,0x1D,0x10,0x41,0xF8,0x7F,0x10,0x00,

      0x00,0x02,0x00,0x41,0x80,0x41,0x60,0x31, //"分"
      0x18,0x0F,0x00,0x01,0x00,0x21,0x38,0x41,
      0x40,0x3F,0x80,0x00,0x00,0x01,0x00,0x01,

      0xE0,0x1F,0x20,0x09,0x20,0x09,0x20,0x09, //"时"
      0xE0,0x1F,0x40,0x00,0x40,0x01,0x40,0x26,
      0x40,0x40,0xF8,0x7F,0x40,0x00,0x40,0x00,

      0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F, //"日"
      0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,
      0x10,0x11,0xF8,0x3F,0x10,0x00,0x00,0x00,

      0x00,0x40,0x00,0x20,0x00,0x10,0xF8,0x0F, //"月"
      0x48,0x02,0x48,0x02,0x48,0x22,0x48,0x42,
      0x48,0x42,0xF8,0x3F,0x00,0x00,0x00,0x00,

      0x80,0x04,0x40,0x04,0x20,0x04,0x98,0x07, //"年"
      0x90,0x04,0x90,0x04,0xF0,0x7F,0x90,0x04,
      0x90,0x04,0x98,0x04,0x90,0x04,0x10,0x04
};


unsigned int disp1,disp2,key1,key2,key;
unsigned int ii,jj;
unsigned int i,w,n,xz,CM,TZ,BZ;

void Delay(unsigned int ms){
ms=ms*3;
while(--ms);
}


void num_led(int aa, int bb)
{
int kk;
for(kk=0;kk<8;kk++){
gate11=key1; gate12=key2;
P2=~NUM1[aa+kk*2];P1=~NUM1[aa+1+kk*2];
Delay(20);
P1=0xff;P2=0xff;

gate11=key2; gate12=key1;
P2=~NUM2[bb+15-kk*2];P1=~NUM2[bb+14-kk*2];
Delay(20);
P1=0xff;P2=0xff;
}
}

void display_clock(void)
{
key1=key;key2=!key;
disp1=BUFFER[3]/10;disp2=BUFFER[4]-(BUFFER[4]/10)*10;
ii=disp1*16;jj=disp2*16;
num_led(ii,jj);
P2=0xff;P1=0xff;Delay(60);

disp1=BUFFER[3]-disp1*10;disp2=BUFFER[4]/10;
ii=disp1*16;jj=disp2*16;
num_led(ii,jj);
P2=0xff;P1=0xff;Delay(60);

ii=160;jj=160;
num_led(ii,jj);
P2=0xff;P1=0xff;Delay(60);

disp1=BUFFER[2]/10;disp2=BUFFER[5]-(BUFFER[5]/10)*10;
ii=disp1*16;jj=disp2*16;
num_led(ii,jj);
P2=0xff;P1=0xff;Delay(60);

disp1=BUFFER[2]-disp1*10;disp2=BUFFER[5]/10;
ii=disp1*16;jj=disp2*16;
num_led(ii,jj);
P2=0xff;P1=0xff;Delay(60);

ii=160;jj=160;
num_led(ii,jj);
P2=0xff;P1=0xff;Delay(60);

disp1=BUFFER[1]/10;disp2=BUFFER[6]-(BUFFER[6]/10)*10;
ii=disp1*16;jj=disp2*16;
num_led(ii,jj);
P2=0xff;P1=0xff;Delay(60);

disp1=BUFFER[1]-disp1*10;disp2=BUFFER[6]/10;
ii=disp1*16;jj=disp2*16;
num_led(ii,jj);
P2=0xff;P1=0xff;Delay(60);
}

void display_TZ(void)
{
gate11=key;gate12=!key;

for(jj=0;jj<16;jj++){
P2=0xff;P1=0xff;
Delay(40);
}

for(jj=0;jj<12;jj++){
P2=~HZ_12[jj*2];P1=~HZ_12[1+jj*2];
Delay(40);
P1=0xff;P2=0xff;
}


for(jj=0;jj<12;jj++){
P2=~HZ_12[TZ*24+jj*2];P1=~HZ_12[TZ*24+1+jj*2];
Delay(40);
P1=0xff;P2=0xff;
}

for(jj=0;jj<8;jj++){
P2=~NUM1[160+jj*2];P1=~NUM1[160+1+jj*2];
Delay(40);
P1=0xff;P2=0xff;
}
disp1=BUFFER[TZ+1]/10;
for(jj=0;jj<8;jj++){
P2=~NUM1[disp1*16+jj*2];P1=~NUM1[disp1*16+1+jj*2];
Delay(40);
P2=0xff;P1=0xff;
}
Delay(60);

disp1=BUFFER[TZ+1]-disp1*10;
for(jj=0;jj<8;jj++){
P2=~NUM1[disp1*16+jj*2];P1=~NUM1[disp1*16+1+jj*2];
Delay(40);
P2=0xff;P1=0xff;
}
Delay(60);
}


void intersvr0(void) interrupt 0
{
key=!key;
if(w==0) w=1;
}

void intersvr1(void) interrupt 2
{

TH1=0; TL1=0;
}

void timer1(void) interrupt 3 using 1
{
}

void timer0(void) interrupt 1 using 1
{
TH0=-(5000/256);      
TL0=-(5000%256);
TR0=1;
BUFFER[0]=BUFFER[0]+1;
if (BUFFER[6]%4==0) M[1]=M[1]+1;
    if (BUFFER[0]>201+xz){
      BUFFER[0]=0;
      BUFFER[1]=BUFFER[1]+1;
   if (BUFFER[1]==60){
   BUFFER[1]=0;
   BUFFER[2]=BUFFER[2]+1;
   if (BUFFER[2]==60){
    BUFFER[2]=0;
    BUFFER[3]=BUFFER[3]+1;
    if (BUFFER[3]==24){
     BUFFER[3]=0;
              BUFFER[4]=BUFFER[4]+1;
              if (BUFFER[4]>M[BUFFER[5]-1]){
                BUFFER[4]=1;
                BUFFER[5]=BUFFER[5]+1;
                if (BUFFER[5]>12){
                  BUFFER[5]=1;
                  BUFFER[6]=BUFFER[6]+1;
                  if(BUFFER[6]>99) {
      BUFFER[6]=0;
                  M[1]=M[1]-1;
      }
                }
              }
            }
          }
        }
      }
}

 

void Jm(void)
{
unsigned int kk,mm;
CM=0x00;
for(kk=0;kk<30;kk++){
    mm=0;
    while((P3&0x80)==0x00){};
    while((P3&0x80)==0x80){mm++;};
    if((mm>350)&&(mm<100)){CM=0x00; break;};
    yy[kk]=mm;
    }
for(kk=17;kk<22;kk++){
   CM=CM<<1;
      if((yy[kk]>65)&&(yy[kk+8]<65)) {CM=CM|0x01;}
      else {if((yy[kk]>65)||(yy[kk+8]<65)) {CM=0x00;break;}
}
}
}

 

void main(void)
{
   xz=8;TZ=1;BZ=0;
   key1=0;key2=1;

   EA=1;

   IT0=1;EX0=1;
   EX1=1;

   IT1=1;ET0=1;
   TMOD=0x11;  
   TH0=-5000/256; TL0=-5000%256;
   TR0=1;

   TH1=0; TL1=0;
   TR1=1;
  
   for(;;){
     w=0;CM=0;
Delay(50);
     if(w==2) {EX1=0;Jm();Delay(1200);EX1=1;w=0;};
     if(BZ==1) if(w==1) {display_TZ();n=1;}
     if(BZ==0) if(w==1) {display_clock();n=1;}
if(CM==9) {BUFFER[1]=0;Delay(1200);BZ=!BZ;w=0;CM=0;}
   if(CM==11){Delay(1200);key=!key;w=1;BZ=0;w=0;CM=0;}
if(CM==23) if(BZ==1) {if(BUFFER[TZ+1]<maxnum[TZ-1]) BUFFER[TZ+1]++; else BUFFER[TZ+1]=minnum[TZ-1];Delay(1200);w=0;CM=0;}
     if(CM==19) if(BZ==1) {if(BUFFER[TZ+1]>minnum[TZ-1]) BUFFER[TZ+1]--; else BUFFER[TZ+1]=maxnum[TZ-1];Delay(1200);w=0;CM=0;}
if(CM==31) if(BZ==1) {if(TZ<5) TZ++; else TZ=1;Delay(1200);w=0;CM=0;}
if(CM==15) if(BZ==1) {if(TZ>1) TZ--; else TZ=5;Delay(1200);w=0;CM=0;}
    
n++;if(n>10) w=1;
     }
}

四。运行效果
  从开机,调整到最后完成。
   
【转帖】POV LED基于51单片机的旋转LED电子钟
开机时
【转帖】POV LED基于51单片机的旋转LED电子钟
调时状态          
【转帖】POV LED基于51单片机的旋转LED电子钟

正常运行状态

 

 

相关文章:

  • 2021-10-17
  • 2018-12-10
  • 2022-01-07
  • 2021-04-11
  • 2022-01-03
  • 2021-12-31
  • 2021-08-05
  • 2021-04-18
猜你喜欢
  • 2021-06-24
  • 2021-12-24
  • 2021-04-28
  • 2022-01-10
  • 2021-04-12
  • 2021-11-24
相关资源
相似解决方案