当前位置: 首页 > news >正文

51单片机 - DS18B20实验1-读取温度

上来一张图,明确思路,程序整体裤架如下,通过单总线,单独封装一个.c文件用于单总线的操作,其实,我们可以把点c文件看成一个类操作,其属性就是我们面向对象的函数,也叫方法,操作起来方便,通过DS18B20调用封装好的单总线,实现温度的读取(用LCD1602显示出读取的温度  ),总后通过主函数调用这些模块,这就是模块化的编程,两个模块,主函数直接调用,也方便移植。

作者:Whappy

时间:2024.9.14

DS18B20实验-温度测试

第一步:模块化单总线 :OneWire.c

一共五个函数

看时序写代码

unsigned char OneWire_Init(void)
{unsigned char AckBit;OneWire_DQ = 1; //保证拉低之前是高电平OneWire_DQ = 0; //拉低Delay1ms();//延时1ms ,至少480usOneWire_DQ = 1;  //释放Delay70us();AckBit = OneWire_DQ; //应答位:存在的从机会拉低总线60~240us以响应主机Delay1ms();//延时1ms ,至少480usreturn AckBit;}

void OneWire_SendBit(unsigned char Bit)
{OneWire_DQ = 0; //拉低Delay10us();OneWire_DQ = Bit; //10us 将数据放到总线上Delay50us();OneWire_DQ = 1;  //释放
}

//接收一位:即主机51读取一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),
//读取为低电平则为接收0,读取为高电平则为接收1 ,整个时间片应大于60us
unsigned char OneWire_ReadBit(void)
{unsigned char Bit;OneWire_DQ = 0; //拉低Delay5us();OneWire_DQ = 1;  //释放Delay5us();Bit = OneWire_DQ;  //数据放到总线上,主机读Delay50us();return Bit;}

//发送一个字节:连续调用8次发送一位的时序,依次发送一个字节的8位(低位在前)
void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i=0; i<8; i++){OneWire_SendBit(Byte & (0X01 << i));}
}//接收一个字节:连续调用8次接收一位的时序,依次接收一个字节的8位(低位在前)unsigned char OneWire_ReceiveByte(void)
{unsigned char i, Byte = 0X00;for(i=0; i<8; i++){if(OneWire_ReadBit()){Byte |= (0x01);}}return Byte;
}

第二步:模块化 DS18B20.c:DS18B20.c  :两个函数


//温度转换函数 :初始化→跳过ROM →开始温度变换void DS18B20_ConvertTemperature(void)
{OneWire_Init();OneWire_SendByte(SKIP_ROM); //跳过ROM,写入一个字节数据,说我要读取温度OneWire_SendByte(CONVERT_T); //发送一个字节,让DS18B20开始温度转化}//温度读取:初始化→跳过ROM →读暂存器→连续的读操作
float DS18B20_ReadTemperature(void)
{unsigned char TLSB, TMSB;int Temp;float T;OneWire_Init();//初始化OneWire_SendByte(READ_SCRATCHPAD); //跳过ROM,写入一个字节数据,说我要读取温度TLSB = OneWire_ReceiveByte();TMSB = OneWire_ReceiveByte();Temp = (TMSB<<8)| TLSB;T = Temp/16.0;return T;}

第三步:主函数调用 :main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"float T;void main(void)
{DS18B20_ConvertTemperature();	//上电先转换一次温度,防止第一次读数据错误Delay_Any(1000);			//等待转换完成//初始化LCD_Init();LCD_ShowString(1,1,"Temperature:");while(1){	DS18B20_ConvertTemperature();T = DS18B20_ReadTemperature();if(T < 0){LCD_ShowChar(2,1,'-');T = -T;}elseLCD_ShowChar(2,1,'+');LCD_ShowNum(2,2,T,3);LCD_ShowChar(2,5,'.');LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);}
}//#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)				//如果温度小于0
//		{
//			LCD_ShowChar(2,1,'-');	//显示负号
//			T=-T;			//将温度变为正数
//		}
//		else				//如果温度大于等于0
//		{
//			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>
#include "Delay.h"sbit OneWire_DQ = P3^7; //单总线的管脚定义//编写5个函数 初始化、写一位、读一位、写一个字节、读一个字节//初始化:主机将总线拉低至少480us,然后释放总线,等待15~60us后,存在的从机会拉低总线60~240us以响应主机,之后从机将释放总线unsigned char OneWire_Init(void)
{unsigned char AckBit;OneWire_DQ = 1; //保证拉低之前是高电平OneWire_DQ = 0; //拉低Delay1ms();//延时1ms ,至少480usOneWire_DQ = 1;  //释放Delay70us();AckBit = OneWire_DQ; //应答位:存在的从机会拉低总线60~240us以响应主机Delay1ms();//延时1ms ,至少480usreturn AckBit;}//写一位数据,即主机51发送一位:主机将总线拉低60~120us,然后释放总线,表示发送0;主机将总线拉低1~15us,
//然后释放总线,表示发送1。从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60usvoid OneWire_SendBit(unsigned char Bit)
{OneWire_DQ = 0; //拉低Delay10us();OneWire_DQ = Bit; //10us 将数据放到总线上,主机写,Delay50us();OneWire_DQ = 1;  //释放
}//接收一位:即主机51读取一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),
//读取为低电平则为接收0,读取为高电平则为接收1 ,整个时间片应大于60us
unsigned char OneWire_ReadBit(void)
{unsigned char Bit;OneWire_DQ = 0; //拉低Delay5us();OneWire_DQ = 1;  //释放Delay5us();Bit = OneWire_DQ;  //数据放到总线上,主机读Delay50us();return Bit;}//发送一个字节:连续调用8次发送一位的时序,依次发送一个字节的8位(低位在前)
void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i=0; i<8; i++){OneWire_SendBit(Byte & (0X01 << i));}
}//接收一个字节:连续调用8次接收一位的时序,依次接收一个字节的8位(低位在前)unsigned char OneWire_ReceiveByte(void)
{unsigned char i, Byte = 0X00;for(i=0; i<8; i++){if(OneWire_ReadBit()){Byte |= (0x01);}}return Byte;
}

DS18B20.c

#include <REGX52.H>
#include "OneWire.h"//DS18B20 程序使用的寄存器进行红宏定义
#define SKIP_ROM			0XCC	//ROM指令 跳过ROM ,相当于直接访问DS18B20
#define CONVERT_T			0X44   //功能指令 温度转换
#define READ_SCRATCHPAD		0XBE  //功能指令  暂存器//温度转换函数 :初始化→跳过ROM →开始温度变换void DS18B20_ConvertTemperature(void)
{OneWire_Init();OneWire_SendByte(SKIP_ROM); //跳过ROM,写入一个字节数据,说我要读取温度OneWire_SendByte(CONVERT_T); //发送一个字节,让DS18B20开始温度转化}//温度读取:初始化→跳过ROM →读暂存器→连续的读操作
float DS18B20_ReadTemperature(void)
{unsigned char TLSB, TMSB;int Temp;float T;OneWire_Init();//初始化OneWire_SendByte(SKIP_ROM);OneWire_SendByte(READ_SCRATCHPAD); //跳过ROM,写入一个字节数据,说我要读取温度TLSB = OneWire_ReceiveByte();TMSB = OneWire_ReceiveByte();Temp = (TMSB<<8) | TLSB;T = Temp/16.0;return T;}

Delay.c

#include <REGX52.H>
#include "intrins.h"void Delay1ms()		//@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}void Delay70us()		//@11.0592MHz
{unsigned char i;_nop_();i = 29;while (--i);
}void Delay_Any(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}void Delay10us()		//@11.0592MHz
{unsigned char i;i = 2;while (--i);
}void Delay50us()		//@11.0592MHz
{unsigned char i;_nop_();i = 20;while (--i);
}void Delay5us()		//@11.0592MHz
{
}

其余代码可参考(主页51单片机内容)

相关文章:

51单片机 - DS18B20实验1-读取温度

上来一张图&#xff0c;明确思路&#xff0c;程序整体裤架如下&#xff0c;通过单总线&#xff0c;单独封装一个.c文件用于单总线的操作&#xff0c;其实&#xff0c;我们可以把点c文件看成一个类操作&#xff0c;其属性就是我们面向对象的函数&#xff0c;也叫方法&#xff0c…...

go语言基础入门(一)

变量声明:批量声明变量:变量赋值: 声明变量同时为变量赋值可以在变量声明时为其赋值go中赋值时的编译器会自动根据等号右侧的数据类型自动推导变量的类型使用 : 进行赋值匿名变量 常量常量计数器iota1. 使用场景2. 基本用法3. 简化语法4. 自定义增量5. 复杂使用go的类似枚举 使…...

linux 基础(一)mkdir、ls、vi、ifconfig

1、linux简介 linux是一个操作系统&#xff08;os: operating system&#xff09; 中国有没有自己的操作系统&#xff08;华为鸿蒙HarmonyOS&#xff0c;阿里龙蜥(Anolis) OS 8、百度DuerOS都有&#xff09; 计算机组的组成&#xff1a;硬件软件 硬件&#xff1a;运算器&am…...

DAMODEL丹摩智算:LLama3.1部署与使用

文章目录 前言 一、LLaMA 3.1 的特点 二、LLaMA3.1的优势 三、LLaMA3.1部署流程 &#xff08;一&#xff09;创建实例 &#xff08;二&#xff09;通过JupyterLab登录实例 &#xff08;3&#xff09;部署LLaMA3.1 &#xff08;4&#xff09;使用教程 总结 前言 LLama3…...

Spring Boot 配置全流程 总结

1. 简介 Springboot可以简化SSM的配置&#xff0c;提高开发效率。 2. 代码 在pom.xml中添加&#xff1a; <parent><!-- 包含SSM常用依赖项 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</art…...

爬虫技术初步自学

目的 本篇文章实际上自学爬虫技术的学习一份学习笔记&#xff0c;希望可以对后学的小白起到帮助&#xff0c;也希望得到大佬的指点&#xff0c;若有错漏希望大佬指出。 初步认知 爬虫实际上是一个计算机程序。开发爬虫程序的常用语言是Python。&#xff08;Python我已经在五…...

【力扣 | SQL题 | 每日三题】力扣175, 176, 181

1. 力扣175&#xff1a;组合两个表 1.1 题目&#xff1a; 表: Person ---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该…...

SpringBoot使用hutool操作FTP

项目场景&#xff1a; SpringBoot使用hutool操作FTP&#xff0c;可以实现从FTP服务器下载文件到本地&#xff0c;以及将本地文件上传到FTP服务器的功能。 实现步骤&#xff1a; 1、引入依赖 <dependency><groupId>commons-net</groupId><artifactId>…...

如何防止SQL注入攻击

SQL注入攻击是一种常见的网络安全威胁&#xff0c;攻击者通过在用户输入中插入恶意的SQL代码&#xff0c;从而可以执行未经授权的数据库操作。为了防止SQL注入攻击&#xff0c;我们可以采取一系列有效的措施来保护数据库和应用程序的安全性。以下是一些关键的防范策略&#xff…...

Java List类

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Java 目录 &#x1f449;&#x1f3fb;List1. 接口与实现2. 特性3. 常用方法4. 示例代码5. 遍历6. 线程安全 &#x1f449;&#x1f3fb;List Java的 List …...

使用 Internet 共享 (ICS) 方式分配ip

设备A使用dhcp的情况下&#xff0c;通过设备B分配ip并共享网络的方法。 启用网络共享&#xff08;ICS&#xff09;并配置 NAT Windows 自带的 Internet Connection Sharing (ICS) 功能可以简化 NAT 设置&#xff0c;允许共享一个网络连接给其他设备。 打开网络设置&#xff1…...

SMTP/IMAP服务发在线邮件时要用到

SMTP/IMAP服务 require PHPMailerAutoload.php; // 或 require class.phpmailer.php;// 创建实例 $mail new PHPMailer();// 设定邮件服务器 $mail->isSMTP(); $mail->Host smtp.example.com; // 邮件服务器地址 $mail->SMTPAuth true; $mail->Username your…...

Threejs绘制圆锥体

上一章节实现了胶囊体的绘制&#xff0c;这节来绘制圆锥体&#xff0c;圆锥体就是三角形旋转获得的&#xff0c;如上文一样&#xff0c;先要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&#xff0c;灯光&#xff0c;渲染器。代码如下&#xff1a; initScene() {this…...

速通LLaMA3:《The Llama 3 Herd of Models》全文解读

文章目录 概览论文开篇IntroductionGeneral OverviewPre-TrainingPre-Training DataModel ArchitectureInfrastructure, Scaling, and EfficiencyTraining Recipe Post-TrainingResultsVision ExperimentsSpeech Experiments⭐Related WorkConclusionLlama 3 模型中的数学原理1…...

Python网络爬虫获取Wallhaven壁纸图片(源码)

** 话不多说&#xff0c;直接附源码&#xff0c;可运行&#xff01; ** import requests from lxml import etree from fake_useragent import UserAgent import timeclass wallhaven(object):def __init__(self):# yellow# self.url "https://wallhaven.cc/search?co…...

智能化引领等保测评新时代:AI与大数据的深度融合

随着信息技术的飞速发展&#xff0c;等级保护测评&#xff08;简称“等保测评”&#xff09;作为保障信息系统安全的重要手段&#xff0c;正迎来前所未有的变革。在这一背景下&#xff0c;人工智能&#xff08;AI&#xff09;与大数据技术的深度融合&#xff0c;正引领等保测评…...

深入解析:HTTP 和 HTTPS 的区别

网络安全问题正变得日益重要&#xff0c;而 HTTP 与 HTTPS 对用户数据的保护十分关键。本文将深入探讨这两种协议的特点、工作原理&#xff0c;以及保证数据安全的 HTTPS 为何变得至关重要。 认识 HTTP 与 HTTPS HTTP 的工作原理 HTTP&#xff0c;全称超文本传输协议&#xf…...

《动手学深度学习》笔记1.11——实战Kaggle比赛:预测房价+详细代码讲解

目录 0. 前言 原书正文 1. 下载和缓存数据集 1.1 download() 下载数据集 1.2 download_extract() 解压缩 2. Kaggle 简介 3. 访问和读取数据集 4. 数据预处理 5. 训练&#xff08;核心难点&#xff09; 5.1 get_net() 定义模型-线性回归 5.2 log_rmse() 对数均方根…...

数据结构:单链表实现信息管理

一、函数声明部分 #ifndef __LINK_H__ #define __LINK_H__ #include <myhead.h> typedef struct Link1 {union{int len;//用于头结点&#xff0c;统计节点个数int data;//用于正常节点&#xff0c;存储数据};struct Link1 *next;//指针域 }Link,*Plink;/**********函数声…...

【Linux】解锁文件描述符奥秘,高效缓存区的实战技巧

fd和缓冲区 1. 文件描述符fd1.1. 概念与本质1.2. 打开文件的管理1.3. 一切皆文件的理解1.4. 分配规则1.5. 重定向的本质1.5.1. dup2 2. FILE中的缓冲区2.1. 概念2.2. 存在的原因2.3. 类型(刷新方案)2.4. 存放的位置2.4.1. 代码证明、现象解释 2.5. 模拟C标准库中的方法 1. 文件…...

5秒无损转换B站缓存视频:m4s-converter完整使用指南

5秒无损转换B站缓存视频&#xff1a;m4s-converter完整使用指南 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经在B站缓存了珍贵的学习…...

解锁你的音乐宝藏:ncmdump让网易云音乐文件自由播放

解锁你的音乐宝藏&#xff1a;ncmdump让网易云音乐文件自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 当你精心收藏的网易云音乐只能在特定客户端播放时&#xff0c;那种被束缚的感觉是否让你感到无奈&#xff1f;想象一下…...

【CH32V307实战】4P OLED屏I2C驱动移植与快速显示指南

1. CH32V307与4P OLED屏的硬件连接指南 第一次拿到CH32V307开发板和4P OLED屏时&#xff0c;最让我头疼的就是接线问题。这种4线制OLED&#xff08;通常标注为4P或4PIN&#xff09;相比传统的7线制简化了不少&#xff0c;但引脚定义各家厂商可能略有差异。经过多次实测&#xf…...

轻量级爬虫框架slacrawl:基于规则驱动的模块化数据采集实践

1. 项目概述&#xff1a;一个轻量级、模块化的网页爬虫框架最近在做一个需要从多个网站定时抓取结构化数据的小项目&#xff0c;找了一圈现成的工具&#xff0c;要么太重&#xff08;像Scrapy&#xff0c;学起来成本高&#xff09;&#xff0c;要么太死板&#xff08;很多脚本只…...

Rulebook-AI:用规则引擎为AI智能体构建可控决策框架

1. 项目概述&#xff1a;一个基于规则的AI智能体框架最近在探索如何让AI智能体&#xff08;Agent&#xff09;的行为更可控、更符合业务逻辑时&#xff0c;我遇到了一个挺有意思的开源项目&#xff1a;botingw/rulebook-ai。乍一看这个名字&#xff0c;可能会觉得它又是一个试图…...

Windows Android子系统深度优化:WSABuilds项目架构解析与实战部署指南

Windows Android子系统深度优化&#xff1a;WSABuilds项目架构解析与实战部署指南 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or Ker…...

嵌入式测试学习第 12天:串口基础概念:UART、波特率、数据位、校验位

串口基础概念&#xff1a;UART、波特率、数据位、校验位一、串口整体基础概念1、什么是UART串口2、串口实物真实图片① 主板/开发板排针串口② USB转TTL串口模块③ 老式DB9工业串口公头母头二、串口四大核心参数1、波特率概念常用标准固定值通俗理解测试场景2、数据位概念作用3…...

数据分析师GitHub作品集构建指南:从项目架构到技术实现

1. 项目概述&#xff1a;一个数据分析师的作品集仓库意味着什么&#xff1f; 在数据驱动的时代&#xff0c;简历上的“精通Python/SQL”已经不够看了。面试官&#xff0c;尤其是那些懂行的技术面试官&#xff0c;更想看到的是你如何用这些工具解决真实世界的问题。这就是为什么…...

基于Databerry的私有数据AI应用构建:从RAG原理到生产部署

1. 项目概述&#xff1a;一个开箱即用的AI应用构建平台如果你正在寻找一个能快速将私有数据&#xff08;比如公司文档、个人笔记、产品手册&#xff09;转化为智能问答机器人的工具&#xff0c;但又不想从零开始折腾复杂的向量数据库、嵌入模型和API集成&#xff0c;那么gmpetr…...

如何加入GEO从入门到精通知识星球?

很多人学了GEO理论&#xff0c;却不知道怎么落地——因为GEO不是靠手动摸索能高效完成的&#xff0c;它需要工具支撑每一个环节。GEO优化分三个核心环节&#xff0c;每个环节都有对应的工具。第一环节&#xff1a;问题挖掘用什么工具&#xff1a;GEO之家问题大师传统SEO靠关键词…...