#include"REG51.H"
#include"INTRINS.H"
typedefunsignedcharBYTE;
sbitSCLK=P1^0;//DS1302時(shí)鐘口P1.0
sbitIO=P1^1;//DS1302數(shù)據(jù)口P1.1
sbitRST=P1^2;//DS1302片選口P1.2
//秒分時(shí)日月星期年
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);//設(shè)置初始時(shí)間
DS1302_GetTime(now);//讀取當(dāng)前時(shí)間
while(1);
}
/**************************************
延時(shí)X微秒(STC12C5A60S2@12M)
不同的工作環(huán)境,需要調(diào)整此函數(shù)
此延時(shí)函數(shù)是使用1T的指令周期進(jìn)行計(jì)算,與傳統(tǒng)的12T的MCU不同
**************************************/
voidDelay()
{
_nop_();
_nop_();
}
/**************************************
從DS1302讀1字節(jié)數(shù)據(jù)
**************************************/
BYTEDS1302_ReadByte()
{
BYTEi;
BYTEdat=0;
for(i=0;i>=1;//數(shù)據(jù)右移一位
if(IO)dat|=0x80;//讀取數(shù)據(jù)
SCLK=1;//時(shí)鐘線拉高
Delay();//延時(shí)等待
}
returndat;
}
/**************************************
向DS1302寫1字節(jié)數(shù)據(jù)
**************************************/
voidDS1302_WriteByte(BYTEdat)
{
chari;
for(i=0;i>=1;//移出數(shù)據(jù)
IO=CY;//送出到端口
SCLK=1;//時(shí)鐘線拉高
Delay();//延時(shí)等待
}
}
/**************************************
讀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的某個(gè)地址寫入數(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;
}
/**************************************
寫入初始時(shí)間
**************************************/
voidDS1302_SetTime(BYTE*p)
{
BYTEaddr=0x80;
BYTEn=7;
DS1302_WriteData(0x8e,0x00);//允許寫操作
while(n--)
{
DS1302_WriteData(addr,*p++);
addr+=2;
}
DS1302_WriteData(0x8e,0x80);//寫保護(hù)
}
/**************************************
讀取當(dāng)前時(shí)間
**************************************/
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);//時(shí)鐘啟動(dòng)
DS1302_WriteData(0x90,0xa6);//一個(gè)二極管+4K電阻充電
DS1302_WriteData(0x8e,0x80);//寫保護(hù)
}
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634633
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論