?? ds1302.c.bak
字號:
//**********************************************************************
//功能 : 實時時鐘DS1302操作模塊
//作者 : lihj
//創建日期 : 2004-06-22
//版本 : V1.0
//修改記錄 :
//***********************************************************************
#include <REG51.h>
#define U8 unsigned char
//DS1302-51連接管腳定義
sbit RT_CLK = P1^0; //實時時鐘時鐘線引腳
sbit RT_IO = P1^1; //實時時鐘數據線引腳
sbit ACC0=ACC^0; //累加器A可位尋址
sbit ACC7=ACC^7;
//函數功能: 往DS1302寫入1Byte數據
//輸入參數: <byIn> : 寫入數據
void WriteByte(U8 byIn)
{
U8 i;
ACC = byIn;
for(i=8; i>0; i--) //先寫D0(低位)
{
RT_IO = ACC0;
RT_CLK = 1; //產生一個上升沿
RT_CLK = 0;
ACC = ACC >> 1;
}
}
//函數功能: 從DS1302讀取1Byte數據
//返回參數: 讀出的數據
U8 ReadByte(void)
{
U8 i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = RT_IO;
RT_CLK = 1;
RT_CLK = 0; //產生一個下降沿
}
return(ACC);
}
//函數功能: 往DS1302指定地址內存寫入數據
//輸入參數: <byAddr> : DS1302地址
// <byData> : 要寫的數據
//說 明: 先寫地址,后寫命令/數據
void WrRTC(U8 byAddr, U8 byData)
{
// byAddr |= 0xC0; //D7D6 = 11,表示操作內存
// byAddr &= 0xFE; //D0 = 0,表示寫操作
WriteByte(byAddr); //地址、操作命令
WriteByte(byData); //寫1Byte數據
}
//函數功能: 讀取DS1302指定地址內存的數據
//輸入參數: <byAddr> : DS1302內存單元地址
//返回參數: <byDa> : 讀取的數據
//說明: 先寫地址,后讀命令/數據
U8 RdRTC(U8 byAddr)
{
U8 byData;
// byAddr |= 0xC0; //D7D6 = 11,表示操作內存
// byAddr &= 0xFE; //D0= 1,表示讀操作
WriteByte(byAddr); //地址、操作命令
byData = ReadByte(); //讀1Byte數據
return(byData);
}
//功能: 往DS1302 RAM區寫入數據(多字節方式)
//輸入: <pData>: 寫入數據
//說明: 先寫地址,后寫數據(多字節方式)
void BurstWrRTC(U8 *pData)
{
U8 i;
WrRTC(0x8e,0x00); //寫之前確保去掉寫保護功能
WriteByte(0xfe); //0xfe:多字節寫模式(burst方式)
for (i=31;i>0;i--) //31字節內存單元,從地址0單元的第0位開始寫
{
WriteByte(*pData++); //寫1Byte數據
}
}
//功能: 讀取DS1302 RAM數據(多字節方式)
//輸入: <pData>: 寄存器數據地址
//說明: 先寫地址,后讀命令/數據(寄存器多字節方式)
void BurstRdRTC(U8 *pData)
{
U8 i;
WriteByte(0xff); //0xff:多字節讀模式
for (i=31; i>0; i--) //31Byte 寄存器數據
{
*pData++ = ReadByte(); //讀1Byte數據
}
}
//功能: 往DS1302寫入時鐘數據(多字節方式)
//輸入: <pData>: 時鐘數據地址 格式為: 秒 分 時 日 月 星期 年 控制
// 8Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B 1B
//說明: 先寫地址,后寫數據(多字節方式)
void BurstWrTime(U8 *pData)
{
U8 i;
WrRTC(0x8e,0x00); //寫之前確保去掉寫保護功能
WriteByte(0xbe); //0xbe:時鐘多字節寫命令
for (i=8;i>0;i--) //8Byte = 7Byte 時鐘數據 + 1Byte 控制
{
WriteByte(*pData); //寫1Byte數據
pData++;
}
}
//功能: 讀取DS1302時鐘數據(多字節方式)
//輸入: <pData>: 時鐘數據地址 格式為: 秒 分 時 日 月 星期 年
// 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
//返回值: byData :讀取的數據
//說明: 先寫地址,后讀命令/數據(多字節方式)
void BurstpData(U8 *pData)
{
U8 i;
WriteByte(0xbf); //0xbf:時鐘多字節讀命令
for (i=8; i>0; i--)
{
*pData = ReadByte(); //讀1Byte數據
pData++;
}
}
//功能: 寫時鐘(按字節方式),實際作用同Burst方式寫時鐘函數
//輸入: <pData>: 初始時間地址。初始時間格式為: 秒 分 時 日 月 星期 年
// 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
void WrTime(U8 *pData)
{
U8 i;
U8 byAddr = 0x80; //秒寄存器地址,D0=0:寫操作
WrRTC(0x8e,0x00); //寫之前確保去掉寫保護功能
for(i =7;i>0;i--)
{
WrRTC(byAddr,*pData); //秒 分 時 日 月 星期 年
pData++;
byAddr +=2;
}
WrRTC(0x8e,0x80); //寫保護
}
//輸入: <pData>: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年
//7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B
//功能: 讀取DS1302當前時間
void RdTime(U8 *pData)
{
U8 i;
U8 byAddr = 0x81; //秒寄存器地址,D0=1,讀操作
for (i=0;i<7;i++)
{
pData[i] = RdRTC(byAddr);//格式為: 秒 分 時 日 月 星期 年
byAddr += 2;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -