极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: Randy

arduino学习笔记38 - Arduino + DS1307 RTC时钟模块与经典总结

[复制链接]
发表于 2012-5-22 21:41:24 | 显示全部楼层
Randy 发表于 2012-5-22 18:39
已经解决,您可以重新下载库,进行编译看结果哦!

没问题了,多谢~~
回复 支持 反对

使用道具 举报

发表于 2012-7-26 11:06:01 | 显示全部楼层
好给力啊,继续出品这样的教程!
回复 支持 反对

使用道具 举报

发表于 2012-8-24 10:22:15 | 显示全部楼层
我用的1.0.1版本的IDE,里面没有 <LiquidCrystal_I2C.h>,编译的时候通不过,我发现每次因为版本不同造成的问题,很多人都建议换一个版本的IDE,难道没有别的方法吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-24 12:25:04 | 显示全部楼层
陈圆 发表于 2012-8-24 10:22
我用的1.0.1版本的IDE,里面没有 ,编译的时候通不过,我发现每次因为版本不同造成的问题,很多人都建议换一 ...

主要是低版本和高版本的文件格式是不一样的!
回复 支持 反对

使用道具 举报

发表于 2012-9-9 12:53:10 | 显示全部楼层
1.0.1的IDE,编译通过,但是工作不正常:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-10 09:13:45 | 显示全部楼层
jack3150 发表于 2012-9-9 12:53
1.0.1的IDE,编译通过,但是工作不正常:

您按照我给出的几个经验检查了没,我自己用这样方法检查,一下测了30个都没问题的!
回复 支持 反对

使用道具 举报

发表于 2012-9-15 21:36:34 | 显示全部楼层
代码是驱动lcd的。
我今天试了一下,结果输出全是1,寄存器全是0xff
回复 支持 反对

使用道具 举报

发表于 2012-9-15 21:37:00 | 显示全部楼层
代码是驱动lcd的。
我今天试了一下,结果输出全是1,寄存器全是0xff
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-15 22:14:47 | 显示全部楼层
萧芸凤 发表于 2012-9-15 21:37
代码是驱动lcd的。
我今天试了一下,结果输出全是1,寄存器全是0xff

寄存器难道设置不正确?
回复 支持 反对

使用道具 举报

发表于 2012-9-15 22:23:20 | 显示全部楼层
Randy 发表于 2012-9-15 22:14
寄存器难道设置不正确?
#include&#160;"Wire.h"





int rtc[7];

int year,month,date,hour,minitue,second,week;



void setup()

{

        Wire.begin();

        Serial.begin(9600);

        registerSet(0x68,0x00,0x00);

        registerSet(0x68,0x02,0x00);       

&#160;&#160;&#160;&#160;registerSet(0x68,0x07,0x93);

       



}



void loop()

{

        bcdRtc()

        Serial.print(year);

        Serial.print(".");

        Serial.print(month);

        Serial.print(".");

        Serial.print(date);

        Serial.print(".");

        Serial.print(week);

        Serial.print(".");

        Serial.print(hour);

        Serial.print(":");

        Serial.print(minitue);

        Serial.print(":");

        Serial.print(second);

        Serial.println();

}







void registerSet(int deviceAddress, int registerAddress, int registerValue)  // 写寄存器

{

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;

&#160;&#160;&#160;&#160;Wire.beginTransmission(deviceAddress);

&#160;&#160;&#160;&#160;Wire.write(registerAddress);

&#160;&#160;&#160;&#160;Wire.write(registerValue);

&#160;&#160;&#160;&#160;Wire.endTransmission();

}



void registerRead(int deviceAddress, int registerAddress) // 读寄存器

{&#160;



        int i;

       

&#160;&#160;&#160;&#160;Wire.beginTransmission(deviceAddress);

&#160;&#160;&#160;&#160;Wire.write(registerAddress);

&#160;&#160;&#160;&#160;Wire.endTransmission();

&#160;&#160;&#160;&#160;Wire.requestFrom(deviceAddress,7);

        if(Wire.available() <= 7);;

                {

                &#160;&#160;&#160;&#160;for( i = 0 ; i < 7 ; i++)       

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rtc&#160;=&#160;Wire.read();

                }



        Wire.endTransmission();

       

}



viod&#160;bcdRtc()

{       

        registerRead(0x68,0x00);



        year&#160;=&#160;(&#160;10&#160;*&#160;(&#160;rtc[6]&#160;&&&#160;0xF0&#160;)&#160;>>&#160;4&#160;)&#160;+&#160;(&#160;rtc[6]&#160;&&&#160;0x0F&#160;);

        month&#160;=&#160;(&#160;10&#160;*&#160;(&#160;rtc[5]&#160;&&&#160;0x10&#160;)&#160;>>&#160;4&#160;)&#160;+&#160;(&#160;rtc[5]&#160;&&&#160;0x0F&#160;);

        date&#160;=&#160;(&#160;10&#160;*&#160;(&#160;rtc[4]&#160;&&&#160;0x30&#160;)&#160;>>&#160;4&#160;)&#160;+&#160;(&#160;rtc[4]&#160;&&&#160;0x0F&#160;);

        hour&#160;=&#160;(&#160;10&#160;*&#160;(&#160;rtc[2]&#160;&&&#160;0x10&#160;)&#160;>>&#160;4&#160;)&#160;+&#160;(&#160;rtc[2]&#160;&&&#160;0x0F&#160;);

        minitue&#160;=&#160;(&#160;10&#160;*(&#160;rtc[1]&#160;&&&#160;0x70&#160;)&#160;>>&#160;4&#160;)&#160;+&#160;(&#160;rtc[1]&#160;&&&#160;0x0F&#160;);

        second&#160;=&#160;(&#160;10&#160;*&#160;(&#160;rtc[0]&#160;&&&#160;0x70&#160;)&#160;>>&#160;4&#160;)&#160;+&#160;(&#160;rtc[0]&#160;&&&#160;0x0F&#160;);

        week&#160;=&#160;rtc[3]&#160;&&&#160;0x0F&#160;;



}

也不知道设置的对不对,我是参考了1307的datasheet,还有就是你的那个库文件

另外,怎样才能把代码贴成你的那个样子啊有行号的那种
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-15 22:31:34 | 显示全部楼层
萧芸凤 发表于 2012-9-15 22:23
也不知道设置的对不对,我是参考了1307的datasheet,还有就是你的那个库文件

另外,怎样才能把代码贴 ...

其实对于Arduino的寄存器来说是不需要设置的,很多时候是已经被一些高手去整合起来了,你现在这个程序的寄存器准不准你需要去仔细看DS1307的datasheet才可以的哦。我没注意看这些,下面回答一下你贴代码的方法。1、点击高级编辑,出来编辑框以后,看图,
点击出来以后,把代码放进去点确认就好了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-9-16 18:15:44 | 显示全部楼层
本帖最后由 萧芸凤 于 2012-9-16 18:19 编辑
Randy 发表于 2012-9-15 22:31
其实对于Arduino的寄存器来说是不需要设置的,很多时候是已经被一些高手去整合起来了,你现在这个程序的寄 ...


下午研究了一下1307,看了半天的datasheet,才发现寄存器中本来就是BCD格式,不需要自己再进行转换了,所以说库文件那个转换过程有些问题,也许是模块不同吧,现在把代码贴一下

[pre lang="arduino" line="1" file="1307"]#include "Wire.h"
byte rtc[7];
int year,month,date,hour,minitue,second,week;
void setup()
{
        Wire.begin();                        //I2C初始化
        Serial.begin(9600);                //串口通讯初始化
        registerSet(0x68,0x00,0x00);        //时钟计数器开始
        registerSet(0x68,0x07,0x93);        //初始化为24时制
        registerSet(0x68,0x00,0x00);        //设置开始为0秒
        registerSet(0x68,0x01,0x40);        //设置开始为40分钟
        registerSet(0x68,0x02,0x17);        //设置开始为17点
        registerSet(0x68,0x03,0x06);        //设置开始为星期六
        registerSet(0x68,0x04,0x16);        //设置开始为16号
        registerSet(0x68,0x05,0x09);        //设置开始为9月
        registerSet(0x68,0x06,0x12);        //设置开始为12年
}



void loop()

{
        bcdRtc();

        Serial.print( year,HEX);        //串口输出,不要问为什么是十六进制,其实设置为HEX,BIN,OCT都可以,只要不是空着就行,
                                        //如果空着,秒分时的计数就不是59跳变了,而是89.
                                        //原因是什么我也不知道,只知道这样可以正常显示

        Serial.print(".");

        Serial.print(month,HEX);

        Serial.print(".");

        Serial.print(date,HEX);

        Serial.print(".");

        Serial.print(week,HEX);

        Serial.print(".");

        Serial.print(hour,HEX);

        Serial.print(":");

        Serial.print(minitue,HEX);

        Serial.print(":");

        Serial.print(second,HEX);

        Serial.println();

}







void registerSet(int deviceAddress, int registerAddress, int registerValue)  // 写寄存器

{

    Wire.beginTransmission(deviceAddress);

    Wire.write(registerAddress);

    Wire.write(registerValue);

    Wire.endTransmission();

}



void registerRead(int deviceAddress, int registerAddress) // 读寄存器

{
        int i;
    Wire.beginTransmission(deviceAddress);

    Wire.write(registerAddress);

    Wire.endTransmission();

    Wire.requestFrom(deviceAddress,7);

        if(Wire.available() <= 7);;

                {

                    for( i = 0 ; i < 7 ; i++)       

            rtc = Wire.read();
            

                }



        Wire.endTransmission();

       

}



void bcdRtc()

{       

       
       registerRead(0x68,0x00);

        year =  rtc[6];                        //并不需要进行什么换算了,寄存器中的数据就是BCD格式,十秒位,秒位会自动更新

        month = rtc[5];

        date = rtc[4];

        hour = rtc[2];

        minitue = rtc[1];

        second = rtc[0];

        week = rtc[3] ;



}[/code]
运行后的结果,以年月日星期时分秒的顺序显示

昨天研究了诺基亚的屏幕,今天又研究了1307,看来模块的差异很大,论坛上的教程有时候会起到误导作用,比如说今天的1307,如果使用到库,那么结果肯定是错误的,当然了,我也希望时我的模块问题。
贴一张模块和控制器的图片


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-16 19:06:04 | 显示全部楼层
萧芸凤 发表于 2012-9-16 18:15
下午研究了一下1307,看了半天的datasheet,才发现寄存器中本来就是BCD格式,不需要自己再进行转换了,所 ...

,模块有区别我们是必须有怀疑的,但是我们的笔记的库肯定是自己能工作了才贴出来了,不然肯定不会贴出来了的。呵呵。
回复 支持 反对

使用道具 举报

发表于 2012-9-16 19:21:10 | 显示全部楼层
Randy 发表于 2012-9-16 19:06
,模块有区别我们是必须有怀疑的,但是我们的笔记的库肯定是自己能工作了才贴出来了,不然肯定不 ...

我也想吧我的代码做成库,可惜不会。以前是学过C,但没有学过C++,面向对象只学了VB。08年iphone火爆时学了objective-C,不是很厉害,就制作了一个复数计算器和一个矩阵计算器用来解微分方程,还是只能解奇次方称。
学校里学的是汇编,用的是89C52,毕业 后再也没用过了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-16 19:58:16 | 显示全部楼层
萧芸凤 发表于 2012-9-16 19:21
我也想吧我的代码做成库,可惜不会。以前是学过C,但没有学过C++,面向对象只学了VB。08年iphone火爆时 ...

写库,用的最多就是C++了,我也不会C++,遗憾啊。我毕业的时候和你差不多,89S52毕业的。现在好很多了。呵呵。一起学习!
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 14:21 , Processed in 0.043818 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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