|
本帖最后由 翌阳 于 2017-10-16 20:58 编辑
电子钟是数年前做的,硬件图没有留下文档,拆机重绘工程量太大了,不过从程序上应该可以分析出来大致的硬件图。主要的差别就是LED显示代码。其它的基本上都差不多。晶体记得好象是11.XXX的那个。走时精度很高的。
- #include <stdio.h>
- #include <reg51.h>
- #define TIMCNT 3126
- #define lowbit(c) (c%10)
- #define hibit(c) (c/10)
- //#include <sio.c>
- code char *version="-=<<Clock V1.2 Written by He Liang 2001.5.4>>=-\n";
- // 0 1 2 3 4 5 6 7 8 9 10 11 12
- code unsigned char asctb[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x2, 0,0x30,0};
- // 0 1 2 3 4 5 6 7 8 9 10 11 12
- code unsigned char daypm[]={0xff,31,28,31,30,31,30,31,31,30,31,30,31,0xff};
- data unsigned char mode=0,year=0,month=1,day=1,hour=0,min=0,sec=0,week=0,setup=0xff;
- data unsigned char ddlycnt=0;
- data unsigned int timcnt=TIMCNT,delaycnt;
- idata unsigned char dbuf[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
- bit modi=0,flash,date=0;
- void inittimer0(void)
- {
- TMOD&=0xf0;
- TMOD+=0x02;
- TH0=0;
- TL0=0;
- TR0=1;
- ET0=1;
- EA=1;
- }
- void timer0(void) interrupt 1
- {
- static unsigned char k=1;
- static unsigned char dc=0;
- k<<=1;
- dc++;
- if(k==0){k=1;dc=0;}
- P1=0;
- T1=1;
- T1=0;
- P1=~dbuf[dc];
- RD=1;
- RD=0;
- P1=k;
- T1=1;
- T1=0;
- if(delaycnt!=0)delaycnt--;
- timcnt--;
- if(timcnt==0)
- {
- if(!modi)sec++;
- if(sec>59)sec=0;
- timcnt=TIMCNT;
- }
- }
- void display()
- {
- unsigned char c;
- switch(mode)
- {
- case 0:
- date=0;
- break;
- case 1:
- if(setup==0xff){ddlycnt++;if(ddlycnt>5){ddlycnt=0;mode=0;}}
- date=1;
- break;
- case 2:
- if(setup==0xff)
- {
- if(delaycnt==0)
- {
- date=!date;
- if(date)delaycnt=TIMCNT*2;else delaycnt=TIMCNT*5;
- }
- }
- else
- date=0;
- break;
- }
- if(date)
- {
- dbuf[0]=asctb[hibit(year)];
- dbuf[1]=asctb[lowbit(year)];
- dbuf[2]=asctb[12];
- dbuf[3]=asctb[hibit(month)];
- dbuf[4]=asctb[lowbit(month)];
- dbuf[5]=asctb[12];
- dbuf[6]=asctb[hibit(day)];
- dbuf[7]=asctb[lowbit(day)];
- }else
- {
- c=hibit(hour);if(c==0)c=11;
- dbuf[0]=asctb[c];
- dbuf[1]=asctb[lowbit(hour)];
- dbuf[2]=asctb[10];
- dbuf[3]=asctb[hibit(min)];
- dbuf[4]=asctb[lowbit(min)];
- dbuf[5]=asctb[10];
- dbuf[6]=asctb[hibit(sec)];
- dbuf[7]=asctb[lowbit(sec)];
- }
- if(setup<3&&!flash)
- {
- c=setup+setup+setup;
- dbuf[c]=0;
- dbuf[c+1]=0;
- }
- if(setup!=3||flash)dbuf[week]|=1;
- }
- void caltim()
- {
- static data unsigned char se=0;
- if(sec!=se)
- {
- se=sec;
- if(sec==0)
- {
- min++;
- if(min>59)
- {
- hour++;min=0;
- if(hour>23)
- {
- hour=0;week++;if(week>6)week=0;
- day++;
- if(day>daypm[month]+((year&3)==0?1:0))
- {
- month++;day=1;
- if(month>12)
- {
- year++;month=1;
- if(year>99)year=0;
- }
- }
- }
- }
- }
- flash=1;
- display();
- }
- if(setup!=0xff&&delaycnt==0)
- {
- delaycnt=750;
- flash=!flash;
- display();
- }
- }
- char _getkey(void)
- {
- static unsigned char cnt=254,lastkey=0,repcnt=10,lstk=0;
- unsigned char k;
- INT0=1;INT1=1;
- k=P3;
- k=(~(k>>2))&3;
- if(k!=lstk){lstk=k;cnt=254;}
- if(cnt>0){cnt--;return 0;}
- cnt=254;
- if(k==lastkey)
- {
- repcnt--;
- if(repcnt==0){repcnt=2;return k;}
- else return 0;
- }else
- {
- lastkey=k;
- repcnt=6;
- return k;
- }
- }
- main()
- {
- unsigned char key;
- inittimer0();
- // initsio();
- while(1)
- {
- PCON|=1;
- caltim();
- key=_getkey();
- if(key!=0)
- {
- ddlycnt=0;
- switch(key)
- {
- case 1:
- setup++;
- if(setup>3)setup=0xff;
- if(setup!=2)modi=0;
- delaycnt=0;
- break;
- case 2:
- if(mode!=1)
- {
- switch(setup)
- {
- case 0:
- hour++;
- if(hour>23)hour=0;
- break;
- case 1:
- min++;
- if(min>59)min=0;
- break;
- case 2:
- modi=1;
- sec++;
- if(sec>59)sec=0;
- timcnt=TIMCNT;
- break;
- case 3:
- week++;
- if(week>6)week=0;
- break;
- case 0xff:
- mode++;
- if(mode>2)mode=0;
- break;
- }
- }else
- {
- switch(setup)
- {
- case 0:
- year++;
- if(year>99)year=0;
- break;
- case 1:
- month++;
- if(month>12)month=1;
- break;
- case 2:
- day++;
- if(day>daypm[month]+((year&3)==0?1:0))day=1;
- break;
- case 3:
- week++;
- if(week>6)week=0;
- break;
- case 0xff:
- mode++;
- if(mode>2)mode=0;
- break;
- }
-
- }
- delaycnt=2400;
- flash=1;
- break;
-
- }
- display();
- }
- }
- }
复制代码
[ 本帖最后由 翌阳 于 2007-5-4 10:19 编辑 ]
寄存个图片在此处:
|
|