网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> MOTO DSP代码示例 >> 文章正文
  DSP56F807对时钟芯片DS1302的操作(包括串读,串写等)         ★★★ 【字体:
DSP56F807对时钟芯片DS1302的操作(包括串读,串写等)
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-16    

//功能:复位1302
//输入:
void reset_1302(void)
{
//*pdddr=0xff7f;
  *peddr|=RTC_DATA | RTC_RST | RTC_SCK ;                   //方向寄存器 0--输出
        delly(50);       
   *pedr&=~RTC_RST;     //rst=0
   *pedr&=~RTC_RST;
   *pedr&=~RTC_RST;
   *pedr&=~RTC_RST;
   *pedr&=~RTC_RST;
        delly(50);   
        *pedr&=~RTC_SCK;   //sck=0
        *pedr&=~RTC_SCK;
        *pedr&=~RTC_SCK;
        *pedr&=~RTC_SCK;
        delly(50);
   *pedr|=RTC_RST;     //RST=1
   *pedr|=RTC_RST;     //RST=1
   *pedr|=RTC_RST;     //RST=1
   *pedr|=RTC_RST;     //RST=1
   *pedr|=RTC_RST;     //RST=1
 
      delly(50);      
}

//功能:往1302写入1 BYTE 数据     即命令又数据
//输入:in_data
void input_1302(word in_data)
{
word i;
word code_choice;
   
//  *pdddr=0xff7f; 
   *peddr|=RTC_DATA;                //方向寄存器 1--输出
   *peddr|=RTC_SCK;                //方向寄存器 1--输出   
    delly(50);
        code_choice=0x01;
        for(i=0;i<8;i++)            //上升沿写数据
 {  
  *pedr&=~RTC_SCK;
  *pedr&=~RTC_SCK;
  *pedr&=~RTC_SCK;    //0x20
  *pedr&=~RTC_SCK; 
   delly(20);
  if(in_data & code_choice){  
   *pedr|=RTC_DATA;
   *pedr|=RTC_DATA;   //0x01
   *pedr|=RTC_DATA;
   *pedr|=RTC_DATA;
  }
  else{
   *pedr&=~RTC_DATA;
   *pedr&=~RTC_DATA;
   *pedr&=~RTC_DATA;
   *pedr&=~RTC_DATA;   
  }
   delly(20);   
  *pedr|=RTC_SCK;
  *pedr|=RTC_SCK;
  *pedr|=RTC_SCK;
  *pedr|=RTC_SCK;       
   delly(20);
  code_choice=code_choice*2;
 }       
 
}

//功能:从1302读出1 BYTE 数据
//输出:从1302读出的数据
word output_1302()
{
word i;
word code_choice;
word out_data;

// *pddr|= RTC_DATA;
   //    *pdddr=(~RTC_DATA)&0xff7f;
    *peddr&=~RTC_DATA;                   //方向寄存器 0--输入      
    delly(50);
   *pedr|=RTC_SCK;
 *pedr|=RTC_SCK;
 *pedr|=RTC_SCK;
 *pedr|=RTC_SCK;
 delly(50);
    out_data=0;       
    for(i=0;i<8;i++)            //下降沿输出数据
 {
  *pedr&=~RTC_SCK;
  *pedr&=~RTC_SCK;
  *pedr&=~RTC_SCK;
  *pedr&=~RTC_SCK;
  delly(30);
  code_choice=*pedr;   
  *pedr|=RTC_SCK;
  *pedr|=RTC_SCK;
  *pedr|=RTC_SCK;
  *pedr|=RTC_SCK;  
  delly(30);
  out_data=out_data/2;
     if(code_choice & RTC_DATA){              
          out_data=out_data | 0x80;            
  }  
 }  
    *peddr|=RTC_DATA;                   //方向寄存器 1--输出    
    return out_data;
}


//让DS1302时钟芯片写使能
void time_wr_en(void)

 reset_1302();
    input_1302(0x8e);           //打开写保护
 input_1302(0x00);  
 reset_1302();
 input_1302(0x90);           //R1=2K,一个二极管
 input_1302(0xab);
 reset_1302();
    input_1302(0x80);           //启动实时时钟
 input_1302(0x00);  
 
}

//对DS1302串读
//功能:读取当前时间,依序为:秒分时日月年,
//输出:全局变量time_str--时间变量
//耗时:1.23730ms
void time_str_rd()
{
word i;
word time_temp[7];

        reset_1302();
        input_1302(0xbf);           //串读命令
        for(i=0;i<7;i++){
            time_temp[i]=output_1302();           
  }           
        time_temp[0]= time_temp[0] & 0x7f;
        time_str[1]=(time_temp[0]/0x10)*10+(time_temp[0]%0x10);     //秒
        time_temp[1]=time_temp[1] & 0x7f;
        time_str[2]=(time_temp[1]/0x10)*10+(time_temp[1]%0x10);    //分
        time_temp[2]=time_temp[2] & 0x3f;
        time_str[3]=(time_temp[2]/0x10)*10+(time_temp[2]%0x10);   //时
        time_temp[3]=time_temp[3] & 0x3f;
        time_str[4]=(time_temp[3]/0x10)*10+(time_temp[3]%0x10);   //日
        time_temp[4]=time_temp[4] & 0x1f;
        time_str[5]=(time_temp[4]/0x10)*10+(time_temp[4]%0x10);   //月
        time_temp[6]=time_temp[6] & 0x1f;
        time_str[6]=(time_temp[6]/0x10)*10+(time_temp[6]%0x10);   //年           
}


//对DS1302串写
//修改当前时间,依序为:秒分时日月年
void time_str_wr(word *tdata)
{
word  i;
   
 if((tdata[5]-0)>(0x99-0))tdata[5]=0;          //年
 if((tdata[4]-1)>(0x12-1))tdata[4]=1;          //月
 if((tdata[3]-1)>(0x31-1))tdata[3]=1;          //日
 if((tdata[2]-0)>(0x23-0))tdata[2]=0;          //时
 if((tdata[1]-0)>(0x59-0))tdata[1]=0;          //分
 if((tdata[0]-0)>(0x59-0))tdata[0]=0;          //秒
        
        tdata[6]=tdata[5];     //年变换位置
        tdata[5]=4;                         //星期
        reset_1302();
        input_1302(0xbe);                   //串读命令
        for(i=0;i<7;i++){
            input_1302(tdata[i]);           
            }
        input_1302(00);                     //写使能
        input_1302(0xab);                   //充电模式

}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章: 没有了

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    DSP56F807开发板-串口通信电…
    DSP56F807开发板-JTAG口电路…
    无ROM的DSP56858自引导技术
    基于DSP56F807的发变组保护装…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号