打印

很奇怪的ds18b20问题

[复制链接]
1480|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlyrh|  楼主 | 2013-5-16 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
还是这个问题未解决。STC90C52RC,单总线四根,12864显示,之前温度显示正常,其中一根18b20到49.2度后就四个都停止不动了,重启全部是85,降温显示正常。测试只有一根时也是到58度左右停止。菜鸟不清楚是什么原因拜求各位大神解答,谢谢了。附ds18b20部分程序:
//——————ds18b20延时——————//
void delay(uint t)
{
        while(t--);
}
//——————初始化——————//
void init_ds18b20(void)
{
        uchar n;
        dq = 1;
        delay(8);
        dq = 0;
        delay(80);
        dq = 1;
        delay(8);
        n = dq;
        delay(4);
}
//——————写数据——————// 低位在前
void write_byte(uchar dat)
{
        uchar i;
        for(i=0; i<8; i++)
        {
                dq = 0;
                dq =dat&0x01;
                delay(4);
                dq = 1;
                dat>>=1;//右移一位
        }
        delay(4);
}
//——————读字节——————//
uchar read_byte(void)
{
        uchar i, value;
        for(i=0; i<8; i++)
        {
                 dq = 0;
                value>>=1;
                dq = 1;//释放完采样
                if(dq)
                value|=0x80;
                delay(4);
        }
        return value;
}

//——————读取温度——————//
uint readtemperature(uchar *ID)
{
        uchar a;
        uint b;

        init_ds18b20();

        write_byte(0x55);//匹配rom
        for(a=0; a<8; a++)
        {
                write_byte(ID[a]);
        }
    delay_50us(10);
        write_byte(0x44);//启动温度测量
        delay_50us(10);
       
        init_ds18b20();
        delay_50us(10);
//        write_byte(0xcc);
        write_byte(0x55);//匹配rom
        for(a=0; a<8; a++)
        {
                write_byte(ID[a]);
        }
    delay_50us(10);
        write_byte(0xbe);//读取
        a = read_byte();  //低八
        b = read_byte();  //高八
       
        b = ((b*256)+a)*0.0625*10;

        return b;
}

相关帖子

沙发
huajinz| | 2013-5-16 13:12 | 只看该作者
        write_byte(0x55);//匹配rom
        for(a=0; a<8; a++)
        {
                write_byte(ID[a]);
        }
这段程序 我看有问题。

使用特权

评论回复
板凳
xlyrh|  楼主 | 2013-5-16 13:33 | 只看该作者
huajinz 发表于 2013-5-16 13:12
write_byte(0x55);//匹配rom
        for(a=0; a

单总线送入芯片的序列号啊,ID如下
uchar code ID1[] = {0x28,0x29,0xb0,0x11,0x04,0x00,0x00,0x58};        //ds18b20序列号
,否则无法匹配对应的18b20。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

4

帖子

0

粉丝