DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架

这篇具有很好参考价值的文章主要介绍了DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我要成为嵌入式高手之4月9日51单片机第四天!! ————————————————————————————

DS18B20温度传感器

单总线数字温度计

异步的半双工的串行通信

测量范围从-55℃ ~ +125℃,增量值为0.5℃

要用DS18B20采集温度,就要实现与单片机之间的通信,因此有两个问题

DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架,DS18B20,MODBUS

Bus master active low:主机执行低电平

DS1820 active low:DS18B20执行低电平

Both bus master and DS1820 active low:全都释放低电平

Resistor pull-up:电阻拉高

1、如何向DS18B20发送数据

sendChar(发送单字节的数据)

DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架,DS18B20,MODBUS

主机(单片机)向DS18B20写入(发送)0: 

        空闲时总线上呈现高电平,如果要发送0,就把总线电平拉低:至少(MIN)拉低15微秒,典型(TYP)拉低30微秒,最多(MAX)拉低60微秒。这样一段时间就表示单片机向DS18B20写入一个0;(由于是异步传输,故0 和 1只能靠控制时间长短来表示)

主机(单片机)向DS18B20写入(发送)1:

        空闲时总线上呈现高电平,如果要发送1,就把总线电平拉低,拉低时间大于1微秒后,立刻又将电平拉高,拉高时间为:至少(MIN)拉高15微秒,典型(TYP)拉高30微秒,最多(MAX)拉高60微秒。

2、如何从DS18B20读取数据

readChar()

DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架,DS18B20,MODBUS

MASTER SAMPLES:主机采样(读引脚电平)

主机(单片机)从DS18B20读取(接收)0:

        空闲时总线上呈现高电平,DS18B20会将电平拉低,在拉低后的15微秒以内,单片机进行采样,若为低电平,说明收到的是0;

主机(单片机)从DS18B20读取(接收)1:

        空闲时总线上呈现高电平,DS18B20会将电平拉低,在拉低后1微秒之后且15微秒以内,单片机进行采样,若为高电平,说明收到的是1;

以上两图即为DS18B20数据收发原理

———————————————————————————————————————————

DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架,DS18B20,MODBUS

DS18B20采集流程

复位

1、单片机向DS18B20发送0xCC

2、单片机向DS18B20发送0x44(启动温度变换)

3、延时(将温度模拟转换为数字需要时间,大约为700ms)

复位

4、单片机向DS18B20发送0xCC

5、单片机向DS18B20发送0xBE(读取温度)

6、单片机连续从DS18B20读取两个字节

如何将读取到的字节转换为浮点型(float)?

读出的两个字节是一个补码,需要 * 0.0625(2 ^ -4)得到温度

涉及到的问题:

        单片机P37和DS18B20总线连接起来,要是P37要拉低电平,总线要拉高电平,那到底是高电平还是低电平?

        答:一定是低电平,因为有任一方拉低,相当于该总线接地,那么就是低电平。

        那么如何保证该总线一定是高电平呢?

        答:在该总线上外接一个上拉电阻(4.7k ~ 10k)(因为51的内部构造,导致51的上拉电平非常弱,因此需要这个电阻来添一把力,保证它是高电平),这样在单片机和DS18B20同时拉高时,该总线一定是高电平。

DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架,DS18B20,MODBUSDS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架,DS18B20,MODBUS

这俩表现出一种特性:线与特性

拉高总线的操作称为:释放总线

拉低总线的操作称为:占有总线

DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架,DS18B20,MODBUS

初始化过程"复位和存在脉冲"

黑色线表示单片机拉低,此时DS18B20释放总线(最少480最多960微秒);然后单片机释放总线在60~240微秒之内DS18B20要拉低总线,这样就能检测到低电平,在240微秒之后,DS18B20再次释放总线,此时总线上必然会检测到高电平,这样就表示该信号存在可以被使用

延时10us函数

//延时10us
void delay10us(unsigned int n)	//@12.000MHz
{
	unsigned char data i;

	while (n--)
	{
		i = 2;
		while (--i);
	}
}

初始化

#include "ds18b20.h"

#define DS18B20CLR (P3 &= ~(1 << 7))
#define DS18B20SET (P3 |= (1 << 7))
#define DS18B20TST ((P3 & (1 << 7)) != 0)//判断总线是否为高电平,1为高电平,0为低电平

void delay10us(unsigned int n)	//@12.000MHz
{
	unsigned char data i;

	while (n--)
	{
		i = 2;
		while (--i);
	}
}

int rest18b20(void)
{
	int t = 0;

	DS18B20CLR;//单片机拉低
	delay10us(70);//延时
	DS18B20SET;//释放总线

	while (t <= 24 && DS18B20TST)//240us之内,DS18B20为高电平
	{
		delay10us(1);
		++t;		
	}
	if (t >= 24)//超过240us
	{
		return 0;//说明初始化有问题
	}
	
	t = 0;
	while (t <= 24 && !DS18B20TST)//240us之内,DS18B20为低电平
	{
		delay10us(1);
	}
	if (t > 24)
	{
		return 0;//一直为低电平,跳不上高电平,初始化有问题
	}	
	return 1;//在240us之内出现低电平,初始化正确,返回1
}

 向18b20发送数据

/*******************
 *向18b20发送数据
 *一次发送一个char
 *先发低位
 ******************/
void sendChar(unsigned char n)//LSB先行,先发低位
{
	int i = 0;
	
	for (i = 0; i < 8; ++i)
	{
		if ((n & 0x01) != 0)//判断要发的位不为0,此时应该找1的时序图
		{
			DS18B20CLR;
			_nop_();
			_nop_();
			DS18B20SET;
			delay10us(3);			
		}
		else
		{
			DS18B20CLR;
			delay10us(5);
			DS18B20SET;
		}
		n >>= 1;
	}
}

从18b20接收数据

/********************
 *从18b20接收数据
 *一次发送一个char
 *从低位开始接收
 *返回接收到的数据
 ********************/
unsigned char readChar(void)//接收18b20的数据,每次接收一个字符
{
	unsigned char ret = 0;
	int i = 0;

	for (i = 0; i < 8; ++i)
	{
		DS18B20CLR;//拉低总线
		_nop_();//空指令,但是消耗了一个指令周期,1us
		_nop_();
		DS18B20SET;//释放总线
		_nop_();
		_nop_();
		_nop_();
		//采样:DS18B20TST表示P37是(1)否(0)为高电平,若接收到1,左移或运算可以将指定位置1(第i位为1,其余位为0)
		ret |= DS18B20TST << i;
		delay10us(5);
	}
	return ret;
}

获取温度(按照流程)

float getTemerature(void)
{
	unsigned char t1, t2;	
	int ret = 0;
//接收温度的总流程
	rest18b20();
	sendChar(0xCC);
	sendChar(0x44);
	delay10us(60000);
	rest18b20();
	sendChar(0xCC);
	sendChar(0xBE);

	t1 = readChar();//低位
	t2 = readChar();//高位
	//将字符型转换为浮点型
	ret = t2 << 8 | t1;
	return ret * 0.0625;	
//
}

 main.c

如何查看获取到的温度的数据呢?

这里采用串口调试查看(uart->send_buffer)

#include "ds18b20.h"
#include "uart.h"

int main(void)
{
	float f;
	char s[16];	

	uart_init();	

	while (1)
	{
		f = getTemerature();
		sprintf(s, "%f", f);
		send_buffer(s, strlen(s));
	}
		
	return 0;
}

MODBUS协议框架

帧:

起始字节 地址码 功能码 数据长度 数据码 数据码 校验码  结束码
0xAA 0x01
01 读温度
02 读秒数
03 设置秒数
02 xx xx xx

0x0D

例如:

读温度:

上位机发出:AA 01 01 00 ** 0D        下位机回复:AA 81 01 04 xx xx xx xx ** 0D

                        0000 0001                                        1000 0001

                        第一位0代表上位机发给下位机,第一位1代表下位机发给上位机

读秒数:

上位机发出:AA 01 02 00 ** 0D        下位机回复:AA 81 02 xx xx ** 0D

                                                                               两个字节的数值,大端发送文章来源地址https://www.toymoban.com/news/detail-853176.html

到了这里,关于DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机读取DS18B20温度传感器

    1 .首先我们知道DS18B20是 单总线协议 ,只有一根数据线。所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平。有了这些概念,我们就能进行下一步。                                                图一 (截取

    2024年02月08日
    浏览(41)
  • 51单片机(十三)DS18B20温度传感器

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(44)
  • 51单片机DS18B20测温LCD1602显示

    主函数 自定义头文件 LCD1602函数 DS18B20 共用函数

    2024年02月11日
    浏览(43)
  • MCU-51:单片机DS18B20温度报警器

    DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点 测温范围:-55°C 到 +125°C 通信接口:1-Wire(单总线) 其它特征:可形成总线结构、内置温度报警功能、

    2024年02月02日
    浏览(54)
  • 单片机第二季:温度传感器DS18B20

    目录 1,DS18B20介绍 2,DS18B20数据手册  2.1,初始化时序  2.2,读写时序  3,DS18B20工作流程 4,代码   DS18B20的基本特征: (1)内置集成ADC,外部数字接口,也就是可以直接与单片机的数字接口连接,DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只

    2024年02月10日
    浏览(54)
  • 【小实验】C51单片机 DS18B20温度显示实验

         利用单总线技术和数码管动态显示的原理,要求实现DS18B20温度采集并显示,能够设定温度值上限值27.5度,当超出上限值LED灯闪烁。    实验前可先用protues绘制出原理图:   代码仅供参考,希望大家能够在此基础上优化代码,而不是ctrl+c,ctrl+v。 谢谢!!!        

    2024年02月12日
    浏览(44)
  • 基于51单片机多路温度检测proteus仿真 ds18b20

    本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 功能说明: 通过对多路DS18B20温度传感器的数据采集,实现8路/4路温度采集并将数值显示在LCD显示屏上; 通过按键设置温度报警

    2024年02月12日
    浏览(49)
  • 【蓝桥杯-单片机学习笔记(十三)】DS18B20温度传感器

    一、温度传感器-DS18B20介绍 DS18B20是单总线数字化温度传感器,测量温度范围是-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.5℃。支持3V~5.5V的供电电压范围。DS18B20可以程序设定9~12位的分辨率,精度为±0.5℃。 1.DS18B20内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度

    2023年04月09日
    浏览(63)
  • 基于51单片机的DS18B20温度控制加热降温系统设计

    仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0007 结合实际情况,基于51单片机设计一个排队叫号系统设计。该系统应满足的功能要求为: 系统由51单片机、DS18B20温度传感器、LCD1602液晶显示屏、继电器、风扇、加热膜、按键、蜂鸣器组成。 可实现以下基本功能

    2023年04月09日
    浏览(79)
  • 51单片机DS18B20测温数码管显示例程(Proteus仿真+程序)

          本设计由STM32单片机+DS18B20温度传感器+四段数码管显示模块组成。 1、主控制器是51单片机 2、DS18B20温度传感器采集温度,精度0.1摄氏度 3、数码管显示温度,由三极管驱动。 4、测温范围-55~110摄氏度,误差±0.1℃ 注意:Proteus7.8以上版本打开 19、51单片机DS18B20测温数码管

    2023年04月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包