該設計是基于單片機設計的電子時鐘,顯示時分秒,本設計加入了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);
}
}
