?? ds18b20.c
字號:
#include<w78e58b.h>
#include <intrins.h>
sbit dq18b20=P1^1;
sbit dq18b20_find=P1^0;
/************* delay time ******************************/
void ds18b20_delay(char t)
{
for(;t>0;t--)
{}
}
/************** wait *****************************/
bit ds18b20_wait(void)
{
unsigned char i;
bit x;
x=0;
for(i=0;i<100;i++)
{
if(~dq18b20)
{
if(dq18b20)
{x=1;return x;}
} }
return x;
}
/************** reset DS18B20 ************************/
void ds18b20_reset(void) // reset DS18b20
{
dq18b20_find=0;
dq18b20=0;
ds18b20_delay(50);
dq18b20=1;
dq18b20_find=1;
}
/*************** wait responsion ***********************/
/*************** read a bit data ******************************/
bit ds18b20_readbit(void)
{
bit x;
dq18b20=0;
_nop_();
_nop_();
_nop_();
_nop_();
dq18b20=1;
x=dq18b20;
return(x);
}
/**************** read a byte data *****************************/
unsigned char ds18b20_readbyte(void)
{
unsigned char i,dat,x;
dat=0x00;
for(i=0;i<8;i++)
{
x=ds18b20_readbit();
dat=(x<<7)|(dat>>1);
}
return(dat);
}
/******************* write a byte data *******************************/
void ds18b20_write(unsigned char dat)
{
unsigned char i,x;
for(i=0;i<8;i++)
{
x=dat&1;
dat>>=1;
if(x==1)
{
dq18b20=0;
ds18b20_delay(0);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
dq18b20=1;
}
else {
dq18b20=0;
ds18b20_delay(5);
dq18b20=1;
}
}
}
/************ starting DS18B20 ********************/
void ds18b20_start(void)
{ EA=0;
ds18b20_reset();
ds18b20_wait();
ds18b20_write(0xcc);
ds18b20_write(0x44);
EA=1;
}
/************* match rom *****************************/
short int match_temperature(unsigned char n[8])
{
unsigned char i,low,high;
unsigned char *p;
short int x;
EA=0; p=n;
ds18b20_reset();
ds18b20_wait();
ds18b20_write(0x55);
for(i=0;i<8;i++)
{
ds18b20_write(*p);
p++;
}
ds18b20_write(0xbe);
ds18b20_delay(3);
low=ds18b20_readbyte();
high=ds18b20_readbyte();
x=high&0xff;
x<<=8;
x+=low;
EA=1;
return x;
}
bit ds18b20_readbit_find(void)
{
bit x;
dq18b20_find=0;
ds18b20_delay(1);
dq18b20_find=1;
x=dq18b20_find;
return(x);
}
/**************** read a byte data *****************************/
unsigned char ds18b20_readbyte_find(void)
{
unsigned char i,dat,x;
dat=0x00;
for(i=0;i<8;i++)
{
x=ds18b20_readbit_find();
ds18b20_delay(1);
dat=(x<<7)|(dat>>1);
}
return(dat);
}
/************** wait *****************************/
bit ds18b20_wait_find(void)
{
unsigned char i;
bit x;
x=0;
for(i=0;i<100;i++)
{
if(~dq18b20_find)
{
ds18b20_delay(0);
if(dq18b20_find)
{x=1;return x;}
} }
return x;
}
/******************* dq18b20_find ***************************/
void ds18b20_write_find(unsigned char dat)
{
unsigned char i,x;
for(i=0;i<8;i++)
{
x=dat&1;
dat>>=1;
if(x==1)
{
dq18b20_find=0;
ds18b20_delay(0);
dq18b20_find=1;
}
else {
dq18b20_find=0;
ds18b20_delay(5);
dq18b20_find=1;
}
}
}
/*********** read number ********************************/
void ds18b20_number(unsigned char xxxxx[8])
{
unsigned char *p;
unsigned char i;
EA=0;
p=xxxxx;
ds18b20_reset();
ds18b20_wait_find();
ds18b20_write_find(0x33);
for(i=0;i<8;i++)
{
*p=ds18b20_readbyte_find();
p++;
}
EA=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -