打印

关于DS18B20 的读程序的问题

[复制链接]
1774|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
锵锵人行|  楼主 | 2008-1-4 13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);}
1。 是不是就在DQ = 0的时候将18B20的一位送出来 
 在DQ = 1的时候 单片机读这一位
2。 dat|=0x80  那么在18B20 送出的这个字节的最高位时  就不能清楚地知道他到底送出是 1还是0 了啊 
望指教

相关帖子

沙发
原野之狼| | 2008-1-4 13:20 | 只看该作者

回复一下,需要仔细看手册

这个还是得仔细看数据手册的,感觉楼主在这个问题上完全没有弄明白。。。
DQ=0是读取每一个位之前的起始信号。
DQ=1是把单片机管脚置为输入状态。
dat|=0x80是读取数据。 

使用特权

评论回复
板凳
孤星119| | 2008-1-4 13:26 | 只看该作者

dat|=0x80

 程序太少.DQ具体是什么意思,楼主估计没高清楚,我也没有.但是就
if(DQ) 
   dat|=0x80;语句来说.应该是这样的:DQ为1时,DAT接受的最高位为1,否则为0.
接受完毕,右移一位,继续重复上面的,直到8位完毕.很清楚的.

使用特权

评论回复
地板
锵锵人行|  楼主 | 2008-1-4 17:22 | 只看该作者

RE

DQ=0是读取每一个位之前的起始信号 
DQ=1是把单片机管脚置为输入状态。
这个理解了
dat|=0x80是读取数据
不是很清楚是怎么读得 
还有dat>>=1   太抽象了 
没有一个特别的形象的吗 
是8位一起从18B20里面出来吗   还是一位一位出来啊

使用特权

评论回复
5
turmary| | 2008-1-4 20:15 | 只看该作者

这个并不难理解

这句
if(DQ) 
   dat|=0x80;
搞懂就行了,

DQ是本次的输入数据
DQ为真(1),dat最高位就为1了
DQ为假(0),dat最高位因为dat>>=1句的关系为0了,
0x80是二进制的0b10000000

LZ,这么基础的东西没几人愿回答你了

使用特权

评论回复
6
锵锵人行|  楼主 | 2008-1-5 08:29 | 只看该作者

5555

那我得谢谢你 和上边那两位大哥了
没办法 谁叫我理解不了呢 那就得问了

使用特权

评论回复
7
cumtnj| | 2008-4-6 15:21 | 只看该作者

18b20的读和写


1. 读一个字节
uchar tmpread(void) //read a byte date 读一个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();        //调用的读一位函数
dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat); //将一个字节数据返回
}

其实理解这个程序不难,只要看资料时注意:单片机通过单线接口读取18B20数据时,地位在前,高位在后!
掌握了这一点,这个程序就很好解释了!
假设读到的每位数据依次为  J1 J2 J3 J4 J5 J6 J7 J8(由低到高排列)
按照上面程序的写法一步一步的分析,如下:
(1)
i=1时,dat=0;
   dat=(j<<7)|(dat>>1);
   (J1<<7)|(dat>>1) ,所以
   J1 0 0 0 0 0 0 0
|   0 0 0 0 0 0 0 0
=  J1 0 0 0 0 0 0 0
(2)
i=2时,dat=J1 0 0 0 0 0 0 0;
   dat=(j<<7)|(dat>>1);
   (J2<<7)|(dat>>1) ,所以
   J2 0 0 0 0 0 0 0
|   0 J1 0 0 0 0 0 0
=  J2 J1 0 0 0 0 0 0
……………………
依次类推,最后得到一个字节的数据 J8 J7 J6 J5 J4 J3 J2 J1(由高到低排列)
读取一个字节的数据就是这样来实现的!



2.写一个字节
void tmpwritebyte(uchar dat)          //write a byte to ds18b20
{   //写一个字节到DS18B20里
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)             //write 1 写1部分
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;          //write 0 写0部分
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}


注意:往18B20里写数据时,也是先从低位写起!

假设要写的一个字节的数据为 dat=J8 J7 J6 J5 J4 J3 J2 J1
(1)
j=1;
testb=J1;
dat=0 J8 J7 J6 J5 J4 J3 J2
(2)
j=2;
testb=J2;
dat=0 0 J8 J7 J6 J5 J4 J3
………………
依次类推,就可以把一个字节的数据从低到高写入18B20



我的理解就是这样的,希望对刚学习18b20的哥们有帮助!

使用特权

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

本版积分规则

30

主题

120

帖子

0

粉丝