Proteus中DS18B20 Search Rom的问题

2019-03-24 17:02发布

求助,关于DS18B20 Search Rom的问题。共4个DS18B20,如下图所示,使用了Search Rom命令,但是结果有点怪,比如28之后多出来2位,求高人指导。

1.jpg
2.jpg

附相关程序:
#include <reg52.h>
#include<stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

bit flag;
sbit ds=P2^2;

uchar symbol;

void delayus(uint t)
{
        while(t--);
}
delay(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=200;b>0;b--);

}
void ds_reset()
{
        ds=1;       
        delayus(5);
        ds=0;
        delayus(70);
        ds=1;
        delayus(15);
        if(ds==0)
                flag=1;
        else
                flag=0;
        delayus(40);
}

void ds_writebit(bit dat)
{       
        ds=1;
        delayus(5);
        ds=0;
        _nop_();
        _nop_();
        ds=dat;
        delayus(6);
}

void ds_writebyte(uchar dat)
{
        uchar i;
        bit temp;
        for(i=0;i<8;i++)
        {
                temp=(dat>>i)&0x01;       
                ds_writebit(temp);
        }
}

bit ds_readbit()
{
        bit dat;
        ds=1;
        delayus(5);
        ds=0;
        _nop_();
        _nop_();
        ds=1;
        _nop_();
        _nop_();
        dat=ds;
        delayus(6);
        return dat;
}

uchar ds_readbyte()
{
        uchar i,j,k;
        for(i=0;i<8;i++)
        {
                j=ds_readbit();
                k=(j<<7)|(k>>1);
        }
        return k;
}

uchar ds_read2bit()  
{  
    uchar i,x=0;  
    for(i=0;i<2;i++)  
    {   
        x<<=1;  
        if(ds_readbit())  
            x|=1;  
    }  
    return x;  
}  


void uart_initial(uint baud)
{
        TMOD=0x20;
        TH1=256-28800/baud;//11.0592MHz;若SMOD=1,则再乘以2
        TL1=TH1;
        TR1=1;
        SCON=0x50;
        EA=1;
        ES=1;
}


#define MaxNum 4 //定义最多有4个DS18B20
uchar ds_RomID[MaxNum][8];
uchar ds_SearchRom()  
{   
    uchar k,l,chongtuwei,m,n,temp,row,num=0;  
    uchar zhan[MaxNum];
    bit bit1;  
    l=0;  
    row=0;  
    do  
    {  
        ds_reset();  
        ds_writebyte(0xf0);      
        for(m=0;m<8;m++)  
        {  

            for(n=0;n<8;n++)  
            {  
                k=ds_read2bit();//读两位数据  
                k=k&0x03;  

                if(k==0x01)//01读到的数据为0 写0 此位为0的器件响应  
                {            
                    ds_writebit(0);
                                    temp=0;
                                        ds_RomID[row][m]=(temp<<7)|(ds_RomID[row][m]>>1);          

                }  
                else if(k==0x02)//读到的数据为1 写1 此位为1的器件响应  
                {  

                    ds_writebit(1);  
                    temp=1;ds_RomID[row][m]=(temp<<7)|(ds_RomID[row][m]>>1);
                }  
                else if(k==0x00)//读到的数据为00 有冲突位 判断冲突位   
                {               //如果冲突位大于栈顶写0 小于栈顶写以前数据 等于栈顶写1  
                    chongtuwei=m*8+n+1;                  
                    if(chongtuwei>zhan[l])  
                    {                        
                        ds_writebit(0);  
                        temp=0;ds_RomID[row][m]=(temp<<7)|(ds_RomID[row][m]>>1);                                               
                        zhan[++l]=chongtuwei;                        
                    }  
                    else if(chongtuwei<zhan[l])  
                    {  
                                                bit1=(ds_RomID[row-1][m]>>n)&0x01;
                                                ds_writebit(bit1);
                                                temp=bit1;ds_RomID[row][m]=(temp<<7)|(ds_RomID[row][m]>>1);

                    }  
                    else if(chongtuwei==zhan[l])  
                    {  

                        ds_writebit(1);  
                        temp=1;ds_RomID[row][m]=(temp<<7)|(ds_RomID[row][m]>>1);
                        l=l-1;  
                    }  
                }  
                else  
                {  
                    return num; //搜索完成,//返回搜索到的个数  
                }  
            }  

        }  
        num=num+1;
                row++;  
    }  
    while(zhan[l]!=0);   

    return num;     //返回搜索到的个数  
}   

void main()
{
        uint i;
        uchar j,ds_num;
        uart_initial(9600);
        TI=1;
        printf(" start system ... ");
        ds_num=ds_SearchRom();
    for(i=0;i<ds_num;i++)  
    {  
        printf(" DS18B20 No%d ID: ",i);  
        for(j=0;j<8;j++)  
        {  
            printf("%02X ",ds_RomID[j]);  
        }  
    }  
        while(1)
        {
       
        }
}




此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
yl616768
1楼-- · 2019-03-25 00:32
你好,我最近也在弄单线多DS18B20,遇到了点麻烦,能不能交流一下呀

一周热门 更多>