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

📄 clock-1302.c

📁 时钟芯片驱动程序
💻 C
字号:
/*=========================================================
  *				开发环境:Keil uVision3					*
  *				软件名称:					*
  *				开发日期:2007/1/10						*
  *				开 发 者:LPC							*
=========================================================*/
/*加入头文件*/
#include<W77C32.h>											//W77E58头文件
#include<intrins.h>											//
#include<stdio.h>											//
#include<stdlib.h>											//
#include<TYPE.H>											//声明定义
#include<OUTTYPE.H>											//声明字库
#include<INCLUDES.H>										//声明所有子函数
//=======================================================//
/*****************实时时钟函数开始************************/
//=======================================================//

/*=========================================================
函数名:DS1302_EN()
功能:时钟芯片使能函数
入口参数:无
出口参数:无
=========================================================*/
void DS1302_EN(void)
{
	DS1302_CS=0;											//释放时钟芯片
	DS1302_CLK=0;											//时钟芯片使能时时钟信号必须为低
	DS1302_CS=1;											//时钟芯片使能
}

/*=========================================================
函数名:DS1302_UN()
功能:时钟芯片释放函数
入口参数:无
出口参数:无
=========================================================*/
void DS1302_UN(void)
{
	DS1302_CLK=1;											//释放时钟
	DS1302_CS=0;											//释放时钟芯片
}

/*=========================================================
函数名:DS1302_ReadByte()
功能:时钟芯片读字节函数
入口参数:无
出口参数:读出数据(1字节)
说明:读出数据在时钟下降沿
=========================================================*/
Uchar DS1302_ReadByte(void)
{
	Uchar i,TByte;											//声明变量
	for(i=0;i<8;i++)
	{
		TByte>>=1;											//接收数据右移1位
		DS1302_CLK=0;										//时钟低
		if(DS1302_IO)
		{
			TByte|=0x80;									//第一位置高
		}
		else
		{
			TByte&=0x7F;									//第一位拉低
		}
		DS1302_CLK=1;										//时钟高
	}
	return TByte;											//返回读出数据
}

/*=========================================================
函数名:DS1302_WriteByte()
功能:时钟芯片写字节函数
入口参数:读出数据(1字节)
出口参数:无
说明:数据在CLK上升沿写入
=========================================================*/
void DS1302_WriteByte(Uchar TByte)
{
	Uchar i;												//声明变量
	for(i=0;i<8;i++)
	{
		DS1302_CLK=0;										//拉低时钟
		if(TByte&0x01)
		{
			DS1302_IO=1;									//写入数据位放在数据口
		}
		else
		{
			DS1302_IO=0;									//写入数据位放在数据口
		}
		DS1302_CLK=1;										//输出数据
		TByte>>=1;											//数据右移移位
	}
}

/*=========================================================
函数名:DS1302_WriteTime()
功能:向时钟芯片写数据函数
入口参数:写入地址(1字节)、写入数据/命令(1字节)
出口参数:无
=========================================================*/
void DS1302_WriteTime(Uchar Addrs,Uchar Con_Dat)
{
	DS1302_EN();											//时钟芯片使能
	DS1302_WriteByte(Addrs);								//写寄存器地址
	DS1302_WriteByte(Con_Dat);								//写指令/数据
	DS1302_UN();											//释放时钟芯片
}

/*=========================================================
函数名:DS1302_ReadTime()
功能:读出时钟芯片数据函数
入口参数:写入地址(1字节)
出口参数:读出数据(1字节)
=========================================================*/
Uchar DS1302_ReadTime(Uchar Addrs)
{
	Uchar r;												//声明变量
	DS1302_EN();											//时钟芯片使能
	DS1302_WriteByte(Addrs);								//写寄存器地址
	r=DS1302_ReadByte();									//读出数据
	DS1302_UN();											//释放时钟芯片
	return r;												//返回数据
}

/*=========================================================
函数名:DS1302_ReadTimeBurst()
功能:连续读出时钟芯片数据函数
入口参数:无
出口参数:无(读出数据(9字节))
=========================================================*/
void DS1302_ReadTimeBurst(void)
{
	Uchar i;												//声明临时变量
	DS1302_EN();											//时钟芯片使能
	DS1302_WriteByte(0xBF);									//发送连续读指令
	for(i=0;i<8;i++)
	{
		Time[i]=DS1302_ReadByte();							//读出数据
	}
	DS1302_UN();											//释放时钟芯片
}

/*=========================================================
函数名:DS1302_WriteTimeBurst()
功能:连续写入时钟芯片时钟数据函数
入口参数:无
出口参数:无
=========================================================*/
void DS1302_WriteTimeBurst(void)
{
	Uchar i;												//声明临时变量
	DS1302_EN();											//时钟芯片使能
	DS1302_WriteByte(0xBE);									//发送连续写指令
	for(i=0;i<8;i++)
	{
		DS1302_WriteByte(Time[i]);							//写入数据
	}
	DS1302_UN();											//释放时钟芯片
}

/*=========================================================
函数名:DS1302_Init()
功能:时钟芯片初始化函数
入口参数:无
出口参数:无
=========================================================*/
void DS1302_Init(void)
{
	Uchar Sd;												//声明变量
	Sd=DS1302_ReadTime(0x81);								//读秒状态寄存器
	if(Sd&0x80)
	{
		DS1302_WriteTime(0x8E,0x00);						//DS1302写使能
		DS1302_WriteTime(0x80,0x00);						//写起始秒数据
		DS1302_WriteTime(0x82,0x00);						//写起始分数据
		DS1302_WriteTime(0x84,0x09);						//写起始时数据
		DS1302_WriteTime(0x86,0x01);						//写起始日数据
		DS1302_WriteTime(0x88,0x05);						//写起始月数据
		DS1302_WriteTime(0x8A,0x04);						//写起始周数据
		DS1302_WriteTime(0x8C,0x08);						//写起始年数据
		DS1302_WriteTime(0x90,0xAA);						//配置充电寄存器
		DS1302_WriteTime(0x8E,0x80);						//关闭DS1302写使能
	}
}

//=======================================================//
/*****************实时时钟函数结束************************/
//=======================================================//

⌨️ 快捷键说明

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