📄 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 + -