打印
[经验分享]

ds1302时钟C程序(转)

[复制链接]
1835|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laslison|  楼主 | 2010-6-21 11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************************************************/
/* ds1302实时时钟C程序 */
/*51hei.com会员经典作品已经测试成功/

#include < reg52.h>
#include <intrins.h>

#define uchar unsigned char
sbit T_CLK = P3^4; /*实时时钟时钟线引脚 */
sbit T_IO = P3^3; /*实时时钟数据线引脚 */
sbit T_RST = P3^2; /*实时时钟复位线引脚 */
//sbit OE=P3^6;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

uchar time[8]="  :  :  ";
uchar min,hou,day,mon,yea;

void Init1302(void);
void v_W1302(uchar ucAddr, uchar ucDa);
uchar uc_R1302(uchar ucAddr);
void v_BurstW1302T(uchar *pSecDa);
void v_BurstR1302T(uchar *pSecDa);
void v_BurstW1302R(uchar *pReDa);
void v_BurstR1302R(uchar *pReDa);
void v_Set1302(uchar *pSecDa);
void v_Get1302(uchar ucCurtime[]);
void donetime(void);
void bcd_int(uchar i);
void bcdtoInt(void);
void SetTime(void);
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_WTInputByte(uchar ucDa)
{
  uchar i;
  //OE=0;
  ACC= ucDa;
  for(i=8; i>0; i--)
   {
    T_IO = ACC0; //*相当于汇编中的 RRC
    T_CLK = 1;
    T_CLK = 0;
    ACC =ACC>> 1;
   }
// OE=1;  
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
  uchar i;
  //OE=0;
  for(i=8; i>0; i--)
   {
    ACC = ACC>>1; //*相当于汇编中的 RRC
    ACC7 = T_IO;
    T_CLK = 1;        
    T_CLK = 0;
   }
  //OE=1;   
  return(ACC);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
  //OE=0;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(ucAddr); /* 地址,命令 */
  v_WTInputByte(ucDa); /* 写1Byte数据*/
  T_CLK = 1;
  T_RST =0;
  //OE=1;
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
  uchar ucDa;
  //OE=0;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(ucAddr); /* 地址,命令 */
  ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
  T_CLK = 1;
  T_RST =0;
// OE=1;
  return(ucDa);
}
/********************************************************************
*
* 名称: v_BurstW1302T
* 说明: 先写地址,后写数据(时钟多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*void v_BurstW1302T(uchar *pSecDa)
{
  uchar i;
  v_W1302(0x8e,0x00); //* 控制命令,WP=0,写操作?
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(0xbe); //* 0xbe:时钟多字节写命令
  for (i=8;i>0;i--) //*8Byte = 7Byte 时钟数据 + 1Byte 控制
   {
    v_WTInputByte(*pSecDa);//* 写1Byte数据
    pSecDa++;
   }
  T_CLK = 1;
  T_RST =0;
}  */      
/********************************************************************
*
* 名称: v_BurstR1302T
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
/*void v_BurstR1302T(uchar *pSecDa)
{
  uchar i;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(0xbf); //* 0xbf:时钟多字节读命令
  for (i=8; i>0; i--)
   {
    *pSecDa = uc_RTOutputByte(); //* 读1Byte数据
    pSecDa++;
   }
  T_CLK = 1;
  T_RST =0;
}  */     
/********************************************************************
*
* 名称: v_BurstW1302R
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
/*void v_BurstW1302R(uchar *pReDa)
{
  uchar i;
  v_W1302(0x8e,0x00); //* 控制命令,WP=0,写操作?
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(0xfe); //* 0xbe:时钟多字节写命令
  for (i=31;i>0;i--) //*31Byte 寄存器数据
   {
    v_WTInputByte(*pReDa); //* 写1Byte数据
    pReDa++;
   }
  T_CLK = 1;
  T_RST =0;
}   */   
/********************************************************************
*
* 名称: uc_BurstR1302R
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
/*void v_BurstR1302R(uchar *pReDa)
{
  uchar i;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  v_WTInputByte(0xff); //* 0xbf:时钟多字节读命令
  for (i=31; i>0; i--) //*31Byte 寄存器数据
   {
    *pReDa = uc_RTOutputByte(); //* 读1Byte数据
    pReDa++;
   }
  T_CLK = 1;
  T_RST =0;
}  */
/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*void v_Set1302(uchar *pSecDa)
{
  uchar i;
  uchar ucAddr = 0x80;
  v_W1302(0x8e,0x00); // 控制命令,WP=0,写操作?
  for(i =7;i>0;i--)
   {
    v_W1302(ucAddr,*pSecDa);  //秒 分 时 日 月 星期 年
    pSecDa++;
    ucAddr +=2;
   }
  v_W1302(0x8e,0x80); // 控制命令,WP=1,写保护?
}  */
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*void v_Get1302(uchar ucCurtime[])
{
  uchar i;
  uchar ucAddr = 0x81;
  for (i=0;i<7;i++)
   {
    ucCurtime = uc_R1302(ucAddr);//*格式为: 秒 分 时 日 月 星期 年
    ucAddr += 2;
   }
} */
/***********************************************************************
* 名称: Init1302
* 说明:
* 功能: 初始化DS1302
* 调用:  
* 输入:  
* 返回值: 无
*****************************************************************************/
void Init1302(void)
{
  v_W1302(0x8e,0x00);  //控制写入WP=0
  v_W1302(0x90,0xa5);
  v_W1302(0x80,0x00);  //秒
  v_W1302(0x82,0x59);  //分
  v_W1302(0x84,0x10);  //时
  v_W1302(0x86,0x01);  //日
  v_W1302(0x88,0x08);  //月
  v_W1302(0x8a,0x03);  //星期
  v_W1302(0x8c,0x07);  //年 */
  v_W1302(0x8e,0x80);
}
/**************************************************************************
* 名称: donetime
* 说明:
* 功能: 时间处理
* 调用:  
* 输入:  
* 返回值: 无
*****************************************************************************/
void donetime(void)
{
  uchar d;
  d=uc_R1302(0x81);
  time[6]=d/16+48;
  time[7]=d%16+48;
  d=uc_R1302(0x83);
  time[3]=d/16+48;
  time[4]=d%16+48;
  d=uc_R1302(0x85);
  time[0]=d/16+48;
  time[1]=d%16+48;
  //bcd_int(d);   
}   

//
/*void bcd_int(uchar i)
  {
  uchar j;  
  time[0]=(i&0x0f)+48;
  j=i>>4;
  time[1]=(j&0x0f)+48;
}  */
//
/*void bcdtoInt(void)
{
  uchar i;
  for(i=0;i<7;i++)
   bcd_int(ucCurtm);
}  */
//
void SetTime(void)
{
   v_W1302(0x8e,0x00);
   v_W1302(0x80,0x80);
   v_W1302(0x82,min);
   v_W1302(0x84,hou);
   v_W1302(0x86,day);
   v_W1302(0x88,mon);
   v_W1302(0x8c,yea);
   v_W1302(0x80,0x00);
   v_W1302(0x8e,0x80);
}

来源:http://www.jdzj.com/pic/Class348/Class578/20091030144546.html
沙发
wangwo| | 2010-6-21 13:05 | 只看该作者
很好,很规范的程序

使用特权

评论回复
板凳
jimoxinl| | 2010-6-21 13:17 | 只看该作者
留下了,正好在学习使用

使用特权

评论回复
地板
ershisi| | 2010-6-22 23:06 | 只看该作者
挺漂亮的,顶!

使用特权

评论回复
5
设计师甲| | 2010-6-23 16:12 | 只看该作者
呵呵!请加油!愿意动手开始的人在下真的很佩服呀!

使用特权

评论回复
6
yidou| | 2010-6-23 21:26 | 只看该作者
很多函数啊

使用特权

评论回复
7
wuzhaolie| | 2010-6-24 22:58 | 只看该作者
测试成功有保障啊

使用特权

评论回复
8
zqmoon| | 2013-3-29 21:22 | 只看该作者
正在学习这个,留下了,谢啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

791

帖子

1

粉丝