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