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

📄 ds1302.c

📁 多功能电子数字钟的设计 带语音报时功能 比赛做的
💻 C
字号:
/*********************************************************************

模块名称:dS1302.c
功    能:实时时钟模块           时钟芯片型号:dS1302 
说    明:
*********************************************************************/
#include"includes.h"
//unsigned char ucCurtime[7];   /*读取当前7字节
/**************函数声明***********************/

static void InputByte1302(unsigned char d);
static unsigned char OutputByte1302(void);
static void W1302(unsigned char ucAddr, unsigned char ucda);
static unsigned char R1302(unsigned char ucAddr); 
/******************************************************************** 

函 数 名:ds1302_init()
功    能:DS1302初始化
说    明:DS1302初始化函数
入口参数:无 
返 回 值:无  
***********************************************************************/
extern void ds1302_init()			  
   {
    T_CLK=0;                  /*拉低时钟信号*/
    T_RST=0;                  /*复位DS1302*/
    T_RST=1;                  /*使能DS1302*/
    InputByte1302(0x8e);        /*发控制命令*/
    InputByte1302(0);           /*允许写DS1302*/
    T_RST=0;                  /*复位*/
   }
/******************************************************************** 

函 数 名:InputByte1302()
功    能:实时时钟写入一字节
说    明:往dS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据 
返 回 值:无  
***********************************************************************/
void InputByte1302(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; 
    } 
}
/******************************************************************** 

函 数 名:OutputByte1302()
功    能:实时时钟读取一字节
说    明:从dS1302读取1Byte数据 (内部函数)
入口参数:无  
返 回 值:ACC
***********************************************************************/
unsigned char OutputByte1302(void) 
{ 
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;         /*相当于汇编中的 RRC */
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}
 /******************************************************************** 

函 数 名:W1302()
功    能:往dS1302某地址写入数据
说    明:先写地址,后写命令/数据 (内部函数)
调    用:InputByte1302() , OutputByte1302()
入口参数:ucAddr: dS1302地址, ucdata: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(unsigned char ucAddr, unsigned char ucda)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    InputByte1302(ucAddr);       /* 地址,命令 */
    InputByte1302(ucda);       /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

函 数 名:R1302()
功    能:读取dS1302某地址的数据
说    明:先写地址,后读命令/数据 (内部函数)
调    用:InputByte1302() , OutputByte1302()
入口参数:ucAddr: dS1302地址
返 回 值:ucdata :读取的数据
***********************************************************************/
unsigned char READ1302(unsigned char ucAddr)
{
    unsigned char ucdata;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    InputByte1302(ucAddr);             /* 地址,命令 */
    ucdata = OutputByte1302();         /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
    return(ucdata);
}
/******************************************************************** 

函 数 名:BurstWRITE1302TIME()
功    能:往dS1302写入时钟数据(多字节方式)
说    明:先写地址,后写命令/数据
调    用:InputByte1302() 
入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
                            8Byte (BCd码)1B 1B 1B 1B 1B  1B  1B 1B
返 回 值:无
***********************************************************************/
extern void BurstWRITE1302TIME(unsigned char *pWClock)
{
    unsigned char i;
    W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    InputByte1302(0xbe);        /* 0xbe:时钟多字节写命令 */
    for (i = 8; i>0; i--)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
    {
        InputByte1302(*pWClock); /* 写1Byte数据*/
        pWClock++;
    }
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 

函 数 名:BurstREAD1302TIME()
功    能:读取dS1302时钟数据
说    明:先写地址/命令,后读数据(时钟多字节方式)
调    用:InputByte1302() , OutputByte1302()
入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCd码)1B 1B 1B 1B 1B  1B  1B
返 回 值:无
***********************************************************************/
extern void BurstREAD1302TIME(unsigned char *pRClock)
{
    unsigned char i;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    InputByte1302(0xbf);             /* 0xbf:时钟多字节读命令 */
    for (i=8; i>0; i--) 
    {
       *pRClock = OutputByte1302();   /* 读1Byte数据 */
       pRClock++;
    }
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

函 数 名:BurstWRITE1302REG()
功    能:往dS1302寄存器数写入数据(多字节方式)
说    明:先写地址,后写数据(寄存器多字节方式)
调    用:InputByte1302()
入口参数:pWReg: 寄存器数据地址
返 回 值:无
***********************************************************************/
extern void BurstWRITE1302REG(unsigned char *pWReg)
{
    unsigned char i;
    W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    InputByte1302(0xfe);         /* 0xfe:寄存器多字节写命令 */
    for (i=31; i>0; i--)       /* 31Byte 寄存器数据 */
    {
        InputByte1302(*pWReg);    /* 写1Byte数据*/
        pWReg++;
    }
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 

函 数 名:BurstRRITE1302REG()
功    能:读取dS1302寄存器数据
说    明:先写地址,后读命令/数据(寄存器多字节方式)
调    用:InputByte1302() , OutputByte1302()
入口参数:pRReg: 寄存器数据地址
返 回 值:无
***********************************************************************/
extern void BurstR1302REG(unsigned char *pRReg)
{
    unsigned char i;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    InputByte1302(0xff);            /* 0xff:寄存器多字节读命令 */
    for (i=31; i>0; i--)          /*31Byte 寄存器数据 */
    {
        *pRReg = OutputByte1302();  /* 读1Byte数据 */
        pRReg++;
    }
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 

函 数 名:Set1302()
功    能:设置初始时间
说    明:先写地址,后读命令/数据(寄存器多字节方式)
调    用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCd码)1B 1B 1B 1B 1B  1B  1B
返 回 值:无
***********************************************************************/
extern void Set1302(unsigned char *pClock) 
{
    unsigned char i;
    unsigned char ucAddr = 0x80; 
    W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作*/
    for(i =7; i>0; i--)
    { 
        W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
        pClock++;
        ucAddr+=2;
    }
    W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护*/
}
/******************************************************************** 

函 数 名:Get1302()
功    能:读取dS1302当前时间
说    明:
调    用:R1302() 
入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
                                        7Byte (BCd码)   1B 1B 1B 1B 1B  1B  1B
返 回 值:无
***********************************************************************/
extern void Get1302(unsigned char ucCurtime[]) 
{
    unsigned char i;
    unsigned char ucAddr = 0x81;
    for (i=0; i<7; i++)
    {
        ucCurtime[i] = READ1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
        ucAddr += 2;
    }
}

⌨️ 快捷键说明

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