我想问一下 18B20的手册上说 释放总线 是什么意思 ?
是设置PORTx口 为高阻态 还是上拉电阻啊 弱上拉即可,注意两线与三线的区别 谢谢我是接4.7K电阻了 我说的是程序里的问题 回复【1楼】again弱上拉即可,注意两线与三线的区别
-----------------------------------------------------------------------
18B20不是 单总线吗? 释放总线就是,输出高电平或者改为输入,这样,总线的电平为高就是释放了 呵呵这几天 终于弄明白了 也不知道对不对说出来讨论讨论
主机释放总线 就是放弃对总线的控制 倘若此时主机还对外输出 那么就肯定控制着总线反之主机必须设置为输入 检测总线的电平变化 如果主机设置成输入且上拉的话 (则在硬件连接可以省去4.7K的上拉电阻 )则主机与1820是线与的关系 1820输出低电平 I/O口就会变为低电平如果不上拉的话当主机设置为输入 则总线会自动被拉高
呵呵就这么多了 希望大侠指教 控制I/O口输出高电平就可以了 回复【6楼】juejiang
-----------------------------------------------------------------------
有点不明白句的意思:
如果主机设置成输入且上拉的话 (则在硬件连接可以省去4.7K的上拉电阻 )
且上拉的话又 可以省去4.7K的上拉电阻
是什么意思??? 4.7K的上拉电阻就是为了在主机释放总线的时候使总线电平为高如果其内部有足够的上拉则当主机设置为输入且上拉才满足 試了一下,外接有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
指教! 三态,低,高,高阻
最好是释放为高阻
高也可以线与 回复【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 1,释放总线一般就是指使管脚变为高阻态,这样就把总线空出来让其他器件用了。
2,对于51单片机,由于引脚内有上拉电阻,则释放总线代表对引脚写入1,这样总线被拉高,又很容易被其他器件的开集、开漏电路拉为低电平,也相当于空出总线让其他器件用。 学习了,多谢 看手册时序图 高阻 。就是把控制权释放 。
页:
[1]