DS18B20多点采样(转贴)

作者: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值