#include"REG51.H"
#include"INTRINS.H"
typedefunsignedcharBYTE;
sbitSCLK=P1^0;//DS1302时钟口P1.0
sbitIO=P1^1;//DS1302数据口P1.1
sbitRST=P1^2;//DS1302片选口P1.2
//秒分时日月星期年
BYTEcodeinit[]={0x00,0x00,0x20,0x01,0x01,0x05,0x10};
BYTEdatanow[7];
voidDS1302_Initial();
voidDS1302_SetTime(BYTE*p);
voidDS1302_GetTime(BYTE*p);
voidmain()
{
DS1302_Initial();//初始化DS1302
DS1302_SetTime(init);//设置初始时间
DS1302_GetTime(now);//读取当前时间
while(1);
}
/**************************************
延时X微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
voidDelay()
{
_nop_();
_nop_();
}
/**************************************
从DS1302读1字节数据
**************************************/
BYTEDS1302_ReadByte()
{
BYTEi;
BYTEdat=0;
for(i=0;i>=1;//数据右移一位
if(IO)dat|=0x80;//读取数据
SCLK=1;//时钟线拉高
Delay();//延时等待
}
returndat;
}
/**************************************
向DS1302写1字节数据
**************************************/
voidDS1302_WriteByte(BYTEdat)
{
chari;
for(i=0;i>=1;//移出数据
IO=CY;//送出到端口
SCLK=1;//时钟线拉高
Delay();//延时等待
}
}
/**************************************
读DS1302某地址的的数据
**************************************/
BYTEDS1302_ReadData(BYTEaddr)
{
BYTEdat;
RST=0;
Delay();
SCLK=0;
Delay();
RST=1;
Delay();
DS1302_WriteByte(addr);//写地址
dat=DS1302_ReadByte();//读数据
SCLK=1;
RST=0;
returndat;
}
/**************************************
往DS1302的某个地址写入数据
**************************************/
voidDS1302_WritEDAta(BYTEaddr,BYTEdat)
{
RST=0;
Delay();
SCLK=0;
Delay();
RST=1;
Delay();
DS1302_WriteByte(addr);//写地址
DS1302_WriteByte(dat);//写数据
SCLK=1;
RST=0;
}
/**************************************
写入初始时间
**************************************/
voidDS1302_SetTime(BYTE*p)
{
BYTEaddr=0x80;
BYTEn=7;
DS1302_WriteData(0x8e,0x00);//允许写操作
while(n--)
{
DS1302_WriteData(addr,*p++);
addr+=2;
}
DS1302_WriteData(0x8e,0x80);//写保护
}
/**************************************
读取当前时间
**************************************/
voidDS1302_GetTime(BYTE*p)
{
BYTEaddr=0x81;
BYTEn=7;
while(n--)
{
*p++=DS1302_ReadData(addr);
addr+=2;
}
}
/**************************************
初始化DS1302
**************************************/
voidDS1302_Initial()
{
RST=0;
SCLK=0;
DS1302_WriteData(0x8e,0x00);//允许写操作
DS1302_WriteData(0x80,0x00);//时钟启动
DS1302_WriteData(0x90,0xa6);//一个二极管+4K电阻充电
DS1302_WriteData(0x8e,0x80);//写保护
}