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

📄 ds1302.c

📁 串行时钟芯片DS1302的c语言程序
💻 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 + -