找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3297|回复: 3
打印 上一主题 下一主题
收起左侧

DS1302应用成功

[复制链接]
跳转到指定楼层
楼主
ID:55874 发表于 2013-10-16 00:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是读取1302与写数据的程序:
//从1302读取一个字节
uchar read(uchar address)
{
uchar i;
dsclk=0;
dsdata=0;
dsret=0;
dsret=1;//ret处于高电平时可对1302进行读操作
for(i=0;i<8;i++)
{
  dsclk=0;//上升沿时进行写数据
  dsdata=address&0x01;//数据传送都是从低位开始
  address=address>>1;//右移一位
  dsclk=1;//上升沿写数据
}
for(i=0;i<8;i++)
{
  dsclk=0;//上升沿动作
  address=address>>1;
  if(dsdata)
  address=address|0x80;
  dsclk=1;//上升沿动作
  dsclk=1;//等待
}
dsclk=1;//时钟置高
dsret=0;//片选无效
return (address);
}
//向1302写一个字节
void write(uchar address,uchar number)
{
uchar i; dsclk=0;//清零时钟总线
dsdata=0;//清零数据总线
dsret=0;//片选端无效
dsret=1;//逻辑控制有效,可对1302操作
for(i=0;i<8;i++)
{
  dsclk=0;
  dsdata=address&0x01;//低地址输入
  address=address>>1;//地址数据右移一位
  dsclk=1;
}
for(i=0;i<8;i++)
{
  dsclk=0;
  dsdata=number&0x01;//进行数据传送
  number=number>>1;//数据右移一位
  dsclk=1;
}
dsclk=1;//上升沿动作
dsret=0;//片选无效,不可进行操作
}

    DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。

评分

参与人数 1黑币 +8 收起 理由
wrty0 + 8 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:55611 发表于 2013-10-21 21:56 | 只看该作者
好好学习,天天向上
回复

使用道具 举报

板凳
ID:110866 发表于 2016-4-12 18:23 | 只看该作者
啥啊,为啥不显示电脑时间
回复

使用道具 举报

地板
ID:123526 发表于 2016-5-27 15:45 | 只看该作者
本帖最后由 whlove1314 于 2016-5-27 16:13 编辑

我的读程序为什么隔一秒显示一次,这一秒显示正常,下一秒就读到8个一(就是0x80),再下一秒就正常,然后又是8个一,搞了一早上了,现在都怀疑芯片坏了如果说程序有问题,那什么还能读到数据,若说没问题,为什么隔一秒无效一次
我现在观察到的现象是,正常显示时,数据输出稳定(每次读IO口数据一致,比如说,0s-1s期间程序多次读IO,每次数据都是0s)不正常时(8个一..)程序每读一次IO得到的数据都会从8个一跳变到8个0,非常奇怪
后来我在主函数只写了一个读取函数,去掉其他干扰项,用8个LED连接到P0口显示读到的BCD码,在读取程序后加了10ms循环延迟,发现不正常显示时,IO口读到数据会在8个1和8个0之间循环跳变,读一次变一次就是(0000 0001{此为正常显示,值为1}然后{1111 1111,0000 0000,1111 1111,0000 0000.....}一直这样循环,循环时间为1s)到了下一秒显示正常0000 0011(此值为3)但是中间丢失了一秒,那一秒刚才在那里乱蹦
我自己的理解是在:程序每个机器周期都会去读取ds1302的IO口,IO口的值在1s内应该是不变的,虽然多次读取,但是每次的值一样,机器周期非常短暂,人是无法察觉到的,给人的感觉就是数据是连续输出的(其实实在一遍一遍扫描的),每次写入的地址都是一样的,读到的值只跟ds1302有关,出现这个问题我实在找不到跟程序有关的地方,
所以,现在懵逼了......
刚才有点新发现,每次在乱蹦时,上一秒的数值不动,刚才延迟太短没看清,现在加大延迟,就看见了,比如说上秒显示(0000 0011)这一秒就是
(0000 0011,1111 1111,0000 0011,1111 1111.......)一直这样蹦,直到下一秒恢复正常,来位大神救命啊.....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表