📄 ds1302.h
字号:
#ifndef DS1302_H
#define DS1302_H
#include<reg52.h>
/******************************************************************
IO口宏定义
*******************************************************************/
sbit T_CLK=P3^0;
sbit T_IO=P3^1;
sbit T_RST=P3^2;
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;
unsigned char hour_sound=0; //闹钟数据 小时
unsigned char minute_sound=0; //闹钟数据 分钟
/************************************************************************
函 数 名:RTInputByte
功 能:实时时钟写一字节
入口参数:无
返 回 值:无
***************************************************************************/
void RTInputByte(unsigned char d)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC 十进制数据
*******************************************************/
unsigned char RTOutputByte(void)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据是十进制
***********************************************************************/
void W1302(unsigned char ucAddr, unsigned char ucData)
{ unsigned char temp1,temp2;
temp1=(ucData/10)*16;
temp2=ucData%10;
ucData=temp1+temp2;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucData); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
:
***********************************************************************/
unsigned char R1302(unsigned char ucAddr)
{
unsigned char ucData,temp,temp2;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
temp=(ucData>>4)*10 ;
temp2 =ucData&0x0f;
temp=temp+temp2 ;
return(temp);
}/********************************************************************
*
* 名称: v_BurstW1302T
* 说明: 先写地址,后写数据(时钟多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: v_RTInputByte()
***********************************************************************/
void v_BurstW1302T(unsigned char *pSecDa)
{
unsigned char i;
unsigned char ucddr=0x80;
W1302(0x8e,0x00);//控制命令 wp=0,写操作 写入8个0;
for(i=7;i>0;i--)
{
W1302(ucddr,*pSecDa);
pSecDa++;
ucddr+=2;
}
W1302(0x8e,0x80);
}
/********************************************************************
*
* 名称: v_BurstR1302T
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输出: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
***********************************************************************/
void v_BurstR1302T(unsigned char *pSecDa)
{
unsigned char i;
unsigned char ucddr=0x81;
W1302(0x8e,0x00);
for(i=0;i<7;i++)
{
pSecDa[i]=R1302(ucddr);
ucddr+=2;
}
}
void init_1302()
{
unsigned char print[7]={0,0,3,8,11,4,7};
v_BurstW1302T(print);
}
/************************************************************************
闹钟检测函数
若到了闹钟设定的时间就返回1
*************************************************************************/
unsigned char reach_time() //闹钟 +日程表提醒;
{ unsigned char print[7], k=0;
v_BurstR1302T(print);
if((print[2]==hour_sound)&&(print[1]==minute_sound))
{
k=1;
}
return k;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -