qinzhendong 发表于 2010-8-17 20:49:55

我想问一下 18B20的手册上说 释放总线 是什么意思 ?

是设置PORTx口 为高阻态 还是上拉电阻啊

again 发表于 2010-8-17 21:11:54

弱上拉即可,注意两线与三线的区别

qinzhendong 发表于 2010-8-17 21:14:57

谢谢我是接4.7K电阻了   我说的是程序里的问题

823032003 发表于 2010-8-17 21:46:14

回复【1楼】again
弱上拉即可,注意两线与三线的区别
-----------------------------------------------------------------------

18B20不是 单总线吗?

honami520 发表于 2010-8-18 08:55:17

释放总线就是,输出高电平或者改为输入,这样,总线的电平为高就是释放了

qinzhendong 发表于 2010-8-19 20:44:58

呵呵这几天 终于弄明白了 也不知道对不对说出来讨论讨论

主机释放总线 就是放弃对总线的控制 倘若此时主机还对外输出 那么就肯定控制着总线反之主机必须设置为输入 检测总线的电平变化 如果主机设置成输入且上拉的话 (则在硬件连接可以省去4.7K的上拉电阻 )则主机与1820是线与的关系 1820输出低电平 I/O口就会变为低电平如果不上拉的话当主机设置为输入 则总线会自动被拉高   

呵呵就这么多了   希望大侠指教

juejiang 发表于 2010-8-19 22:59:50

控制I/O口输出高电平就可以了

dreamfy236 发表于 2010-8-29 10:43:30

回复【6楼】juejiang
-----------------------------------------------------------------------

有点不明白句的意思:

如果主机设置成输入且上拉的话 (则在硬件连接可以省去4.7K的上拉电阻 )

且上拉的话又   可以省去4.7K的上拉电阻

是什么意思???

qinzhendong 发表于 2010-8-29 20:47:36

4.7K的上拉电阻就是为了在主机释放总线的时候使总线电平为高如果其内部有足够的上拉则当主机设置为输入且上拉才满足

passjordan 发表于 2010-10-7 11:37:08

試了一下,外接有4.7k上拉時,設置為輸入且上拉不能釋放,內部不要上拉就可以了.
源程序如下:

    set18out;               //Set 18B20 IO output (pull down)
    set18low;
    delayus(500);         //Delay have to more than 480us

    //set18high;            //Pull up
    set18in;                //Set 18B20 IO input (release data line)
    delayus(85);            //Delay have to more than 60us

    while(PIN18);         //Can use this mode to check whether 18B20 reset is responed
    while(!(PIN18));      //Data line down means begin reset, up means reset

指教!

fanwt 发表于 2010-10-7 12:23:28

三态,低,高,高阻
最好是释放为高阻
高也可以线与

qinzhendong 发表于 2010-10-20 21:30:38

回复【9楼】passjordan
-----------------------------------------------------------------------

不好意思现在才看见   我把自己写的程序发上来(我做成了库)   您看看
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\   C文件
// 1-Wire Digital Thermometer


#include"DS18B20.h"

#include<avr/io.h>
#include<util/delay.h>


/********************************************************************************************************
** 描      述: DS18B20函数
**********************************************************************************************************/
/**********************************************************************
functionName: void Initial_DS18B20(void)
description :DS18B20初始化
**********************************************************************/
void Initial_DS18B20(void)
{   
                       
      SET_Master_Out;
        Set_DS18B20;                //Maga128控制总线
        Clr_DS18B20;                //强制拉低
        _delay_us(600);//延时500us,大于480us
        SET_Master_In;        //释放总线,总线自动上拉
      Set_DS18B20;
        _delay_us(45);      //等待85us,读取总线状态
        while(!        Check_DS18B20);//等待复位成功
        SET_Master_In;        //释放总线,总线自动上拉
      Set_DS18B20;
        _delay_us(500);
}
/**********************************************************************
functionName: uchar readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
uchar readByteDS18B20()
{
        uchar i;
        uchar retVal=0;
        for(i=8;i>0;i--)
        {
          SET_Master_In;
          Set_DS18B20;
          _delay_us(2);
          retVal>>=1;
          SET_Master_Out;       //Maga16控制总线
          Set_DS18B20;
          Clr_DS18B20;       //强制拉低
            _delay_us(2);    //延时2us,大于1us
          SET_Master_In; //释放总线
          Set_DS18B20;
          _delay_us(8);    //10us后读取总线状态,
          if(        Check_DS18B20)
                {
                  retVal|=0x80;
                     _delay_us(60);
                       
                }
           else
                {
                  _delay_us(60);      //延时30us
                   SET_Master_In;
                   Set_DS18B20;        //释放总线
               
                }
       }
         return(retVal);
}


/**********************************************************************
functionName: uchar readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void writeByteDS18B20(uchar wb)
{
        uchar j=8;
        for(j=8;j>0;j--)
        {

          SET_Master_In;
          Set_DS18B20;
          _delay_us(10);
          SET_Master_Out;
          Set_DS18B20;                 //Maga16控制总线
          Clr_DS18B20;                //强制拉低
          _delay_us(3);       //保持3us
          if((wb&0x01)==0x01)
           {

                SET_Master_In;
               Set_DS18B20;
                _delay_us(82);
          }
           else
           {

                Clr_DS18B20;
                _delay_us(82);
                SET_Master_In;
                Set_DS18B20;
          }
          wb>>=1;
               
        }
}






/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度
**********************************************************************/
void readTempDS18B20()
{
        uchar tempL,tempH;
        unsigned long int x;
        Initial_DS18B20();
        writeByteDS18B20(0xcc);         //跳过ROM
        writeByteDS18B20(0x44);                //启动温度转换

      _delay_ms(800);
        Initial_DS18B20();
        writeByteDS18B20(0xcc);                //跳过ROM
        writeByteDS18B20(0xbe);                //读数据

        tempL=readByteDS18B20();
        tempH=readByteDS18B20();
      tempH=tempH&0x07;
        x=(tempH<<8)|tempL;
        x=x*625;
      table=DIP_NUM;//100
        table=DIP_NUM;//10
      table=DIP_NUM;
        table=DIP_NUM;
      table=DIP_NUM;//0.1
        table=DIP_NUM;//0.01
        table=DIP_NUM;//0.001
        table=DIP_NUM;//0.0001
        table=DIP_NUM;
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\一下为 H文件
// 1-Wire Digital Thermometer


#ifndef __DS18B20_H__
#define __DS18B20_H__

#include<avr/io.h>
#include<util/delay.h>
/*******************************************************************************
** 描      述: 部分数组定义
********************************************************************************                                                                                                               

/*********************************************************************************
** 描      述: 宏定义
DS18B20操作定义 注意在MEGA128中 “当DDRx=0;PORTx=1;PUD=0(一般默认为零,可以不做改变)”;
在DS18B20的手册中讲到 MASTER释放总线 即表示此时BUS上的电平由DS18B20控制,MASTER只是
监视BUS上的电平变化,故在此前必须照“”内容进行设置;
********************************************************************************/

#define         ddr_dat             0
#define                Clr_DS18B20          PORTA&=~(1<<ddr_dat)        //数据线强制拉低
#define                Set_DS18B20          PORTA|=(1<<ddr_dat)                //数据线强制拉高
#define                SET_Master_Out          DDRA|=(1<<ddr_dat)                 //Mega128输出
#define                SET_Master_In          DDRA&=~(1<<ddr_dat)       //Mega128输入
#define                Check_DS18B20          PINA & 0x01)               //数据线的状态
         

/****************************************Copyright (c)**************************************************
** 描      述: 基本指令集
**********************************************************************************************************/

#define Read_Rom          0x33
#define Match_Rom         0x55
#define Skip_Rom          0xCC
#define Search_Rom      0xF0
#define Alarm_Search      0xEC
#define Convert_T         0x44
#define Read_Scratchpad   0xBE
#define Write_Scratchpad0x4E
#define Copy_Scratchpad   0x48
#define Recall_Eepram   0xB8
#define R_Power_Suply   0xB4


#endif

马学家 发表于 2013-6-22 20:39:47

1,释放总线一般就是指使管脚变为高阻态,这样就把总线空出来让其他器件用了。
2,对于51单片机,由于引脚内有上拉电阻,则释放总线代表对引脚写入1,这样总线被拉高,又很容易被其他器件的开集、开漏电路拉为低电平,也相当于空出总线让其他器件用。

STMstudy 发表于 2014-9-25 14:30:46

学习了,多谢

hsc0588 发表于 2014-9-25 14:38:08

看手册时序图

hemingjing 发表于 2014-9-26 14:48:30

高阻 。就是把控制权释放 。
页: [1]
查看完整版本: 我想问一下 18B20的手册上说 释放总线 是什么意思 ?