一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2697|回复: 9
收起左侧

[51单片机] 用ds3231测温 怎么偏差这么大 比实际温度偏低4~5度

[复制链接]
发表于 2015-10-11 13:32 | 显示全部楼层 |阅读模式
本帖最后由 龙行天下 于 2015-10-11 13:34 编辑

用ds3231测温 怎么偏差这么大 比实际温度偏低4~5度  3231时间倒是挺准的

温度读取代码  只用了整数部分
uint    read_temp()      
{
                uchar temp;
                write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换

        temp=read_random(0x11);
         
        //IIC_Stop();
                return temp;
}
发表于 2015-10-11 14:07 | 显示全部楼层
手册上说的好像是误差3度
 楼主| 发表于 2015-10-11 14:40 | 显示全部楼层
本帖最后由 龙行天下 于 2015-10-11 14:50 编辑

3231温度读取函数里+4,这样温度就差不多了

温度读取代码  只用了整数部分
uint    read_temp()      
{
                uchar temp;
                write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换

        temp=read_random(0x11);
         
        //IIC_Stop();
                return temp+4;
}
不知道这样做对不对  加4以后和实际温度差不多 只能这样用了  

发表于 2015-10-11 15:09 | 显示全部楼层
本帖最后由 gongzhu 于 2015-10-11 15:45 编辑

void        Delay5US()           //@12MHz           延时5us
{
        _nop_();
}

void Start_I2C()
{
    SDA=1;                  //发送起始条件的数据信号
    SCL=1;
    Delay5US();             //起始条件建立时间大于4.7us,延时     
    SDA=0;                  //发送起始信号
    Delay5US();             // 起始条件锁定时间大于4μs                        
    SCL=0;                  //钳住I2C总线,准备发送或接收数据
}                                                                                                   

void Stop_I2C()
{
    SDA=0;                  //发送结束条件的数据信号
    SCL=1;                  //结束条件建立时间大于4us
    Delay5US();                                                                                             
    SDA=1;                  //发送I2C总线结束信号
}

uchar    read_temp()       /* -------- read temperature -------- */
{
int     itemp;
float   ftemp;

                //温度数据是以2 进制格式存储的并不需要数制转换
                write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换

        itemp = ( (int) read_random(0x11) << 5 );
        itemp += ( read_random(0x12)>> 3);
       Stop_I2C();

        if(itemp & 0x1000)
                        itemp += 0xe000;        /* if sign bit set, make 16 bit 2's comp */

        ftemp = 0.03125 * (float) itemp;        /* convert to degrees C */
        /* ftemp = ftemp * 9 / 5 + 32;  /* skip this if you don't want degrees F */
                return  (uchar) ftemp;
}
u8 read_random(u8 random_addr)
{
    Start_I2C();
    SendByte(DS3231_WriteAddress);
    if(ack==0)
        return(0);            
    SendByte(random_addr);
    if(ack==0)
        return(0);                           
    return(read_current());
}


 楼主| 发表于 2015-10-11 19:31 | 显示全部楼层
gongzhu 发表于 2015-10-11 15:09
void        Delay5US()           //@12MHz           延时5us
{
        _nop_();

用你这个函数试了下 和我上面的那个函数效果一样  温度比实际温度低 4度   
发表于 2015-10-11 21:10 | 显示全部楼层
那就不用他测温,计时即可
 楼主| 发表于 2015-10-12 00:48 | 显示全部楼层
快活丞 发表于 2015-10-11 21:10
那就不用他测温,计时即可

用18b20到是可以  就是点阵屏闪烁   
发表于 2015-10-12 12:55 | 显示全部楼层
龙行天下 发表于 2015-10-11 19:31
用你这个函数试了下 和我上面的那个函数效果一样  温度比实际温度低 4度

这样测试下——把模块放冰箱里冰一下,然后拿出来看温度上升的情况。
我的这个帖子你参考下:https://www.yleee.com.cn/thread-44732-1-1.html1
仅供参考!
发表于 2015-10-23 23:43 来自手机 | 显示全部楼层
龙行天下 发表于 2015-10-12 00:48
用18b20到是可以  就是点阵屏闪烁

读取18b20 路面的delay 函数 用恰当时间长度的 display 代替掉  就不闪了  
发表于 2015-10-23 23:48 | 显示全部楼层
点阵要是不控制OE调光就不影响,但是如果调光的话读取18B20就会闪,我试过怎么替代延时也会轻微的闪,可能本人能力有限,现在改成一分钟读一次

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-19 17:04 , Processed in 0.063591 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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