#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);//寫保護
}
-
單片機
+關注
關注
6055文章
44795瀏覽量
643574
發布評論請先 登錄
相關推薦
51單片機DS1302實時時鐘驅動程序

使用51單片機和DS1302芯片設計的LED時鐘的C語言程序和工程文件

評論