該設(shè)計是基于單片機設(shè)計的電子時鐘,顯示時分秒,本設(shè)計加入了ds1302帶有涓細(xì)電流充電功能的RTC(實時時鐘),直接用單片機對1302寫初值后,直接讀1302即可,該設(shè)計能保證在系統(tǒng)掉電后時間不會亂。還可調(diào)時,本設(shè)計只能調(diào)時間,年月日調(diào)節(jié)未作,因為和時間的調(diào)節(jié)方法大同小異。
源程序: #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); } }