找回密码
 立即注册

QQ登录

只需一步,快速开始

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

有关DS1302一直不能正常工作的问题,请帮忙看一下。

[复制链接]
跳转到指定楼层
楼主
ID:695961 发表于 2020-4-12 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:
  1. #define DS1302_RST         P11        // 兼容之前的RST引脚
  2. #define DS1302_SDA         P12        // 推挽输入/输出IO管脚
  3. #define DS1302_SCL         P13        // 时钟

  4. void DS1302_WriteByte(uint8 dat)
  5. {
  6.         uint8 i;
  7.        
  8.         for(i = 0; i < 8; i++)
  9.         {
  10.                 DS1302_SDA = dat & 0x1;
  11.                 dat >>= 1;                                // 数据左移一位
  12.                
  13.                 DS1302_SCL = 0;
  14.                 DS1302_SCL = 1;
  15.         }
  16. }

  17. void DS1302_Write(uint8 address, uint8 dat)
  18. {
  19.         DS1302_RST = 0;
  20.         DS1302_SCL = 0;
  21.         DS1302_RST = 1;
  22.        
  23.         DS1302_WriteByte(address);
  24.         DS1302_WriteByte(dat);
  25.        
  26.         DS1302_SCL = 1;
  27.         DS1302_RST = 0;
  28. }

  29. uint8 DS1302_Read(uint8 address)
  30. {
  31.         uint8 i, dat = 0;
  32.        
  33.         DS1302_RST = 0;
  34.         DS1302_SCL = 0;
  35.         DS1302_RST = 1;
  36.        
  37.         DS1302_WriteByte(address);
  38.         for(i = 0; i < 8; i++)
  39.         {
  40.                
  41.                
  42.                 dat >>= 1;                        // 数据左移一位
  43.                 if(DS1302_SDA)
  44.                         dat = dat | 0x80;
  45.                
  46.                 DS1302_SCL = 0;
  47.                 DS1302_SCL = 1;
  48.         }
  49.        
  50.         DS1302_RST = 0;
  51.         DS1302_SDA = 0;
  52.         DS1302_SCL = 1;
  53.        
  54.         return dat;
  55. }

  56. void main()
  57. {
  58.        
  59.         // 初始化DS1302
  60.         DS1302_RST = 0;
  61.         DS1302_SCL = 0;
  62.        
  63. // 设定年份
  64.         DS1302_Write(0x8E, 0x00);
  65.         DS1302_Write(0x8C, 0x20);    // 2020年
  66.         DS1302_Write(0x8E, 0x80);
  67.        
  68.         // 打印年份
  69.         printf("%x", DS1302_Read(0x8D));
  70.        
  71.        
  72.         while(1)
  73.         {
复制代码

程序上来就设定一个年份,然后再读出来。但是一直都不对。来回整了一天了,请帮忙看一下哪里有问题。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:695961 发表于 2020-4-12 15:29 | 只看该作者
应用程序没有写错。

是我把备用电源和主电源接反造成的。换过来以后,出现了另一个问题:

即,程序运行过程中我把主电源接上后,再读寄存器读出的数据是错误的(偶尔能读到正确的数据)。

拔掉主电源就可以,不知道大家见过这种情况没?
回复

使用道具 举报

板凳
ID:94031 发表于 2020-4-12 15:56 | 只看该作者
时序有问题,初学者还是先在网上找例子改一下用。
回复

使用道具 举报

地板
ID:695961 发表于 2020-4-12 17:08 | 只看该作者
最后确定,时序没有问题。

我在RST,CLK,SDA上接三个电阻到电源解决了问题。

应该是不同的DS1302芯片接法不一样。我看网上很多例子都不需要接电阻的。

后来偶尔看到一个接了电阻的例子,接上去以后就可以了。
回复

使用道具 举报

5#
ID:401564 发表于 2020-4-13 14:34 | 只看该作者
chinayanhui 发表于 2020-4-12 17:08
最后确定,时序没有问题。

我在RST,CLK,SDA上接三个电阻到电源解决了问题。

RST可以不用上拉电路
时钟如果是设定成强推挽,也可以不用电阻
但数据线是一定要加的,不然读出来的数据是不对,很有可能是奇数正确,偶数不正确,我种情况我碰到过
回复

使用道具 举报

6#
ID:630491 发表于 2020-4-13 19:02 | 只看该作者
还有,哪个32k多一点的晶振你也可以换一个事实,如果是protues的话就加上scl和sda的上拉电阻吧10k
回复

使用道具 举报

7#
ID:202239 发表于 2020-4-24 19:36 | 只看该作者
在开发板上可以读取数据,但是换到网上买的最小系统板就读取不了数据,请问是什么问题??
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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