📄 ds18b20.c
字号:
#include <AT89X52.H>
#include <INTRINS.h>
sbit DQ =P1^4;
//延时函数
void delay(unsigned int i)
{
for(i;i>0;i--);
}
//初始化函数
bit Init_DS18B20(void)
{
DQ = 0; //单片机将DQ拉低
delay(255); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(60);
return(DQ); //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(200);
}
//读一个字节
unsigned char readdatafromds18b20(void)
{
unsigned char i;
unsigned char j;
unsigned char temp;
temp=0;
for(i=0;i<8;i++)
{
temp=_cror_(temp,1);
DQ=0;
_nop_();
_nop_();
DQ=1;
for(j=10;j>0;j--);
if(DQ==1)
{
temp=temp | 0x80;
}
else
{
temp=temp | 0x00;
}
for(j=200;j>0;j--);
}
return(temp);
}
void writecommandtods18b20(unsigned char command)
{
unsigned char i;
unsigned char j;
for(i=0;i<8;i++)
{
if((command & 0x01)==0)
{
DQ=0;
for(j=35;j>0;j--);
DQ=1;
}
else
{
DQ=0;
for(j=2;j>0;j--);
DQ=1;
for(j=33;j>0;j--);
}
command=_cror_(command,1);
}
}
//读取温度
unsigned int ReadTemperaturefromds18b20(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
writecommandtods18b20(0xCC); // 跳过读序号列号的操作
writecommandtods18b20(0x44); // 启动温度转换
Init_DS18B20();
writecommandtods18b20(0xCC); //跳过读序号列号的操作
writecommandtods18b20(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=readdatafromds18b20();
b=readdatafromds18b20();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
return(tt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -