ds1302程序

注:本人博文整理至CSDN以方便查阅,源博文位于EDN


#ifndef DS1302_H
#define DS1302_H


#include


sbit T_CLK= P1^2; /*实时时钟时钟线引脚 */
sbit T_IO = P1^3; /*实时时钟数据线引脚 */
sbit T_RST= P1^4; /*实时时钟复位线引脚 */


sbit ACC7=ACC^7;
sbit ACC0=ACC^0;


//unsigned char gettime[8]={0};
unsigned char settime[7]={0x00,0x1f,0x14,0x16,0x07,0x07,0x07};



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


计时模块1302:


1 实时时钟模块 时钟芯片型号:DS1302
*
* 名称: v_RTInputByte
* 说明: 
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据 
* 返回值: 无
**********************************************************/
/*
void v_RTInputByte(unsigned char d)
{
    unsigned char i;
    ACC="d";              //将8位数据写入ACC
    for(i=8;i>0;i--)    //循环8次将ACC8位数据从低位到高位写入1302
    {   
        T_IO=ACC0;     //将ACC的最低位转送到IO口
        T_CLK=1;         //上升沿写入1位数据
        T_CLK=0;
        ACC="ACC">>1;     //将ACC次低位变为最低位
    }
}
*/
void v_RTInputByte(unsigned char ucDa) 

unsigned char i;
ACC=ucDa;
for(i=8;i>0;i--)
{
 T_IO=ACC0; //相当于汇编中的 RRC //
 T_CLK=1;
 T_CLK=0;
 ACC=ACC>>1; 

}
/******************************************************************** 
*
* 名称: unsigned char uc_RTOutputByte
* 说明: 
* 功能: 从DS1302读取1Byte数据
* 调用: 
* 输入: 
* 返回值: ACC
***********************************************************************/
/*
unsigned char uc_RTOutputByte(void)
{
    unsigned char i;
    for(i=8;i>0;i--)
    {
        ACC="ACC">>1;
        ACC7=T_IO;
        T_CLK=1; //时钟下降沿读1位数据
        T_CLK=0;
        
    }
    return (ACC);
}
*/
unsigned char uc_RTOutputByte(void) 

 unsigned char i;
 for(i=8;i>0;i--)
 {
  ACC=ACC>>1; //相当于汇编中的 RRC //
  ACC7=T_IO;
  T_CLK=1;
  T_CLK=0;
 } 
 return(ACC); 
}
/******************************************************************** 
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte() 
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
/*
void v_W1302(unsigned char add,unsigned char d)
{
    T_RST= 0;
    T_CLK=0;
    T_RST= 1;
    v_RTInputByte(add); //将1302的指针移到add处
    v_RTInputByte(d);     //往add处写入数据
    T_CLK=1;
    T_RST=0;              //停止写数据
}
*/
void v_W1302(unsigned char ucAddr, unsigned char ucDa)
{
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(ucAddr); // 地址,命令 //
 v_RTInputByte(ucDa); // 写1Byte数据//
 T_CLK=1;
 T_RST=0;

/******************************************************************** 
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
/*
unsigned char uc_R1302(unsigned char add)
{
    unsigned char d;
    T_RST=0;
    T_CLK=0;
    T_RST=1;
    v_RTInputByte(add);
    d="uc"_RTOutputByte();
    T_CLK=1;
    T_RST=0;
    return (d);
}
*/
unsigned char uc_R1302(unsigned char ucAddr)
{
 unsigned char ucDa;
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(ucAddr); // 地址,命令 //
 ucDa=uc_RTOutputByte(); // 读1Byte数据//
 T_CLK=1;
 T_RST=0;
 return(ucDa);
}



/******************************************************************** 
*
* 名称: v_Set1302
* 说明: 
* 功能: 设置初始时间
* 调用: v_W1302() 
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*
void v_Set1302(unsigned char *time)
{
    unsigned char i;
    v_W1302(0x8e,0x00);  //令WP=0,进行写操作
    T_RST=0;
    T_CLK=0;
    T_RST=1;
    v_RTInputByte(0xbe);  //时钟多字节写命令
    for(i=8;i>0;i--)
    {
        v_RTInputByte(*time); //写入1byte数据
        time++;
    }
    T_CLK=1;
    T_RST=0;
}
*/
void v_Set1302(unsigned char *pSecDa) 
{
 unsigned char i,ten,sin;
 v_W1302(0x8e,0x00); // 控制命令,WP=0,写操作?//
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(0xbe);
 for(i=8;i>0;i--)
 {
  sin=(*pSecDa)%10;
  ten=(*pSecDa/10)*0x10;
  *pSecDa=ten+sin; 
  v_RTInputByte(*pSecDa); // 秒 分 时 日 月 星期 年 //
  pSecDa++;
 }
 T_CLK=1;
 T_RST=0;
}
/******************************************************************** 
*
* 名称: v_Get1302
* 说明: 
* 功能: 读取DS1302当前时间
* 调用: uc_R1302() 
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*
void v_Get1302(unsigned char *time)
{
    unsigned char i;
    bdata unsigned char l,h;
    T_RST=0;
    T_CLK=0;
    T_RST=1;
    v_RTInputByte(0xbf);  //时钟多字节方式读取命令
    for(i=8;i>0;i--)
    {
        *time=uc_RTOutputByte(); //读1字节数据
        l=(*time)&0x0f;         //l存放time的低4位,即个位
        h=(*time>>4)&0x0f;      //h存放time的高4位,即十位
        *time=h*10+l;           //时间数据以十进制形式放进time[i]中
        time++;
    }
    T_CLK=1;
    T_RST=0;
}
*/
void v_Get1302() 
{
 unsigned char i,ten,sin;
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(0xbf);
 for(i=0;i<7;i++)
 {
  ten=uc_RTOutputByte();//格式为: 秒 分 时 日 月 星期 年 //
  sin=ten&0x0f;
  ten=ten>>4;
  settime[i]=ten*10+sin;
 }
 T_CLK=1;
 T_RST=0;
}


#endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值