搜索
bottom↓
回复: 15

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

[复制链接]

出0入0汤圆

发表于 2010-8-17 20:49:55 | 显示全部楼层 |阅读模式
是设置PORTx口 为高阻态 还是上拉电阻啊

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-8-17 21:11:54 | 显示全部楼层
弱上拉即可,注意两线与三线的区别

出0入0汤圆

 楼主| 发表于 2010-8-17 21:14:57 | 显示全部楼层
谢谢  我是接4.7K电阻了   我说的是程序里的问题

出0入0汤圆

发表于 2010-8-17 21:46:14 | 显示全部楼层
回复【1楼】again
弱上拉即可,注意两线与三线的区别
-----------------------------------------------------------------------

18B20不是 单总线吗?

出0入90汤圆

发表于 2010-8-18 08:55:17 | 显示全部楼层
释放总线就是,输出高电平或者改为输入,这样,总线的电平为高就是释放了

出0入0汤圆

 楼主| 发表于 2010-8-19 20:44:58 | 显示全部楼层
呵呵  这几天 终于弄明白了 也不知道对不对  说出来讨论讨论

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

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

出0入0汤圆

发表于 2010-8-19 22:59:50 | 显示全部楼层
控制I/O口输出高电平就可以了

出0入0汤圆

发表于 2010-8-29 10:43:30 | 显示全部楼层
回复【6楼】juejiang
-----------------------------------------------------------------------

有点不明白句的意思:

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

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

是什么意思???

出0入0汤圆

 楼主| 发表于 2010-8-29 20:47:36 | 显示全部楼层
4.7K的上拉电阻就是为了在主机释放总线的时候  使总线电平为高  如果其内部有足够的上拉  则当主机设置为输入且上拉才满足

出0入0汤圆

发表于 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

指教!

出0入0汤圆

发表于 2010-10-7 12:23:28 | 显示全部楼层
三态,低,高,高阻
最好是释放为高阻
高也可以线与

出0入0汤圆

 楼主| 发表于 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[0]=DIP_NUM[x/1000000];  //100
        table[1]=DIP_NUM[x%1000000/100000];//10
        table[2]=DIP_NUM[x/10000%100%10];
        table[3]=DIP_NUM[10];
        table[4]=DIP_NUM[x%10000/1000];//0.1
        table[5]=DIP_NUM[x%1000/100];//0.01
        table[6]=DIP_NUM[x%100/10];//0.001
        table[7]=DIP_NUM[x%10];//0.0001
        table[8]=DIP_NUM[11];
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\一下为 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_Scratchpad  0x4E
#define Copy_Scratchpad   0x48
#define Recall_Eepram     0xB8
#define R_Power_Suply     0xB4


#endif

出0入0汤圆

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

出20入0汤圆

发表于 2014-9-25 14:30:46 | 显示全部楼层
学习了,多谢

出0入0汤圆

发表于 2014-9-25 14:38:08 | 显示全部楼层
看手册时序图

出0入4汤圆

发表于 2014-9-26 14:48:30 | 显示全部楼层
高阻 。就是把控制权释放 。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表