该设计是基于单片机设计的电子时钟,显示时分秒,本设计加入了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);
}
}
