温度传感器DS18B20通信时序检测周围环境温度
一、DS18B20简介
二、DS18B20通信时序
1、写时序
向DS18B20写一位数据的代码实现:
void WR_Bit(bit i)
{
DQ=0;//产生写时序
_nop_();
_nop_();//总线拉低持续时间要大于1us
DQ=i;//写数据 ,0和1均可
Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取
DQ=1;//释放总线
}
DS18B20写字节函数,先写最低位的代码实现:
void WR_Byte(unsigned char dat)
{
unsigned char i="0";
while(i++<8)
{
WR_Bit(dat&0x01);//从最低位写起
dat>>=1; //注意不要写成dat>>1
}
}
2、读时序
向DS18B20读一位数据的代码实现:
unsigned char Read_Bit()
{
unsigned char ret;
DQ=0;//拉低总线
_nop_(); _nop_();
DQ=1;//释放总线
_nop_(); _nop_();
_nop_(); _nop_();
ret=DQ;//读时隙产生7 us后读取总线数据。把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性
Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求
DQ=1;//释放总线
return ret; //返回读取到的数据
}
DS18B20读一个字节函数,先读最低位的代码实现:
unsigned char Read_Byte()
{
unsigned char i;
unsigned char dat="0";
for(i=0;i<8;i++)
{
dat>>=1;//先读最低位
if(Read_Bit())
dat|=0x80;
}
return(dat);
}
三、检测周围环境温度
1、代码实现:
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
void main(void)
{
uchar i,temp;
delay5(1000);
while(1)
{
temp=retemp();
for(i=0;i<10;i++)
{
out=(temp/10)&0x0f;
smg1=0;
smg2=1;
delay5(1000);
out=(temp%10)&0x0f;
smg1=1;
smg2=0;
delay5(1000);
}
}
}
void delay5(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
void init_ds18b20(void)
{
uchar x=0;
DQ =0;
delay5(120);
DQ =1;
delay5(16);
delay5(80);
}
uchar readbyte(void)
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5(1);
DQ =1;
date>>=1;
if(DQ)
date|=0x80;
delay5(11);
}
return(date);
}
void writebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01;
delay5(12);
DQ = 1;
dat>>=1;
delay5(5);
}
}
uchar retemp(void)
{
uchar a,b,tt;
uint t;
init_ds18b20();
writebyte(0xCC);
writebyte(0x44);
init_ds18b20();
writebyte(0xCC);
writebyte(0xBE);
a=readbyte();
b=readbyte();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}
2、proteus仿真
21
3、keil波形分析
22
4、普中开发板仿真
23
5、改变时序进行观察
显示的温度与现有温度不符
四、总结
时序对测量的数据的准确性是有一定影响的,我们在写延时函数时要注意,将时序弄准确后再进行实验