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

📄 ds1302.c

📁 ds1302的运用
💻 C
字号:
/***********************************************
程序名称:实时时钟芯片DS1302控制函数
晶振大小:11.0592MHz

作    者: 周徐良
创建日期: 2005年1月31日
修改日期:
***********************************************/
#include <stdio.h>
#include <intrins.h>
#include <reg52.h>

//定义宏
#define uchar unsigned char
#define uint  unsigned int

//系统位端口定义
sbit  DS1302_CLK=P1^0;
sbit  DS1302_IO=P1^1;
sbit  DS1302_RST=P1^2;


void DS1302_writebyte(uchar byte_data);
uchar DS1302_readbyte(void);
void DS1302_writedata(uchar addr,uchar byte_data);
uchar DS1302_readdata(uchar addr);
void DS1302_settime(uchar *p);
void DS1302_readtime(uchar *p);
void DS1302_initialize(void);

/*****************************************
函 数 名:void DS1302_initialize(void)
功    能:初始化DS1302
入口参数:无
出口参数:无
返 回 值:无
***********************************************************/
void DS1302_initialize(void)
{
        uchar sec;
        uchar hour;
        //DS1302_RST=0;
        //DS1302_CLK=0;
        DS1302_writedata(0x90,0x00);//初始化慢速充电寄存器(Trickle charge)
        sec=DS1302_readdata(0x81);  //读取秒寄存器数据
        //if(sec&0x80)                //判断秒寄存器时钟暂停位CH是否位1
        //   {
        sec=sec&0x7F;       //为1则改为0,启动时钟
        DS1302_writedata(0x80,sec);//写入数据启动时钟
        //   }
        hour=DS1302_readdata(0x85); //读取时寄存器数据
        //if(hour&0x80)               //时寄存器位7为1(12小时方式),改成24小时方式
        //   {
        hour=hour&0x7F;     //改成24小时方式
        DS1302_writedata(0x84,hour);
        //   }
}

/***********************************************************
函 数 名:void DS1302_settime(uchar idata *p)
功    能:设置初始时间
入口参数:p:存放时间数据地址,初始时间格式为: 秒 分 时 日 月 星期 年
出口参数:无
返 回 值:无
***********************************************************/
void DS1302_settime(uchar *p)
{
        uchar i;
        uchar addr;
       // uchar buf;
        addr=0x8C; //DS1302中写年的值的寄存器地址
        for(i=7;i>0;i--)
            {
                if(i==1||i==3)  
                  *p=*p&0x7F;
                //if(i==3)
                //*p=*p&0x7F;
                DS1302_writedata(addr,*p);
                addr=addr-0x02;
                //当i=6时,地址是设置星期,不用设置星期跳出本次循环
                if(i==6)
                  continue;
                p++;
            }
}


/***********************************************************
函 数 名:void DS1302_readtime(uchar idata *p)
功    能:读取当前时间
入口参数:无
出口参数:p:存放时间数据地址,时间格式为: 秒 分 时 日 月 星期 年
返 回 值:无
***********************************************************/
void DS1302_readtime(uchar *p)
{
        uchar i;
        uchar addr;
        addr=0x8D; //DS1302中寄存器地址
        for(i=7;i>0;i--)
            {
            	//i=6时是星期,不需要星期跳出本次循环
                if(i==6) 
                  {
                    addr-=2;
                    continue;
                  }
                *p=DS1302_readdata(addr);
                addr-=2;
                p++;
            }
}

/***********************************************************
函 数 名:DS1302_writedata(uchar idata addr,uchar idata byte_data)
功    能:往DS1302中某一地址写入1个数据,需先取消保护位
入口参数:addr:地址,byte_data:数据/命令
出口参数:无
返 回 值:无
***********************************************************/
void DS1302_writedata(uchar addr,uchar byte_data)
{
        DS1302_RST=0;
        DS1302_CLK=0;
        DS1302_RST=1;
        DS1302_writebyte(0x8E);
        DS1302_writebyte(0x00);//WP=0,写操作
        DS1302_CLK=1;
        //DS1302_RST=0;

        DS1302_RST=0;
        DS1302_CLK=0;
        DS1302_RST=1;
        DS1302_writebyte(addr);//先写地址
        DS1302_writebyte(byte_data);//后写数据/命令
        DS1302_CLK=1;
        DS1302_RST=0;
        
        //去除DS1302的写保护功能
        //DS1302_RST=0;
        //DS1302_CLK=0;
        //DS1302_RST=1;
        //DS1302_writebyte(0x8E);
        //DS1302_writebyte(0x80);//WP=1,写保护
        //DS1302_CLK=1;
        //DS1302_RST=0;
}


/***********************************************************
函 数 名:uchar DS1302_readdata(uchar idata addr)
功    能:从DS1302中某一地址读取1个数据
入口参数:addr:地址
出口参数:无
返 回 值:byte_data
***********************************************************/
uchar DS1302_readdata(uchar addr)
{
        uchar byte_data;
        DS1302_RST=0;
        DS1302_CLK=0;
        DS1302_RST=1;
        DS1302_writebyte(addr);  //先发送命令
        byte_data=DS1302_readbyte();//读取1个字节数据并存放在DS1302_readbyte中
        DS1302_CLK=1;
        DS1302_RST=0;
        return(byte_data);
}


/**********************************************************
函 数 名:DS1302_writebyte(uchar idata byte_data)
功    能:写1个字节数据到DS1302中
入口参数:byte_data:需要写入的数据
出口参数:无
返 回 值:无
**********************************************************/
void DS1302_writebyte(uchar byte_data)  //上升沿写入数据
{
        uchar i;
        for(i=8;i>0;i--)
            {
                DS1302_IO=(bit)(byte_data&0x01); //先传低位即位0
                DS1302_CLK=1;
                DS1302_CLK=0;
                byte_data>>=1;
            }

}

/***********************************************************
函 数 名:DS1302_readbyte(void)
功    能:从DS1302中读1个字节数据
入口参数:无
出口参数:无
返 回 值:byte_data
***********************************************************/
uchar DS1302_readbyte(void)   //下降沿输出数据
{
        uchar byte_data;
        uchar i;
        byte_data=0;
        for(i=8;i>0;i--)
            {
                DS1302_IO=1;//置单片机I/O口为输入方式
                byte_data>>=1;
                if(DS1302_IO) 
                   byte_data|=0x80;
                DS1302_CLK=1;
                DS1302_CLK=0;
            }
        return(byte_data);
}

⌨️ 快捷键说明

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