📄 ds18b20.h
字号:
#ifndef __DS18B20_H__
#define __DS18B20_H__
//#define uchar unsigned char
//#define uint unsigned int
bit Tflag; //温度正负值标志
sbit DQ=P2^3;
/***************************************************************************/
// 延时函数
void Delay(uint num)
{
while( --num );
}
/***************************************************************************/
//毫秒延时 11.0592 Mhz
void dmsec (uint count)
{
uint i; // 1ms延时
while (count--)
{
for (i=0;i<125;i++);
}
}
/***************************************************************************/
//复位脉冲
void tmreset (void)
{
DQ = 0;
Delay(90); // 精确延时 大于 480us
DQ = 1;
Delay(4); // 90,4 可以小范围变化
}
/***************************************************************************/
//存在脉冲
/*void tmpre (void)
{
while (DQ);
while (~DQ);
Delay(4);
}+/
/***************************************************************************/
//读一个位
bit tmrbit (void)
{
uint i;
bit dat;
DQ = 0; i++; // i++;大概1us
DQ = 1; i++; i++;
dat = DQ;
Delay(8);
return (dat);
}
/***************************************************************************/
//读一个比特
uchar tmrbyte (void)
{
uchar i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
/***************************************************************************/
//写一个比特
void tmwbyte (uchar dat)
{
uint i;
uchar j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1; // 从低位开始? if (testb)
{// Write 1
DQ = 0; // 先拉低
i++; i++; // >1us
DQ = 1;
Delay(4);
}
else
{// Write 0
DQ = 0;
Delay(4); // 大一点 没影响,但不能太大,写一个位在30us内
DQ = 1;
i++; i++; // 再拉高
}
}
}
/***************************************************************************/
//ds1820开始转换
void tmstart (void)
{
dmsec(1);
tmreset ();
// tmpre (); //等待存在脉冲
dmsec (1);
tmwbyte (0xcc); // skip rom
tmwbyte (0x44); // 转换
}
/***************************************************************************/
//读取温度
uchar tmrtemp (void)
{
uchar a,b,y1,y2,y3;
tmreset ();
//tmpre ();
dmsec (1);
tmwbyte (0xcc); // skip rom
tmwbyte (0xbe); // 转换
a = tmrbyte (); // LSB低8位
b = tmrbyte (); // MSB高8位
if((b & 0x80)==0x80) //判断温度正负
{
b=~b;a=~a+1; //负温度处理(DS18B20的负温度是正的反码,即将它取反+1,就得到正的温度)
y1=a>>4; //降低精度(去掉小数点)
y2=b<<4; //减小测量范围(-30°C---99°C)
y3=y1 | y2;
Tflag=0;
}
else
{
y1=a>>4;
y2=b<<4;
y3=y1 | y2;
Tflag=1;
}
return(y3);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -