单总线温度采集

目录

一、目标

二、原理介绍

三、实现单总线温度测量系统

1、利用DS18B20和LED数码管在Proteus仿真软件中实现单总线温度测量系统

2、Keil仿真演示


一、目标

1、学习单总线温度传感器的原理和通信时序;

2、使用51单片机的一个 IO 口模拟单总线时序与温度传感器DS18B20通信,将检测的环境温度读取出来。

二、原理介绍

DS18B20介绍:

DS18B20是美国DALLAS公司生产的数字温度传感器,体积小、低功耗、抗干扰能力强。可直接将温度转化成数字信号传送给单片机处理,因而可省去传统的信号放大、A/D转换等外围电路。DS18B20转换时间与分辨率有关。当设定为9位时,转换时间为93.75ms;设定10位时,转换时间为187.5 ms;当设定11位时,转换时间为375ms;当设定为12位时,转换时间为750ms。当DS18B20采集的温度为+125℃时,输出为*0x07d0,则:实际温度=(0x07d0)/16=(0×163+7×162+13×161+0×160)/16=125℃当DS18B20采集的温度为-55℃时,输出为0xfc90,由于是补码,则先将11位数据取反加1得0x0370,注意符号位不变,也不参加运算,则实际温度=(0x0370)/16=(0×163+3×162+7×161+0×160)/16=55℃。注意,负号则需对采集的温度进行判断后,再予以显示。

DS18B20部分代码如图所示:

74LS47是BCD-7段译码器/驱动器,用于将单片机P0口输出欲显示的BCD码转化成相应的数字显示的段码,并直接驱动LED数码管显示。

三、实现单总线温度测量系统

1、利用DS18B20和LED数码管在Proteus仿真软件中实现单总线温度测量系统

Keil源码如图所示:

#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++)	//连续扫描数码管10次
	 {
	 out=(temp/10)&0x0f;
	 smg1=0;
	 smg2=1;
	 delay5(1000);	//延时5ms
	 out=(temp%10)&0x0f;
	 smg1=1;
	 smg2=0;
	 delay5(1000);	//延时5ms
	 }
	}
}
/*--------------精确延时5us子程序---------*/
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;	//15微秒内拉释放总线
		  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;//写"1" 在15微秒内拉低
	  delay5(12);	   //写"0" 拉低60微秒
	  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);
}

Proteus仿真图如图所示:

Proteus仿真演示如图所示:

2、Keil仿真演示

规定初始化时序如图所示:

如图所示,两条画线之间的时间间隔为0.304ms左右,这段时间为单总线上的初始化过程,此时主机输出低电平,并保持低电平时间超过480us,所以产生复位脉冲

如图所示,在产生复位信号后,主机释放总线,外部上拉电阻将单总线拉高,并延时了0.25ms左右,此时进入接收模式,相比于要求延时15~60us的规定,本次演示远远超出了规定,拉高了190~235us,明显这是不符合规定和技术要求的

如图所示,在进入接受模式后,DS18B20会拉低单总线,并延时了35.5us左右,同时产生了低电平应答脉冲,相比于要求延时60~240us的规定,本次演示远远超出了规定,拉低了25~205us,明显这是不符合规定和技术要求的

规定写时序图如图所示:

如图所示,写0时序时,主机输出低电平,延时35us,与规定的延时60us不符,然后释放总线并延时18.5us,与规定的延时2us不符

如图所示,写1时序时,主机输出低电平,延时2us

写1时序延时2us后,主机释放单总线,同时延时52us,略低于规定的60us

规定的读时序如图所是

如图所示,主机发起时序到采样总线状态总共用时35us,其中前1us为主机拉低总线并延时所用时间,前15us为采样总线状态开始时间,所以采样总线完成时间为20us

如图所示,采样总线状态后,外部上拉电阻拉高总线,并延时18us

所以,本次仿真演示的各时序如图所示:

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值