📄 ds18b20_51.h
字号:
//Filename:DS18B20_51.h
//Frequency:12MHz
#ifndef __uchar_
#define uchar unsigned char
#endif
#ifndef __uint_
#define uint unsigned int
#endif
/******下面变量用于确定转换精度,只要修改BIT的值就可以修改精度********
*****9位BIT=0X1f; 10位BIT=0x3f; 11位BIT=0x5f; 12位BIT=0X7f***/
#define BIT 0x1f
sbit DQ=P3^7; //定义通信端口
//延时函数
void delay(uint i)
{
while(i--);
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
//读一个字节
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(4);
}
//读取温度返回浮点数
float ReadTemperature_float(void)
{
uint a=0;
uint b=0;
float dat;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=8;
a|=b;
if(a&0x0800)
{
a=~a+1;
dat=-((a&0x07ff)*0.0625);
}
else dat=(a&0x07ff)*0.0625;
return dat;
}
//读取温度返回整数
char ReadTemperature_char(void)
{
uint a=0;
uint b=0;
uchar dat;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
b<<=8;
a|=b;
if(a&0x0800)
{
a=~a+1;
dat=-((a&0x07ff)*0.0625);
}
else dat=(a&0x07ff)*0.0625;
return dat;
}
/*该函数可用于修改转换精度*/
void Setmemory(void)
{
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x4e); //写暂存存储器(RAM)
WriteOneChar(0x00); //向内部RAM中写TH数据
WriteOneChar(0x00); //向内部RAM中写TL数据
WriteOneChar(BIT); //是9位还是12位转换精度只需改变此处的转换精度值就可以,
//9位为0X00,10位为0x20,11位为0x40,12位为0X60
WriteOneChar(0x48); //复制闪存器(将RAM中的TH和TL复制到EEPROM中)
Init_DS18B20(); //重新复位DS18B20
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0xbe); //读暂存器和CRC
Init_DS18B20(); //重新复位DS18B20
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x48); //复制闪存器(将RAM中的TH和TL复制到EEPROM中)
delay(1100);
Init_DS18B20(); //重新复位DS18B20
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -