当前位置:文档之家› DS1302时钟程序

DS1302时钟程序

/***************************************************/
/*********** DS1302时钟程序 *****************/
/***************************************************/
#include
#define uchar unsigned char
/***********************引脚接线图****************/
sbit ds1302_clk=P1^0;
sbit ds1302_dat=P1^1;
sbit ds1302_rst=P1^2;
uchar address;
sbit ACC_0=ACC^0;
sbit ACC_1=ACC^1;
sbit ACC_2=ACC^2;
sbit ACC_3=ACC^3;
sbit ACC_4=ACC^4;
sbit ACC_5=ACC^5;
sbit ACC_6=ACC^6;
sbit ACC_7=ACC^7;

/***********************函数说明****************/
void Read(void);
void Write(void);
uchar ReadRam_B(uchar address);
uchar ReadRTC_B(uchar address);
uchar WriteRam_B(uchar address,uchar number);
uchar WriteRTC_B(uchar address,uchar number);
void ReadRam(uchar data*buffer,uchar size);
void ReadRTC(uchar data*buffer,uchar size);
void ReadRam(uchar data*buffer,uchar size);
void ReadRTC(uchar data*buffer,uchar size);
uchar ReadSec(void);
uchar ReadMin(void);
uchar ReadHr(void);
uchar ReadDay(void);
uchar ReadMonth(void);
uchar ReadWeek(void);
uchar ReadYear(void);

void WriteSec(uchar number);
void WriteMin(uchar number);
void WriteHr(uchar number);
void WriteDay(uchar number);
void WriteMonth(uchar number);
void WriteWeek(uchar number);
void WriteYear(uchar number);
void WriteControl(uchar number);
void EnableWP(void);
void DisableWP(void);

void Write(void) //写DS1302操作
{
ACC =address;
ACC <<=1;
ACC|=0x80;
ds1302_dat = ACC_0;
ds1302_clk = 1;
ds1302_clk = 0;
ds1302_dat = ACC_1;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat =ACC_2;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat =ACC_3;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat =ACC_4;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat =ACC_5;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat =ACC_6;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat =ACC_7;
ds1302_clk = 1; ds1302_clk = 0;

}

void Read(void) //读DS1302操作
{
ACC_0=ds1302_dat;
ds1302_clk = 1;
ds1302_clk = 0;
ACC_1=ds1302_dat;
ds1302_clk = 1;ds1302_clk = 0;
ACC_2=ds1302_dat;
ds1302_clk = 1;ds1302_clk = 0;
ACC_3=ds1302_dat;
ds1302_clk = 1;ds1302_clk = 0;
ACC_4=ds1302_dat;
ds1302_clk = 1;ds1302_clk = 0;
ACC_5=ds1302_dat;
ds1302_clk = 1;ds1302_clk = 0;
ACC_6=ds1302_dat;
ds1302_clk = 1;ds1302_clk = 0;
ACC_7=ds1302_dat;
ds1302_res = 0;ds1302_clk = 1;
}

uchar ResdRam_B(uchar address) //从RAM中读出一字节
{
ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
ACC=address;
Write();
ds1302_dat=1;
Read();
retum Acc;
}

uchar ResdRTC_B(uchar address) //从DS1302中读出一字节
{
ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
ACC=address;
Write();
ds1302_dat=1;
Read();
retur Acc;
}

uchar WriteRam_B(uchar address,uchar number) //向DS1302中写入一字节
{
ds1302_clk=0; ds1302_rst=0;ds1302_rst=1;
ACC=

address;
Write();
ACC=number;
Write();
ds1302_rst=0;
ds1302_clk=1;
}

void ReadRam(uchar data*buffer,uchar size)//从RAM中读出多字节
{
register uchar a,b;
ds1302_clk=0;
ds1302_rst=0;
ds1302_rst=1;
ACC=0xff;
Write();
ds1302_dat=1;
for(a=0;a{
ACC_0=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_1=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_2=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_3=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_4=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_5=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_6=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_7=ds1302_dat;

b=ACC;
*(buffer+a)=b;
ds1302_clk=1;ds1302_clk=0;
}
ds1302_rst=0;ds1302_clk=1;
}
void ReadRTC(uchar data*buffer,uchar size)
{
register uchar a,b;
ds1302_clk=0;
ds1302_rst=0;
ds1302_rst=1;
ACC=0xbf;
Write();
ds1302_dat=1;
for(a=0;a{
ACC_0=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_1=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_2=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_3=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_4=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_5=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_6=ds1302_dat;
ds1302_clk=1;ds1302_clk=0;ACC_7=ds1302_dat;

b=ACC;
*(buffer+a)=b;
ds1302_clk=1;ds1302_clk=0;
}
ds1302_rst=0;
ds1302_clk=1;
}
void WriteRam(rchar data*buffer,uchar size)
{
register uchar a;
ds1302_clk=0;
ds1302_rst=0;
ds1302_rst=1;
ACC=0xfe;
Write();
for(a=0;a{
ACC = *(buffer+a);
Write();
}
ds1302_rst=0;
ds1302_clk=1;
}
void WriteRTC(uchar data*buffer,uchar size)
{ //注意:连续写DS1302只能是8字节一起写
register uchar a;
ds1302_clk=0;
ds1302_rst=0;
ds1302_rst=1;
ACC=0xfb;
Write();
for(a=0;a{
ACC = *(buffer+a);
Write();
}
ds1302_rst=0;
ds1302_clk=1;

}
uchar ReadSec(void)
{
return ReadRTC_B(0x81);
}
uchar ReadMin(void)
{
return ReadRTC_B(0x83);
}
uchar ReadHr(void)
{return ReadRTC_B(0x85);}

uchar ReadDay(void)
{return ReadRTC_B(0x87);}

uchar ReadMonth(void)
{return ReadRTC_B(0x89);}

uchar ReadWeek(void)
{return ReadRTC_B(0x8B);}

uchar ReadYear(void)
{return ReadRTC_B(0x8D);}

void WriteScc(uchar number)
{WriteRTC_B(0x80,number);}

void WriteMin(uchar number)
{WriteRTC_B(0x82,number);}

void WriteHr(uchar number)
{WriteRTC_B(0x84,number);}

void WriteDay(uchar number)
{WriteRTC_B(0x86,number);}

void WriteMonth(uchar number)
{WriteRTC_B(0x88,number);}

void WriteWeek(uchar number)
{WriteRTC_B(0x8A,number);}

void WriteYeay(uchar number)
{WriteRTC_B(0x8C,number);}

void WriteControl(uchar number)
{WriteRTC_B(0x90,number);}

void DisableWP(void)
{WriteRTC_B(0x8E,0);}

void EnableWP(void)
{WriteRTC_B(0x8E,0x80);}

void main(void) //

主程序
{
uchar sec,min,hr,day,month,week,year,number;
uchar data buffer1[32] =
{32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
uchar data buffer2[8]={45,45,15,13,3,2,01,0};
ReadRTC(buffer2,8);
DisableWP();
WriteControl(0xaa);
WriteRam(buffer1,31);
ReadRTC(buffer2,8);
EnableWP();
ReadRam(buffer1,31);
ReadRTC(buffer2,8);
sec=ReadSec();
min=ReadHr();
day=ReadDay();
month=readMonth();
week=ReadWeek();
year=Read Year();
ACC=0;
}

相关主题
文本预览
相关文档 最新文档