磁动力电子网-雕刻机DIY论坛,单片机论坛,CNCDIY,DIYCNC

 找回密码
 加入磁动力

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 10217|回复: 32

[原创]DIY“硬盘时钟”资料

[复制链接]
发表于 2009-3-20 21:03:00 | 显示全部楼层 |阅读模式
完成的作品

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

开机画面图

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

运行状态图

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料

电原理图

DIY“硬盘时钟”资料

DIY“硬盘时钟”资料


C51源程序

// 硬盘时钟程序
//
//    周正华
// 2009.3.9


#include <reg52.h>
#include <intrins.h>
#include <absacc.h>

#define WORDPORT P2
#define DIGPORT  P1

#define NUM2BCD(x) ((((x)/10)<<4)|(x%10))
#define BCD2NUM(x) (((x)>>4)*10+((x)&0x0f))


#define XZ 8 
#define Ru(x) (x+XZ)>59? (x+XZ-60):(x+XZ) 


#define Delay10Us {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define Delay100Us {Delay10Us;Delay10Us;Delay10Us;Delay10Us;Delay10Us;\
                    Delay10Us;Delay10Us;Delay10Us;Delay10Us;Delay10Us;}


#define TIME_SECOND  XBYTE[0x7f00]
#define TIME_MINUTE  XBYTE[0x7f02]
#define TIME_HOUR  XBYTE[0x7f04]
#define TIME_DAY  XBYTE[0x7f06]
#define TIME_DATE  XBYTE[0x7f07]
#define TIME_MONTH  XBYTE[0x7f08]
#define TIME_YEAR  XBYTE[0x7f09]

#define REGISTERA  XBYTE[0x7f0A]
#define REGISTERB  XBYTE[0x7f0B]
#define REGISTERC  XBYTE[0x7f0C]
#define REGISTERD  XBYTE[0x7f0D]

sbit P_LED_R=P3^0;
sbit P_LED_G=P3^4;
sbit P_LED_B=P3^1;

sbit Key1=P1^6;
sbit Key2=P1^7;
sbit Key0=P3^5;

sbit Put_LED=P3^3;

unsigned char code LED_COL[8][3]=
{
   1,1,1,       //白
   1,0,0,       //红
   0,1,0,       //绿
   0,0,1,       //蓝
   1,1,0,       //黄
   1,0,1,       //品红
   0,1,1,       //青
   0,0,0,       //黑
};

unsigned char code COL_MOD[3][5]=
{
   4,0,3,2,1,
   5,1,4,2,3,
   6,2,3,4,1
};

unsigned char code CH[]={32,32,32,32,32,32,32,32,
                         68,73,89,32,76,69,68,32,
    80,79,86,32,72,68,68,32,
    67,76,79,67,75,32,32,32,
    32,32,32,32,32,32
    };
                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
unsigned char code SD[5][6]={
                         77,73,78,85,84,69,
                         72,79,85,82,32,32,
                         68,65,84,69,32,32,
                         77,79,78,84,72,32,
                         89,69,65,82,32,32
                         };

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

unsigned char Time[7];
unsigned char t1,t2,t3,M1,M2,M3;
unsigned char PT_col[60],BL_col,KD_col;
unsigned char m,n,t,co,ST,CM,TZ,BZ;
unsigned int Tn,Tn0,Ti0,Ti1,Ti2,Ti,k,p;             
unsigned int RT=34100;

/*********************************************************************************************/ 

void intersvr0(void) interrupt 0 using 1
{
  if(ST==5) {                        
    Tn=0;
    TH0=-Ti2/256;TL0=-Ti2%256;
  }
  else {                            
    TH0=-Ti1/256;TL0=-Ti1%256;
    m=0;
  }
}

void timer0(void) interrupt 1
{

TH0=-Ti0/256;TL0=-Ti0%256;
                                   
if(ST==0){                   
  if(p<420) p++; else {p=0; ST=1;};
  P_LED_R=LED_COL[7-p/70][0];
  P_LED_G=LED_COL[7-p/70][1];
  P_LED_B=LED_COL[7-p/70][2];
}
if((ST>0)&&(ST<5)) {
  if(m<co) m++; else m=0;
  P_LED_R=LED_COL[m][0];
  P_LED_G=LED_COL[m][1];
  P_LED_B=LED_COL[m][2];

}
}

void timer1(void) interrupt 3 using 1
{
if(ST==5){

  TH1=-3;TL1=-21;

  P_LED_R=LED_COL[PT_col[Tn]][0];
  P_LED_G=LED_COL[PT_col[Tn]][1];
  P_LED_B=LED_COL[PT_col[Tn]][2];

  Delay100Us;Delay100Us;Delay100Us;

  P_LED_R=LED_COL[BL_col][0];
  P_LED_G=LED_COL[BL_col][1];
  P_LED_B=LED_COL[BL_col][2];

  Tn++;
}

if(ST<5) {TH1=Ti/256;TL1=Ti%256;}
if(ST==0) Ti0=RT;
if(ST==1) {if(t<3) t++; else {t=0;if(k>8) k--; else ST=4; Ti0=100*k;}}
//if(ST==2) {if(t<8) t++; else {t=0;if(n>1) n--;  else ST=3; Ti0=RT/n-44;}}
//if(ST==3) {if(t<40) t++; else {t=0;if(n<24) n++; else ST=4; Ti0=RT/n-44;}}
if(ST==4) {if(t<40) t++; else {t=0;if(co>1) co--; else {ST=5;Ti0=0;Ti1=160;Ti2=0;};Ti0=RT/24-44;}}
}


SetupDs12887(void)
{
    REGISTERA = 0x70;
 REGISTERB = 0xa2;

 TIME_SECOND= NUM2BCD(Time[0]);  
 TIME_MINUTE= NUM2BCD(Time[1]);
 TIME_HOUR  = NUM2BCD(Time[2]);

 TIME_DATE  = NUM2BCD(Time[3]);  
 TIME_MONTH = NUM2BCD(Time[4]);
 TIME_YEAR  = NUM2BCD(Time[5]);

 REGISTERA = 0x20; 
 REGISTERB = 0x22; 
}

void ReadDs12887(void)
{
 Time[0] = BCD2NUM(TIME_SECOND);
 Time[1] = BCD2NUM(TIME_MINUTE);
 Time[2] = BCD2NUM(TIME_HOUR);
 
 Time[3] = BCD2NUM(TIME_DATE);
 Time[4] = BCD2NUM(TIME_MONTH);
 Time[5] = BCD2NUM(TIME_YEAR);
}

void Delay_100Us(unsigned int tt)
{
  unsigned char ii;
  for(;tt>0;tt--)
    for(ii=94;ii>0;ii--);
}


/*主程序*/
void main(void)
{
unsigned char i,j;
unsigned char kdxz=3;
  P3=0xff;
 
  m=0;k=339;
  n=60;
  Ti0=RT/n;
  Ti1=57;
  Ti2=1750;
  Ti=43600;
  ST=0;
  co=7;

  CM=0;  
  BL_col=COL_MOD[CM][0];
  KD_col=COL_MOD[CM][1];
 
  TMOD=0x11;
 
  TH0=0; TL0=0;
  TR0=1; ET0=1;

  TH1=0; TL1=0;
  TR1=1; ET1=1;

  IT0=1; EX0=1;

  for(i=0;i<60;i++) PT_col=BL_col;
  PT_col[0+kdxz]=0;
  PT_col[5+kdxz]=0;
  PT_col[10+kdxz]=0;
  PT_col[15+kdxz]=0;
  PT_col[20+kdxz]=0;
  PT_col[25+kdxz]=0;
  PT_col[30+kdxz]=0;
  PT_col[35+kdxz]=0;
  PT_col[40+kdxz]=0;
  PT_col[45+kdxz]=0;
  PT_col[50+kdxz]=0;
  PT_col[55+kdxz]=0;

  Delay_100Us(9000);
  Delay_100Us(9000);
  Delay_100Us(9000);
  EA=1;

  P_LED_R=0;
  P_LED_G=0;
  P_LED_B=0;

for(;;){
  if(TZ==0) ReadDs12887(); 

  Delay_100Us(50);
  Delay_100Us(50);
 
  if((ST>2)&&(TZ==0)){    
    M1=Time[0];M2=Time[1];M3=Time[2];
    DIGPORT=0xec; WORDPORT=0x30+Time[3]%10;
    DIGPORT=0xed; WORDPORT=0x30+Time[3]/10;
    DIGPORT=0xee; WORDPORT=0x2d;
    DIGPORT=0xef; WORDPORT=0x30+Time[4]%10;
    DIGPORT=0xd3; WORDPORT=0x30+Time[4]/10;
    DIGPORT=0xd7; WORDPORT=0x2d;
    DIGPORT=0xdb; WORDPORT=0x30+Time[5]%10;
    DIGPORT=0xdf; WORDPORT=0x30+Time[5]/10;
  }
  if((ST<3)&&(TZ==0)){
    for(j=0;j<30;j++){  
      DIGPORT=0xec; WORDPORT=CH[7+j];
      DIGPORT=0xed; WORDPORT=CH[6+j];
      DIGPORT=0xee; WORDPORT=CH[5+j];
      DIGPORT=0xef; WORDPORT=CH[4+j]; 
      DIGPORT=0xd3; WORDPORT=CH[3+j];
      DIGPORT=0xd7; WORDPORT=CH[2+j];
      DIGPORT=0xdb; WORDPORT=CH[1+j];
      DIGPORT=0xdf; WORDPORT=CH[0+j];
      Delay_100Us(2360);
    }
    Delay_100Us(9000); 
  }
  if((TZ>0)&&(BZ==1))   
  {
      DIGPORT=0xec; WORDPORT=0x30+Time[TZ]%10;
      DIGPORT=0xed; WORDPORT=0x30+Time[TZ]/10;
      DIGPORT=0xee; WORDPORT=SD[TZ-1][5];
      DIGPORT=0xef; WORDPORT=SD[TZ-1][4]; 
      DIGPORT=0xd3; WORDPORT=SD[TZ-1][3];
      DIGPORT=0xd7; WORDPORT=SD[TZ-1][2];
      DIGPORT=0xdb; WORDPORT=SD[TZ-1][1];
      DIGPORT=0xdf; WORDPORT=SD[TZ-1][0];
    BZ=0;
      M1=Time[0];M2=Time[1];M3=Time[2];
  } 

  Delay_100Us(50);
  Delay_100Us(50);

  PT_col[t1]=BL_col;
  PT_col[t2]=BL_col;
  PT_col[t3]=BL_col;

  if(M3>12) M3=M3-12;
  t1=Ru(M1);t2=Ru(M2);t3=Ru(M3*5+M2/12);

  PT_col[0+kdxz]=KD_col;
  PT_col[5+kdxz]=KD_col;
  PT_col[10+kdxz]=KD_col;
  PT_col[15+kdxz]=KD_col;
  PT_col[20+kdxz]=KD_col;
  PT_col[25+kdxz]=KD_col;
  PT_col[30+kdxz]=KD_col;
  PT_col[35+kdxz]=KD_col;
  PT_col[40+kdxz]=KD_col;
  PT_col[45+kdxz]=KD_col;
  PT_col[50+kdxz]=KD_col;
  PT_col[55+kdxz]=KD_col;

  PT_col[t1]=COL_MOD[CM][2];
  PT_col[t2]=COL_MOD[CM][3];
  PT_col[t3]=COL_MOD[CM][4];

  Delay_100Us(50);
  Delay_100Us(50);
 
  if(Key0==0){       
    Delay_100Us(80);
 if(Key0==0) {if(TZ<5) TZ++; else {TZ=0; SetupDs12887();};BZ=1;}
 }

  if(Key1==0){       
    Delay_100Us(50);
 if(Key1==0) {if(Time[TZ]<maxnum[TZ-1]) Time[TZ]++;  else Time[TZ]=minnum[TZ-1]; BZ=1;}
 }
    
  if(Key2==0){       
    Delay_100Us(50);
    if(Key2==0) {if(Time[TZ]>minnum[TZ-1]) Time[TZ]--; else Time[TZ]=maxnum[TZ-1];BZ=1;}
 }
   
  Delay_100Us(50);
  Delay_100Us(50);

  if(TZ!=0) Put_LED=~Put_LED; else Put_LED=1;
 
  Delay_100Us(50);
  Delay_100Us(50);
}
}

[此贴子已经被明浩于2009-4-3 17:24:14编辑过]

回复

使用道具 举报

发表于 2009-3-21 18:21:00 | 显示全部楼层
牛X,兄弟,你三种颜色的LED是装在哪里的啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-21 20:23:00 | 显示全部楼层

回复楼上两位

发光二极管是安装在碟盘下面,由三基色原理,由RGB的三色LED可产生七种颜色的光。
回复 支持 反对

使用道具 举报

发表于 2009-3-22 17:23:00 | 显示全部楼层
继续来顶,资料也放出来了,真得很赞!
回复 支持 反对

使用道具 举报

发表于 2009-3-21 10:43:00 | 显示全部楼层
好羡慕啊~~不知道我能不做一个
回复 支持 反对

使用道具 举报

发表于 2009-3-20 23:53:00 | 显示全部楼层
很酷,音乐也酷。
回复 支持 反对

使用道具 举报

发表于 2009-3-20 22:49:00 | 显示全部楼层

哈哈 真漂亮,不知道转盘是啥做的?

回复 支持 反对

使用道具 举报

发表于 2009-3-22 19:08:00 | 显示全部楼层
编译错误
回复 支持 反对

使用道具 举报

发表于 2009-3-23 15:54:00 | 显示全部楼层
强顶一个!!
回复 支持 反对

使用道具 举报

发表于 2009-3-26 18:45:00 | 显示全部楼层

资料终于出来啦!能否贴出你的详细的制作的过程讲解,因为不知道怎么能做到如图你的效果出来,如果你介绍下相信我们能够更快的做出像你一样的效果!谢谢!

还有你那3基色的LED哪里能够买到啊!????

[此贴子已经被作者于2009-3-26 18:47:49编辑过]
回复 支持 反对

使用道具 举报

发表于 2009-3-26 18:54:00 | 显示全部楼层
你小子,才发现你怎么做的,大家知道吗,我知道了你在盘面上切掉了一部分!虽然你没怎么说明!好 拍一个!
[此贴子已经被作者于2009-3-26 18:56:35编辑过]
回复 支持 反对

使用道具 举报

发表于 2009-4-3 17:24:00 | 显示全部楼层

源码已修正

回复 支持 反对

使用道具 举报

发表于 2009-4-3 20:04:00 | 显示全部楼层
相当有创意!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-31 09:47:00 | 显示全部楼层
回复楼上的:
1。你用心找,能找到持续旋转的硬盘。不过,试验时一定记住,至少要安装上一张碟盘在电机上。
2。开一小缝并不影响平衡的,这不是理论和想象,而是实际表明的。
3。采用的是用较早期的硬盘驱动后期的硬盘盘体,这样做的目的主要目的是为了降噪。特别要说明的是转速也不能太低了,这样会影响亮度和效果的。
回复 支持 反对

使用道具 举报

发表于 2009-3-30 17:58:00 | 显示全部楼层
能调整盘的转速不?
回复 支持 反对

使用道具 举报

发表于 2009-3-30 22:54:00 | 显示全部楼层
1.怎么能让它持续的转
2.在这么大的速度下如何进修平衡
3.如何降低转速
回复 支持 反对

使用道具 举报

发表于 2009-3-30 19:39:00 | 显示全部楼层
漂亮!创意不错!
回复 支持 反对

使用道具 举报

发表于 2009-3-30 01:40:00 | 显示全部楼层
好东西~我才刚开始学单片机~~以后也学做一个
回复 支持 反对

使用道具 举报

发表于 2009-4-4 22:36:00 | 显示全部楼层

这个硬盘是自己转的,就是由原来的硬盘电路驱动,与此制作无关。此制作只是增加了个缺口,检测硬盘盘片的位置。不过我还是没看出来发光管是怎样让盘面亮起来的,发光管放盘下面?盘是非透明的啊。盘在转,但是发光管是固定的,和以前的发光管运动是不一样的,请说明一下是如何实现这个效果的。

回复 支持 反对

使用道具 举报

发表于 2009-4-4 22:42:00 | 显示全部楼层
我最想知道的是这个发光的LED是如何安装的,至于彩色LED倒不是问题,电路图上只有一只三色管,但从盘上效果来看有十个管子。不清楚是如何实现这个效果的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入磁动力

本版积分规则

QQ|小黑屋|手机版|Archiver|www.cdle.net 磁动力电子网 2001-2017 ( 粤ICP备10098153号

粤公网安备 44040402000001号

GMT+8, 2019-6-18 20:38

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.