找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1784|回复: 0
收起左侧

选择时钟芯片

[复制链接]
ID:117433 发表于 2017-3-5 21:37 | 显示全部楼层 |阅读模式
本帖最后由 xizhe2005 于 2017-3-5 21:44 编辑

做过几个时钟,用过1302,DS12C887,都不太理想,既然是时钟就要精准,结果过了两天就差了几分了,让人比较苦恼,其中DS12C887用STC的
1T单片机怎么也读不出来时间,只能用12T的单片机,用过这些后发现了DS3231这个时钟芯片,价格差不多,比12C887还便宜,是内置晶振的,
到底有多精准,直观的体会就是:过几天和手机的时间一对分毫不差。一下是很实用简单的程序:单片机是STC12C5A60S2,晶振11.0592M
#define DS3231_WriteAddress 0xD0    //器件写地址
#define DS3231_ReadAddress  0xD1    //器件读地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //时
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年
//启动信号函数
void IICstart_ds3231(void)
{
        SDA=1;
        SCL=1;
        _nop_();
        _nop_();
        SDA=0;
        _nop_();
        _nop_();
        SCL=0;
}
//停止信号函数
void IICstop_ds3231(void)
{
        SDA=0;
        SCL=1;
        _nop_();
        _nop_();
        SDA=1;
        _nop_();
        _nop_();
        SCL=0;
}
//向IIC总线写入一个字节函数
void Write1Byte_ds3231(unsigned char Buf1)
{
        unsigned char k;
        for(k=0;k<8;k++)
        {
                if(Buf1&0x80)
                        SDA=1;
                else
                        SDA=0;
                _nop_();
                _nop_();
                SCL=1;
                Buf1=Buf1<<1;
                _nop_();
                SCL=0;
                _nop_();
        }
        SDA=1;
        _nop_();
        SCL=1;
        _nop_();
        _nop_();
        SCL=0;
}
//从IIC读出一个字节函数
unsigned char Read1Byte_ds3231()
{
        unsigned char k,t=0;
        for(k=0;k<8;k++)
        {
                t=t<<1;
                SDA=1;
                SCL=1;
                _nop_();
                _nop_();
                if(SDA==1)
                        t=t|0x01;
                else
                        t=t&0xfe;
                SCL=0;
                _nop_();
                _nop_();
        }
        return t;        
}
//向指定地址写一个字节函数
void Write_ds3231(unsigned char Address,unsigned char Databuf)
{
        IICstart_ds3231();
        Write1Byte_ds3231(0xd0);//0xA0是IIC器件的写地址1010 0000最低位为0为写操作
        Write1Byte_ds3231(Address);
        Write1Byte_ds3231(Databuf);
        IICstop();
}
//从指定地址读一个字节的函数
unsigned char ReadAT_ds3231(unsigned char Address)
{
        unsigned char buf;
        IICstart_ds3231();
        Write1Byte_ds3231(0xd0);
        Write1Byte_ds3231(Address);
        IICstart_ds3231();
        Write1Byte_ds3231(0xd1);
        buf=Read1Byte_ds3231();
        IICstop_ds3231();
        return(buf);
}





评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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