DS18B20多点采样(转贴)

转载 2007年10月14日 13:31:00

作者:xuanyu

//***********************************************
#define DS18B20_DIR P2DIR
#define DS18B20_OUT P2OUT
#define DS18B20_IN P2IN
//***********************************************
#define TRUE 1
#define FALSE !TRUE
//***********************************************
unsigned char Ds18b20_read_byte(void);//从 1-wire 总线上读取一个字节
void delay(unsigned int);//延时
unsigned char Ds18b20_present(void);//ds18b20复位和存在脉冲
void Ds18b20_write_byte(unsigned char);//向 1-WIRE 总线上写一个字节
//***********************************************
// GLOBAL VARIA**ES
//static unsigned char ROM[8]; // ROM Bit
//static unsigned char lastDiscrep = 0; // last discrepancy
//static unsigned char doneFlag = 0; // Done flag
//static unsigned char FoundROM[10][8]; // ta**e of found ROM codes
//static unsigned char numROMs;
//static unsigned char dowcrc;
//***********************************************
static unsigned char ow_crc(unsigned char);
//***********************************************
static const unsigned char dscrc_ta**e[] =
{
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
};
//***********************************************
static unsigned char Next(void);

//signed int Ds18b20_resault[10];
//static unsigned char numDS18B20s = 0;
//static unsigned char ROMCODE[2][8];
//static char tmpbuf[100] ;
//static unsigned char DS18b20_chanle = 0;

/************************************************
函 数 名: delay(unsigned int)
功 能:延时
说 明:
调 用:
全局变量:
入口参数:unsigned int
出口参数:无
返 回 值:无
************************************************/
//延时
void delay(unsigned int useconds)
{
for(; useconds > 0; useconds--)
{
_NOP();
_NOP();
}
}
/************************************************
函 数 名: Ds18b20_present()
功 能: ds18b20复位和存在脉冲
说 明:
调 用:
全局变量:
入口参数: 无
出口参数:无
返 回 值: unsigned char(0: presence, 1: no part)
************************************************/
//ds18b20复位
unsigned char Ds18b20_present(void)
{
unsigned char presence;
DS18B20_OUT |= DS18B20;
DS18B20_OUT &= ~DS18B20; //pull DQ line low
DS18B20_DIR |= DS18B20; //SET TO OUTPUT
delay(100); //le**e it low for 600us
DS18B20_OUT |= DS18B20; //allow line to return high
delay(4); //wait for presence
DS18B20_DIR &= ~DS18B20; //SET TO INPUT
presence = DS18B20_IN & DS18B20; //get presence signal
delay(100); //wait for end of timeslot
if(presence)
return(FALSE);
else
return(TRUE); //presence signal returned
} //1 = presence, 0 = no part
/************************************************
函 数 名: Ds18b20_read_bit()
功 能:从 1-wire 总线上读取一个位
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:unsigned char
************************************************/
//从 1-wire 总线上读取一个位
unsigned char Ds18b20_read_bit(void)
{
unsigned char bit = 0;
DS18B20_OUT &= ~DS18B20; //pull DQ low to start timeslot
DS18B20_DIR |= DS18B20; //SET TO OUTPUT
_NOP();
_NOP();
DS18B20_DIR &= ~DS18B20; //SET TO INPUT
if(DS18B20_IN & DS18B20)
bit = 1;
else
bit = 0;
delay(8); //wait for rest of timeslot
return(bit);
}
/************************************************
函 数 名: Ds18b20_read_byte()
功 能:从 1-wire 总线上读取一个字节
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:unsigned char
************************************************/
//从 1-wire 总线上读取一个字节
unsigned char Ds18b20_read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for(i = 8; i > 0; i--)
{
value >>= 1;
DS18B20_OUT &= ~DS18B20; //pull DQ low to start timeslot
DS18B20_DIR |= DS18B20; //SET TO OUTPUT
_NOP();
_NOP();
DS18B20_DIR &= ~DS18B20; //SET TO INPUT
if(DS18B20_IN & DS18B20)
value |= 0x80;
else
value &= ~0x80;
delay(8); //wait for rest of timeslot
}
return(value);
}
/************************************************
函 数 名: Ds18b20_write_bit(unsigned char)
功 能:向 1-WIRE 总线上写一个位
说 明:
调 用:
全局变量:
入口参数:unsigned char
出口参数:无
返 回 值:无
************************************************/
//向 1-WIRE 总线上写一个位
void Ds18b20_write_bit(unsigned char bit)
{
DS18B20_DIR |= DS18B20; //SET TO OUTPUT
DS18B20_OUT &= ~DS18B20; //pull DQ low to start time slot
_NOP();
if(bit & 0x01)
DS18B20_OUT |= DS18B20;
else
DS18B20_OUT &= ~DS18B20;
delay(12); //hold value for remainder of time slot
DS18B20_OUT |= DS18B20;
delay(10);
}
/************************************************
函 数 名: Ds18b20_write_byte(unsigned char)
功 能:向 1-WIRE 总线上写一个字节
说 明:
调 用:
全局变量:
入口参数:unsigned char
出口参数:无
返 回 值:无
************************************************/
//向 1-WIRE 总线上写一个字节
void Ds18b20_write_byte(unsigned char val)
{
unsigned char i;
DS18B20_DIR |= DS18B20; //SET TO OUTPUT
for(i = 8; i > 0; i--) //writes byte, one bit at a time
{
DS18B20_OUT &= ~DS18B20; //pull DQ low to start time slot
_NOP();
if(val & 0x01)
DS18B20_OUT |= DS18B20;
else
DS18B20_OUT &= ~DS18B20;
delay(12); //hold value for remainder of time slot
DS18B20_OUT |= DS18B20;
val >>= 1;
}
delay(10);
}

/************************************************
函 数 名: Ds18b20_Send_MatchRom()
功 能:匹配ROM
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
//匹配ROM
void Ds18b20_Send_MatchRom(void)
{
unsigned char i;
Ds18b20_present();
Ds18b20_write_byte(0x55);
for(i = 0; i < 8; i++)
{
Ds18b20_write_byte(FoundROM[DS18b20_chanle][i]);
}
}
/************************************************
函 数 名: Ds18b20_Convert_commond()
功 能:转换命令
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
void Ds18b20_Convert_commond(void)
{
Ds18b20_present();
Ds18b20_write_byte(0xCC); //Skip ROM
Ds18b20_write_byte(0x44); // Start Conversion
}
/************************************************
函 数 名: Ds18b20_Write_Scratchpad()
功 能:写暂存器
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
//写暂存器
void Ds18b20_Write_Scratchpad(void)
{
unsigned char i;
unsigned char buf[9];
buf[0] = 0;
buf[1] = 0;
buf[2] = 127;

Ds18b20_present();
Ds18b20_write_byte(0xCC); //Skip ROM

Ds18b20_write_byte(0x4E);
for(i = 0; i < 3; i++)
{
Ds18b20_write_byte(buf[i]);
}
}
/************************************************
函 数 名: Ds18b20_Copy_Scratchpad()
功 能:复制暂存器
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
//复制暂存器
void Ds18b20_Copy_Scratchpad(void)
{
Ds18b20_present();
Ds18b20_Send_MatchRom();
Ds18b20_write_byte(0x48);
}
/************************************************
函 数 名: Ds18b20_Read_ScratchPad()
功 能:读暂存器
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
//读暂存器
void Ds18b20_Read_ScratchPad(void)
{
int tmp;
unsigned char buf[9];
Ds18b20_present();
Ds18b20_Send_MatchRom();
Ds18b20_write_byte(0xBE);
for(tmp = 0; tmp < 9; tmp++)
{
buf[tmp] = Ds18b20_read_byte();
}
dowcrc = 0;
for(tmp = 0; tmp < 9; tmp++)
ow_crc(buf[tmp]);
if(dowcrc)
return;
if(buf[4] != 127)
{
Ds18b20_Write_Scratchpad();
Ds18b20_Copy_Scratchpad();
return;
}
tmp = buf[1]* 256 + buf[0];

if(tmp < 0)
{
Ds18b20_resault[DS18b20_chanle] = -((~tmp)+ 1);
}
else
{
Ds18b20_resault[DS18b20_chanle] = tmp;
}
}
/************************************************
函 数 名: ow_crc()
功 能:1-wire CRC校验
说 明:
调 用:
全局变量:
入口参数:数据
出口参数:无
返 回 值:无
************************************************/
// ONE WIRE CRC
static unsigned char ow_crc(unsigned char x)
{
dowcrc = dscrc_ta**e[dowcrc ^ x];
return dowcrc;
}
/************************************************
函 数 名: Next()
功 能:在1-wire上寻找下一个器件
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:
************************************************/
// The Next function searches for the next device on the 1-wire bus. If
// there are no more devices on the 1-wire then false is returned.
static unsigned char Next(void)
{
unsigned char m = 1; // ROM Bit index(id_bit_number)
unsigned char n = 0; // ROM Byte index
unsigned char k = 1; // bit mask
unsigned char x = 0;
unsigned char discrepMarker = 0; // discrepancy marker(last_zero)
unsigned char g; // Output bit (search_direction)
unsigned char nxt; // return value
unsigned char flag;

nxt = FALSE; // set the next flag to false
dowcrc = 0; // reset the dowcrc

flag = !Ds18b20_present(); // reset the 1-wire
if(flag || doneFlag) // no parts -> return false
{
lastDiscrep = 0; // reset the search
return FALSE;
}

Ds18b20_write_byte(0xF0); // send SearchROM command

do // for all eight bytes
{
x = 0;
if(1 == Ds18b20_read_bit())
x = 2;
if(1 == Ds18b20_read_bit() == 1)
x |= 1; // and its complement
if(x == 3)
{
break;// 搜索到的位都是1,there are no devices on the 1-wire
}
else
{
if(x > 0) // all devices coupled h**e 0 or 1
g = x >> 1; // 写一个位来搜索,bit write value for search
else
{
// if this discrepancy is before the last discrepancy
//on a previous Next then pick the same as last time
if(m < lastDiscrep)
g = ((ROM[n] & k) > 0);
else
g = (m == lastDiscrep);
// if equal to last pick 1
// if not then pick 0 if 0 was picked then record
// position with mask k
if(g == 0)
discrepMarker = m;
}
if(g == 1)
ROM[n] |= k;// isolate bit in ROM[n] with mask k
else
ROM[n] &= ~k;

Ds18b20_write_bit(g); // ROM search write
m++; // increment bit counter m
k <<= 1; // and shift the bit mask k
if(k == 0) // if the mask is 0 then go to new ROM
{
// byte n and reset mask
ow_crc(ROM[n]); // accumulate the CRC
n++;
k = 1;
}
}
}
while(n < 8); //loop until through all ROM bytes 0-7
if(m < 65 || dowcrc) // if search was unsuccessful then
lastDiscrep = 0; // reset the last discrepancy to 0
else
{
// search was successful, so set lastDiscrep,
// lastOne, nxt
lastDiscrep = discrepMarker;
doneFlag = (lastDiscrep == 0);
nxt = TRUE; // indicates search is not complete yet, more parts remain
}
return nxt;
}
/************************************************
函 数 名: FIRST()
功 能:
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:
************************************************/
// FIRST
// The First function resets the current state of a ROM search and calls
// Next to find the first device on the 1-wire bus.
static unsigned char First(void)
{
lastDiscrep = 0; // reset the rom search last discrepancy global
doneFlag = FALSE;
return Next(); // call Next and return its return value
}
/************************************************
函 数 名: FindDevices()
功 能:
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
//FIND DEVICES
void FindDevices(void)
{
unsigned char m;

numDS18B20s = 0;
if(Ds18b20_present()) //Begins when a presence is detected
{
if(First()) //Begins when at least one part is found
{
numDS18B20s = 0;
do
{
for(m = 0; m < 8; m++)
{
FoundROM[numDS18B20s][m] = ROM[m];
}
while(Next()&&(numDS18B20s < 10));
}
else
ProgramFlagCTL |= ERROR_FLAG;
}
else
ProgramFlagCTL |= ERROR_FLAG;
}

 

DS18B20多点测温(读序列,匹配序列,51 C程序,1602显示)

DS18B20多点测温(读序列,匹配序列,51 C程序,1602显示)         由于本人在前两天找DS18B20多点测温(51 C程序),网上下载了很多,但是都不是很理想,后来,自己总结前人...
  • dcx1205
  • dcx1205
  • 2013-06-09 17:24:56
  • 1756

一种快速查询多点DS18B20温度的方法

一种快速查询多点DS18B20温度的方法 为了满足实时性要求较高系统的设计需求,针对串联多个器件在一线制总线上的结构导致的在查询多点温度时速度缓慢的问题,北京铭正同创科技有限公司提出了一种快速查...
  • dldw8816
  • dldw8816
  • 2015-04-21 14:44:38
  • 4816

单片机挂载多个ds18b20 程序

  • 2014年09月19日 10:05
  • 30KB
  • 下载

基于STM32与DS18B20的温度采集

SystemInit();//系统时钟配置 delay_init(72);//系统延时函数初始化 Usart_Init(115200);//串口初始化 Beep_Init();//蜂鸣器初始化 LCD...
  • u011992534
  • u011992534
  • 2016-03-14 12:28:36
  • 1042

多个DS18B20的PROTEUS 仿真

  • 2009年03月02日 09:41
  • 60KB
  • 下载

DS18B20的温度显示程序,序列号读取,多点测温

  • 2011年05月19日 10:17
  • 3KB
  • 下载

多点测温 ds18b20 程序

  • 2009年04月23日 12:37
  • 73KB
  • 下载

模拟实时测温,1602显示,一个I/O口上挂两个温感DS18B20,实现于仿真上PROTEUS

DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位Write Protect(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定...
  • qq_32681121
  • qq_32681121
  • 2017-01-08 09:27:07
  • 1063

DS18B20分布式多点测温的Proteus仿真

  • 2009年05月19日 09:24
  • 1.97MB
  • 下载

ds18b20 汇编

程序清单: BW EQU 32H;四位动态显示数据 SW EQU 33H GW EQU 34H qw equ 38h TEML EQU 35H TEMH EQU 36H TEM EQU 37H FLA...
  • angianui
  • angianui
  • 2011-01-11 20:08:00
  • 451
收藏助手
不良信息举报
您举报文章:DS18B20多点采样(转贴)
举报原因:
原因补充:

(最多只允许输入30个字)