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

📄 ds1302.c

📁 万年历代码
💻 C
字号:
//******************************************************
//文 件 名:Drive.c
//功能描述:提供时钟芯片DS1302的底层源码
//IDE 环境:凌阳u'nSP IDE 2.0.0
//单 片 机:凌阳SPCE061A
//硬件连接:Drive中硬件连接如:
//				DS1302的片选线(/RST)	接IOA15
//				DS1302的数据线(I/O)	接IOA14  
//				DS1302的时钟线(CLK)	接IOA13 
//
//使用说明:本文件为凌阳SPCE061A上接DS1302的驱动程序
//			使用时不用改动函数的任何部分
//			只需改动下面的宏定义中的IO口即可
//
//作    者:山东大学曹香鹏xpstudio
//维护记录:2006.07.19	文件创建
//			2006.07.20	调试成功
//****************************************************
#define		P_IOA_Data				(volatile unsigned int *)0x7000
#define		P_IOA_Buffer			(volatile unsigned int *)0x7001
#define		P_IOA_Dir				(volatile unsigned int *)0x7002
#define		P_IOA_Attrib			(volatile unsigned int *)0x7003
#define		P_IOA_Latch				(volatile unsigned int *)0x7004

//位操作宏定义,使用时只需修改以下宏定义即可
#define		set_RST		*P_IOA_Data|=0x8000	//RST=1
#define		clr_RST		*P_IOA_Data&=0x7fff	//RST=0

#define		set_IO		*P_IOA_Data|=0x4000	//IO=1
#define		clr_IO		*P_IOA_Data&=0xbfff	//IO=0

#define		set_CLK		*P_IOA_Data|=0x2000	//CLK=1
#define		clr_CLK		*P_IOA_Data&=0xdfff	//CLK=0

/******************************向DS1302写入1B数据***********************
* 名称: void InputByte(unsigned int data)
* 功能: 向DS1302写入1B的指令或数据(内部函数)
* 调用: 无
* 输入: data
* 返回值: 无
* 作者:山东大学曹香鹏xpstudio
* 时间:2006.07.20
***********************************************************************/
void InputByte(unsigned int data)
{		//向DS1302写入1B数据(内部函数)
	int i;
	unsigned int temp;
	temp=data;//ACC
	for(i=8;i>0;i--)
	{
		if(temp&1)	set_IO;//IO=ACC0
			else	clr_IO;
		set_CLK;//CLK=1	
		clr_CLK;//CLK=0	
		temp>>=1;
	}//for
}
/*****************************从DS1302读出1B数据************************
* 名称: OutputByte()
* 功能: 从DS1302读出1B数据(内部函数)
* 调用: 无
* 输入: 无
* 返回值: 1B数据
* 作者:山东大学曹香鹏xpstudio
* 时间:2006.07.20
***********************************************************************/
unsigned int OutputByte()
{		//从DS1302读出1B数据(内部函数)
	int i;
	unsigned int temp=0;

	//设IOA14为输入口
	*P_IOA_Dir&=0xbfff;

	for(i=8;i>0;i--)
	{
		temp>>=1;
		temp&=0x7fff;
		if(*P_IOA_Data&0x4000)temp+=0x8000;//
		set_CLK;//CLK=1		
		clr_CLK;//CLK=0	

	}//for
		
	//将IOA14改回输出口
	*P_IOA_Dir|=0x4000;
	
	temp>>=8;
	temp&=0x00ff;
	return temp;
}
/*******************************向DS1302写入指令或数据*******************
* 名称: void WR1302(unsigned int add,unsigned int data)
* 功能: 向DS1302写入以add为地址的data数据
* 调用: void InputByte(unsigned int data)
* 输入: add,data
* 返回值: 无
* 作者:山东大学曹香鹏xpstudio
* 时间:2006.07.20
***********************************************************************/
void WR1302(unsigned int add,unsigned int data)
{//add 为写入数据的地址,data为要写入的数据----写入单个的数据
	
	clr_RST;//RST=0		
	clr_CLK;//CLK=0
	set_RST;//RST=1,启动数据传输
	
	InputByte(add);
	InputByte(data);
	
	clr_RST;//RST=0	
}
/******************************读DS1302里对应寄存器的数据***************
* 名称: unsigned int RE1302(unsigned int add)
* 功能: 从DS1302读出以add为地址的数据
* 调用: void InputByte(unsigned int data)
		unsigned int OutputByte()
* 输入: add
* 返回值: temp
* 作者:山东大学曹香鹏xpstudio
* 时间:2006.07.20
***********************************************************************/
unsigned int RE1302(unsigned int add)
{//add 为写入数据的地址,data为要写入的数据
	unsigned int temp;
	
	clr_RST;//RST=0		
	clr_CLK;//CLK=0
	set_RST;//RST=1,启动数据传输
	
	InputByte(add);//写入地址
	temp=OutputByte();
	
	clr_RST;//RST=0	
	
	return temp;
}
/******************************设置DS1302的初始时间*********************
* 名称: void SET1302(unsigned int* pClock)
* 功能: 设置DS1302的初始时间,pClock寄存器的顺序为:秒,分,时,日,月,周,年,为BCD码形式
* 调用:void WR1302(unsigned int add,unsigned int data)
* 输入: pClock
* 返回值: 无
* 作者:山东大学曹香鹏xpstudio
* 时间:2006.07.20
***********************************************************************/
void SET1302(unsigned int* pClock)
{	//入口条件:pClock寄存器的顺序为:秒,分,时,日,月,周,年
	//			为BCD码的形式
	int i;
	unsigned int add=0x80;
	WR1302(0x80,0x00);//将控制寄存器设为0,最高位WP=0,DS1302允许写入
	
	for(i=0;i<7;i++)//将七个初始值依次写入对应的七个寄存器
	{
		WR1302(add,*pClock);
		pClock++;
		add+=2;
	}
	
	WR1302(0x8e,0x80);//写保护,防止干扰
		
}
/******************************读取DS1302的初始时间*********************
* 名称: void GET1302(unsigned int* cur_time)
* 功能: 记取DS1302的当前时间,
		cur_time寄存器的顺序为:秒,分,时,日,月,周,年
		数据数组为BCD码形式
* 调用:unsigned int RE1302(unsigned int add)
* 输入:cur_time
* 返回值: cur_time数组值
* 作者:山东大学曹香鹏xpstudio
* 时间:2006.07.20
***********************************************************************/
void GET1302(unsigned int* cur_time)
{	//出口条件:cur_time数组的顺序为:秒,分,时,日,月,周,年
	//			为BCD码的形式
	int i;
	unsigned int add=0x81;
	
	for(i=0;i<7;i++)//将七个初始值依次写入对应的七个寄存器
	{
		cur_time[i]=RE1302(add);
		add+=2;
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -