ds1302写时间

#include "1302.h"
#include "delay.h"

/*****************************************************
函数功能:向1302写一个字节数据
入口参数:x
***************************************************/ 

void Write1302(unsigned char dat)
{
  unsigned char i; 
  //SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  //delaynus(2);       //稍微等待,使硬件做好准备 //(这个两个多余的)
  for(i=0;i<8;i++)      //连续写8个二进制位数据
    {
         DATA=dat&0x01;    //取出dat的第0位数据写入1302  低位在前,高位在后
         delaynus(2);       //稍微等待,使硬件做好准备
         SCLK=1;           //上升沿写入数据
         delaynus(2);      //稍微等待,使硬件做好准备
         SCLK=0;           //重新拉低SCLK,形成脉冲
         dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
      }
    
 }
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/ 
void WriteSet1302(unsigned char Cmd,unsigned char dat)
 {      
        RST=0;           //禁止数据传递
        delaynus(2);     //稍微等待,使硬件做好准备
        SCLK=0;          //确保写数居前SCLK被拉低
        delaynus(2);     //稍微等待,使硬件做好准备
        RST=1;           //启动数据传输
        delaynus(2);     //稍微等待,使硬件做好准备
        Write1302(Cmd);  //写入命令字
        Write1302(dat);  //写数据
        RST=0;           //禁止数据传递
        delaynus(2);     //稍微等待,使硬件做好准备
        DATA=1;//(这个是什么意思?)
        SCLK=1;          //将时钟电平置于高电平状态

 }
/*****************************************************
函数功能:从1302读一个字节数据
入口参数:x
***************************************************/ 
 unsigned char Read1302(void)
 {
    unsigned char i,dat;
    delaynus(2);       //稍微等待,使硬件做好准备//(这个可以不要)
    for(i=0;i<8;i++)   //连续读8个二进制位数据
     {     dat>>=1;
         if(DATA==1)    //如果读出的数据是1
         dat|=0x80;    //将1取出,写在dat的最高位
         SCLK=1;       //将SCLK置于高电平,为下降沿读出
         delaynus(2);  //稍微等待
         SCLK=0;       //拉低SCLK,形成脉冲下降沿
         delaynus(2);  //稍微等待
      }     
  return dat;        //将读出的数据返回
}  
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/ 
unsigned char  ReadSet1302(unsigned char Cmd)
 {
  unsigned char dat;
  RST=0;                 //拉低RST
  SCLK=0;                //确保写数居前SCLK被拉低
  RST=1;                 //启动数据传输
  Write1302(Cmd);       //写入命令字
  dat=Read1302();       //读出数据
  SCLK=1;              //将时钟电平置于已知状态
  RST=0;               //禁止数据传递
  return dat;          //将读出的数据返回
}
/*****************************************************
函数功能: 1302进行初始化设置
***************************************************/ 
void Init_DS1302(void)
{  (写入时间的话可以直接写如:WriteSet1302(0x80,0x55)  

   WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
   WriteSet1302(0x80,((55/10)<<4|(55%10)));   //根据写秒寄存器命令字,写入秒的初始值

    WriteSet1302(0x82,((59/10)<<4|(59%10)));   //根据写分寄存器命令字,写入分的初始值

    WriteSet1302(0x84,((23/10)<<4|(23%10))); //根据写小时寄存器命令字,写入小时的初始值

    WriteSet1302(0x86,((18/10)<<4|(18%10))); //根据写日寄存器命令字,写入日的初始值

    WriteSet1302(0x88,((6/10)<<4|(6%10))); //根据写月寄存器命令字,写入月的初始值

    WriteSet1302(0x8c,((9/10)<<4|(9%10)));   //根据写年寄存器命令字,写入年的初始值

    WriteSet1302(0x90,0xa5);                //打开充电功能 选择2K电阻充电方式

    WriteSet1302(0x8E,0x80);              //根据写状态寄存器命令字,写入保护指令
}
                                        

    void Ds1302_Write_Time(void) (这里没看懂)
{
    WriteSet1302(0x8e,0x00);            //关闭写保护 
    WriteSet1302(0x80,0x80);                //暂停 
    //Ds1302_Write_Byte(ds1302_charger_add,0xa9);            //涓流充电 
    WriteSet1302(0x84,BCDhour);        //时 
    WriteSet1302(0x82,BCDminute);        //分
    WriteSet1302(0x80,BCDsecond);        //秒
    WriteSet1302(0x8e,0x80);            //打开写保护 
}

以上带括号的就是我写的,你自己再看看
展开阅读全文

没有更多推荐了,返回首页