初次接触DS18B20,有许多语句不懂,麻烦大家帮帮忙,谢谢

[复制链接]
2563|15
 楼主| 梦那些年 发表于 2013-7-10 12:48 | 显示全部楼层 |阅读模式
unsigned char ReadOneChar(void){//读一个字节
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--){
                DQ = 0; // 给脉冲信号
                dat>>=1;
                DQ = 1; // 给脉冲信号
                if(DQ==1){
                        dat|=0x80;
                }
                Delay(4);
        }
        return(dat);
}



这两条语句的由来,不明白  dat>>=1;
        dat|=0x80; 请朋友们讲解讲解,谢谢了
南宫云明 发表于 2013-7-10 13:06 | 显示全部楼层
这是SPI通信吧,8位一个字节。。。
huangxz 发表于 2013-7-10 14:28 | 显示全部楼层
这么基本的语法还是拿你的课本先看看吧,别不听老师的,碰到问题上来就问啊;P
 楼主| 梦那些年 发表于 2013-7-10 14:43 | 显示全部楼层
huangxz 发表于 2013-7-10 14:28
这么基本的语法还是拿你的课本先看看吧,别不听老师的,碰到问题上来就问啊 ...

我不是不懂语法,我是不知道为什么要写这两条,如果你明白给讲讲吧
kkaikl 发表于 2013-7-10 15:28 | 显示全部楼层
你上面的程序是DS18B20的读操作程序,读一个字节。dat是定义的一个变量,刚开始值为0,进入for循环后,循环里根据读取到18B20传过来的数据(DQ)是1还是0,分别将dat对应的某一位置为1或0(就是那条右移语句的作用)。现在分析一下你那几条语句:
                  dat>>=1;//把dat右移一位。
                  if(DQ==1)//判断DQ位是不是等于1如果等于1,那么就把dat和1000 0000相或,
                  {
                        dat|=0x80;//如果等于1,那么就把dat和1000 0000相或
                  }
比如刚开始dat=0000 0000,假如读回来的DQ=1,那么dat=dat | 1000 0000,结果dat=1000 0000。然后回到for (i=8;i>0;i--)循环,即从
                {
                DQ = 0; // 给脉冲信号
                dat>>=1;
                DQ = 1; // 给脉冲信号
                if(DQ==1){
                dat|=0x80;
                }  再继续执行,执行完   DQ = 0; // 给脉冲信号 dat>>=1;   后,那么dat右移一位,dat=0100 0000
就这样循环8次,那么就可以把传回来的一个字节读出来。自己去体会一下!
ningling_21 发表于 2013-7-10 20:06 | 显示全部楼层
18B20低位在前发送数据,一个数据8位...
小营七郎 发表于 2013-7-10 21:12 | 显示全部楼层
原来我还以为就我一个人不会了,哈哈。
读的时候在主机把线拉低到15US末尾的时候读,因为每次只能读一位,所以一个字节的话要读8次,如果才开始读一个字节的最低位,那么就把这个位和0x01与,但是ds18b20才开始读的是一个字节的最高位,所以要和0x80与一下,如果为0,则与的结果为0,如果为1则与的结果为1。
  uchar Read_18B20(void){
    uchar i;
    uchar temp = 0;

    _DINT();
    for(i = 0;i < 8;i++)
    {
        temp >>= 1;
        DQ0;
        DelayNus(6);            //延时6us
        DQ1;
        DelayNus(8);            //延时9us
        DQ_in;
        _NOP();
        if(DQ_val)   temp |= 0x80;
        DelayNus(45);           //延时45us
        DQ_out;
        DQ1;
        DelayNus(10);           //延时10us
    }
    _EINT();

    return  temp;
}这是老板给我的代码,希望对你有帮助。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
liang5319 发表于 2013-7-10 23:54 | 显示全部楼层
  dat>>=1;
共8次循环,每次将Dat的所有位右移1位,比如dat=0x02,,所有的右移一次就是0x01吧。。。
     dat|=0x80; 这句话就是dat=dat|0x80,,,,0x80也就是最高位为1,剩下是0,,,,不管data原来是什么数据,,和0x80求或之后最高位一定是1,就是把这个数据的最高位强行置1,配合上边的移位指令,就可以把8个数据组合成一个8位的数据。。。
liang5319 发表于 2013-7-10 23:54 | 显示全部楼层
没事多看看基础的知识吧
 楼主| 梦那些年 发表于 2013-7-11 09:17 | 显示全部楼层
kkaikl 发表于 2013-7-10 15:28
你上面的程序是DS18B20的读操作程序,读一个字节。dat是定义的一个变量,刚开始值为0,进入for循环后,循环 ...

谢谢您的解答
 楼主| 梦那些年 发表于 2013-7-11 09:19 | 显示全部楼层
小营七郎 发表于 2013-7-10 21:12
原来我还以为就我一个人不会了,哈哈。
读的时候在主机把线拉低到15US末尾的时候读,因为每次只能读一位, ...

谢谢,连图都附上了,学习中。
 楼主| 梦那些年 发表于 2013-7-11 09:20 | 显示全部楼层
liang5319 发表于 2013-7-10 23:54
dat>>=1;
共8次循环,每次将Dat的所有位右移1位,比如dat=0x02,,所有的右移一次就是0x01吧。。。
      ...

:)
zhang17520 发表于 2013-7-11 11:08 | 显示全部楼层
:lol 学习了
tergy2012 发表于 2013-7-11 11:22 | 显示全部楼层
这个不懂
江枫渔火 发表于 2013-7-11 14:34 | 显示全部楼层
大家太热心了~太让人感动了~
怎么掉了呢 发表于 2013-7-16 11:26 | 显示全部楼层
骚年多看看C语言书吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

88

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部