打印

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

[复制链接]
1979|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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
这么基本的语法还是拿你的课本先看看吧,别不听老师的,碰到问题上来就问啊 ...

我不是不懂语法,我是不知道为什么要写这两条,如果你明白给讲讲吧

使用特权

评论回复
5
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次,那么就可以把传回来的一个字节读出来。自己去体会一下!

使用特权

评论回复
6
ningling_21| | 2013-7-10 20:06 | 只看该作者
18B20低位在前发送数据,一个数据8位...

使用特权

评论回复
7
小营七郎| | 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;
}这是老板给我的代码,希望对你有帮助。

使用特权

评论回复
8
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位的数据。。。

使用特权

评论回复
9
liang5319| | 2013-7-10 23:54 | 只看该作者
没事多看看基础的知识吧

使用特权

评论回复
10
梦那些年|  楼主 | 2013-7-11 09:17 | 只看该作者
kkaikl 发表于 2013-7-10 15:28
你上面的程序是DS18B20的读操作程序,读一个字节。dat是定义的一个变量,刚开始值为0,进入for循环后,循环 ...

谢谢您的解答

使用特权

评论回复
11
梦那些年|  楼主 | 2013-7-11 09:19 | 只看该作者
小营七郎 发表于 2013-7-10 21:12
原来我还以为就我一个人不会了,哈哈。
读的时候在主机把线拉低到15US末尾的时候读,因为每次只能读一位, ...

谢谢,连图都附上了,学习中。

使用特权

评论回复
12
梦那些年|  楼主 | 2013-7-11 09:20 | 只看该作者
liang5319 发表于 2013-7-10 23:54
dat>>=1;
共8次循环,每次将Dat的所有位右移1位,比如dat=0x02,,所有的右移一次就是0x01吧。。。
      ...

:)

使用特权

评论回复
13
zhang17520| | 2013-7-11 11:08 | 只看该作者
:lol 学习了

使用特权

评论回复
14
tergy2012| | 2013-7-11 11:22 | 只看该作者
这个不懂

使用特权

评论回复
15
江枫渔火| | 2013-7-11 14:34 | 只看该作者
大家太热心了~太让人感动了~

使用特权

评论回复
16
怎么掉了呢| | 2013-7-16 11:26 | 只看该作者
骚年多看看C语言书吧

使用特权

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

本版积分规则

10

主题

88

帖子

0

粉丝