Chinaunix首页 | 论坛 | 博客
  • 博客访问: 962700
  • 博文数量: 175
  • 博客积分: 2788
  • 博客等级: 少校
  • 技术积分: 2060
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-25 12:25
个人简介

知之者不如好之,好之者不如乐之

文章分类

全部博文(175)

文章存档

2016年(1)

2015年(20)

2014年(8)

2013年(68)

2012年(16)

2011年(35)

2010年(1)

2008年(26)

分类: 嵌入式

2013-11-19 21:21:52

  两天的时间一直在捣鼓这颗时钟芯片,电路都是成熟的,驱动也是网上流传n久的代码。时钟跑的很正常,读写也没有问题。但因为想利用它的32Byte的RAM,麻烦来了。  先说原理吧很简单的,


也就是说如果想在第一个Byte写数据只要调用DS1302_WriteByte(0xC0,data);就ok了,同理想读取只需DS1302_ReadByte(0xC1);就可以了。每操作一个Byte只需将对应的控制字加2就行了。
我的1302的备用电源脚接的是3.6v、60mAh的电池。所以需要设置充电使能控制字(不设的话则只能写一次RAM,虽然我不明白这是为啥。。。 ‘.‘|||),另外需要注意的就是初始化了。我开始没有写初始化函数结果也是只能写入一次RAM。第三就是要去掉写保护了,为了安全一般都会在写完DS1302后,写入DS1302_WriteByte(0x8e,0x80);使得写保护。理论上讲它应该保护的是时间区地的寄存器,但是经试验确实会影响RAM的写操作。^_^ 也就是说其实这个控制字控制的是整个1302的起震和写使能。
下附1302相关的代码,仅供参考:
DS1302.h:
//******************************************************
//* head file of DS1302
//* date 2008.5.27
//* author sjing
//* vertion 1.0
//*******************************************************
#ifndef __DS1302_H__
#define __DS1302_H__
#include
#include
#include
#include
#include
/*以下是时钟控制函数和变量*/

sbit IO_rst = P2^0;
sbit IO_clk = P2^1;
sbit IO_data = P2^2;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
typedef struct DS1302Time
{
unsigned char seconds;
unsigned char minute;
unsigned char hour;
unsigned char date;
unsigned char month;
unsigned char week;
unsigned char year;
unsigned char ctrl;
};
extern void DS1302_Send(unsigned char d);
extern unsigned char DS1302_Receive();
extern void DS1302_WriteByte(unsigned char addr,unsigned char dat);
extern unsigned char DS1302_ReadByte(unsigned char addr);
extern void DS1302_WriteClock(unsigned char *p);
extern void DS1302_ReadClock(unsigned char *p);
extern void ds1302_init();
#endif

DS1302.c:
//******************************************************
//* DS1302相关的函数
//* date 2008.5.27
//* author sjing
//* vertion 1.0
//*******************************************************
#include "DS1302.h"
//DS1302初始化函数
void ds1302_init()
{
   IO_clk =0;                            //拉低时钟信号
   IO_rst =0;                            //复位DS1302
   IO_rst =1;                             //使能DS1302
   DS1302_Send(0x8e);                //发控制命令
   DS1302_Send(0);                   //允许写DS1302
   IO_rst =0;                             //复位
}
//******************************************************
//*写数据到ds1302内部RAM
//*入口参数: d   (内部函数)
//******************************************************
void DS1302_Send(unsigned char d)
{
unsigned char i;
ACC = d;
for(i = 8;i > 0; i--)
{
  IO_data = ACC0;
  IO_clk = 1;
    _nop_();
  IO_clk = 0;
  ACC = ACC >> 1;
}
}
//*********************************************************
//*读取数据从ds1302内部RAM
//*返回值为ACC   (内部函数)
//*********************************************************
unsigned char DS1302_Receive()
{
unsigned char i;
EA = 0;
for(i = 8; i > 0;i--)
{
  ACC = ACC >> 1;
  ACC7 = IO_data;
  IO_clk = 1;
    _nop_();
  IO_clk = 0;
  }
EA = 1;
return(ACC);
}
//**********************************************************
//*写ds1302函数 带地址 数据 命令
//*入口变量:地址 addr 数据(命令)data
//**********************************************************
void DS1302_WriteByte(unsigned char addr,unsigned char dat)
{
IO_rst = 0;
IO_clk = 0;
IO_rst = 1;
DS1302_Send(addr);
DS1302_Send(dat);
IO_clk = 1;
IO_rst = 0;
}
//************************************************************
//*读ds1302函数 带地址
//*入口变量:地址 addr 返回值:data
//************************************************************
unsigned char DS1302_ReadByte(unsigned char addr)
{
unsigned char temp;
IO_rst = 0;
IO_clk = 0;
IO_rst = 1;
DS1302_Send(addr);
temp = DS1302_Receive();
IO_clk = 1;
IO_rst = 0;
return (temp);
}
//*************************************************************
//*写实时时钟数据多字节方式
//*入口:clock_buff 时钟数据 秒 分 时 日 月 年
//*************************************************************
void DS1302_WriteClock(unsigned char *p)
{
unsigned char i;
DS1302_WriteByte(0x8e,0x00);
  DS1302_WriteByte(0x90,0xA5);
IO_rst = 0;
IO_clk = 0;
IO_rst = 1;
DS1302_Send(0xbe);
for(i = 8;i > 0; i--)
{
  DS1302_Send(*p);
  p++;
}
// DS1302_WriteByte(0x8e,0x80);
IO_clk = 1;
IO_rst = 0;
}
//*************************************************************
//*读实时时钟数据多字节方式
//*入口:clock_buff 时钟数据 秒 分 时 日 月 年
//*************************************************************
void DS1302_ReadClock(unsigned char *p)
{
unsigned char i;
IO_rst = 0;
IO_clk = 0;
IO_rst = 1;
DS1302_Send(0xbf);
for(i = 8;i > 0;i--)
{
  *p = DS1302_Receive();
  p++;
}
IO_clk = 1;
IO_rst = 0;
}

原文:http://sujing2857.blog.163.com/b ... 546200862221118816/



阅读(1012) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~