18B20驱动代码步骤:
18B20驱动代码步骤:
***it DQ=P1^4;//数据输入输出脚 单总线接口
#include"intrins.h"
1、初始化
2、温度读取
3、读取18B20数据
4、写18B20数据
1、18B20初始化:
/18B20初始化*/
void dsinit()
{
DQ=0; //总线拉低初始化
Delay500us();
DQ=1; //拉高
Delay500us();
}
时序图:
2、写18B20数据:
void write(uchar dat)
{
uchar i;
for(i=0;i<8;i++)//八位数据写入
{
DQ=0; //总线拉低,开始写入数据
DQ=dat&0x01; // 0000 0000 &0000 0001= 0000 0001
Delay100us();
DQ=1; //总线拉高,结束数据写操作
dat>>=1;//数据右移动一位。
}
}
3、读取18B20数据:
/温度数据读取*/
uchar read()
{
uchar i;
uchar dat;
for (i=0;i<8;i++)
{
DQ=0; //总线拉低
dat=dat>>1; //数据移位
nop(); //大约延时15us
DQ=1; //总线拉高
if(DQ==1)//如果写完了数据,开始移位
{
dat |= 0x80;//1000 0000
}
Delay100us();
}
return dat; //返回值
}
4、温度读取:
uchar temget()
{
uchar temp;
uchar low,high;
dsinit();//18b20初始化
write(0xcc); //跳过ROM指令
write(0x44); //开始温度变换
Delay500us();
Delay500us();
dsinit(); //18b20初始化
write(0xcc); //跳过ROM指令
write(0xbe);//读暂存存储器和 CRC 字节 ,读数据直到 9 字节
low=read(); //获取温度下限
high=read();//获取温度上限
temp=high<<4; //
temp |=(low>>4); //
return temp;//返回数据,刷新
}
其中,温度读取函数uchar temget()可以直接返回到主程序之中运行, 即为:
uchar wendu;
wendu=temget();
liu=wendu/100;
qi=wendu%100/10;
ba=wendu%10;
相关的延时:
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
/18B20延时函数****/
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
nop();
nop();
i = 2;
j = 15;
do
{
while (–j);
} while (–i);
}
注意!!:使用官网给出的驱动的延时需要扩大8-10倍
写温度获取函数的步骤:
1、初始化
2、忽略ROM操作(ROM指令)【CCH】
3、DS18B20功能指令(读写)
忽略ROM指令:0xCC
发送温度转换指令:0x44
读取暂存器指令:0xbe
18B20驱动代码步骤:
18B20驱动代码步骤:
***it DQ=P1^4;//数据输入输出脚 单总线接口
#include"intrins.h"
1、初始化
2、温度读取
3、读取18B20数据
4、写18B20数据
1、18B20初始化:
/18B20初始化*/
void dsinit()
{
DQ=0; //总线拉低初始化
Delay500us();
DQ=1; //拉高
Delay500us();
}
时序图:
2、写18B20数据:
void write(uchar dat)
{
uchar i;
for(i=0;i<8;i++)//八位数据写入
{
DQ=0; //总线拉低,开始写入数据
DQ=dat&0x01; // 0000 0000 &0000 0001= 0000 0001
Delay100us();
DQ=1; //总线拉高,结束数据写操作
dat>>=1;//数据右移动一位。
}
}
3、读取18B20数据:
/温度数据读取*/
uchar read()
{
uchar i;
uchar dat;
for (i=0;i<8;i++)
{
DQ=0; //总线拉低
dat=dat>>1; //数据移位
nop(); //大约延时15us
DQ=1; //总线拉高
if(DQ==1)//如果写完了数据,开始移位
{
dat |= 0x80;//1000 0000
}
Delay100us();
}
return dat; //返回值
}
4、温度读取:
uchar temget()
{
uchar temp;
uchar low,high;
dsinit();//18b20初始化
write(0xcc); //跳过ROM指令
write(0x44); //开始温度变换
Delay500us();
Delay500us();
dsinit(); //18b20初始化
write(0xcc); //跳过ROM指令
write(0xbe);//读暂存存储器和 CRC 字节 ,读数据直到 9 字节
low=read(); //获取温度下限
high=read();//获取温度上限
temp=high<<4; //
temp |=(low>>4); //
return temp;//返回数据,刷新
}
其中,温度读取函数uchar temget()可以直接返回到主程序之中运行, 即为:
uchar wendu;
wendu=temget();
liu=wendu/100;
qi=wendu%100/10;
ba=wendu%10;
相关的延时:
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
/18B20延时函数****/
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
nop();
nop();
i = 2;
j = 15;
do
{
while (–j);
} while (–i);
}
注意!!:使用官网给出的驱动的延时需要扩大8-10倍
写温度获取函数的步骤:
1、初始化
2、忽略ROM操作(ROM指令)【CCH】
3、DS18B20功能指令(读写)
忽略ROM指令:0xCC
发送温度转换指令:0x44
读取暂存器指令:0xbe
举报