求助,关于DS18B20 Search Rom的问题。共4个DS18B20,如下图所示,使用了Search Rom命令,但是结果有点怪,比如28之后多出来2位,求高人指导。
附相关程序:
#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)
{
}
}
此帖出自小平头技术问答
一周热门 更多>