温度传感器DS18B20通信时序检测周围环境温度

温度传感器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、改变时序进行观察

显示的温度与现有温度不符

在这里插入图片描述

四、总结

时序对测量的数据的准确性是有一定影响的,我们在写延时函数时要注意,将时序弄准确后再进行实验

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值