#include"REG51.H"
#include"INTRINS.H"
typedefunsignedcharBYTE;
sbitSCLK=P1^0;//DS1302時鐘口P1.0
sbitIO=P1^1;//DS1302數(shù)據(jù)口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)
不同的工作環(huán)境,需要調(diào)整此函數(shù)
此延時函數(shù)是使用1T的指令周期進行計算,與傳統(tǒng)的12T的MCU不同
**************************************/
voidDelay()
{
_nop_();
_nop_();
}
/**************************************
從DS1302讀1字節(jié)數(shù)據(jù)
**************************************/
BYTEDS1302_ReadByte()
{
BYTEi;
BYTEdat=0;
for(i=0;i<8;i++)//8位計數(shù)器
{
SCLK=0;//時鐘線拉低
Delay();//延時等待
dat>>=1;//數(shù)據(jù)右移一位
if(IO)dat|=0x80;//讀取數(shù)據(jù)
SCLK=1;//時鐘線拉高
Delay();//延時等待
}
returndat;
}
/**************************************
向DS1302寫1字節(jié)數(shù)據(jù)
**************************************/
voidDS1302_WriteByte(BYTEdat)
{
chari;
for(i=0;i<8;i++)//8位計數(shù)器
{
SCLK=0;//時鐘線拉低
Delay();//延時等待
dat>>=1;//移出數(shù)據(jù)
IO=CY;//送出到端口
SCLK=1;//時鐘線拉高
Delay();//延時等待
}
}
/**************************************
讀DS1302某地址的的數(shù)據(jù)
**************************************/
BYTEDS1302_ReadData(BYTEaddr)
{
BYTEdat;
RST=0;
Delay();
SCLK=0;
Delay();
RST=1;
Delay();
DS1302_WriteByte(addr);//寫地址
dat=DS1302_ReadByte();//讀數(shù)據(jù)
SCLK=1;
RST=0;
returndat;
}
/**************************************
往DS1302的某個地址寫入數(shù)據(jù)
**************************************/
voidDS1302_WritEDAta(BYTEaddr,BYTEdat)
{
RST=0;
Delay();
SCLK=0;
Delay();
RST=1;
Delay();
DS1302_WriteByte(addr);//寫地址
DS1302_WriteByte(dat);//寫數(shù)據(jù)
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);//寫保護
}
STC單片機控制DS1302 (1TMCU C程序)