📄 exp.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbit DQ=P1^0; //DS18B20的数据线
bdata uchar dat; //用于数据收发
sbit dat0=dat^0; //变量dat的最低位
sbit dat7=dat^7; //变量dat的最高位
void delay15(uchar n) //15us延时函数
{ do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
n--;
}while(n);
}
bit reset(void) //初始化DS18B20
{ bit err;
DQ=0; //在数据线上产生600us的低电平
delay15(40);
DQ=1; //数据线拉高
delay15(4); //延时60us
err=DQ; //读取数据线状态,err=0:复位成功
delay15(18); // err=1:复位失败
return(err);
}
void wrbyte(uchar d) //向DS18B20写入一个字节
{ uchar i;
dat=d;
for(i=8;i>0;i--) //循环写8位(先低位,后高位)
{ DQ=0; //产生15us的负脉冲
delay15(1);
DQ=dat0; //将当前数据位送数据线
dat=dat>>1; //将下一位要写入的数据移到最低位
delay15(1); //延时15us
DQ=1; //数据线拉高,为写入下一位做准备
}
}
uchar rdbyte(void) //从DS18B20 读取一个字节
{ uchar i;
dat=0; //读出数据初值为0
for(i=8;i>0;i--) //循环读8位(先低位,后高位)
{ dat=dat>>1; //读出数据先右移一位
DQ=0; //产生1us的负脉冲
_nop_();
DQ=1; //数据总线拉高
delay15(1); //延时15us
dat7=DQ; //读取数据
delay15(4); //延时,为读下一位做准备
}
return(dat);
}
void convert(void) //启动DS18B20开始温度转换
{ bit err;
err=reset(); //复位传感器
wrbyte(0xcc); //跳过多传感器识别
wrbyte(0x44); //启动温度转换
}
int readt(void) //读取DS18B20暂存器中的温度值
{ uchar h,l;
bit err;
err=reset(); //复位传感器
wrbyte(0xcc); //跳过多传感器识别
wrbyte(0xbe); //读暂存器指令
l=rdbyte(); //读温度低位
h=rdbyte(); //读温度高位
return(h*256+l);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -