该设计是基于单片机设计的电子时钟,显示时分秒,本设计加入了ds1302带有涓细电流充电功能的RTC(实时时钟),直接用单片机对1302写初值后,直接读1302即可,该设计能保证在系统掉电后时间不会乱。还可调时,本设计只能调时间,年月日调节未作,因为和时间的调节方法大同小异。
源程序: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit lcdrs=P3^0; sbit lcdrw=P3^1; sbit lcden=P3^2; sbit rst=P1^3; sbit sclk=P1^4; sbit io=P1^5; sbit ACC_7=ACC^7; sbit menu=P1^0; sbit jia=P1^1; sbit jian=P1^2; uchar code table[]=" 20 - - "; uchar code table1[]=" : : day:"; uchar code table2[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10, 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21, 0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31, 0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42, 0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,0x51,0x52,0x53, 0x54,0x55,0x56,0x57,0x58,0x59}; uchar unm,miao,fen,shi,nian,yue,ri,zhou,kkk; void delay(int z) { int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void writen1302(uchar addr,dat) { uchar i,temp; rst=0; sclk=0; rst=1; for(i=0;i<8;i++) { sclk=0; temp=addr; io=(bit)(temp&0x01); addr>>=1; sclk=1; } for(i=0;i<8;i++) { sclk=0; temp=dat; io=(bit)(temp&0x01); dat>>=1; sclk=1; } rst=0; } uchar read1302(addr) { uchar i,temp,dat1,dat2; rst=0; sclk=0; rst=1; for(i=0;i<8;i++) { sclk=0; temp=addr; io=(bit)(temp&0x01); addr>>=1; sclk=1; } for(i=0;i<8;i++) { ACC_7=io; sclk=1; ACC>>=1; sclk=0; } rst=0; dat1=ACC; dat2=dat1/16; dat1=dat1%16; dat1=dat1+dat2*10; return (dat1); } void writen_com(uchar com) { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void writen_date(uchar date) { lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void writen_sfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; writen_com(0x80+0x40+add); writen_date(0x30+shi); writen_date(0x30+ge); } void writen_nyr(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; writen_com(0x80+add); writen_date(0x30+shi); writen_date(0x30+ge); } void keyscan() { if(menu==0) { delay(1); if(menu==0) { while(!menu); writen_com(0x0f); writen_com(0x80+0x40+8); while(menu) { if(jia==0) { delay(1); if(jia==0); { while(!jia); if(miao==59) { miao=-1; } miao++; writen1302(0x80,table2[miao]); writen_sfm(8,miao); writen_com(0x80+0x40+8); } } } if(menu==0) { delay(1); if(menu==0) { while(!menu); writen_com(0x0f); writen_com(0x80+0x40+5); while(menu) { if(jia==0) { delay(1); if(jia==0); { while(!jia); if(fen==59) { fen=-1; } fen++; writen1302(0x82,table2[fen]); writen_sfm(5,fen); writen_com(0x80+0x40+5); } } } } if(menu==0) { delay(1); if(menu==0) { while(!menu); writen_com(0x0f); writen_com(0x80+0x40+2); while(menu) { if(jia==0) { delay(1); if(jia==0); { while(!jia); if(shi==23) { shi=-1; } shi++; writen1302(0x84,table2[shi]); writen_sfm(2,shi); writen_com(0x80+0x40+2); writen1302(0x8e,0x80); } } } if(menu==0) { delay(1); if(menu==0) { writen_com(0x0c); writen_com(0x06); } } } } } } } } void init() { lcdrw=0; lcden=0; writen_com(0x38); writen_com(0x0c); writen_com(0x06); writen_com(0x80); writen1302(0x8a,0x02); for(unm=0;unm<13;unm++) { writen_date(table[unm]); } writen_com(0x80+0x40); for(unm=0;unm<16;unm++) { writen_date(table1[unm]); } } void main() { init(); while(1) { keyscan(); miao=read1302(0x81); writen_sfm(8,miao); writen_com(0x80+0x40+8); fen=read1302(0x83); writen_sfm(5,fen); writen_com(0x80+0x40+5); shi=read1302(0x85); writen_sfm(2,shi); writen_com(0x80+0x40+2); zhou=read1302(0x8b); writen_sfm(14,zhou); writen_com(0x80+0x40+14); nian=read1302(0x8d); writen_nyr(4,nian); writen_com(0x80+4); yue=read1302(0x89); writen_nyr(7,yue); writen_com(0x80+7); ri=read1302(0x87); writen_nyr(10,ri); writen_com(0x80+10); } }