DS18B20读写操作程序详解

一、ds18b20的初始化 (1) 先将数据线置高电平“1”。
(2) 延时(该时间要求的不是很严格,但是尽可能的短一点)
(3) 数据线拉到低电平“0”。
(4) 延时750微秒(该时间的时间范围可以从480到960微秒)。
(5) 数据线拉到高电平“1”。
(6) 延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由ds18b20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7) 若cpu读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8) 将数据线再次拉高到高电平“1”后结束。
二、 ds18b20的写操作 (1) 数据线先置低电平“0”。
(2) 延时确定的时间为15微秒。
(3) 按从低位到高位的顺序发送字节(一次只发送一位)。
(4) 延时时间为45微秒。
(5) 将数据线拉到高电平。
(6) 重复上(1)到(6)的操作直到所有的字节全部发送完为止。
(7) 最后将数据线拉高。
三、ds18b20的读操作 (1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时15微秒。
(5)将数据线拉高“1”。
(6)延时15微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时30微秒。
四、ds18b20读写操作程序 //----------------------------------------------------------
// 模块名称:ds18b20.h
// 模块功能:ds18b20 读写操作
//----------------------------------------------------------
sbit ds = p1^0;
//----------------------------------------------------------
// 函数名称:void delaytmp(unsigned int count)
// 函数功能:延时
//----------------------------------------------------------
void delaytmp(unsigned int count)
{
unsigned int i;
while(count)
{
i=200;while(i》0)i--;
count--;
}
}
//----------------------------------------------------------
// 函数名称:void dsreset(void)
// 函数功能:复位
//----------------------------------------------------------
void dsreset(void)
{
unsigned int i;
ds=0;
i=103; while(i》0)i--;
ds=1;
i=4;while(i》0)i--;
}
//----------------------------------------------------------
// 函数名称:bit tmpreadbit(void)
// 函数功能:读取一位
//----------------------------------------------------------
bit tmpreadbit(void)
{
unsigned int i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i》0)i--;
return (dat);
}
//----------------------------------------------------------
// 函数名称:unsigned char tmpread(void)
// 函数功能:读取一字节
//----------------------------------------------------------
unsigned char tmpread(void)
{
unsigned char i,j,dat;
dat=0;
for(i=1;i《=8;i++)
{j=tmpreadbit();
dat=(j《《7)|(dat》》1); }
return(dat);
}
//----------------------------------------------------------
// 函数名称:void tmpwritebyte(unsigned char dat)
// 函数功能:写入一字节
//----------------------------------------------------------
void tmpwritebyte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for(j=1;j《=8;j++)
{
testb=dat&0x01;
dat=dat》》1;
if(testb) //write 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i》0)i--;
}
else
{
ds=0; //write 0
i=8;while(i》0)i--;
ds=1;
i++;i++;
}
}
}
//----------------------------------------------------------
// 函数名称:void tmpchange(void)
// 函数功能:温度转换
//----------------------------------------------------------
void tmpchange(void)
{
dsreset();
delaytmp(1);
tmpwritebyte(0xcc);
tmpwritebyte(0x44);
}
//----------------------------------------------------------
// 函数名称:unsigned int tmp()
// 函数功能:获取温度
//----------------------------------------------------------
unsigned int tmp()
{
float tt;
unsigned char a,b;
unsigned int temp;
dsreset();
delaytmp(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp《《=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
//----------------------------------------------------------
// 函数名称:void refreshtmp()
// 函数功能:刷新温度
//----------------------------------------------------------
void refreshtmp()
{
tmpchange();
displaytmp(tmp());
}

openGauss社区开放治理迈出了新的一步
自助终端联网监控高效运维解决方案
富士康宣布退出!印度1400亿芯片项目要黄?
电子电路设计的四个技巧
赛普拉斯PSoC4芯片揭秘:玩转SAR ADC模块
DS18B20读写操作程序详解
iphone13官网预订流程
AI与人的关系如何被二次校准?
5G提供超宽带通信能力 助力智能移动安防起飞
鸿蒙的第一个世界版Hello World
Riskified与国际航空运输协会(IATA)宣布建立战略合作伙伴关系
基于Linux在射频识别模块实现便携式标签卡的信息采集和处理
大数据怎么和职业教育扯上关系
晶台高端影院P3系列将成为LED显示屏进军影屏的主力军
无人机蓝海波澜壮阔 苹果也来分一杯“技术羹”
利用FPGA现小型声纳的片上系统集成
架构师设计原则:编程时优先考虑的准则
RS485是什么,RS485的120欧匹配电阻应该如何接
华为发布5G全场景战略,踏足电视领域成实锤!
揭秘户外储能便携电站测试内容