程序在KEIL软件上调试成功
接上仿真软件就可以运行
在这里就不发仿真软件电路图了
有需要可以联系我
程序100%可以运行。。。。。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DEC2BCD(X) ((X/10)<<4 | (X%10))
#define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F))
void write_com(uchar com);
void write_data(uchar dat);
void init();
void write_time(uchar add,uchar dat);
void write_riqi(uchar add,uchar dat);
void write_xingqi(uchar dat);
void write_byte(uchar dat);
uchar read_byte();
void s_write(uchar add,uchar dat);
void s_write(uchar add,uchar dat);
uchar s_read(uchar add);
void set_ds1302(uchar *pClock);
void rw_ds1302();
void keyscan();
uchar data table[]="2009-01-01 MON.";
uchar data table1[]="20-01-01 ";
uchar code week1[]="SUN";
uchar code week2[]="MON";
uchar code week3[]="TUE";
uchar code week4[]="WED";
uchar code week5[]="THU";
uchar code week6[]="FRI";
uchar code week7[]="SAT";
uchar code time[]={0x00,0x00,0x00,0x06,0x09,0x07,0x09};
uchar data time1[]={0x00,0x00,0x00,0x06,0x09,0x07,0x09};
uchar hour,min,sec,week,day,month,year,num,sfcount,flag;
sbit ds1302_sclk=P1^4;
sbit ds1302_io=P1^5;
sbit ds1302_ce=P2^2;
sbit acc0=ACC^0;
sbit acc7=ACC^7;
sbit lcdrs=P1^7;
sbit lcdrw=P1^6;
sbit lcde=P2^4;
sbit le=P3^6;
sbit leden=P2^5;
sbit dkle=P3^7;
sbit beep=P2^7;
sbit sf=P1^0;
sbit sup=P1^1;
void delay(uint a);
void keyscan();
void main()
{
s_write(0x8e,0x80);
init();
P0=0xff;
while(1)
{
keyscan();
if(flag==0)
{
rw_ds1302();
}
}
}
void write_byte(uchar dat)
{
uchar i;
ACC=dat;
for(i=8;i>0;i--)
{
ds1302_io=acc0;
ds1302_sclk=1;
ds1302_sclk=0;
ACC=ACC>>1;
}
}
uchar read_byte()
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
acc7=ds1302_io;
ds1302_sclk=1;
ds1302_sclk=0;
}
return(ACC);
}
void s_write(uchar add,uchar dat)
{
ds1302_ce=0;
ds1302_sclk=0;
ds1302_ce=1;
write_byte(add);
write_byte(dat);
ds1302_sclk=1;
ds1302_ce=0;
}
uchar s_read(uchar add)
{
uchar temp;
ds1302_ce=0;
ds1302_sclk=0;
ds1302_ce=1;
write_byte(add);
temp=read_byte();
ds1302_sclk=1;
ds1302_ce=0;
temp=BCD2DEC(temp);
return(temp);
}
void set_ds1302(uchar *pClock)
{
uchar i;
uchar add=0x80;
EA=0;
s_write(0x8e,0x00);
for(i=7;i>0;i--)
{
s_write(add,*pClock);
pClock++;
add+=2;
}
s_write(0x8e,0x80);
EA=1;
}
void rw_ds1302()
{
EA=0;
sec=s_read(0x81);
write_time(8,sec);
write_com(0x80+0x40+9);
min=s_read(0x83);
write_time(5,min);
write_com(0x80+0x40+6);
hour=s_read(0x85);
write_time(2,hour);
write_com(0x80+0x40+3);
week=s_read(0x8b);
write_xingqi(week);
write_com(0x80+0x0d);
day=s_read(0x87);
write_riqi(8,day);
write_com(0x80+9);
month=s_read(0x89);
write_riqi(5,month);
write_com(0x80+6);
year=s_read(0x8d);
write_riqi(2,year);
write_com(0x80+3);
EA=1;
}
void write_com(uchar com)
{
lcde=0;
lcdrw=0;
lcdrs=0;
delay(1);
lcde=1;
delay(1);
P0=com;
delay(1);
lcde=0;
}
void write_data(uchar dat)
{
lcde=0;
lcdrw=0;
lcdrs=1;
delay(1);
lcde=1;
delay(1);
P0=dat;
delay(1);
lcde=0;
}
void init()
{
s_write(0x90,0xa5);
set_ds1302(time);
delay(5);
lcde=0;
le=0;
leden=0;
write_com(0x38);
delay(100);
write_com(0x38);
delay(50);
write_com(0x38);
delay(10);
write_com(0x08);
write_com(0x01);
write_com(0x0c);
write_com(0x80);
for(num=0;num<15;num++)
{
write_data(table[num]);
}
write_com(0x80+0x40);
for(num=0;num<10;num++)
{
write_data(table1[num]);
}
}
void write_time(uchar add,uchar dat)
{
uchar shi,ge;
shi=dat/10;
ge=dat%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_riqi(uchar add,uchar dat)
{
uchar shi,ge;
shi=dat/10;
ge=dat%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
/*void write_xingqi(uchar dat)
{
write_com(0x80+0x0b);
switch(dat)
{
case 1: for(num=0;num<4;num++)
{
write_data(xingqi[num]);
};break;
case 2: for(num=5;num<9;num++)
{
write_data(xingqi[num]);
};break;
case 3: for(num=10;num<14;num++)
{
write_data(xingqi[num]);
};break;
case 4: for(num=15;num<19;num++)
{
write_data(xingqi[num]);
};break;
case 5: for(num=20;num<24;num++)
{
write_data(xingqi[num]);
};break;
case 6: for(num=25;num<29;num++)
{
write_data(xingqi[num]);
};break;
case 7: for(num=30;num<34;num++)
{
write_data(xingqi[num]);
};break;
}
}*/
void write_xingqi(uchar dat)
{
uchar i;
write_com(0x80+12);
switch(dat)
{
case 1: for(i=0;i<3;i++)
{
write_data(week1[i]);
delay(5);
}
break;
case 2: for(i=0;i<3;i++)
{
write_data(week2[i]);
delay(5);
}
break;
case 3: for(i=0;i<3;i++)
{
write_data(week3[i]);
delay(5);
}
break;
case 4: for(i=0;i<3;i++)
{
write_data(week4[i]);
delay(5);
}
break;
case 5: for(i=0;i<3;i++)
{
write_data(week5[i]);
delay(5);
}
break;
case 6: for(i=0;i<3;i++)
{
write_data(week6[i]);
delay(5);
}
break;
case 7: for(i=0;i<3;i++)
{
write_data(week7[i]);
delay(5);
}
break;
}
}
void keyscan()
{
if(sf==0)
{
delay(2);
if(sf==0)
{
while(!sf);
sfcount++;
if(sfcount==1)
{
flag=1;
s_write(0x80,0x80);
write_com(0x80+0x40+9);
write_com(0x0f);
}
if(sfcount==2)
{
write_com(0x80+0x40+6);
}
if(sfcount==3)
{
write_com(0x80+0x40+3);
}
if(sfcount==4)
{
write_com(0x80+0x0d);
}
if(sfcount==5)
{
write_com(0x80+9);
}
if(sfcount==6)
{
write_com(0x80+6);
}
if(sfcount==7)
{
write_com(0x80+3);
}
if(sfcount==8)
{
sfcount=0;
flag=0;
set_ds1302(time1);
delay(5);
write_com(0x0c);
s_write(0x80,0x00);
}
}
}
if(sup==0)
{
delay(5);
if(sup==0)
{
while(!sup);
if(sfcount==1)
{
sec++;
if(sec==60)
sec=0;
time1[0]=DEC2BCD(sec);
write_time(8,sec);
write_com(0x80+0x40+9);
}
if(sfcount==2)
{
min++;
if(min==60)
min=0;
time1[1]=DEC2BCD(min);
write_time(5,min);
write_com(0x80+0x40+6);
}
if(sfcount==3)
{
hour++;
if(hour==24)
hour=0;
time1[2]=DEC2BCD(hour);
write_time(2,hour);
write_com(0x80+0x40+3);
}
if(sfcount==4)
{
week++;
if(week==8)
week=1;
time1[5]=week;
write_xingqi(week);
write_com(0x80+0x0d);
}
if(sfcount==5) //???
{
day++;
if(day==32)
day=1;
time1[3]=DEC2BCD(day);
write_riqi(8,day);
write_com(0x80+9);
}
if(sfcount==6) //???
{
month++;
if(month==13)
month=1;
time1[4]=DEC2BCD(month);
write_riqi(5,month);
write_com(0x80+6);
}
if(sfcount==7) //???
{
year++;
if(year==100)
year=9;
time1[6]=DEC2BCD(year);
write_riqi(2,year);
write_com(0x80+3);
}
}
}
}
void delay(uint a)
{
uint i,j;
for(j=a;j>0;j--)
for(i=250;i>0;i--) ;
}
|