DS3231
概述:在许多电子应用中都含有时钟要求,最节省成本的是直接使用单片机中的定时器作为计时方式,但是这种方式是有很大的不足,计时误差大,同时电源掉电不能保持时钟继续运行,不能满足长时间作为时钟计时。在对时钟要求较高的场合中,则使用廉价的时钟芯片(如DS1302,PCF8563等等)加备用电池,计时精度略高,可满足一般的要求。
在这篇文章中,我们重点介绍高精度时钟电路DS3231的设计和应用。在DS1302普及型时钟芯片,晶体均需外置,由于晶体的离散性,很难选择到精度很高的器件,同时也没有温度补偿电路,不同的温度环境下,晶体的特性也在变化,直接影响着时钟的振荡频率,较大的误差在所在所难免。而我爱线报网DS3231高精度时钟芯片,将晶体和温度补偿均集成在芯片中,为提高计时精度提供了可能,实册证明,使用DS3231时钟芯片,误差可做到一年小于一分钟,甚至部分显示器误差可小于20秒/一年。这对有相对精确时钟要求的应用场合是个理想的选择。
一、DS3231时钟芯片结构原理
DS3231是一款高精度I2C实时时钟(RTC)器件,具有集成的温度补偿晶体振荡器(TCXO)。该器件包含电池输入端,断开主电源时仍可保持精确计时。集成的晶体振荡器可提高器件的长期精确度。DS3231的寄存器能保存秒、分、时、星期、日期、月、年和闹钟设置信息,时钟和日历寄存器的内容采用二–十进制编码(BCD)格式。少于31天的月份,我爱线报网可自动调整月末日期,包括闰年补偿。时钟的工作格式为24小时或带AM/PM指示的12小时格式。DS3231提供两个可编程日历闹钟和一路可编程方波输出。DS3231与单片机通过I2C双向串行总线传输地址与数据。
引脚功能:
VCC用于主电源的DC引脚;
INT/SQW为低电平有效中断或方波输出:是低电平有效复位引脚;
N.C.表示无连接,外部必须接地;
GND为地;
VBAT为备用电源输入;
SDA为串行数据输入、输出;
SCL为串行时钟输入。
二、选型
DS3231有两种封装:1、SOP-16;2、SOP-8。
型号有DS3231sn、DS3231Mz,前者的精度高于后者,相差也不是很大。ds3231做的比较好的是引我爱线报网脚都是一样的
三、操作
该芯片提供的是IIC接口,使用起来比较方便。
#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_Y我爱线报网EAR 0x06 //年
//闹铃1
#define DS3231_SALARM1ECOND 0x07 //秒
#define DS3231_ALARM1MINUTE 0x08 //分
#define DS3231_ALARM1HOUR 0x09 //时
#define DS3231_ALARM1WEEK 0x0A //星期/日
//闹铃2
#define DS3231_ALARM2MINUTE 0x0b //分
#define DS3231_ALARM2HOUR 0x0c //时
#define DS3231_ALARM2WEEK 0x0d //星期/日
#define DS3231_CONTROL 0x0e 我爱线报网//控制寄存器
#define DS3231_STATUS 0x0f //状态寄存器
#define BSY 2 //忙
#define OSF 7 //振荡器停止标志
#define DS3231_XTAL 0x10 //晶体老化寄存器
#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位)
#define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)
//一般使用不需要进行复位操作
if(read_random(DS3231_CONTROL)!=0x1C){
if (write_byte(DS3231_CONTROL, 0x1C) 我爱线报网== 0)
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
}
if(read_random(DS3231_STATUS)!=0){
if (write_byte(DS3231_STATUS, 0x00) == 0)
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
}
完成这连个操作后就可以直接读取寄存器
void get_show_date(uint8 *data)
{
uint8 Ytemp,Mtemp,Dtemp;
Ytemp=BCD2HEX(read_random(DS3231_YEAR)); //年
Mtemp=BCD2HEX(read_random(DS3231_M我爱线报网ONTH));//月
Dtemp=BCD2HEX(read_random(DS3231_DAY)); //日
if(data!=0){
data[0]=Ytemp;
data[1]=Mtemp;
data[2]=Dtemp;
}
}
static uint8 BCD2HEX (uint8 val) //16->10
{
return val – 6 * (val >> 4);
}
static uint8 HEX2BCD (uint8 val) //10->16
{
return val + 6 * (val / 10);
}
推荐阅读
友情提醒: 请尽量登录购买,防止付款了不发货!
QQ交流群:226333560 站长微信:qgzmt2