本章讲一个跟小伙伴生活息息相关的技能——时钟!
原理大放送: 主角名叫DS3231,是一款低成本、高精度 I2C 实时时钟( RTC),具有集成的温补晶体振荡器( TCXO)和晶体。该器件包含电池输入端,断开主电源时仍可保持精确的计时。集成的晶体振荡器大大提高了器件的长期精确度。该时钟可以记录秒、分、时、星期、日期、月和年信息,少于 31 天的月份,将自动调整月末日期,包括闰年补偿。 芯片特性:- 工作电压:2.3V -- 5.5V
- 工作温度范围:0℃ - 70℃(商用级),-40℃ - 85℃(工业级)
- 0℃ - 40℃精度为±2ppm
- -40℃ - 85℃精度为±3.5ppm
关于它的精度,通俗来讲就是:每天的计时误差在0.3秒以内,一年不超过2分钟!
应用电路非常简单,只需要一个电源滤波电容即可,编程时注意硬件地址 
代码示例: 008 | unsigned long prev, interval = 1000 ; |
011 | char cmd_buff[CMD_BUFF]; |
012 | unsigned char count = 0 , time_tick; |
013 | unsigned char cmd_flag = 0 ; |
014 | unsigned char u8_temp, i; |
015 | unsigned short u16_temp; |
021 | DS3231_init(DS3231_INTCN); / / interrupt enable |
028 | unsigned long now = millis(); |
030 | / / show time once in a while |
031 | if ((now - prev) > interval) |
035 | snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d" , t.year, |
036 | t.mon, t.mday, t.hour, t. min , t.sec); |
038 | Serial.println(buff); |
047 | if ((time_tick > = 2 ) && (cmd_flag = = 1 )) |
054 | if conf time and date |
056 | if (Serial.available()) |
069 | cmd_buff[count + + ] = Serial.read(); |
070 | if (count > = 14 ) / / decode and set time |
075 | for (i = 0 ; i < 14 ; i + + ) |
083 | u16_temp + = cmd_buff[ 0 ] * 1000 ; |
084 | u16_temp + = cmd_buff[ 1 ] * 100 ; |
085 | u16_temp + = cmd_buff[ 2 ] * 10 ; |
086 | u16_temp + = cmd_buff[ 3 ]; |
093 | u8_temp + = cmd_buff[ 4 ] * 10 ; |
094 | u8_temp + = cmd_buff[ 5 ]; |
101 | u8_temp + = cmd_buff[ 6 ] * 10 ; |
102 | u8_temp + = cmd_buff[ 7 ]; |
109 | u8_temp + = cmd_buff[ 8 ] * 10 ; |
110 | u8_temp + = cmd_buff[ 9 ]; |
117 | u8_temp + = cmd_buff[ 10 ] * 10 ; |
118 | u8_temp + = cmd_buff[ 11 ]; |
125 | u8_temp + = cmd_buff[ 12 ] * 10 ; |
126 | u8_temp + = cmd_buff[ 13 ]; |
下载程序后打开串口调试助手,这个程序的功能比较腻害!提供两个功能:通过串口显示当前的时间;可以通过串口设置新的时间!重点讲下设置时间方式: 1 号箭头位置是待设置的新时间: 020150207143000,第 1 个字符为 0,后面跟年(2015)、月 (02)、日 (07)、时(14)、分(30)、秒(00)共 15 个字符, 输入完毕后,点击 2 号箭头发送,会看到新的时间已经写入。 注意:时间格式为 24 小时制;数据长度必须为 15 个字符,例如 2 月需要写成 02,其他数据段写法类似。

附件: ds3231.zip |