问:仿制成功,温度显示有问题,不能大于26度,是哪的问题啊
答:
- 好多人反应都有这个问题,一超过25.5就回到了20多,暂时没条件测试了,等我的新的大数字万年历板子回来了再测试。
- 怀疑是DS3231.h中的 uint read_temp() 是否有问题(26度的临界bug)。
- uint read_temp() /* -------- read temperature -------- */
- {
- int itemp;
- float ftemp;
- //温度数据是以2 进制格式存储的并不需要数制转换
- write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换
- itemp = ( (int) read_random(0x11) << 5 ); //放大32倍
- itemp += ( read_random(0x12)>> 3);
- Stop_I2C();
- if(itemp & 0x1000)
- itemp += 0xe000; /* if sign bit set, make 16 bit 2's comp */
- ftemp = 0.3125 * (float) itemp+0.5; /* 放大10倍 */
- return (uint) ftemp;
- }
- 该read_temp() 函数放在C++编译环境中测试是可以大于26度的。
- 和温度相关的另一个函数是displaytime.h中的:
- /*温度值显示-----------------------------------------------------------------*/
- void displaytemp()
- {
- uint tvalue=read_temp();
- set1616pic(5,4,0,1); //显示"温度计图标"
- write_com(0x30); write_com(0x06);
- write_com(0x9d); //在液晶上显示温度起始位置:"28.8°C"
- if(tvalue>=100)
- write_data(tvalue%1000/100+0x30); //显示十位
- else
- write_data(0x20); //不显示十位
- write_data(tvalue%100/10+0x30); //显示个位
- write_data(0x2e); //显示小数点
- write_data(tvalue%10+0x30); //显示小数位
- set1616pic(8,4,0,0); //在第8列第4行不反白的°C图标
- }
复制代码
此函数似乎没多大问题。
但是我用同样的DS3231.h做的其他几个时钟温度是可以大于26度的:
29度!
希望其他懂单片机的坛友看到了此回复有精力就帮忙测试下DS3231的温度函数问题。
如果温度不够,可以用手触摸ds3231芯片让其升温至26度上!
原因已找到, ds3231芯片的问题 ,换了个就没事了,用的是一年前买的不带#号的片子。
|