您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页DS18B02温度传感器——学习记录

DS18B02温度传感器——学习记录

来源:百家汽车网

学习目标:实现测温

一、DS18B20介绍

发送/读取数据帧

这里主要使用skip rom,convert t,read scratchpad指令。温度由2个字节存储,在读取暂存器时要分别读取温度数据的低字节和高字节。ms byte高5位是符号位,如果温度为正,那么前5位都是0,反之则为1。ls byte 后四位存的温度数据的小数部分,前4位是整数部分。

代码部分

一、测温部分

整体思路:onewire.c包含初始化,发送接收一位、一个字节的操作,DS18B20.c功能包括温度转化,读取温度。主函数调用DS18B20实现测温。

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "delay.h"
float T;

void main()
{
	DS18B20_convertT();//上电先转换一次温度,防止第一次读取数据错误
	delay(1000);//等待转换完成
	LCD_Init();
	LCD_ShowString(1,1,"temperature:");
	while(1)
	{
		DS18B20_convertT();
		T=DS18B20_readT();
		if(T<0)
		{
			LCD_ShowChar(2,1,'-');
			T=-T;
		}
		else
		{
		  LCD_ShowChar(2,1,'+');
		}
		LCD_ShowNum(2,2,T,3);//显示整数部分
		LCD_ShowChar(2,5,'.');
		LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);//显示小数部分,数据类型强制转换之后取余
	}
}

onewire.c

#include <REGX52.H>

sbit onewire_dq=P3^7;//重新命名引脚

unsigned char onewire_init()//初始化函数
{
	unsigned char i;
	unsigned char ackbit;//应答位
	onewire_dq=1;//确保拉低前总线为高电平
	onewire_dq=0;//拉低总线
	i = 227;while (--i);//延时500us
  onewire_dq=1;//主机释放
	i = 29;while (--i);//延时70us
	ackbit= onewire_dq;//获取总线电平
	i = 227;while (--i);//延时500us
	return ackbit;
}

void onewire_sendbit(unsigned char Bit)//发送一位
{
	unsigned char i;
	onewire_dq=0;//拉低总线
	i=4;while(--i);//调用一个函数体的时间是4微妙,在这里我们没有调用函数体,直接把函数内部的内容写在这里了,所以要加上4微妙的时间
	onewire_dq=Bit;//在14us时将要发送的一位赋值给总线
	i = 22;while (--i);//延时50us
	onewire_dq=1;//发送之后释放总线
}

unsigned char onewire_receivebit()
{
	unsigned char i;
	unsigned char Bit;
	onewire_dq=0;//拉低总线
	i=1;while(--i);//延时5us
	onewire_dq=1;//释放总线
	i=1;while(--i);//延时5us
	Bit=onewire_dq;//获取总线电平
	i=22;while(--i);//延时50us
	return Bit;
}

void onewire_sendbyte(unsigned char byte)//发送一个字节
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		onewire_sendbit(byte&(0x01<<i));//取出要发送的字节的每一位
	}
}

unsigned char onewire_receivebyte()
{
	unsigned char i;
	unsigned char byte=0x00;
	for(i=0;i<8;i++)
	{
		if(onewire_receivebit())
		{byte|=(0x01<<i);}
	}
	return byte;
}

DS18B20.c

#include <REGX52.H>
#include "onewire.h"
#define DS18B20_skip_rom 0xCC
#define DS18B20_convert_T 0x44
#define DS18B20_read_scratchpad 0xBE
void DS18B20_convertT()//温度转换
{
	onewire_init();//初始化
	onewire_sendbyte(DS18B20_skip_rom);//跳过rom
	onewire_sendbyte(DS18B20_convert_T);//开始温度变换
}

float DS18B20_readT()//读取温度
{
	unsigned char TLSB,TMSB;
	int temp;
	float T;//温度
	onewire_init();//初始化
	onewire_sendbyte(DS18B20_skip_rom);//跳过rom
	onewire_sendbyte(DS18B20_read_scratchpad);//读暂存器
	TLSB=onewire_receivebyte();
	TMSB=onewire_receivebyte();
	temp=(TMSB<<8)|TLSB;//组成完整的16位的二进制补码
	T=temp/16.0;//转化为浮点数
	return T;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务