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

📄 ds1302.c

📁 时钟芯片ds1302的程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: ds1302.c
**创   建   人: 
**创 建 日  期: 
**最后修改日期: 
**描        述: 中断处理初始化及中断处理 
********************************************************************************************************/
#define _DS1302_C_

#include "Intrins.h"
#include "reg51.h"
#include "DS1302.h"

sbit T_CLK = P1^1;
sbit T_IO  = P1^2;
sbit T_RST = P1^3;
sbit BIT7  = ACC^7;
sbit BIT0  = ACC^0;

unsigned int *pCurrentTime;			//用于*GetTime()函数中存放读到的时间值
unsigned char CurrentTime[7];		//用于*GetTime()函数中存放读到的时间值
unsigned char i,j,k,x,m,n;			//用于循环次数
unsigned char OutData;				//用于Read1302(unsigned char ucAddress)函数中返回读取的值
unsigned char InitTime[7] = {0x00,0x01,0x01,0x01,0x01,0x01,0x01};
						//   秒   分   时   日   月   星期 年
/****************************************************************************
* 名	称:Initial1302()
* 功	能:DS1302初始化
* 入口参数:无
* 出口参数:无
* 说	明:设置时间初值
****************************************************************************/
#ifdef _INITIAL_1302_
void Initial1302()	
{
	unsigned char wAddress = 0x80;		//秒寄存器写地址
	Write1302(0x8e,0x00);				//将控制寄存器值设为0,最高位WP=0允许写
	for(i=0;i<7;i++)					//将7个时间初值写入对应的寄存器
	{
		Write1302(wAddress,InitTime[i]);
		wAddress += 2;
	}
	Write1302(0x8e,0x80);				//写保护,防止干扰影响时间值	
}
#endif
/****************************************************************************
* 名	称:InputByte(unsigned char InData)
* 功	能:写入一个字节数据
* 入口参数:unsigned char InData
* 出口参数:无
* 说	明:8位数据写入函数
****************************************************************************/
#ifdef _INPUT_BYTE_
InputByte(unsigned char InByte)
{
	ACC = InByte;						//将要写入的数放在ACC中
	for(j=8;j>0;j--)					//循环8次,写入8位数据,从低位到高位
	{
		T_IO = BIT0;					//将ACC的低位放在I/O线上
		_nop_();
		T_CLK = 0;
		T_CLK = 1;						//在时钟线的上升沿写入1位数据
		ACC = ACC >> 1;					//将待写入数据的高位移至ACC^0
	}
}
#endif
/****************************************************************************
* 名	称:OutputByte()
* 功	能:读出一个字节数据
* 入口参数:无
* 出口参数:ACC
* 说	明://8位数据读出函数
****************************************************************************/
#ifdef _OUTPUT_BYTE_
unsigned char OutputByte()				
{
	ACC = 0;
	for(k=8;k>0;k--)
	{
		ACC = ACC >> 1;					//先收到的是低位,所以将其往低位移
		T_CLK = 1;		
		T_CLK = 0;						//时钟下降沿读出1位数据
		BIT7 = T_IO;	
	}
	return ACC;
}
#endif
/****************************************************************************
* 名	称:Write1302()
* 功	能:将指令或数据写入对应的寄存器
* 入口参数:unsigned char Address,unsigned char InData
* 出口参数:无
* 说	明:
****************************************************************************/
#ifdef _WRITE_1302_
void Write1302(unsigned char xAddress,unsigned char InData)
{
	T_CLK = 0;
	T_RST = 0;
	
	T_RST = 1;							//启动数据传送
	_nop_();
	InputByte(xAddress);				//调用写入函数,先写入地址	
	InputByte(InData);					//调用写入函数将指令或数据写入
	T_RST = 0;
	//T_CLK = 1;
}
#endif
/****************************************************************************
* 名	称:Read1302(unsigned char Address)
* 功	能:读出对应寄存器的内容
* 入口参数:unsigned char Address
* 出口参数:OutData
* 说	明:
****************************************************************************/
#ifdef _READ_1302_
unsigned char Read1302(unsigned char dAddress)
{
	T_CLK = 0;
	T_RST = 0;
	T_RST = 1;
	_nop_();
	InputByte(dAddress);				//调用写入函数,先写入地址	
	OutData = OutputByte();
	T_RST = 0;
//	T_CLK = 1;
	return OutData;
}
#endif

/****************************************************************************
* 名	称:GetTime
* 功	能:读取当前时间值
* 入口参数:无
* 出口参数:CurrentTime
* 说	明:
****************************************************************************/
#ifdef _GET_TIME_
unsigned int *GetTime()		
{
	unsigned char rAddress = 0x81;		//秒寄存器读地址
	for(x=0;x<7;x++)
	{
//		*(pCurrentTime + x) = Read1302(rAddress);	//读对应时钟寄存器的值
		CurrentTime[x] = Read1302(rAddress);
		rAddress += 2;
	}
	return pCurrentTime;
}
#endif

/****************************************************************************
* 名	称:Delay10ms()
* 功	能:延时10ms
* 入口参数:无
* 出口参数:无
* 说	明:1us每周期
****************************************************************************/
#ifdef _DELAY_10_MS_
void Delay10ms()		
{
	for(m=20;m>0;m--) 	
	for(n=250;n>0;n--); 	
}
#endif

⌨️ 快捷键说明

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