📄 18b20.c
字号:
#include <reg52.h>
#include <main1.H>
bit flag1 = 0;
unsigned int gettemp1(void);
void delay3(unsigned int i) //(i*5+20)us
{
while(i--);
}
//初始化DS18B20
//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
void dsInit1()
//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us
{ ds1=1;
_nop_();
ds1 = 0;
delay3(100); //拉低约800us, 符合协议要求的480us以上
ds1 = 1; //产生一个上升沿, 进入等待应答状态
delay3(6);
if(ds1 == 0) {flag1=1;}
else {flag1=0;}
delay3(20);
ds1=1;
}
void write1(unsigned char wr)
{unsigned char i;
for(i=0;i<8;i++)
{ds1=0;
_nop_();
ds1=wr&0x01;
delay3(5);
ds1=1;
wr>>=1;
}
}
unsigned int readword1 (void)
{ unsigned char i;
unsigned int u1=0;
for (i=0; i<16; i++)
{ds1=0;
u1>>=1;
ds1=1;
if (ds1==1) u1|=0x8000;
delay3(4);
}
return (u1);
}
unsigned int gettemp1 (void)
{unsigned int tem1;
dsInit1();
if(flag1)
{write1 (0xcc); //skiprom
write1 (0x44); //tempconvert
dsInit1();
write1 (0xcc); //skiprom
write1 (0xbe); //readtemp
tem1=readword1();//read
return tem1;
}
}
//DS18B20 获取温度
int getTmpValue(int tt)
{
signed int tmpvalue;
int value; //存放温度数值
float t;
unsigned char low, high;
tmpvalue=tt;
low=tmpvalue;
high=tmpvalue>>8;
//将高低两个字节合成一个整形变量
//计算机中对于负数是利用补码来表示的
//若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
value = tmpvalue;
//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
t = value * 0.0625;
//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入
//如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度
//如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度
//value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
//value=abs(value);
t = t*100;
if(high>128)
return (-t);
else
return t;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -