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

news2024/11/26 3:55:50

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

DS18B20温度传感器

单总线数字温度计

异步的半双工的串行通信

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

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

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

DS1820 active low:DS18B20执行低电平

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

Resistor pull-up:电阻拉高

1、如何向DS18B20发送数据

sendChar(发送单字节的数据)

主机(单片机)向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()

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

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

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

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

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

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

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

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释放总线(最少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协议框架

帧:

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

02xxxxxx

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

                                                                               两个字节的数值,大端发送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远程控制软件免费

远程控制软件免费&#xff1a;选择、价值与安全性探讨 随着科技的进步和互联网的普及&#xff0c;远程控制软件在日常生活和工作中的应用越来越广泛。这类软件允许用户通过网络远程访问和控制另一台计算机&#xff0c;为远程办公、技术支持和在线教育等提供了极大的便利。本文…

Java中双重检查锁(double checked locking)

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 双重检查锁&#x…

电脑硬件 - 内存

内存&#xff0c;是一台电脑的CPU与硬盘间数据交互的中转站。不稳定的内存时常会导致蓝屏&#xff0c;黑屏&#xff0c;死机&#xff0c;甚至电脑无法亮机。 在电脑工作中&#xff0c;CPU和硬盘间无时无刻地进行着大量的数据交互。为了保证软件流畅正常运行&#xff0c;会在中…

大厂Java笔试题之与7有关的数

题目&#xff1a;输出 1到n之间 的与 7 有关数字的个数。 一个数与7有关是指这个数是 7 的倍数&#xff0c;或者是包含 7 的数字&#xff08;如 17 &#xff0c;27 &#xff0c;37 ... 70 &#xff0c;71 &#xff0c;72 &#xff0c;73...&#xff09; 比如输入20&#xff0c;…

游戏测试审表流程

备注:本文为博主原创文章,未经博主允许禁止转载。如有问题,欢迎指正。 个人笔记(整理不易,有帮助,收藏+点赞+评论,爱你们!!!你的支持是我写作的动力) 笔记目录:笔记本~笔记目录_airtest和selenium那个好用-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪…

【黑马头条】-day06自媒体文章上下架-Kafka

文章目录 今日内容1 Kafka1.1 消息中间件对比1.2 kafka介绍1.3 kafka安装及配置1.4 kafka案例1.4.1 导入kafka客户端1.4.2 编写生产者消费者1.4.3 启动测试1.4.4 多消费者启动 1.5 kafka分区机制1.5.1 topic剖析 1.6 kafka高可用设计1.7 kafka生产者详解1.7.1 同步发送1.7.2 异…

吴恩达机器学习笔记:第 7 周-12支持向量机(Support Vector Machines)12.1-12.3

目录 第 7 周 12、 支持向量机(Support Vector Machines)12.1 优化目标12.2 大边界的直观理解 第 7 周 12、 支持向量机(Support Vector Machines) 12.1 优化目标 到目前为止,你已经见过一系列不同的学习算法。在监督学习中&#xff0c;许多学习算法的性能都非常类似&#xf…

【Python】python学生体能考核成绩管理系统(数据库) (源码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

新版chrome 解决在http协议下无法调用摄像头和麦克风的问题(不安全)

解决办法&#xff1a;亲测可行 chrome浏览器地址栏中输入chrome://flags/#unsafely-treat-insecure-origin-as-secure&#xff0c;回车&#xff0c;如下图&#xff0c;将该选项置为Enabled&#xff0c; edge浏览器打开&#xff1a;edge://flags/#unsafely-treat-insecure-orig…

linux文件访问权限理解

目录 一&#xff0c;涉及指令: 二&#xff0c;权限的表示 三&#xff0c;权限命令使用 一&#xff0c;涉及指令: umask chmod chown/chgrp 二&#xff0c;权限的表示 rwx rwx r-x含义: 访问方式: r-可读;w-可写&#xff1b;x-可执行&#xff1b; 访问用户:u-所有者;…

最新Android Studio导入aar包的方法

以前的方式&#xff0c;目前看网上也大多数都是这种方式&#xff0c;导致我本地加的时候一直有问题 但是这样都无法sync以及编译通过&#xff0c;因为方式已经变了 1&#xff1a;将aar文件复制到MyApplication\app\libs下 2&#xff1a;在MyApplication\app\build.gradle下添加…

LLM大语言模型助力DataEase小助手,新增气泡地图,DataEase开源数据可视化分析平台v2.5.0发布

2024年4月8日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.5.0版本。 这一版本的功能升级包括&#xff1a;新增DataEase小助手支持&#xff0c;通过结合智能算法和LLM&#xff08;即Large Language Model&#xff0c;大语言模型&#xff09;能力&#xff0c;DataEas…

Python(9):一文学懂进程,线程和协程

文章目录 一、进程1.创建多进程2.查看进程id3.进程池4.进程间的互相通信 二、线程1.threading线程模块2.创建多线程3.互斥锁4.死锁5.线程间的互相通信 三、协程1.认识协程2.gevent模块在爬虫中的应用 四、多线程、多进程、协程的区别 分类定义程序一个应用可以当做一个程序&…

广佛站点导航助手小程序产品使用说明书

一、产品简介 广佛站点导航助手小程序是一款专为广佛地区用户设计的地铁导航工具。通过获取用户的实时位置信息&#xff0c;小程序能够迅速定位并展示离用户最近的三个地铁站点。用户可以通过本小程序轻松查找地铁站点&#xff0c;规划出行路线&#xff0c;提高出行效率。 二、…

STM32 串口接收定长,不定长数据

本文为大家介绍如何使用 串口 接收定长 和 不定长 的数据。 文章目录 前言一、串口接收定长数据1. 函数介绍2.代码实现 二、串口接收不定长数据1.函数介绍2. 代码实现 三&#xff0c;两者回调函数的区别比较四&#xff0c;空闲中断的介绍总结 前言 一、串口接收定长数据 1. 函…

计算机网络——网络地址转换(NAT)技术

目录 前言 前篇 引言 SNAT&#xff08;Source Network Address Translation&#xff09;源网络地址转换 SNAT流程 确定性标记 DNAT&#xff08;Destination Network Address Translation&#xff0c;目标网络地址转换&#xff09; NAT技术重要性 前言 本博客是博主用于…

Docker学习笔记(二):在Linux中部署Docker(Centos7下安装docker、环境配置,以及镜像简单使用)

一、前言 记录时间 [2024-4-6] 前置文章&#xff1a;Docker学习笔记&#xff08;一&#xff09;&#xff1a;入门篇&#xff0c;Docker概述、基本组成等&#xff0c;对Docker有一个初步的认识 在上文中&#xff0c;笔者进行了Docker概述&#xff0c;介绍其历史、优势、作用&am…

Linux:软件包管理器 - yum

Linux&#xff1a;软件包管理器 - yum Linux的软件安装方式源代码安装rpm包安装yum安装 yum三板斧yum listyum installyum remove yum生态yum源 Linux的软件安装方式 源代码安装 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序 源代码安…

python+Flask+django企业仓库进销存管理信息系统35wiz

Flask提供了更大的灵活性和简单性&#xff0c;适合小型项目和微服务。Django则提供了更多的内置功能&#xff0c;适合大型项目。Flask让开发者更多的控制其组件&#xff0c;而Django则遵循开箱即用的原则 本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行&am…

五大背景图光线手法,附大量案例,可下载原图。

2023-10-01 23:05贝格前端工场 在背景图设计中&#xff0c;使用光线效果可以帮助营造科技感。以下是一些使用光线来表现科技感的设计技巧&#xff1a; 线性光源&#xff1a;使用线性光源可以在背景图中创建出明亮的光线效果。可以在设计中添加一条或多条线性光源&#xff0c;然…