📄 ds1302.c
字号:
#include <REG51.H>
#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
sbit T_IO = P1^5; /*实时时钟数据线引脚 */
sbit T_RST = P1^3; /*实时时钟复位线引脚 */
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x81
#define DS1302_MINUTE 0x83
#define DS1302_HOUR 0x85
#define DS1302_WEEK 0x8B
#define DS1302_DAY 0x87
#define DS1302_MONTH 0x89
#define DS1302_YEAR 0x8D
#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
/*--------------------------
往DS1302写入1Byte数据
--------------------------*/
void v_WTInputByte(uchar ucDa)
{
uchar k;
ACC = ucDa;
for(k=8; k>0; k--)
{
T_IO = ACC0;
T_CLK = 1;
T_CLK = 0;
ACC >>= 1;
}
}
/*--------------------------
从DS1302读取1Byte数据
--------------------------*/
uchar uc_RTOutputByte(void)
{
uchar k;
for(k=8; k>0; k--)
{
ACC>>=1;
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/*--------------------------
往DS1302写入数据
--------------------------*/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
v_WTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/*--------------------------
读取DS1302某地址的数据
--------------------------*/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucDa);
}
/*--------------------------
往DS1302写入时钟数据(多字节方式)
--------------------------*/
/*void v_BurstW1302T(uchar *pSecDa)
{
uchar k;
v_W1302(0x8e,0x00); //* 控制命令,WP=0,写操作?
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(0xbe); //* 0xbe:时钟多字节写命令
for (k=8;k>0;k--) //*8Byte = 7Byte 时钟数据 + 1Byte 控制
{
v_WTInputByte(*pSecDa);//* 写1Byte数据
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}*/
/*--------------------------
读取DS1302时钟数据
--------------------------*/
/*void v_BurstR1302T(uchar *pSecDa)
{
uchar k;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(0xbf); //* 0xbf:时钟多字节读命令
for (k=8; k>0; k--)
{
*pSecDa = uc_RTOutputByte(); //* 读1Byte数据
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}*/
/*--------------------------
往DS1302寄存器数写入数据(多字节方式)
--------------------------*/
/*void v_BurstW1302R(uchar *pReDa)
{
uchar k;
v_W1302(0x8e,0x00); //* 控制命令,WP=0,写操作?
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(0xfe); //* 0xbe:时钟多字节写命令
for (k=31;k>0;k--) //*31Byte 寄存器数据
{
v_WTInputByte(*pReDa); //* 写1Byte数据
pReDa++;
}
T_CLK = 1;
T_RST =0;
}*/
/*--------------------------
读取DS1302寄存器数据
--------------------------*/
/*void v_BurstR1302R(uchar *pReDa)
{
uchar k;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_WTInputByte(0xff); //* 0xbf:时钟多字节读命令
for (k=31; k>0; k--) //*31Byte 寄存器数据
{
*pReDa = uc_RTOutputByte(); //* 读1Byte数据
pReDa++;
}
T_CLK = 1;
T_RST =0;
}*/
/*--------------------------
设置初始时间
--------------------------*/
void v_Set1302(uchar *pSecDa)
{
uchar k;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); // 控制命令,WP=0,写操作
for(k = 7; k>0; k--)
{
v_W1302(ucAddr,*pSecDa); //秒 分 时 日 月 星期 年
pSecDa++;
ucAddr += 2;
}
v_W1302(0x8e,0x80); // 控制命令,WP=1,写保护
}
/*--------------------------
读取DS1302当前时间
--------------------------*/
void v_Get1302(SYSTEMTIME *Time)
{
uchar readvalue;
readvalue = uc_R1302(DS1302_SECOND);
Time->Second = ((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue = uc_R1302(DS1302_MINUTE);
Time->Minute = ((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue = uc_R1302(DS1302_HOUR);
Time->Hour = ((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue = uc_R1302(DS1302_DAY);
Time->Day = ((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue = uc_R1302(DS1302_WEEK);
Time->Week = ((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue = uc_R1302(DS1302_MONTH);
Time->Month = ((readvalue&0x70)>>4)*10+(readvalue&0x0f);
readvalue = uc_R1302(DS1302_YEAR);
Time->Year = ((readvalue&0x70)>>4)*10+(readvalue&0x0f);
}
void DateToStr(SYSTEMTIME *Time)
{
Time->DateString[0] = Time->Year/10 + '0';
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
}
void TimeToStr(SYSTEMTIME *Time)
{
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
Time->DateString[8] = '\0';
}
/*--------------------------
初始化DS1302
--------------------------*/
void Init1302(void)
{
v_W1302(0x8e,0x00); //控制写入WP=0
v_W1302(0x90,0xa5);
v_W1302(0x80,0x00); //秒
v_W1302(0x82,0x29); //分
v_W1302(0x84,0x21); //时
v_W1302(0x86,0x01); //日
v_W1302(0x88,0x04); //月
v_W1302(0x8a,0x03); //星期
v_W1302(0x8c,0x08); //年
v_W1302(0x8e,0x80);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -