芯片解密DS3231作为一个走时精准的RTC芯片,内部带有温度补偿电路,此例将读取其中11H和12H寄存器,提取测得的温度值并传送到串口输出。
芯片解密1.根据DS3231的芯片手册,其温度传感器的精度为±3℃,毕竟不是专用的温度传感器,在使用中可以作为一个参考,且仅此而已。
2.根据DS3231的芯片手册,其温度分辨率为±0.25℃,所以其小数部分读出的值只能是.00、.25、.50、.75这四种,如果读出的值不是这四种,则数据处理有误。
3.本实验使用一个float型数据直接接收了转换的温度值,没有对补码的符号位进行判断等。
注明:本程序没有使用CONV位进行强制转换,但是实际上温度值的刷新速度还是很令人满意(用手按住芯片,温度值更改速度很快,下面的测试图片是恒温下检测的,故无变化)。
测试程序:
- #include<STC15.H>
- #include"stdio.h"
- #include<intrins.h>
- //位定义
- sbit DS3231_SDA=P3^3;
- sbit DS3231_SCL=P3^2;
- //运行数组
- unsigned char DS3231_Time_Buffer[7]={0x00,0x48,0x11,0x02,0x12,0x02,0x19};
- unsigned char temp[2]={0,0};
- char buf[20]={0};
- //运行标志位
- bit busy=0;
- //运行变量
- float v;
- /*##############################################################################
- 芯片解密
- ##############################################################################*/
- /*###################以下为给DS3231定义的IIC通信函数################*/
- void DS3231_Delay()//使用空操作进行短暂的延时
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- void DS3231_IIC_Start()//IIC总线的开始信号
- {
- DS3231_SCL=1;
- DS3231_SDA=1;
- DS3231_Delay();
- DS3231_SDA=0;
- DS3231_Delay();
- DS3231_SCL=0;
- }
- void DS3231_IIC_Stop()//IIC总线的停止信号
- {
- DS3231_SCL=0;
- DS3231_SDA=0;
- DS3231_Delay();
- DS3231_SCL=1;
- DS3231_Delay();
- DS3231_SDA=1;
- DS3231_Delay();
- }