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

📄 ds1302.c

📁 用于GPRS远程电力抄表系统中采集器端的程序
💻 C
字号:
#include "ds1302.h"

void    wr_oneword_ds1302(uchar,uchar);
uchar   rd_oneword_ds1302(uchar);
void    delay1302(void);

uchar    xdata    rdtime[6] = {0};
uchar    xdata    inittime[6]={0};//初始时间(yy,mm,dd,hh,mm,ss)

sbit    sck1302    =P1^5;    //1302的clock
sbit    sio1302    =P1^6;    //1302的io口
sbit    rst1302    =P1^7;    //1302的rst


/************************************************************/
/*函数名:ds1302set
/*描述:设置1302的时间
/*输入:inittime:初始时间暂存区头指针
/*输出:无
/************************************************************/
void    ds1302set(void)
    {
        uchar    xdata    *inittimeptr;
        uchar    ctrl1302;    //存放1302控制码
        uchar    data1302;    //存放1302数据
        inittimeptr=inittime;

        ctrl1302=0x8e;        
        data1302=0x00;        //控制字(允许写)
        wr_oneword_ds1302(ctrl1302,data1302);

        ctrl1302=0x80;        //禁止1302
        data1302=0x80;
        wr_oneword_ds1302(ctrl1302,data1302);        
    
        
        ctrl1302=0x8c;        //写入年
        data1302=*inittimeptr;
        wr_oneword_ds1302(ctrl1302,data1302);
        inittimeptr++;

        ctrl1302=0x88;        //写入月
        data1302=*inittimeptr;
        wr_oneword_ds1302(ctrl1302,data1302);
        inittimeptr++;        

        ctrl1302=0x86;        //写入日期
        data1302=*inittimeptr;
        wr_oneword_ds1302(ctrl1302,data1302);
        inittimeptr++;        

        ctrl1302=0x84;        //写入小时
        data1302=*inittimeptr;
        data1302&=0x7f;//24小时制
        wr_oneword_ds1302(ctrl1302,data1302);
        inittimeptr++;        
        
        ctrl1302=0x82;        //写入分
        data1302=*inittimeptr;
        wr_oneword_ds1302(ctrl1302,data1302);
        inittimeptr++;    

        ctrl1302=0x80;
        data1302=*inittimeptr;
        data1302|=0x80;
        wr_oneword_ds1302(ctrl1302,data1302);

        ctrl1302=0x80;        //写入秒 
        data1302=*inittimeptr;
        data1302&=0x7f;//开始计时
        wr_oneword_ds1302(ctrl1302,data1302);    
                
        ctrl1302=0x90;
        data1302=0xa5;
        wr_oneword_ds1302(ctrl1302,data1302);//trikle charger    
    

        ctrl1302=0x8e;        //结束(写保护)
        data1302=0x80;
        wr_oneword_ds1302(ctrl1302,data1302);    
    
    }
/***********************************************************/
/*函数名:ds1302read
/*描述:读出1302计数器中的当前值
/*输入:inittime:读出数据保存区的头指针
/*输出:无
/***********************************************************/
void    ds1302read(void)    //读1302内部数据
    {    
        uchar    ctrl1302;
        uchar    data1302;

        uchar    xdata        *inittimep;
        inittimep = rdtime;

        ctrl1302=0x8e;        
        data1302=0x00;        //控制字(允许写)
        wr_oneword_ds1302(ctrl1302,data1302);

        ctrl1302=0x8d;        //读入年
        data1302=rd_oneword_ds1302(ctrl1302);
        *inittimep = data1302;
        inittimep++;


        ctrl1302=0x89;        //读入月
        data1302=rd_oneword_ds1302(ctrl1302);
        *inittimep=data1302;
        inittimep++;


        ctrl1302=0x87;        //读入日期
        data1302=rd_oneword_ds1302(ctrl1302);
        *inittimep=data1302;
        inittimep++;

        ctrl1302=0x85;        //读入小时
        data1302=rd_oneword_ds1302(ctrl1302);
        *inittimep=data1302;
        inittimep++;

        ctrl1302=0x83;        //读入分钟
        data1302=rd_oneword_ds1302(ctrl1302);
        *inittimep=data1302;
        inittimep++;

        ctrl1302=0x81;        //读入秒
        data1302=rd_oneword_ds1302(ctrl1302);
        *inittimep=data1302;

        ctrl1302=0x8e;        //结束(写保护)
        data1302=0x80;
        wr_oneword_ds1302(ctrl1302,data1302);
        inittimep = rdtime;
    //    return(inittimep);    
    }

/*************************************************************/
/*函数名:wr_oneword_ds1302
/*描述:向ds1302的某一指定单元写入一字节
/*输入:ctrl1302:命令字节
        data1302:数据字节
/*输出:无
/************************************************************/
void    wr_oneword_ds1302(uchar    ctrl1302,uchar    data1302)
    {
        uchar    i;
        uchar    ds1302tmp;
        ds1302tmp =ctrl1302;
        ds1302tmp|=0x80;//控制码最高位必须位1
        ds1302tmp&=0xfe;//写入时,最低位必须为0
        sck1302 =0;//当把rst驱动为1时,sck必须为0
        delay1302();
        rst1302 =1;//只有rst为高时,才允许数据传送

        for(i=0;i<8;i++)//写入控制码
        {
            sck1302 =0;
            delay1302();
            if(ds1302tmp&0x01)
                sio1302 =1;
            else
                sio1302 =0;
            _nop_();
            _nop_();
            sck1302 =1;//上升沿将数据写入
            delay1302();
            ds1302tmp>>=1;
        }

        ds1302tmp =data1302;//写入数据
        for(i=0;i<8;i++)
        {
            sck1302 =0;
            delay1302();
            if(ds1302tmp&0x01)
                sio1302 =1;
            else    
                sio1302 =0;
            _nop_();
            _nop_();
            sck1302 =1;
            delay1302();
            ds1302tmp>>=1;
        }
        _nop_();
        _nop_();
        rst1302 =0;//禁止芯片操作
        sck1302 =0;//恢复原有状态
        
    }
/************************************************************/
/*函数名:rd_oneword_ds1302
/*描述:从ds1302的指定单元读出一字节
/*输入:ctrl1302:指定要读取的单元
/*输出:读取的字节
/***********************************************************/
uchar    rd_oneword_ds1302(uchar    ctrl1302)
    {
        
        uchar    i;
        uchar    ds1302tmp;
        ds1302tmp =ctrl1302;
        ds1302tmp|=0x80;//控制码最高位必须为1
        ds1302tmp|=0x01;//读出时,最低位必须为1
        sck1302 =0;//当把rst驱动为1时,sck必须为0
        delay1302();
        rst1302 =1;//只有rst为高时,才允许数据传送

        for(i=0;i<8;i++)//输出控制码
        {
            sck1302 =0;
            delay1302();
            if(ds1302tmp&0x01)
                sio1302 =1;
            else    
                sio1302 =0;
            _nop_();
            _nop_();
            sck1302 =1;
            delay1302();
            ds1302tmp>>=1;    
        }
    
        for(i=0;i<8;i++)//读出控制码指定单元内容
        {    
            ds1302tmp>>=1;
            sck1302 =1;
            delay1302();
            sck1302 =0;
            delay1302();
            if(sio1302)
                ds1302tmp|=0x80;//最高位为1
            else
                ds1302tmp&=0x7f;//最高位为0
            delay1302();
        }
        rst1302 =0;//禁止芯片操作
        sck1302 =0;//恢复原有状态
        return(ds1302tmp);
    }
/*****************************************/
/*函数名:delay1302
/*描述:延时,使程序时序符合芯片要求
/*输入:无 
/*输出:无
/****************************************/
void    delay1302(void)//对于11.0592Mhz,延时为1us
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    } 



⌨️ 快捷键说明

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