51单片机(十三)DS18B20温度传感器

该文章是一份51单片机和STM32学习教程的一部分,重点介绍了DS18B20温度传感器的使用。内容包括传感器的基础知识、目标、单总线协议,以及通过两个实践项目(温度读取和温度报警器)来展示如何编程操作该传感器。同时提供了代码示例和资源链接供学习者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取码:gdzf

本节主要介绍学习DS18B20温度传感器的相关知识,包括DS18B20温度传感器基础知识介绍、本节目标等;并利用两个小实验来写程序进行练习,分别是DS18B20温度读取以及DS18B20温度报警器,最后附上相关代码。

一、DS18B20温度传感器和本节目标

1.1 DS18B20温度传感器基础知识

DS18B02温度传感器在开发板上的位置如下图所示:

在这里插入图片描述

DS18B02介绍
在这里插入图片描述

引脚及应用电路

在这里插入图片描述

内部结构框图

在这里插入图片描述
存储结构

在这里插入图片描述

在这里插入图片描述

单总线电路规范

在这里插入图片描述

单总线时序结构
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.2 本节目标

目标1:DS18B20温度读取

实时读取并显示当前温度

在这里插入图片描述

目标2:DS18B20温度报警器

显示实时温度、温度上限和温度下限,不在上限和下限范围内则进行报警。

在这里插入图片描述
使用按键K1和K2可以对上限下限进行调节。

温度不在上下限范围内时,如果超过上限,显示OV:H;低于下限时,显示OV:L;如下图:

在这里插入图片描述

且设置的温度上限和下限值是可以存在AT24C02的;保证了掉电不丢失;

二、DS18B20温度读取

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\13-1 DS18B20温度读取
具体代码:

#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);//显示温度小数部分
	}
}

DS18B20.c:

#include <REGX52.H>
#include "OneWire.h"

//DS18B20指令
#define DS18B20_SKIP_ROM			0xCC
#define DS18B20_CONVERT_T			0x44
#define DS18B20_READ_SCRATCHPAD 	0xBE

/**
  * @brief  DS18B20开始温度变换
  * @param  无
  * @retval 无
  */
void DS18B20_ConvertT(void)
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_CONVERT_T);
}

/**
  * @brief  DS18B20读取温度
  * @param  无
  * @retval 温度数值
  */
float DS18B20_ReadT(void)
{
	unsigned char TLSB,TMSB;
	int Temp;
	float T;
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);
	TLSB=OneWire_ReceiveByte();
	TMSB=OneWire_ReceiveByte();
	Temp=(TMSB<<8)|TLSB;
	T=Temp/16.0;
	return T;
}

OneWire.c:

#include <REGX52.H>

//引脚定义
sbit OneWire_DQ=P3^7;

/**
  * @brief  单总线初始化
  * @param  无
  * @retval 从机响应位,0为响应,1为未响应
  */
unsigned char OneWire_Init(void)
{
	unsigned char i;
	unsigned char AckBit;
	OneWire_DQ=1;
	OneWire_DQ=0;
	i = 247;while (--i);		//Delay 500us
	OneWire_DQ=1;
	i = 32;while (--i);			//Delay 70us
	AckBit=OneWire_DQ;
	i = 247;while (--i);		//Delay 500us
	return AckBit;
}

/**
  * @brief  单总线发送一位
  * @param  Bit 要发送的位
  * @retval 无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	OneWire_DQ=0;
	i = 4;while (--i);			//Delay 10us
	OneWire_DQ=Bit;
	i = 24;while (--i);			//Delay 50us
	OneWire_DQ=1;
}

/**
  * @brief  单总线接收一位
  * @param  无
  * @retval 读取的位
  */
unsigned char OneWire_ReceiveBit(void)
{
	unsigned char i;
	unsigned char Bit;
	OneWire_DQ=0;
	i = 2;while (--i);			//Delay 5us
	OneWire_DQ=1;
	i = 2;while (--i);			//Delay 5us
	Bit=OneWire_DQ;
	i = 24;while (--i);			//Delay 50us
	return Bit;
}

/**
  * @brief  单总线发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));
	}
}

/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
  */
unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i;
	unsigned char Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
	}
	return Byte;
}

二、DS18B20温度报警器

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\13-2 DS18B20温度报警器
具体代码:

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Timer0.h"

float T,TShow;
char TLow,THigh;
unsigned char KeyNum;

void main()
{
	DS18B20_ConvertT();		//上电先转换一次温度,防止第一次读数据错误
	Delay(1000);			//等待转换完成
	THigh=AT24C02_ReadByte(0);	//读取温度阈值数据
	TLow=AT24C02_ReadByte(1);
	if(THigh>125 || TLow<-55 || THigh<=TLow)
	{
		THigh=20;			//如果阈值非法,则设为默认值
		TLow=15;
	}
	LCD_Init();
	LCD_ShowString(1,1,"T:");
	LCD_ShowString(2,1,"TH:");
	LCD_ShowString(2,9,"TL:");
	LCD_ShowSignedNum(2,4,THigh,3);
	LCD_ShowSignedNum(2,12,TLow,3);
	Timer0_Init();
	
	while(1)
	{
		KeyNum=Key();
		
		/*温度读取及显示*/
		DS18B20_ConvertT();	//转换温度
		T=DS18B20_ReadT();	//读取温度
		if(T<0)				//如果温度小于0
		{
			LCD_ShowChar(1,3,'-');	//显示负号
			TShow=-T;		//将温度变为正数
		}
		else				//如果温度大于等于0
		{
			LCD_ShowChar(1,3,'+');	//显示正号
			TShow=T;
		}
		LCD_ShowNum(1,4,TShow,3);		//显示温度整数部分
		LCD_ShowChar(1,7,'.');		//显示小数点
		LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);//显示温度小数部分
		
		/*阈值判断及显示*/
		if(KeyNum)
		{
			if(KeyNum==1)	//K1按键,THigh自增
			{
				THigh++;
				if(THigh>125){THigh=125;}
			}
			if(KeyNum==2)	//K2按键,THigh自减
			{
				THigh--;
				if(THigh<=TLow){THigh++;}
			}
			if(KeyNum==3)	//K3按键,TLow自增
			{
				TLow++;
				if(TLow>=THigh){TLow--;}
			}
			if(KeyNum==4)	//K4按键,TLow自减
			{
				TLow--;
				if(TLow<-55){TLow=-55;}
			}
			LCD_ShowSignedNum(2,4,THigh,3);	//显示阈值数据
			LCD_ShowSignedNum(2,12,TLow,3);
			AT24C02_WriteByte(0,THigh);		//写入到At24C02中保存
			Delay(5);
			AT24C02_WriteByte(1,TLow);
			Delay(5);
		}
		if(T>THigh)			//越界判断
		{
			LCD_ShowString(1,13,"OV:H");
		}
		else if(T<TLow)
		{
			LCD_ShowString(1,13,"OV:L");
		}
		else
		{
			LCD_ShowString(1,13,"    ");
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=20)
	{
		T0Count=0;
		Key_Loop();	//每20ms调用一次按键驱动函数
	}
}
<think>好的,我现在需要帮助用户了解如何在Altium Designer 21中创建工程。首先,我需要回顾用户提供的引用内容,确保回答准确。用户提到了引用1到5,其中引用2、5和3可能最相关。 引用2提到创建PCB工程的步骤:File → New → Project,然后选择PCB Project类型。引用5则强调了保存工程时不要放在Free Documents下,这是一个常见的错误。引用3提到了板框设计,虽然属于后续步骤,但可能用户也会需要。 接下来,我需要按照步骤组织回答。首先,启动软件,然后新建工程,选择正确的类型。接着保存工程到合适的位置,避免Free Documents的错误。然后可能需要添加原理图和PCB文件,引用1提到了添加原理图的步骤,右键工程,Add New。引用3的板框设计可以作为PCB设计的一部分。最后,保存所有文件,并注意工程结构是否正确。 用户可能需要常见问题解答,比如无法创建工程怎么办,这里引用4提到npm link的问题,但可能不直接相关,可能需要检查安装或权限。此外,工程文件管理也很重要,引用5的错误示范需要强调正确保存位置。 需要确保步骤清晰,使用中文,遵循用户要求的格式,内联公式用$...$,但这里可能用不上数学公式。生成相关问题要考虑用户可能遇到的后续问题,比如保存错误、添加文件、快捷键等。 最后,检查是否所有引用都正确标注,比如引用2、5、3在步骤中提到,其他引用如1和4在适当的地方引用。确保回答结构符合用户的要求,分步骤说明,并包含注意事项和常见问题。</think>### Altium Designer 21 创建新工程步骤 #### **1. 启动软件并新建工程** - 打开Altium Designer 21,点击菜单栏的 **File → New → Project**。 - 在弹出窗口中,选择 **PCB Project** 作为工程类型(其他类型如集成库工程可根据需求选择)[^2][^5]。 - 输入工程名称并选择保存路径,**避免直接保存在默认的“Free Documents”目录下**(否则可能导致文件关联错误)[^5]。 #### **2. 添加原理图文件** - 右键单击新建的工程名,选择 **Add New to Project → Schematic**,此时会自动创建并关联一个原理图文件(`.SchDoc`)[^1]。 - 使用快捷键 **Ctrl + S** 保存原理图文件,建议将其存放在与工程相同的文件夹内[^5]。 #### **3. 添加PCB文件** - 类似地,右键工程名选择 **Add New to Project → PCB**,创建PCB文件(`.PcbDoc`)。 - 设计板框时,切换到机械层(如`Mechanical 1`),使用线工具绘制闭合轮廓,选中后通过 **Design → Board Shape → Define from selected objects** 定义板框形状[^3]。 #### **4. 保存工程** - 确保所有文件(工程、原理图、PCB)均保存至同一文件夹,工程文件扩展名为`.PrjPcb`。 - 最终工程结构示例: ``` 项目文件夹/ ├── 工程名称.PrjPcb ├── 原理图名称.SchDoc └── PCB名称.PcbDoc ``` #### **注意事项** - **错误操作示例**:若工程文件显示在“Free Documents”下,需重新保存至独立文件夹以避免关联丢失。 - **文件关联**:若文件未自动关联到工程,可右键工程选择 **Add Existing to Project** 手动添加。 --- ### **相关问题** 1. 如何修复Altium Designer中工程文件关联错误? 2. 在Altium Designer中如何快速切换不同设计层(如机械层、信号层)? 3. 创建PCB工程后,如何导入元件库并放置封装? 4. Altium Designer有哪些常用快捷键可提升设计效率? --- ### **引用说明** - 新建工程类型选择与保存路径规范参考了PCB工程创建流程[^5]。 - 板框设计方法引用了机械层操作指南。 - 文件关联错误案例来自工程保存位置常见问题。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘凉~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值