⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c.bak

📁 51单片机和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 + -