打印

我用ds18b20匹配ROM时不正常

[复制链接]
2371|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
回归线|  楼主 | 2007-6-28 00:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在匹配ROM时,发送64位代码时,不管发送的是什么,都能读出温度,如果加两个传感器时读出的是乱码。请各位执教。程序如下

sbit DQ =P1^1;   //定义通信端口

//延时函数

//extern void send (unsigned char ff);


uchar rom[8]={0x28,0xfd,0x97,0xB6,0x00,0x00,0x00,0x58};

void delay(unsigned int i)
{
    while(i--);
}

//初始化函数
Init_DS18B20(void)
{
    unsigned char x=0;
    DQ = 1;    //DQ复位
    delay(8);  //稍做延时
    DQ = 0;    //单片机将DQ拉低
    delay(80); //精确延时 大于 480u
    DQ = 1;    //拉高总线
    delay(14);
    x=DQ;      //稍做延时后 如果x=0则初始化成功 x="1则初始化失败"
    delay(20);
}

//读一个字节
ReadOneChar(void)
{
    unsigned char i=0;
    unsigned char dat = 0;
    for (i=8;i>0;i--)
    {
        DQ = 0; // 给脉冲信号
        dat>>=1;
        DQ = 1; // 给脉冲信号
        if(DQ)
        dat|=0x80;
        delay(4);
    }
    return(dat);
}

//写一个字节
WriteOneChar(unsigned char dat)
{
    unsigned char i=0;
    for (i=8; i>0; i--)
    {
        DQ = 0;
        DQ = dat&0x01;
        delay(5);
        DQ = 1;
        dat>>=1;
    }
    delay(4);
}

//读取温度
unsigned int ReadTemperature(void)
{
    unsigned char a=0;
    unsigned char b=0;
    unsigned int  t=0;
    uchar i,j;
//    float tt=0;
    Init_DS18B20();
    WriteOneChar(0xCC); // 跳过读序号列号的操作
    WriteOneChar(0x44); // 启动温度转换
    for(j=250;j>0;j--);//延时
    Init_DS18B20();//复位
//    WriteOneChar(0xCC); //跳过读序号列号的操作
    WriteOneChar(0x55); 
    for(i=0;i<8;i++)
    {
        WriteOneChar(rom);
    }
    WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    a=ReadOneChar();
    b=ReadOneChar();
    

    t=b;
    t<<=8;
    t=t|a;
//    tt=t*0.0625;
    
//    tt= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
    return(t);
}

相关帖子

沙发
回归线|  楼主 | 2007-6-28 22:26 | 只看该作者

怎么没有人回答呢?

没有人遇到同样的问题吗?好惨啊

使用特权

评论回复
板凳
古道热肠| | 2007-6-29 09:53 | 只看该作者

有些新东西,只能靠自已了。

  到maxim网站上找应用笔记作参考是上策。

使用特权

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

本版积分规则

8

主题

17

帖子

0

粉丝