📄 ds18b20.c
字号:
//=========================================================
// test the temputure with 18b20
// copyright by wangmeng 2006.4.3
//==========================================================
#include"reg51.h"
sbit DQ =P2^3; // 定义DQ引脚为P1.7
//============================================================
//delay time is (1+2+2*t)*1.08
//=============================================================
void delay(unsigned char t)
{
while(--t);
}
//=============================================================
//reset 18b20
//=============================================================
unsigned char reset(void)
{
unsigned char presence;
DQ = 0;
delay(240); //holding 483us(400~960)
DQ = 1;
delay(15); //holding 33us(15~60)
presence = DQ;
delay(240); //wait for 18b20 203
return(presence); // return the sign,0 is presence, 1 is no
}
//==============================================================
//write one bit to 18b20
//==============================================================
void write_bit(char bitval)
{
DQ = 0;
delay(1);
if(bitval) DQ =1; //if write 1,DQ return 1
else DQ = 0;
delay(28); //holding 63us(>60us)
DQ = 1;
}
//==============================================================
//write one byte to 18b20
//==============================================================
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++)
{ // 写入字节, 每次写入一位
temp = val>>i;
temp &= 0x01;
write_bit(temp);
}
}
//==================================================
//read one bit from the 18b20
//==================================================
unsigned char read_bit(void)
{
unsigned char i;
DQ = 0;
delay(1);
DQ = 1; // then return high
delay(2); //delay 15us
i=DQ;
delay(25);
DQ = 1;
return(i);
}
//========================================================
//read one byte from 18b20
//========================================================
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{ // 读取字节,每次读取一个字节
if(read_bit()) value|=0x01<<i; // 然后将其左移
delay(3);
}
return(value);
}
//========================================
//get the temperature
//========================================
char Read_Temperature(void)
{
unsigned char get[10];
unsigned char temp_lsb,temp_msb;
int k;
reset();
write_byte(0xCC); // 跳过 ROM
write_byte(0x44); // 启动温度转换
delay(50);
reset();
write_byte(0xCC); // 跳过 ROM
write_byte(0xBE); // 读暂存器
for (k=0;k<9;k++)
{
get[k]=read_byte();
}
temp_msb = get[1]; // Sign byte + lsbit
temp_lsb = get[0]; // Temp data plus lsb
k=temp_msb;
k&=0x07; //match the sign bit
k=k<<8|temp_lsb;
k=k/16;
return(k);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -