DS1302驱动根据数据手册编写
#include<reg51.h>
unsigned char year,month,day,week,hour,min,sec;
sbit RST = P3^7;
sbit IO = P3^4;
sbit SCLK=P3^6;
void DS1302_res()
{
RST=0;
RST=1;
}
unsigned char DS1302_read_bit()
{
unsigned char dat,i;
for(i=0;i<8;i++)
{
SCLK = 1;
SCLK = 0;
dat = dat >> 1;
if(IO)
{
dat = dat | 0x80;
}
}
return dat;
}
void DS1302_write_bit(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
IO = dat & 0x01;
SCLK=0;
SCLK=1;
dat = dat >> 1;
}
}
void DS1302_write(unsigned char address,unsigned char dat)
{
DS1302_res();
DS1302_write_bit(address);
DS1302_write_bit(dat);
}
unsigned char DS1302_read(unsigned char address)
{
unsigned char dat;
DS1302_res();
DS1302_write_bit(address);
dat = DS1302_read_bit();
return dat;
}
unsigned char BCD_TEN(unsigned char dat)
{
unsigned char TEN;
TEN = 0X0F & dat;
dat=dat>>4;
TEN=TEN+dat*10;
return TEN;
}
unsigned char TEN_BCD(unsigned char dat)
{
unsigned char BCD;
BCD = dat % 10;
dat= dat/10;
dat=dat<<4;
BCD=BCD|dat;
return BCD;
}
void get_time()
{
unsigned char date;
date = DS1302_read(0x81);
sec = BCD_TEN(date);
date = DS1302_read(0x83);
min = BCD_TEN(date);
date = DS1302_read(0x85);
hour = BCD_TEN(date);
date = DS1302_read(0x87);
day = BCD_TEN(date);
date = DS1302_read(0x8b);
week = BCD_TEN(date);
date = DS1302_read(0x89);
month = BCD_TEN(date);
date = DS1302_read(0x8d);
year = BCD_TEN(date);
}
void time_write(unsigned char hour,unsigned char min,unsigned char sec,unsigned char year,unsigned char month,unsigned char day)
{
DS1302_write(0x8e,0x00);
DS1302_write(0x84,TEN_BCD(hour));
DS1302_write(0x82,TEN_BCD(min));
DS1302_write(0x80,TEN_BCD(sec));
DS1302_write(0x8c,TEN_BCD(year));
DS1302_write(0x88,TEN_BCD(month));
DS1302_write(0x86,TEN_BCD(day));
DS1302_write(0x8e,0x80);
}