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

📄 time.c

📁 DS1302时间和RAM的读写
💻 C
字号:
#include "time.h"
#include "ac2a.h"
#include <intrins.h>

void rtc_delay(){_nop_();_nop_();_nop_();}
/*********************************************************************

 公司名称:
 模块名称:DS1302.c
 功    能:实时时钟模块           时钟芯片型号:DS1302 
 说    明:
 程序设计:zhaojunjie       修改和增加:Gary Wong    
 设计时间:2002.03.02        
 版 本 号: 20020302
*********************************************************************/

/******************************************************************** 

 函 数 名:RTInputByte()
 功    能:实时时钟写入一字节
 说    明:往DS1302写入1Byte数据 (内部函数)
 入口参数:d 写入的数据 
 返 回 值:无  
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void RTInputByte(uchar d) 
{ 
    uchar 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
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
uchar RTOutputByte(void) 
{ 
    uchar i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;         /*相当于汇编中的 RRC */
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}
/******************************************************************** 

 函 数 名:W1302()
 功    能:往DS1302写入数据
 说    明:先写地址,后写命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);       /* 地址,命令 */
    RTInputByte(ucDa);       /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

 函 数 名:R1302()
 功    能:读取DS1302某地址的数据
 说    明:先写地址,后读命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址
 返 回 值:ucData :读取的数据
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
uchar R1302(uchar ucAddr)
{
    uchar ucData;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);             /* 地址,命令 */
    ucData = RTOutputByte();         /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
    return(ucData);
}
/******************************************************************** 

 函 数 名:BurstW1302T()
 功    能:往DS1302写入时钟数据(多字节方式)
 说    明:先写地址,后写命令/数据
 调    用:RTInputByte() 
 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
                            8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
void set_time(TIME_STRUCT *ts)
{
    uchar i;
	BCD buf[8];

	buf[0]=ts->sec;buf[1]=ts->min;
	buf[2]=ts->hr; buf[3]=ts->dat;
	buf[4]=ts->mon;buf[5]=ts->week;buf[6]=ts->yr;
	buf[7]=0x80;

    W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xbe);        /* 0xbe:时钟多字节写命令 */
    for (i = 0; i<8; i++)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
    {
        RTInputByte(buf[i]); /* 写1Byte数据*/     
    }
    T_CLK = 1;
    T_RST = 0;
} 
/******************************************************************** 

 函 数 名:BurstR1302T()
 功    能:读取DS1302时钟数据
 说    明:先写地址/命令,后读数据(时钟多字节方式)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:Gary Wong            日    期: 2004-11-17
***********************************************************************/
void read_time(TIME_STRUCT *ts)
{
    uchar i;
	BCD buf[8];

    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(0xbf);             /* 0xbf:时钟多字节读命令 */
    for (i=0; i<8; i++) 
    {
       buf[i] = RTOutputByte();   /* 读1Byte数据 */
    }
    T_CLK = 1;
    T_RST = 0;

	ts->sec=buf[0];ts->min=buf[1];ts->hr  =buf[2];
	ts->dat=buf[3];ts->mon=buf[4];ts->week=buf[5];
	ts->yr=buf[6];	   
}

/******************************************************************************/
/*author:Gary Wong
/******************************************************************************/
void rd_rtc_ram(BYTE addr,BYTE *buf,BYTE len)
{
	BYTE i;
	for(i=0;i<len;i++)buf[i]=R1302(0xc1 + (i+addr)*2);
}

void wr_rtc_ram(BYTE addr,BYTE *buf,BYTE len)
{
	BYTE i;
    W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?**/
	rtc_delay();
	for(i=0;i<len;i++)
	{
		W1302(0xc0+(addr+i)*2,buf[i]);			
	}
	rtc_delay();
	W1302(0x8e,0x80);
}

⌨️ 快捷键说明

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